git ssb

3+

ev / decent



Tree: b5f3c11f9e0e43e79da1e0146bd5f9357360d53c

Files: b5f3c11f9e0e43e79da1e0146bd5f9357360d53c / plugins / ws / index.js

2399 bytesRaw
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
9function 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
18var 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
43exports.name = 'ws'
44exports.version = '1.0.0'
45exports.manifest = {
46 getAddress: 'sync'
47}
48
49function 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
55exports.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