@dxos/network-manager 2.33.9-dev.d0ae5f95 → 2.33.9-dev.d0dce35f

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.
Files changed (151) hide show
  1. package/dist/src/network-manager.blueprint-test.d.ts +3 -1
  2. package/dist/src/network-manager.blueprint-test.d.ts.map +1 -1
  3. package/dist/src/network-manager.blueprint-test.js +50 -21
  4. package/dist/src/network-manager.blueprint-test.js.map +1 -1
  5. package/dist/src/network-manager.browser-test.js +1 -1
  6. package/dist/src/network-manager.browser-test.js.map +1 -1
  7. package/dist/src/network-manager.d.ts.map +1 -1
  8. package/dist/src/network-manager.js +6 -6
  9. package/dist/src/network-manager.js.map +1 -1
  10. package/dist/src/network-manager.test.js +5 -4
  11. package/dist/src/network-manager.test.js.map +1 -1
  12. package/dist/src/proto/gen/dxos/credentials.d.ts +39 -0
  13. package/dist/src/proto/gen/dxos/credentials.d.ts.map +1 -1
  14. package/dist/src/proto/gen/dxos/halo/keys.d.ts +44 -2
  15. package/dist/src/proto/gen/dxos/halo/keys.d.ts.map +1 -1
  16. package/dist/src/proto/gen/dxos/halo/keys.js +4 -0
  17. package/dist/src/proto/gen/dxos/halo/keys.js.map +1 -1
  18. package/dist/src/proto/gen/dxos/mesh/signal.d.ts +74 -37
  19. package/dist/src/proto/gen/dxos/mesh/signal.d.ts.map +1 -1
  20. package/dist/src/proto/gen/dxos/mesh/signalMessage.d.ts +79 -0
  21. package/dist/src/proto/gen/dxos/mesh/signalMessage.d.ts.map +1 -0
  22. package/dist/src/proto/gen/dxos/mesh/signalMessage.js +3 -0
  23. package/dist/src/proto/gen/dxos/mesh/signalMessage.js.map +1 -0
  24. package/dist/src/proto/gen/google/protobuf.d.ts +8 -2
  25. package/dist/src/proto/gen/google/protobuf.d.ts.map +1 -1
  26. package/dist/src/proto/gen/index.d.ts +17 -5
  27. package/dist/src/proto/gen/index.d.ts.map +1 -1
  28. package/dist/src/proto/gen/index.js +1 -1
  29. package/dist/src/proto/gen/index.js.map +1 -1
  30. package/dist/src/proto/substitutions.d.ts +4 -0
  31. package/dist/src/proto/substitutions.d.ts.map +1 -1
  32. package/dist/src/proto/substitutions.js +3 -1
  33. package/dist/src/proto/substitutions.js.map +1 -1
  34. package/dist/src/signal/in-memory-signal-manager.d.ts +7 -7
  35. package/dist/src/signal/in-memory-signal-manager.d.ts.map +1 -1
  36. package/dist/src/signal/in-memory-signal-manager.js +29 -8
  37. package/dist/src/signal/in-memory-signal-manager.js.map +1 -1
  38. package/dist/src/signal/index.d.ts +1 -2
  39. package/dist/src/signal/index.d.ts.map +1 -1
  40. package/dist/src/signal/index.js +1 -2
  41. package/dist/src/signal/index.js.map +1 -1
  42. package/dist/src/signal/integration.test.d.ts +2 -0
  43. package/dist/src/signal/integration.test.d.ts.map +1 -0
  44. package/dist/src/signal/integration.test.js +102 -0
  45. package/dist/src/signal/integration.test.js.map +1 -0
  46. package/dist/src/signal/message-router.d.ts +7 -7
  47. package/dist/src/signal/message-router.d.ts.map +1 -1
  48. package/dist/src/signal/message-router.js +6 -1
  49. package/dist/src/signal/message-router.js.map +1 -1
  50. package/dist/src/signal/message-router.test.js +15 -19
  51. package/dist/src/signal/message-router.test.js.map +1 -1
  52. package/dist/src/signal/signal-client.d.ts +33 -18
  53. package/dist/src/signal/signal-client.d.ts.map +1 -1
  54. package/dist/src/signal/signal-client.js +102 -92
  55. package/dist/src/signal/signal-client.js.map +1 -1
  56. package/dist/src/signal/signal-client.test.js +60 -77
  57. package/dist/src/signal/signal-client.test.js.map +1 -1
  58. package/dist/src/signal/{websocket-signal-manager.d.ts → signal-manager-impl.d.ts} +13 -11
  59. package/dist/src/signal/signal-manager-impl.d.ts.map +1 -0
  60. package/dist/src/signal/signal-manager-impl.js +151 -0
  61. package/dist/src/signal/signal-manager-impl.js.map +1 -0
  62. package/dist/src/signal/signal-manager.d.ts +12 -11
  63. package/dist/src/signal/signal-manager.d.ts.map +1 -1
  64. package/dist/src/signal/signal-rpc-client.d.ts +19 -0
  65. package/dist/src/signal/signal-rpc-client.d.ts.map +1 -0
  66. package/dist/src/signal/signal-rpc-client.js +108 -0
  67. package/dist/src/signal/signal-rpc-client.js.map +1 -0
  68. package/dist/src/signal/signal-rpc-client.test.d.ts +2 -0
  69. package/dist/src/signal/signal-rpc-client.test.d.ts.map +1 -0
  70. package/dist/src/signal/signal-rpc-client.test.js +74 -0
  71. package/dist/src/signal/signal-rpc-client.test.js.map +1 -0
  72. package/dist/src/swarm/connection.d.ts +3 -3
  73. package/dist/src/swarm/connection.d.ts.map +1 -1
  74. package/dist/src/swarm/connection.js +1 -4
  75. package/dist/src/swarm/connection.js.map +1 -1
  76. package/dist/src/swarm/swarm.d.ts +6 -7
  77. package/dist/src/swarm/swarm.d.ts.map +1 -1
  78. package/dist/src/swarm/swarm.js +21 -17
  79. package/dist/src/swarm/swarm.js.map +1 -1
  80. package/dist/src/swarm/swarm.test.js +156 -117
  81. package/dist/src/swarm/swarm.test.js.map +1 -1
  82. package/dist/src/topology/fully-connected-topology.d.ts +0 -1
  83. package/dist/src/topology/fully-connected-topology.d.ts.map +1 -1
  84. package/dist/src/topology/fully-connected-topology.js +1 -6
  85. package/dist/src/topology/fully-connected-topology.js.map +1 -1
  86. package/dist/src/topology/mmst-topology.d.ts +0 -1
  87. package/dist/src/topology/mmst-topology.d.ts.map +1 -1
  88. package/dist/src/topology/mmst-topology.js +1 -6
  89. package/dist/src/topology/mmst-topology.js.map +1 -1
  90. package/dist/src/topology/star-topology.d.ts +0 -1
  91. package/dist/src/topology/star-topology.d.ts.map +1 -1
  92. package/dist/src/topology/star-topology.js +1 -6
  93. package/dist/src/topology/star-topology.js.map +1 -1
  94. package/dist/src/topology/topology.d.ts +0 -6
  95. package/dist/src/topology/topology.d.ts.map +1 -1
  96. package/dist/src/transport/in-memory-transport.d.ts +2 -2
  97. package/dist/src/transport/in-memory-transport.d.ts.map +1 -1
  98. package/dist/src/transport/in-memory-transport.js.map +1 -1
  99. package/dist/src/transport/transport.d.ts +3 -3
  100. package/dist/src/transport/transport.d.ts.map +1 -1
  101. package/dist/src/transport/webrtc-transport.d.ts +3 -3
  102. package/dist/src/transport/webrtc-transport.d.ts.map +1 -1
  103. package/dist/src/transport/webrtc-transport.js.map +1 -1
  104. package/dist/tests-setup.js +1 -1
  105. package/dist/tsconfig.tsbuildinfo +1 -1
  106. package/package.json +16 -14
  107. package/src/network-manager.blueprint-test.ts +61 -26
  108. package/src/network-manager.browser-test.ts +1 -1
  109. package/src/network-manager.test.ts +8 -7
  110. package/src/network-manager.ts +8 -9
  111. package/src/proto/defs/dxos/mesh/signal.proto +53 -35
  112. package/src/proto/defs/dxos/mesh/signalMessage.proto +51 -0
  113. package/src/proto/gen/dxos/credentials.ts +40 -0
  114. package/src/proto/gen/dxos/halo/keys.ts +45 -2
  115. package/src/proto/gen/dxos/mesh/signal.ts +73 -37
  116. package/src/proto/gen/dxos/mesh/signalMessage.ts +83 -0
  117. package/src/proto/gen/google/protobuf.ts +9 -2
  118. package/src/proto/gen/index.ts +18 -6
  119. package/src/proto/substitutions.ts +3 -1
  120. package/src/signal/in-memory-signal-manager.ts +37 -12
  121. package/src/signal/index.ts +1 -2
  122. package/src/signal/integration.test.ts +117 -0
  123. package/src/signal/message-router.test.ts +36 -41
  124. package/src/signal/message-router.ts +22 -18
  125. package/src/signal/signal-client.test.ts +70 -92
  126. package/src/signal/signal-client.ts +119 -113
  127. package/src/signal/signal-manager-impl.ts +166 -0
  128. package/src/signal/signal-manager.ts +12 -12
  129. package/src/signal/signal-rpc-client.test.ts +86 -0
  130. package/src/signal/signal-rpc-client.ts +121 -0
  131. package/src/swarm/connection.ts +5 -8
  132. package/src/swarm/swarm.test.ts +208 -169
  133. package/src/swarm/swarm.ts +24 -20
  134. package/src/topology/fully-connected-topology.ts +1 -9
  135. package/src/topology/mmst-topology.ts +1 -9
  136. package/src/topology/star-topology.ts +1 -7
  137. package/src/topology/topology.ts +0 -7
  138. package/src/transport/in-memory-transport.ts +2 -2
  139. package/src/transport/transport.ts +3 -3
  140. package/src/transport/webrtc-transport.ts +3 -3
  141. package/dist/browser-mocha/bundle.js +0 -119276
  142. package/dist/browser-mocha/main.js +0 -27
  143. package/dist/src/signal/websocket-rpc.d.ts +0 -30
  144. package/dist/src/signal/websocket-rpc.d.ts.map +0 -1
  145. package/dist/src/signal/websocket-rpc.js +0 -203
  146. package/dist/src/signal/websocket-rpc.js.map +0 -1
  147. package/dist/src/signal/websocket-signal-manager.d.ts.map +0 -1
  148. package/dist/src/signal/websocket-signal-manager.js +0 -134
  149. package/dist/src/signal/websocket-signal-manager.js.map +0 -1
  150. package/src/signal/websocket-rpc.ts +0 -208
  151. package/src/signal/websocket-signal-manager.ts +0 -158
