Files: 0e358d0e8e4ca71ca7ba37a67f2226bf1531dc13 / index.js
2356 bytesRaw
1 | var pull = require('pull-stream') |
2 | var muxrpc = require('muxrpc') |
3 | var address = require('ssb-address') |
4 | var ws = require('pull-ws-server') |
5 | var Serializer = require('pull-serializer') |
6 | var loadManf = require('ssb-manifest/load') |
7 | var ssbFeed = require('secure-scuttlebutt/feed') |
8 | var ssbDefaults = require('secure-scuttlebutt/defaults') |
9 | |
10 | function isFunction (f) { |
11 | return 'function' === typeof f |
12 | } |
13 | |
14 | function throwIfError(err) { |
15 | if(err) throw err |
16 | } |
17 | |
18 | module.exports = function (config) { |
19 | var manifest |
20 | //if we are in the browser |
21 | config = config || {} |
22 | config.host = config.host || 'localhost' |
23 | |
24 | var client = muxrpc(loadManf(config), { auth: 'async' }, serialize)({ |
25 | auth: function (req, cb) { |
26 | // when this connects to a server, the server auths |
27 | // back to see who this is. we don't have any apis |
28 | // for the server to call (yet) so this doesn't do anything. |
29 | // however, if we don't just let this go through, the server |
30 | // log shows a nasty error log. |
31 | cb() |
32 | } |
33 | }) |
34 | |
35 | var wsStream |
36 | var rpcStream |
37 | |
38 | client.connect = function(addr, cb) { |
39 | if(isFunction(addr)) |
40 | cb = addr, addr = null |
41 | |
42 | addr = address(addr || config) |
43 | client.addr = addr |
44 | if (wsStream) { |
45 | wsStream.close() |
46 | client._emit('reconnecting') |
47 | } |
48 | |
49 | var called = false |
50 | wsStream = ws.connect(addr, { |
51 | onOpen: function() { |
52 | client._emit('connect') |
53 | if(called) return |
54 | called = true; cb && cb() |
55 | }, |
56 | onClose: function() { |
57 | client._emit('close') |
58 | //rpcStream will detect close on it's own. |
59 | if(called) return |
60 | called = true; cb && cb() |
61 | } |
62 | }) |
63 | |
64 | rpcStream = client.createStream() |
65 | pull(wsStream, rpcStream, wsStream) |
66 | |
67 | return client |
68 | } |
69 | |
70 | client.close = function(cb) { |
71 | wsStream.close() |
72 | rpcStream.close(cb ? cb : throwIfError) |
73 | return client |
74 | } |
75 | |
76 | client.reconnect = function(opts) { |
77 | opts = opts || {} |
78 | client.close(function() { |
79 | if (opts.wait) |
80 | setTimeout(client.connect.bind(client, client.addr), opts.wait) |
81 | else |
82 | client.connect(client.addr) |
83 | }) |
84 | return client |
85 | } |
86 | |
87 | client.createFeed = function (keys) { |
88 | return ssbFeed(this, keys, ssbDefaults) |
89 | } |
90 | |
91 | return client |
92 | } |
93 | |
94 | function serialize (stream) { |
95 | return Serializer(stream, JSON, {split: '\n\n'}) |
96 | } |
97 |
Built with git-ssb-web