1 | 'use strict'
|
2 | var PSC = require('packet-stream-codec')
|
3 | var u = require('./util')
|
4 | var initStream = require('./stream')
|
5 | var createApi = require('./api')
|
6 | var createLocalCall = require('./local-api')
|
7 | var EventEmitter = require('events').EventEmitter
|
8 |
|
9 | function 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 |
|
22 |
|
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 |
|
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 |
|
85 | module.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 |
|