UNPKG

2.51 kBJavaScriptView Raw
1var MultiServer = require('multiserver')
2var WS = require('multiserver/plugins/ws')
3var SHS = require('multiserver/plugins/shs')
4var http = require('http')
5var muxrpc = require('muxrpc')
6var pull = require('pull-stream')
7var JSONApi = require('./json-api')
8
9var cap =
10 new Buffer('1KHLiKZvAvjbY1ziZEHMXawbCEIM6qwjCDm3VYRan/s=', 'base64')
11
12function toSodiumKeys(keys) {
13 return {
14 publicKey:
15 new Buffer(keys.public.replace('.ed25519',''), 'base64'),
16 secretKey:
17 new Buffer(keys.private.replace('.ed25519',''), 'base64'),
18 }
19}
20
21var READ_AND_ADD = [ //except for add, of course
22 'get',
23 'getLatest',
24 'createLogStream',
25 'createUserStream',
26
27 'createHistoryStream',
28 'getAddress',
29
30 'links',
31
32 'blobs.add',
33 'blobs.size',
34 'blobs.has',
35 'blobs.get',
36 'blobs.changes',
37 'blobs.createWants',
38
39
40 'add',
41
42 'query.read',
43 'links2.read'
44]
45
46
47exports.name = 'ws'
48exports.version = require('./package.json').version
49exports.manifest = {
50 getAddress: 'sync'
51}
52
53function toId(id) {
54 return '@'+id.toString('base64')+'.ed25519'
55}
56
57exports.init = function (sbot, config) {
58
59 var port
60 if(config.ws)
61 port = config.ws.port
62 if(!port)
63 port = 1024+(~~(Math.random()*(65536-1024)))
64
65 var server = http.createServer(JSONApi(sbot)).listen(port)
66
67 //allow friends to
68 sbot.auth.hook(function (fn, args) {
69 var id = args[0]
70 var cb = args[1]
71 var self = this
72 fn.apply(self, [id, function (err, allowed) {
73 if(err) return cb(err)
74 if(allowed) return cb(null, allowed)
75 sbot.friends.get({source: sbot.id, dest: id}, function (err, follows) {
76 if(err) return cb(err)
77 else if(follows) cb(null, {allow: READ_AND_ADD, deny: null})
78 else cb()
79 })
80 }])
81
82 })
83
84 var ms = MultiServer([
85 [
86 WS({server: server, port: port, host: config.host || 'localhost'}),
87 SHS({
88 keys: toSodiumKeys(config.keys),
89 appKey: (config.caps && config.caps.shs) || cap,
90 auth: function (id, cb) {
91 sbot.auth(toId(id), cb)
92 },
93 timeout: config.timeout
94 })
95 ]
96 ])
97
98 var close = ms.server(function (stream) {
99 var manifest = sbot.getManifest()
100 var rpc = muxrpc({}, manifest)(sbot, stream.auth)
101 rpc.id = toId(stream.remote)
102 pull(stream, rpc.createStream(), stream)
103 })
104
105 //close when the server closes.
106 sbot.close.hook(function (fn, args) {
107 close()
108 fn.apply(this, args)
109 })
110
111 return {
112 getAddress: function () {
113 return ms.stringify()
114 }
115
116 }
117}
118
119
120
121
122