@dxos/network-manager 2.33.9-dev.7d11f506 → 2.33.9-dev.9bbef4e2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/network-manager.blueprint-test.d.ts +3 -1
- package/dist/src/network-manager.blueprint-test.d.ts.map +1 -1
- package/dist/src/network-manager.blueprint-test.js +46 -17
- package/dist/src/network-manager.blueprint-test.js.map +1 -1
- package/dist/src/network-manager.browser-test.js +1 -1
- package/dist/src/network-manager.browser-test.js.map +1 -1
- package/dist/src/network-manager.d.ts.map +1 -1
- package/dist/src/network-manager.js +13 -12
- package/dist/src/network-manager.js.map +1 -1
- package/dist/src/network-manager.test.js +5 -4
- package/dist/src/network-manager.test.js.map +1 -1
- package/dist/src/proto/gen/dxos/credentials.d.ts +39 -0
- package/dist/src/proto/gen/dxos/credentials.d.ts.map +1 -1
- package/dist/src/proto/gen/dxos/halo/keys.d.ts +44 -2
- package/dist/src/proto/gen/dxos/halo/keys.d.ts.map +1 -1
- package/dist/src/proto/gen/dxos/halo/keys.js +4 -0
- package/dist/src/proto/gen/dxos/halo/keys.js.map +1 -1
- package/dist/src/proto/gen/dxos/mesh/signal.d.ts +74 -16
- package/dist/src/proto/gen/dxos/mesh/signal.d.ts.map +1 -1
- package/dist/src/proto/gen/dxos/mesh/signalMessage.d.ts +79 -0
- package/dist/src/proto/gen/dxos/mesh/signalMessage.d.ts.map +1 -0
- package/dist/src/proto/gen/dxos/mesh/signalMessage.js +3 -0
- package/dist/src/proto/gen/dxos/mesh/signalMessage.js.map +1 -0
- package/dist/src/proto/gen/google/protobuf.d.ts +8 -2
- package/dist/src/proto/gen/google/protobuf.d.ts.map +1 -1
- package/dist/src/proto/gen/index.d.ts +17 -4
- package/dist/src/proto/gen/index.d.ts.map +1 -1
- package/dist/src/proto/gen/index.js +1 -1
- package/dist/src/proto/gen/index.js.map +1 -1
- package/dist/src/proto/substitutions.d.ts +4 -0
- package/dist/src/proto/substitutions.d.ts.map +1 -1
- package/dist/src/proto/substitutions.js +3 -1
- package/dist/src/proto/substitutions.js.map +1 -1
- package/dist/src/protocol-factory.js +3 -3
- package/dist/src/protocol-factory.js.map +1 -1
- package/dist/src/signal/in-memory-signal-manager.d.ts +7 -7
- package/dist/src/signal/in-memory-signal-manager.d.ts.map +1 -1
- package/dist/src/signal/in-memory-signal-manager.js +34 -13
- package/dist/src/signal/in-memory-signal-manager.js.map +1 -1
- package/dist/src/signal/index.d.ts +1 -2
- package/dist/src/signal/index.d.ts.map +1 -1
- package/dist/src/signal/index.js +1 -2
- package/dist/src/signal/index.js.map +1 -1
- package/dist/src/signal/integration.test.d.ts +2 -0
- package/dist/src/signal/integration.test.d.ts.map +1 -0
- package/dist/src/signal/integration.test.js +102 -0
- package/dist/src/signal/integration.test.js.map +1 -0
- package/dist/src/signal/message-router.d.ts +20 -8
- package/dist/src/signal/message-router.d.ts.map +1 -1
- package/dist/src/signal/message-router.js +96 -17
- package/dist/src/signal/message-router.js.map +1 -1
- package/dist/src/signal/message-router.test.js +125 -22
- package/dist/src/signal/message-router.test.js.map +1 -1
- package/dist/src/signal/signal-client.d.ts +33 -17
- package/dist/src/signal/signal-client.d.ts.map +1 -1
- package/dist/src/signal/signal-client.js +102 -82
- package/dist/src/signal/signal-client.js.map +1 -1
- package/dist/src/signal/signal-client.test.js +60 -75
- package/dist/src/signal/signal-client.test.js.map +1 -1
- package/dist/src/signal/{websocket-signal-manager.d.ts → signal-manager-impl.d.ts} +13 -11
- package/dist/src/signal/signal-manager-impl.d.ts.map +1 -0
- package/dist/src/signal/signal-manager-impl.js +151 -0
- package/dist/src/signal/signal-manager-impl.js.map +1 -0
- package/dist/src/signal/signal-manager.d.ts +12 -11
- package/dist/src/signal/signal-manager.d.ts.map +1 -1
- package/dist/src/signal/signal-rpc-client.d.ts +19 -0
- package/dist/src/signal/signal-rpc-client.d.ts.map +1 -0
- package/dist/src/signal/signal-rpc-client.js +108 -0
- package/dist/src/signal/signal-rpc-client.js.map +1 -0
- package/dist/src/signal/signal-rpc-client.test.d.ts +2 -0
- package/dist/src/signal/signal-rpc-client.test.d.ts.map +1 -0
- package/dist/src/signal/signal-rpc-client.test.js +74 -0
- package/dist/src/signal/signal-rpc-client.test.js.map +1 -0
- package/dist/src/swarm/connection.d.ts +3 -3
- package/dist/src/swarm/connection.d.ts.map +1 -1
- package/dist/src/swarm/connection.js +8 -11
- package/dist/src/swarm/connection.js.map +1 -1
- package/dist/src/swarm/swarm.d.ts +6 -7
- package/dist/src/swarm/swarm.d.ts.map +1 -1
- package/dist/src/swarm/swarm.js +29 -25
- package/dist/src/swarm/swarm.js.map +1 -1
- package/dist/src/swarm/swarm.test.js +156 -115
- package/dist/src/swarm/swarm.test.js.map +1 -1
- package/dist/src/testing/test-protocol.d.ts.map +1 -1
- package/dist/src/testing/test-protocol.js +3 -3
- package/dist/src/testing/test-protocol.js.map +1 -1
- package/dist/src/topology/fully-connected-topology.d.ts +0 -1
- package/dist/src/topology/fully-connected-topology.d.ts.map +1 -1
- package/dist/src/topology/fully-connected-topology.js +4 -9
- package/dist/src/topology/fully-connected-topology.js.map +1 -1
- package/dist/src/topology/mmst-topology.d.ts +0 -1
- package/dist/src/topology/mmst-topology.d.ts.map +1 -1
- package/dist/src/topology/mmst-topology.js +6 -11
- package/dist/src/topology/mmst-topology.js.map +1 -1
- package/dist/src/topology/star-topology.d.ts +0 -1
- package/dist/src/topology/star-topology.d.ts.map +1 -1
- package/dist/src/topology/star-topology.js +5 -10
- package/dist/src/topology/star-topology.js.map +1 -1
- package/dist/src/topology/topology.d.ts +0 -6
- package/dist/src/topology/topology.d.ts.map +1 -1
- package/dist/src/transport/in-memory-transport.d.ts +2 -2
- package/dist/src/transport/in-memory-transport.d.ts.map +1 -1
- package/dist/src/transport/in-memory-transport.js +2 -2
- package/dist/src/transport/in-memory-transport.js.map +1 -1
- package/dist/src/transport/transport.d.ts +3 -3
- package/dist/src/transport/transport.d.ts.map +1 -1
- package/dist/src/transport/webrtc-transport.d.ts +3 -3
- package/dist/src/transport/webrtc-transport.d.ts.map +1 -1
- package/dist/src/transport/webrtc-transport.js +3 -3
- package/dist/src/transport/webrtc-transport.js.map +1 -1
- package/dist/tests-setup.js +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +17 -12
- package/src/network-manager.blueprint-test.ts +57 -22
- package/src/network-manager.browser-test.ts +1 -1
- package/src/network-manager.test.ts +8 -7
- package/src/network-manager.ts +10 -10
- package/src/proto/defs/dxos/mesh/signal.proto +54 -23
- package/src/proto/defs/dxos/mesh/signalMessage.proto +51 -0
- package/src/proto/gen/dxos/credentials.ts +40 -0
- package/src/proto/gen/dxos/halo/keys.ts +45 -2
- package/src/proto/gen/dxos/mesh/signal.ts +73 -16
- package/src/proto/gen/dxos/mesh/signalMessage.ts +83 -0
- package/src/proto/gen/google/protobuf.ts +9 -2
- package/src/proto/gen/index.ts +18 -5
- package/src/proto/substitutions.ts +3 -1
- package/src/protocol-factory.ts +1 -1
- package/src/signal/in-memory-signal-manager.ts +38 -13
- package/src/signal/index.ts +1 -2
- package/src/signal/integration.test.ts +117 -0
- package/src/signal/message-router.test.ts +169 -58
- package/src/signal/message-router.ts +120 -27
- package/src/signal/signal-client.test.ts +70 -90
- package/src/signal/signal-client.ts +120 -87
- package/src/signal/signal-manager-impl.ts +166 -0
- package/src/signal/signal-manager.ts +12 -12
- package/src/signal/signal-rpc-client.test.ts +86 -0
- package/src/signal/signal-rpc-client.ts +121 -0
- package/src/swarm/connection.ts +6 -9
- package/src/swarm/swarm.test.ts +208 -167
- package/src/swarm/swarm.ts +26 -22
- package/src/testing/test-protocol.ts +1 -1
- package/src/topology/fully-connected-topology.ts +2 -10
- package/src/topology/mmst-topology.ts +2 -10
- package/src/topology/star-topology.ts +2 -8
- package/src/topology/topology.ts +0 -7
- package/src/transport/in-memory-transport.ts +3 -3
- package/src/transport/transport.ts +3 -3
- package/src/transport/webrtc-transport.ts +4 -4
- package/dist/src/signal/websocket-rpc.d.ts +0 -30
- package/dist/src/signal/websocket-rpc.d.ts.map +0 -1
- package/dist/src/signal/websocket-rpc.js +0 -203
- package/dist/src/signal/websocket-rpc.js.map +0 -1
- package/dist/src/signal/websocket-signal-manager.d.ts.map +0 -1
- package/dist/src/signal/websocket-signal-manager.js +0 -134
- package/dist/src/signal/websocket-signal-manager.js.map +0 -1
- package/src/signal/websocket-rpc.ts +0 -208
- package/src/signal/websocket-signal-manager.ts +0 -158
|
@@ -6,7 +6,7 @@ import { Event } from '@dxos/async';
|
|
|
6
6
|
import { ErrorStream } from '@dxos/debug';
|
|
7
7
|
import { PublicKey } from '@dxos/protocols';
|
|
8
8
|
|
|
9
|
-
import {
|
|
9
|
+
import { SignalMessage } from '../proto/gen/dxos/mesh/signalMessage';
|
|
10
10
|
|
|
11
11
|
/**
|
|
12
12
|
* Abstraction over a P2P connection transport. Currently either WebRTC or in-memory.
|
|
@@ -15,7 +15,7 @@ export interface Transport {
|
|
|
15
15
|
closed: Event
|
|
16
16
|
connected: Event
|
|
17
17
|
errors: ErrorStream
|
|
18
|
-
signal (msg:
|
|
18
|
+
signal (msg: SignalMessage): Promise<void> // TODO(burdon): Remove async?
|
|
19
19
|
close (): Promise<void>
|
|
20
20
|
}
|
|
21
21
|
|
|
@@ -38,7 +38,7 @@ export interface TransportOptions {
|
|
|
38
38
|
/**
|
|
39
39
|
* Send a signal message to remote peer.
|
|
40
40
|
*/
|
|
41
|
-
sendSignal: (msg:
|
|
41
|
+
sendSignal: (msg: SignalMessage) => Promise<void> // TODO(burdon): Remove async?
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
export type TransportFactory = (options: TransportOptions) => Transport
|
|
@@ -3,15 +3,15 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
import wrtc from '@koush/wrtc';
|
|
6
|
-
import assert from 'assert';
|
|
7
6
|
import debug from 'debug';
|
|
7
|
+
import assert from 'node:assert';
|
|
8
8
|
import SimplePeerConstructor, { Instance as SimplePeer } from 'simple-peer';
|
|
9
9
|
|
|
10
10
|
import { Event } from '@dxos/async';
|
|
11
11
|
import { ErrorStream } from '@dxos/debug';
|
|
12
12
|
import { PublicKey } from '@dxos/protocols';
|
|
13
13
|
|
|
14
|
-
import {
|
|
14
|
+
import { SignalMessage } from '../proto/gen/dxos/mesh/signalMessage';
|
|
15
15
|
import { Transport, TransportFactory } from './transport';
|
|
16
16
|
|
|
17
17
|
const log = debug('dxos:network-manager:swarm:transport:webrtc');
|
|
@@ -35,7 +35,7 @@ export class WebRTCTransport implements Transport {
|
|
|
35
35
|
private readonly _remoteId: PublicKey,
|
|
36
36
|
private readonly _sessionId: PublicKey,
|
|
37
37
|
private readonly _topic: PublicKey,
|
|
38
|
-
private readonly _sendSignal: (msg:
|
|
38
|
+
private readonly _sendSignal: (msg: SignalMessage) => void,
|
|
39
39
|
private readonly _webrtcConfig?: any
|
|
40
40
|
) {
|
|
41
41
|
log(`Created WebRTC connection ${this._ownId} -> ${this._remoteId} initiator=${this._initiator}`);
|
|
@@ -89,7 +89,7 @@ export class WebRTCTransport implements Transport {
|
|
|
89
89
|
return this._peer;
|
|
90
90
|
}
|
|
91
91
|
|
|
92
|
-
async signal (msg:
|
|
92
|
+
async signal (msg: SignalMessage) {
|
|
93
93
|
assert(this._peer, 'Connection not ready to accept signals.');
|
|
94
94
|
assert(msg.data?.signal?.json, 'Signal message must contain signal data.');
|
|
95
95
|
this._peer.signal(JSON.parse(msg.data.signal.json));
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import { Event } from '@dxos/async';
|
|
2
|
-
import { SignalApi } from './signal-api';
|
|
3
|
-
/**
|
|
4
|
-
* A websocket connection paired with nanomessage-rpc endpoint.
|
|
5
|
-
*
|
|
6
|
-
* Provides lifecycle events and command trace.
|
|
7
|
-
*
|
|
8
|
-
* Does not automatically reconnect, if the connection is dropped client must recreate the class instance.
|
|
9
|
-
*/
|
|
10
|
-
export declare class WebsocketRpc {
|
|
11
|
-
private readonly _host;
|
|
12
|
-
private readonly _connectTrigger;
|
|
13
|
-
private readonly _socket;
|
|
14
|
-
private readonly _rpc;
|
|
15
|
-
private _messageId;
|
|
16
|
-
readonly commandTrace: Event<SignalApi.CommandTrace>;
|
|
17
|
-
readonly connected: Event<void>;
|
|
18
|
-
readonly disconnected: Event<void>;
|
|
19
|
-
readonly error: Event<Error>;
|
|
20
|
-
/**
|
|
21
|
-
* @param _host Signal server websocket URL.
|
|
22
|
-
*/
|
|
23
|
-
constructor(_host: string);
|
|
24
|
-
close(): Promise<void>;
|
|
25
|
-
call(method: string, payload: any): Promise<any>;
|
|
26
|
-
emit(method: string, data: any): Promise<any>;
|
|
27
|
-
addHandler(method: string, handler: (data: any) => Promise<any>): void;
|
|
28
|
-
subscribe(method: string, handler: (data: any) => void): void;
|
|
29
|
-
}
|
|
30
|
-
//# sourceMappingURL=websocket-rpc.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"websocket-rpc.d.ts","sourceRoot":"","sources":["../../../src/signal/websocket-rpc.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,KAAK,EAAkB,MAAM,aAAa,CAAC;AAEpD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAMzC;;;;;;GAMG;AACH,qBAAa,YAAY;IAerB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAdxB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiB;IACjD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAY;IACpC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAM;IAC3B,OAAO,CAAC,UAAU,CAAc;IAEhC,QAAQ,CAAC,YAAY,gCAAuC;IAC5D,QAAQ,CAAC,SAAS,cAAe;IACjC,QAAQ,CAAC,YAAY,cAAe;IACpC,QAAQ,CAAC,KAAK,eAAsB;IAEpC;;OAEG;gBAEgB,KAAK,EAAE,MAAM;IAiE1B,KAAK;IAQL,IAAI,CAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAqCjD,IAAI,CAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG;IAYrC,UAAU,CAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC;IAgChE,SAAS,CAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI;CAaxD"}
|
|
@@ -1,203 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
//
|
|
3
|
-
// Copyright 2020 DXOS.org
|
|
4
|
-
//
|
|
5
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
|
-
};
|
|
8
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.WebsocketRpc = void 0;
|
|
10
|
-
const assert_1 = __importDefault(require("assert"));
|
|
11
|
-
const debug_1 = __importDefault(require("debug"));
|
|
12
|
-
const isomorphic_ws_1 = __importDefault(require("isomorphic-ws"));
|
|
13
|
-
const nanomessage_rpc_1 = __importDefault(require("nanomessage-rpc"));
|
|
14
|
-
const util_1 = require("util");
|
|
15
|
-
const async_1 = require("@dxos/async");
|
|
16
|
-
const log = (0, debug_1.default)('dxos:network-manager:websocket-rpc');
|
|
17
|
-
const RPC_TIMEOUT = 3000;
|
|
18
|
-
/**
|
|
19
|
-
* A websocket connection paired with nanomessage-rpc endpoint.
|
|
20
|
-
*
|
|
21
|
-
* Provides lifecycle events and command trace.
|
|
22
|
-
*
|
|
23
|
-
* Does not automatically reconnect, if the connection is dropped client must recreate the class instance.
|
|
24
|
-
*/
|
|
25
|
-
class WebsocketRpc {
|
|
26
|
-
/**
|
|
27
|
-
* @param _host Signal server websocket URL.
|
|
28
|
-
*/
|
|
29
|
-
constructor(_host) {
|
|
30
|
-
this._host = _host;
|
|
31
|
-
this._connectTrigger = new async_1.Trigger();
|
|
32
|
-
this._messageId = Date.now();
|
|
33
|
-
this.commandTrace = new async_1.Event();
|
|
34
|
-
this.connected = new async_1.Event();
|
|
35
|
-
this.disconnected = new async_1.Event();
|
|
36
|
-
this.error = new async_1.Event();
|
|
37
|
-
this._socket = new isomorphic_ws_1.default(this._host);
|
|
38
|
-
this._socket.onopen = async () => {
|
|
39
|
-
log(`Websocket connected ${this._host}`);
|
|
40
|
-
this._connectTrigger.wake();
|
|
41
|
-
try {
|
|
42
|
-
await this._rpc.open();
|
|
43
|
-
log(`RPC open ${this._host}`);
|
|
44
|
-
this.connected.emit();
|
|
45
|
-
}
|
|
46
|
-
catch (err) {
|
|
47
|
-
this.error.emit(err);
|
|
48
|
-
}
|
|
49
|
-
};
|
|
50
|
-
this._socket.onclose = async () => {
|
|
51
|
-
log(`Disconnected ${this._host}`);
|
|
52
|
-
this.disconnected.emit();
|
|
53
|
-
try {
|
|
54
|
-
await this._rpc.close();
|
|
55
|
-
}
|
|
56
|
-
catch (err) {
|
|
57
|
-
this.error.emit(err);
|
|
58
|
-
}
|
|
59
|
-
};
|
|
60
|
-
this._socket.onerror = e => {
|
|
61
|
-
var _a;
|
|
62
|
-
log(`Signal socket error ${this._host} ${e.message}`);
|
|
63
|
-
this.error.emit((_a = e.error) !== null && _a !== void 0 ? _a : new Error(e.message));
|
|
64
|
-
};
|
|
65
|
-
this._rpc = (0, nanomessage_rpc_1.default)({
|
|
66
|
-
send: async (data) => {
|
|
67
|
-
await this._connectTrigger.wait();
|
|
68
|
-
(0, assert_1.default)(this._socket, 'No socket');
|
|
69
|
-
await (0, util_1.promisify)(this._socket.send.bind(this._socket))(data);
|
|
70
|
-
},
|
|
71
|
-
subscribe: (next) => {
|
|
72
|
-
void this._connectTrigger.wait().then(() => {
|
|
73
|
-
(0, assert_1.default)(this._socket, 'No socket');
|
|
74
|
-
this._socket.onmessage = async (e) => {
|
|
75
|
-
try {
|
|
76
|
-
// `e.data` is Buffer in node, and Blob in chrome.
|
|
77
|
-
let data;
|
|
78
|
-
if (Object.getPrototypeOf(e.data).constructor.name === 'Blob') {
|
|
79
|
-
data = Buffer.from(await e.data.arrayBuffer());
|
|
80
|
-
}
|
|
81
|
-
else {
|
|
82
|
-
data = e.data;
|
|
83
|
-
}
|
|
84
|
-
next(data);
|
|
85
|
-
}
|
|
86
|
-
catch (err) {
|
|
87
|
-
this.error.emit(err);
|
|
88
|
-
}
|
|
89
|
-
};
|
|
90
|
-
});
|
|
91
|
-
return () => {
|
|
92
|
-
if (this._socket) {
|
|
93
|
-
this._socket.onmessage = () => { };
|
|
94
|
-
}
|
|
95
|
-
};
|
|
96
|
-
}
|
|
97
|
-
});
|
|
98
|
-
this._rpc.on('error', (error) => this.error.emit(error));
|
|
99
|
-
}
|
|
100
|
-
async close() {
|
|
101
|
-
try {
|
|
102
|
-
await this._rpc.close();
|
|
103
|
-
}
|
|
104
|
-
finally {
|
|
105
|
-
this._socket.close();
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
async call(method, payload) {
|
|
109
|
-
const start = Date.now();
|
|
110
|
-
try {
|
|
111
|
-
const response = await Promise.race([
|
|
112
|
-
(async () => {
|
|
113
|
-
await this._rpc.open();
|
|
114
|
-
await this._connectTrigger.wait();
|
|
115
|
-
return this._rpc.call(method, payload);
|
|
116
|
-
})(),
|
|
117
|
-
(0, async_1.sleep)(RPC_TIMEOUT).then(() => Promise.reject(new Error(`Signal RPC call timed out in ${RPC_TIMEOUT} ms`)))
|
|
118
|
-
]);
|
|
119
|
-
this.commandTrace.emit({
|
|
120
|
-
messageId: `${this._host}-${this._messageId++}`,
|
|
121
|
-
host: this._host,
|
|
122
|
-
incoming: false,
|
|
123
|
-
time: Date.now() - start,
|
|
124
|
-
method,
|
|
125
|
-
payload,
|
|
126
|
-
response
|
|
127
|
-
});
|
|
128
|
-
log(`Signal RPC ${this._host}: ${method} ${JSON.stringify(payload)} ${JSON.stringify(response)}`);
|
|
129
|
-
return response;
|
|
130
|
-
}
|
|
131
|
-
catch (err) {
|
|
132
|
-
log(`Signal RPC error ${this._host}: ${method} ${JSON.stringify(payload)} ${err.message}`);
|
|
133
|
-
this.commandTrace.emit({
|
|
134
|
-
messageId: `${this._host}-${this._messageId++}`,
|
|
135
|
-
host: this._host,
|
|
136
|
-
incoming: false,
|
|
137
|
-
time: Date.now() - start,
|
|
138
|
-
method,
|
|
139
|
-
payload,
|
|
140
|
-
error: err.message
|
|
141
|
-
});
|
|
142
|
-
throw err;
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
async emit(method, data) {
|
|
146
|
-
this.commandTrace.emit({
|
|
147
|
-
messageId: `${this._host}-${this._messageId++}`,
|
|
148
|
-
host: this._host,
|
|
149
|
-
incoming: false,
|
|
150
|
-
time: 0,
|
|
151
|
-
method,
|
|
152
|
-
payload: data
|
|
153
|
-
});
|
|
154
|
-
return this._rpc.emit('signal', data);
|
|
155
|
-
}
|
|
156
|
-
addHandler(method, handler) {
|
|
157
|
-
this._rpc.actions({
|
|
158
|
-
[method]: async (data) => {
|
|
159
|
-
const begin = Date.now();
|
|
160
|
-
try {
|
|
161
|
-
const response = await handler(data);
|
|
162
|
-
this.commandTrace.emit({
|
|
163
|
-
messageId: `${this._host}-${this._messageId++}`,
|
|
164
|
-
host: this._host,
|
|
165
|
-
incoming: true,
|
|
166
|
-
time: Date.now() - begin,
|
|
167
|
-
method,
|
|
168
|
-
payload: data,
|
|
169
|
-
response
|
|
170
|
-
});
|
|
171
|
-
return response;
|
|
172
|
-
}
|
|
173
|
-
catch (error) {
|
|
174
|
-
this.commandTrace.emit({
|
|
175
|
-
messageId: `${this._host}-${this._messageId++}`,
|
|
176
|
-
host: this._host,
|
|
177
|
-
incoming: true,
|
|
178
|
-
time: Date.now() - begin,
|
|
179
|
-
method,
|
|
180
|
-
payload: data,
|
|
181
|
-
error: error.message
|
|
182
|
-
});
|
|
183
|
-
throw error;
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
});
|
|
187
|
-
}
|
|
188
|
-
subscribe(method, handler) {
|
|
189
|
-
this._rpc.on(method, (data) => {
|
|
190
|
-
this.commandTrace.emit({
|
|
191
|
-
messageId: `${this._host}-${this._messageId++}`,
|
|
192
|
-
host: this._host,
|
|
193
|
-
incoming: true,
|
|
194
|
-
time: 0,
|
|
195
|
-
method,
|
|
196
|
-
payload: data
|
|
197
|
-
});
|
|
198
|
-
handler(data);
|
|
199
|
-
});
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
exports.WebsocketRpc = WebsocketRpc;
|
|
203
|
-
//# sourceMappingURL=websocket-rpc.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"websocket-rpc.js","sourceRoot":"","sources":["../../../src/signal/websocket-rpc.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"websocket-signal-manager.d.ts","sourceRoot":"","sources":["../../../src/signal/websocket-signal-manager.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,EAAgB,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAIjD,qBAAa,sBAAuB,YAAW,aAAa;IAexD,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAf3B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmC;IAE5D,qCAAqC;IACrC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgE;IAC9F,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAuD;IAE9F,OAAO,CAAC,mBAAmB,CAAC,CAAiB;IAE7C,QAAQ,CAAC,aAAa,4BAAmC;IACzD,QAAQ,CAAC,YAAY,gCAAuC;IAC5D,QAAQ,CAAC,qBAAqB,qDAA2D;IACzF,QAAQ,CAAC,QAAQ,iBAAwB;gBAGtB,MAAM,EAAE,MAAM,EAAE,EAChB,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,MAAM,CAAC;IAkBlE,SAAS,IAAK,SAAS,CAAC,MAAM,EAAE;IAIhC,IAAI,CAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS;IAMzC,KAAK,CAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS;YAO5B,sBAAsB;IA4CpC,OAAO,CAAC,UAAU;IAWlB,MAAM,CAAE,KAAK,EAAE,SAAS;IAgBxB,KAAK,CAAE,GAAG,EAAE,OAAO;IAMb,MAAM,CAAE,GAAG,EAAE,OAAO;IAQpB,OAAO;CAGd"}
|
|
@@ -1,134 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
//
|
|
3
|
-
// Copyright 2020 DXOS.org
|
|
4
|
-
//
|
|
5
|
-
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
6
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
7
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
8
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
9
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
10
|
-
};
|
|
11
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
-
};
|
|
14
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.WebsocketSignalManager = void 0;
|
|
16
|
-
const assert_1 = __importDefault(require("assert"));
|
|
17
|
-
const debug_1 = __importDefault(require("debug"));
|
|
18
|
-
const async_1 = require("@dxos/async");
|
|
19
|
-
const util_1 = require("@dxos/util");
|
|
20
|
-
const signal_client_1 = require("./signal-client");
|
|
21
|
-
const log = (0, debug_1.default)('dxos:network-manager:websocket-signal-manager');
|
|
22
|
-
class WebsocketSignalManager {
|
|
23
|
-
constructor(_hosts, _onOffer) {
|
|
24
|
-
this._hosts = _hosts;
|
|
25
|
-
this._onOffer = _onOffer;
|
|
26
|
-
this._servers = new Map();
|
|
27
|
-
/** Topics joined: topic => peerId */
|
|
28
|
-
this._topicsJoined = new util_1.ComplexMap(topic => topic.toHex());
|
|
29
|
-
this._topicsJoinedPerSignal = new Map();
|
|
30
|
-
this.statusChanged = new async_1.Event();
|
|
31
|
-
this.commandTrace = new async_1.Event();
|
|
32
|
-
this.peerCandidatesChanged = new async_1.Event();
|
|
33
|
-
this.onSignal = new async_1.Event();
|
|
34
|
-
log(`Created WebsocketSignalManager with signal servers: ${_hosts}`);
|
|
35
|
-
(0, assert_1.default)(_hosts.length === 1, 'Only a single signaling server connection is supported');
|
|
36
|
-
for (const host of this._hosts) {
|
|
37
|
-
const server = new signal_client_1.SignalClient(host, async (msg) => this._onOffer(msg), async (msg) => this.onSignal.emit(msg));
|
|
38
|
-
this._servers.set(host, server);
|
|
39
|
-
server.statusChanged.on(() => this.statusChanged.emit(this.getStatus()));
|
|
40
|
-
server.commandTrace.on(trace => this.commandTrace.emit(trace));
|
|
41
|
-
this._topicsJoinedPerSignal.set(host, new util_1.ComplexMap(x => x.toHex()));
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
getStatus() {
|
|
45
|
-
return Array.from(this._servers.values()).map(server => server.getStatus());
|
|
46
|
-
}
|
|
47
|
-
join(topic, peerId) {
|
|
48
|
-
log(`Join ${topic} ${peerId}`);
|
|
49
|
-
this._topicsJoined.set(topic, peerId);
|
|
50
|
-
void this._reconcileJoinedTopics();
|
|
51
|
-
}
|
|
52
|
-
leave(topic, peerId) {
|
|
53
|
-
log(`Leave ${topic} ${peerId}`);
|
|
54
|
-
this._topicsJoined.delete(topic);
|
|
55
|
-
void this._reconcileJoinedTopics();
|
|
56
|
-
}
|
|
57
|
-
async _reconcileJoinedTopics() {
|
|
58
|
-
log('Reconciling joined topics');
|
|
59
|
-
const promises = [];
|
|
60
|
-
for (const [host, server] of this._servers.entries()) {
|
|
61
|
-
for (const [topic, peerId] of this._topicsJoined.entries()) {
|
|
62
|
-
if (!this._topicsJoinedPerSignal.get(host).has(topic)) {
|
|
63
|
-
log(`Join ${topic} as ${peerId} on ${host}`);
|
|
64
|
-
promises.push(server.join(topic, peerId).then(peers => {
|
|
65
|
-
log(`Joined successfully ${host}`);
|
|
66
|
-
this._topicsJoinedPerSignal.get(host).set(topic, peerId);
|
|
67
|
-
log(`Peer candidates changed ${topic} ${peers}`);
|
|
68
|
-
// TODO(marik-d): Deduplicate peers.
|
|
69
|
-
this.peerCandidatesChanged.emit([topic, peers]);
|
|
70
|
-
}, err => {
|
|
71
|
-
log(`Join error ${host} ${err.message}`);
|
|
72
|
-
this._topicsJoinedPerSignal.get(host).delete(topic);
|
|
73
|
-
this._reconcile();
|
|
74
|
-
}));
|
|
75
|
-
}
|
|
76
|
-
for (const [topic, peerId] of this._topicsJoinedPerSignal.get(host).entries()) {
|
|
77
|
-
if (!this._topicsJoined.has(topic)) {
|
|
78
|
-
log(`Leave ${topic} as ${peerId} on ${host}`);
|
|
79
|
-
promises.push(server.leave(topic, peerId).then(() => {
|
|
80
|
-
log(`Left successfully ${host}`);
|
|
81
|
-
this._topicsJoinedPerSignal.get(host).delete(topic);
|
|
82
|
-
}, err => {
|
|
83
|
-
log(`Leave error ${host} ${err.message}`);
|
|
84
|
-
this._reconcile();
|
|
85
|
-
}));
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
await Promise.all(promises);
|
|
91
|
-
}
|
|
92
|
-
_reconcile() {
|
|
93
|
-
if (this._reconcileTimeoutId !== undefined) {
|
|
94
|
-
return;
|
|
95
|
-
}
|
|
96
|
-
log('Will reconcile in 3 seconds');
|
|
97
|
-
this._reconcileTimeoutId = setTimeout(async () => {
|
|
98
|
-
this._reconcileTimeoutId = undefined;
|
|
99
|
-
await this._reconcileJoinedTopics();
|
|
100
|
-
}, 3000);
|
|
101
|
-
}
|
|
102
|
-
lookup(topic) {
|
|
103
|
-
log(`Lookup ${topic}`);
|
|
104
|
-
for (const server of this._servers.values()) {
|
|
105
|
-
server.lookup(topic).then(peers => {
|
|
106
|
-
log(`Peer candidates changed ${topic} ${peers}`);
|
|
107
|
-
// TODO(marik-d): Deduplicate peers.
|
|
108
|
-
this.peerCandidatesChanged.emit([topic, peers]);
|
|
109
|
-
}, () => {
|
|
110
|
-
// Error will already be reported in devtools. No need to do anything here.
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
offer(msg) {
|
|
115
|
-
log(`Offer ${msg.remoteId}`);
|
|
116
|
-
// TODO(marik-d): Broadcast to all signal servers.
|
|
117
|
-
return Array.from(this._servers.values())[0].offer(msg);
|
|
118
|
-
}
|
|
119
|
-
async signal(msg) {
|
|
120
|
-
log(`Signal ${msg.remoteId}`);
|
|
121
|
-
for (const server of this._servers.values()) {
|
|
122
|
-
void server.signal(msg);
|
|
123
|
-
// TODO(marik-d): Error handling.
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
async destroy() {
|
|
127
|
-
await Promise.all(Array.from(this._servers.values()).map(server => server.close()));
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
__decorate([
|
|
131
|
-
async_1.synchronized
|
|
132
|
-
], WebsocketSignalManager.prototype, "_reconcileJoinedTopics", null);
|
|
133
|
-
exports.WebsocketSignalManager = WebsocketSignalManager;
|
|
134
|
-
//# sourceMappingURL=websocket-signal-manager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"websocket-signal-manager.js","sourceRoot":"","sources":["../../../src/signal/websocket-signal-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,208 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Copyright 2020 DXOS.org
|
|
3
|
-
//
|
|
4
|
-
|
|
5
|
-
import assert from 'assert';
|
|
6
|
-
import debug from 'debug';
|
|
7
|
-
import WebSocket from 'isomorphic-ws';
|
|
8
|
-
import nanomessagerpc from 'nanomessage-rpc';
|
|
9
|
-
import { promisify } from 'util';
|
|
10
|
-
|
|
11
|
-
import { Event, Trigger, sleep } from '@dxos/async';
|
|
12
|
-
|
|
13
|
-
import { SignalApi } from './signal-api';
|
|
14
|
-
|
|
15
|
-
const log = debug('dxos:network-manager:websocket-rpc');
|
|
16
|
-
|
|
17
|
-
const RPC_TIMEOUT = 3_000;
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* A websocket connection paired with nanomessage-rpc endpoint.
|
|
21
|
-
*
|
|
22
|
-
* Provides lifecycle events and command trace.
|
|
23
|
-
*
|
|
24
|
-
* Does not automatically reconnect, if the connection is dropped client must recreate the class instance.
|
|
25
|
-
*/
|
|
26
|
-
export class WebsocketRpc {
|
|
27
|
-
private readonly _connectTrigger = new Trigger();
|
|
28
|
-
private readonly _socket: WebSocket;
|
|
29
|
-
private readonly _rpc: any;
|
|
30
|
-
private _messageId = Date.now();
|
|
31
|
-
|
|
32
|
-
readonly commandTrace = new Event<SignalApi.CommandTrace>();
|
|
33
|
-
readonly connected = new Event();
|
|
34
|
-
readonly disconnected = new Event();
|
|
35
|
-
readonly error = new Event<Error>();
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* @param _host Signal server websocket URL.
|
|
39
|
-
*/
|
|
40
|
-
constructor (
|
|
41
|
-
private readonly _host: string
|
|
42
|
-
) {
|
|
43
|
-
this._socket = new WebSocket(this._host);
|
|
44
|
-
this._socket.onopen = async () => {
|
|
45
|
-
log(`Websocket connected ${this._host}`);
|
|
46
|
-
this._connectTrigger.wake();
|
|
47
|
-
try {
|
|
48
|
-
await this._rpc.open();
|
|
49
|
-
log(`RPC open ${this._host}`);
|
|
50
|
-
this.connected.emit();
|
|
51
|
-
} catch (err: any) {
|
|
52
|
-
this.error.emit(err);
|
|
53
|
-
}
|
|
54
|
-
};
|
|
55
|
-
|
|
56
|
-
this._socket.onclose = async () => {
|
|
57
|
-
log(`Disconnected ${this._host}`);
|
|
58
|
-
this.disconnected.emit();
|
|
59
|
-
try {
|
|
60
|
-
await this._rpc.close();
|
|
61
|
-
} catch (err: any) {
|
|
62
|
-
this.error.emit(err);
|
|
63
|
-
}
|
|
64
|
-
};
|
|
65
|
-
|
|
66
|
-
this._socket.onerror = e => {
|
|
67
|
-
log(`Signal socket error ${this._host} ${e.message}`);
|
|
68
|
-
this.error.emit(e.error ?? new Error(e.message));
|
|
69
|
-
};
|
|
70
|
-
|
|
71
|
-
this._rpc = nanomessagerpc({
|
|
72
|
-
send: async (data: Uint8Array) => {
|
|
73
|
-
await this._connectTrigger.wait();
|
|
74
|
-
assert(this._socket, 'No socket');
|
|
75
|
-
await promisify(this._socket.send.bind(this._socket) as any)(data);
|
|
76
|
-
},
|
|
77
|
-
subscribe: (next: (data: any) => void) => {
|
|
78
|
-
void this._connectTrigger.wait().then(() => {
|
|
79
|
-
assert(this._socket, 'No socket');
|
|
80
|
-
this._socket.onmessage = async e => {
|
|
81
|
-
try {
|
|
82
|
-
// `e.data` is Buffer in node, and Blob in chrome.
|
|
83
|
-
let data: Buffer;
|
|
84
|
-
if (Object.getPrototypeOf(e.data).constructor.name === 'Blob') {
|
|
85
|
-
data = Buffer.from(await (e.data as any).arrayBuffer());
|
|
86
|
-
} else {
|
|
87
|
-
data = e.data as any;
|
|
88
|
-
}
|
|
89
|
-
next(data);
|
|
90
|
-
} catch (err: any) {
|
|
91
|
-
this.error.emit(err);
|
|
92
|
-
}
|
|
93
|
-
};
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
return () => {
|
|
97
|
-
if (this._socket) {
|
|
98
|
-
this._socket.onmessage = () => {};
|
|
99
|
-
}
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
});
|
|
103
|
-
this._rpc.on('error', (error: Error) => this.error.emit(error));
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
async close () {
|
|
107
|
-
try {
|
|
108
|
-
await this._rpc.close();
|
|
109
|
-
} finally {
|
|
110
|
-
this._socket.close();
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
async call (method: string, payload: any): Promise<any> {
|
|
115
|
-
const start = Date.now();
|
|
116
|
-
try {
|
|
117
|
-
const response = await Promise.race([
|
|
118
|
-
(async () => {
|
|
119
|
-
await this._rpc.open();
|
|
120
|
-
await this._connectTrigger.wait();
|
|
121
|
-
return this._rpc.call(method, payload);
|
|
122
|
-
})(),
|
|
123
|
-
sleep(RPC_TIMEOUT).then(() => Promise.reject(new Error(`Signal RPC call timed out in ${RPC_TIMEOUT} ms`)))
|
|
124
|
-
]);
|
|
125
|
-
this.commandTrace.emit({
|
|
126
|
-
messageId: `${this._host}-${this._messageId++}`,
|
|
127
|
-
host: this._host,
|
|
128
|
-
incoming: false,
|
|
129
|
-
time: Date.now() - start,
|
|
130
|
-
method,
|
|
131
|
-
payload,
|
|
132
|
-
response
|
|
133
|
-
});
|
|
134
|
-
log(`Signal RPC ${this._host}: ${method} ${JSON.stringify(payload)} ${JSON.stringify(response)}`);
|
|
135
|
-
return response;
|
|
136
|
-
} catch (err: any) {
|
|
137
|
-
log(`Signal RPC error ${this._host}: ${method} ${JSON.stringify(payload)} ${err.message}`);
|
|
138
|
-
this.commandTrace.emit({
|
|
139
|
-
messageId: `${this._host}-${this._messageId++}`,
|
|
140
|
-
host: this._host,
|
|
141
|
-
incoming: false,
|
|
142
|
-
time: Date.now() - start,
|
|
143
|
-
method,
|
|
144
|
-
payload,
|
|
145
|
-
error: err.message
|
|
146
|
-
});
|
|
147
|
-
throw err;
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
async emit (method: string, data: any) {
|
|
152
|
-
this.commandTrace.emit({
|
|
153
|
-
messageId: `${this._host}-${this._messageId++}`,
|
|
154
|
-
host: this._host,
|
|
155
|
-
incoming: false,
|
|
156
|
-
time: 0,
|
|
157
|
-
method,
|
|
158
|
-
payload: data
|
|
159
|
-
});
|
|
160
|
-
return this._rpc.emit('signal', data);
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
addHandler (method: string, handler: (data: any) => Promise<any>) {
|
|
164
|
-
this._rpc.actions({
|
|
165
|
-
[method]: async (data: any) => {
|
|
166
|
-
const begin = Date.now();
|
|
167
|
-
try {
|
|
168
|
-
const response = await handler(data);
|
|
169
|
-
this.commandTrace.emit({
|
|
170
|
-
messageId: `${this._host}-${this._messageId++}`,
|
|
171
|
-
host: this._host,
|
|
172
|
-
incoming: true,
|
|
173
|
-
time: Date.now() - begin,
|
|
174
|
-
method,
|
|
175
|
-
payload: data,
|
|
176
|
-
response
|
|
177
|
-
});
|
|
178
|
-
return response;
|
|
179
|
-
} catch (error: any) {
|
|
180
|
-
this.commandTrace.emit({
|
|
181
|
-
messageId: `${this._host}-${this._messageId++}`,
|
|
182
|
-
host: this._host,
|
|
183
|
-
incoming: true,
|
|
184
|
-
time: Date.now() - begin,
|
|
185
|
-
method,
|
|
186
|
-
payload: data,
|
|
187
|
-
error: error.message
|
|
188
|
-
});
|
|
189
|
-
throw error;
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
});
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
subscribe (method: string, handler: (data: any) => void) {
|
|
196
|
-
this._rpc.on(method, (data: any) => {
|
|
197
|
-
this.commandTrace.emit({
|
|
198
|
-
messageId: `${this._host}-${this._messageId++}`,
|
|
199
|
-
host: this._host,
|
|
200
|
-
incoming: true,
|
|
201
|
-
time: 0,
|
|
202
|
-
method,
|
|
203
|
-
payload: data
|
|
204
|
-
});
|
|
205
|
-
handler(data);
|
|
206
|
-
});
|
|
207
|
-
}
|
|
208
|
-
}
|