@@ -1,27 +0,0 @@
1
-
2
- import debug from 'debug';
3
-
4
-
5
-
6
- debug.enable('false');
7
-
8
- import { mocha } from 'mocha';
9
-
10
- async function run() {
11
- const context = await window.browserMocha__getEnv();
12
-
13
- window.browserMocha = { context };
14
-
15
- mocha.reporter('spec');
16
- mocha.setup('bdd');
17
- mocha.checkLeaks();
18
-
19
- require("../../src/network-manager.browser-test.ts");
20
-
21
- window.browserMocha__initFinished()
22
-
23
- mocha.run(window.browserMocha__testsDone);
24
- }
25
-
26
- run();
27
-
@@ -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 debug_1 = __importDefault(require("debug"));
11
- const isomorphic_ws_1 = __importDefault(require("isomorphic-ws"));
12
- const nanomessage_rpc_1 = __importDefault(require("nanomessage-rpc"));
13
- const node_assert_1 = __importDefault(require("node:assert"));
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, node_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, node_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 debug_1 = __importDefault(require("debug"));
17
- const node_assert_1 = __importDefault(require("node:assert"));
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, node_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 debug from 'debug';
6
- import WebSocket from 'isomorphic-ws';
7
- import nanomessagerpc from 'nanomessage-rpc';
8
- import assert from 'node:assert';
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
- }