UNPKG

2.3 kBJavaScriptView Raw
1'use strict'
2var PSC = require('packet-stream-codec')
3var u = require('./util')
4var initStream = require('./stream')
5var createApi = require('./api')
6var createLocalCall = require('./local-api')
7var EventEmitter = require('events').EventEmitter
8
9function createMuxrpc (remoteManifest, localManifest, localApi, id, perms, codec, legacy) {
10 var bootstrap
11 if ('function' === typeof remoteManifest) {
12 bootstrap = remoteManifest
13 remoteManifest = {}
14 }
15
16 localManifest = localManifest || {}
17 remoteManifest = remoteManifest || {}
18 var emitter = new EventEmitter()
19 if(!codec) codec = PSC
20
21 //pass the manifest to the permissions so that it can know
22 //what something should be.
23 var _cb, ws
24 var context = {
25 _emit: function (event, value) {
26 emitter && emitter._emit(event, value)
27 return context
28 },
29 id: id
30 }
31
32 var ws = initStream(
33 createLocalCall(localApi, localManifest, perms).bind(context),
34 codec, function (err) {
35 if(emitter.closed) return
36 emitter.closed = true
37 emitter.emit('closed')
38 if(_cb) {
39 var cb = _cb; _cb = null; cb(err)
40 }
41 }
42 )
43
44 createApi(emitter, remoteManifest, function (type, name, args, cb) {
45 if(ws.closed) throw new Error('stream is closed')
46 return ws.remoteCall(type, name, args, cb)
47 }, bootstrap)
48
49 //legacy local emit, from when remote emit was supported.
50 emitter._emit = emitter.emit
51
52 if(legacy) {
53 Object.__defineGetter__.call(emitter, 'id', function () {
54 return context.id
55 })
56
57 Object.__defineSetter__.call(emitter, 'id', function (value) {
58 context.id = value
59 })
60
61 var first = true
62
63 emitter.createStream = function (cb) {
64 _cb = cb
65 if(first) {
66 first = false; return ws
67 }
68 else
69 throw new Error('one stream per rpc')
70 }
71 }
72 else
73 emitter.stream = ws
74
75 emitter.closed = false
76
77 emitter.close = function (err, cb) {
78 ws.close(err, cb)
79 return this
80 }
81
82 return emitter
83}
84
85module.exports = function (remoteManifest, localManifest, codec) {
86 if(arguments.length > 3)
87 return createMuxrpc.apply(this, arguments)
88 return function (local, perms, id) {
89 return createMuxrpc(remoteManifest, localManifest, local, id, perms, codec, true)
90 }
91}
92