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