@dxos/messaging 0.1.57 → 0.1.58-main.0e9c99e
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/lib/browser/index.mjs +109 -27
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node/index.cjs +105 -23
- package/dist/lib/node/index.cjs.map +3 -3
- package/dist/lib/node/meta.json +1 -1
- package/dist/types/src/messenger.d.ts +9 -0
- package/dist/types/src/messenger.d.ts.map +1 -1
- package/package.json +12 -12
- package/src/messenger.ts +77 -5
|
@@ -1,21 +1,24 @@
|
|
|
1
1
|
import "@dxos/node-std/globals";
|
|
2
2
|
|
|
3
3
|
// packages/core/mesh/messaging/src/messenger.ts
|
|
4
|
-
import { TimeoutError, scheduleExponentialBackoffTaskInterval, scheduleTask } from "@dxos/async";
|
|
4
|
+
import { TimeoutError, scheduleExponentialBackoffTaskInterval, scheduleTask, scheduleTaskInterval } from "@dxos/async";
|
|
5
5
|
import { Context } from "@dxos/context";
|
|
6
6
|
import { invariant } from "@dxos/invariant";
|
|
7
7
|
import { PublicKey } from "@dxos/keys";
|
|
8
8
|
import { log } from "@dxos/log";
|
|
9
|
-
import { schema, trace } from "@dxos/protocols";
|
|
9
|
+
import { TimeoutError as ProtocolTimeoutError, schema, trace } from "@dxos/protocols";
|
|
10
10
|
import { ComplexMap, ComplexSet } from "@dxos/util";
|
|
11
11
|
|
|
12
12
|
// packages/core/mesh/messaging/src/timeouts.ts
|
|
13
13
|
var MESSAGE_TIMEOUT = 1e4;
|
|
14
14
|
|
|
15
15
|
// packages/core/mesh/messaging/src/messenger.ts
|
|
16
|
-
var __dxlog_file = "/
|
|
16
|
+
var __dxlog_file = "/home/runner/work/dxos/dxos/packages/core/mesh/messaging/src/messenger.ts";
|
|
17
17
|
var ReliablePayload = schema.getCodecForType("dxos.mesh.messaging.ReliablePayload");
|
|
18
18
|
var Acknowledgement = schema.getCodecForType("dxos.mesh.messaging.Acknowledgement");
|
|
19
|
+
var ERROR_LIMIT = 5;
|
|
20
|
+
var NETWORK_REBOOT_DELAY = 3e3;
|
|
21
|
+
var RECEIVED_MESSAGES_GC_INTERVAL = 12e4;
|
|
19
22
|
var Messenger = class {
|
|
20
23
|
constructor({ signalManager, retryDelay = 300 }) {
|
|
21
24
|
// { peerId, payloadType } => listeners set
|
|
@@ -23,8 +26,14 @@ var Messenger = class {
|
|
|
23
26
|
// peerId => listeners set
|
|
24
27
|
this._defaultListeners = new ComplexMap(PublicKey.hash);
|
|
25
28
|
this._onAckCallbacks = new ComplexMap(PublicKey.hash);
|
|
26
|
-
this._receivedMessages = new ComplexSet(
|
|
29
|
+
this._receivedMessages = new ComplexSet(PublicKey.hash);
|
|
30
|
+
/**
|
|
31
|
+
* Keys scheduled to be cleared from _receivedMessages on the next iteration.
|
|
32
|
+
*/
|
|
33
|
+
this._toClear = new ComplexSet(PublicKey.hash);
|
|
27
34
|
this._closed = true;
|
|
35
|
+
this._errorCount = 0;
|
|
36
|
+
this._rebooting = false;
|
|
28
37
|
this._signalManager = signalManager;
|
|
29
38
|
this._retryDelay = retryDelay;
|
|
30
39
|
this.open();
|
|
@@ -38,14 +47,14 @@ var Messenger = class {
|
|
|
38
47
|
id: traceId
|
|
39
48
|
}), {
|
|
40
49
|
F: __dxlog_file,
|
|
41
|
-
L:
|
|
50
|
+
L: 74,
|
|
42
51
|
S: this,
|
|
43
52
|
C: (f, a) => f(...a)
|
|
44
53
|
});
|
|
45
54
|
this._ctx = new Context({
|
|
46
55
|
onError: (err) => log.catch(err, void 0, {
|
|
47
56
|
F: __dxlog_file,
|
|
48
|
-
L:
|
|
57
|
+
L: 76,
|
|
49
58
|
S: this,
|
|
50
59
|
C: (f, a) => f(...a)
|
|
51
60
|
})
|
|
@@ -55,18 +64,21 @@ var Messenger = class {
|
|
|
55
64
|
from: message.author
|
|
56
65
|
}, {
|
|
57
66
|
F: __dxlog_file,
|
|
58
|
-
L:
|
|
67
|
+
L: 80,
|
|
59
68
|
S: this,
|
|
60
69
|
C: (f, a) => f(...a)
|
|
61
70
|
});
|
|
62
71
|
await this._handleMessage(message);
|
|
63
72
|
}));
|
|
73
|
+
scheduleTaskInterval(this._ctx, async () => {
|
|
74
|
+
this._performGc();
|
|
75
|
+
}, RECEIVED_MESSAGES_GC_INTERVAL);
|
|
64
76
|
this._closed = false;
|
|
65
77
|
log.trace("dxos.mesh.messenger.open", trace.end({
|
|
66
78
|
id: traceId
|
|
67
79
|
}), {
|
|
68
80
|
F: __dxlog_file,
|
|
69
|
-
L:
|
|
81
|
+
L: 95,
|
|
70
82
|
S: this,
|
|
71
83
|
C: (f, a) => f(...a)
|
|
72
84
|
});
|
|
@@ -81,7 +93,7 @@ var Messenger = class {
|
|
|
81
93
|
async sendMessage({ author, recipient, payload }) {
|
|
82
94
|
invariant(!this._closed, "Closed", {
|
|
83
95
|
F: __dxlog_file,
|
|
84
|
-
L:
|
|
96
|
+
L: 107,
|
|
85
97
|
S: this,
|
|
86
98
|
A: [
|
|
87
99
|
"!this._closed",
|
|
@@ -95,7 +107,7 @@ var Messenger = class {
|
|
|
95
107
|
};
|
|
96
108
|
invariant(!this._onAckCallbacks.has(reliablePayload.messageId), void 0, {
|
|
97
109
|
F: __dxlog_file,
|
|
98
|
-
L:
|
|
110
|
+
L: 114,
|
|
99
111
|
S: this,
|
|
100
112
|
A: [
|
|
101
113
|
"!this._onAckCallbacks.has(reliablePayload.messageId!)",
|
|
@@ -108,7 +120,7 @@ var Messenger = class {
|
|
|
108
120
|
recipient
|
|
109
121
|
}, {
|
|
110
122
|
F: __dxlog_file,
|
|
111
|
-
L:
|
|
123
|
+
L: 115,
|
|
112
124
|
S: this,
|
|
113
125
|
C: (f, a) => f(...a)
|
|
114
126
|
});
|
|
@@ -123,7 +135,7 @@ var Messenger = class {
|
|
|
123
135
|
messageId: reliablePayload.messageId
|
|
124
136
|
}, {
|
|
125
137
|
F: __dxlog_file,
|
|
126
|
-
L:
|
|
138
|
+
L: 129,
|
|
127
139
|
S: this,
|
|
128
140
|
C: (f, a) => f(...a)
|
|
129
141
|
});
|
|
@@ -135,22 +147,23 @@ var Messenger = class {
|
|
|
135
147
|
err
|
|
136
148
|
}, {
|
|
137
149
|
F: __dxlog_file,
|
|
138
|
-
L:
|
|
150
|
+
L: 131,
|
|
139
151
|
S: this,
|
|
140
152
|
C: (f, a) => f(...a)
|
|
141
153
|
}));
|
|
142
154
|
}, this._retryDelay);
|
|
143
|
-
scheduleTask(messageContext, () => {
|
|
155
|
+
scheduleTask(messageContext, async () => {
|
|
144
156
|
log("message not delivered", {
|
|
145
157
|
messageId: reliablePayload.messageId
|
|
146
158
|
}, {
|
|
147
159
|
F: __dxlog_file,
|
|
148
|
-
L:
|
|
160
|
+
L: 140,
|
|
149
161
|
S: this,
|
|
150
162
|
C: (f, a) => f(...a)
|
|
151
163
|
});
|
|
152
164
|
this._onAckCallbacks.delete(reliablePayload.messageId);
|
|
153
|
-
|
|
165
|
+
await this.errorLimitCheck();
|
|
166
|
+
timeoutHit(new ProtocolTimeoutError("signaling message not delivered", new TimeoutError(MESSAGE_TIMEOUT, "Message not delivered")));
|
|
154
167
|
void messageContext.dispose();
|
|
155
168
|
}, MESSAGE_TIMEOUT);
|
|
156
169
|
this._onAckCallbacks.set(reliablePayload.messageId, () => {
|
|
@@ -165,6 +178,54 @@ var Messenger = class {
|
|
|
165
178
|
});
|
|
166
179
|
return promise;
|
|
167
180
|
}
|
|
181
|
+
async errorLimitCheck() {
|
|
182
|
+
log(`checking error limit ${this._errorCount}`, void 0, {
|
|
183
|
+
F: __dxlog_file,
|
|
184
|
+
L: 165,
|
|
185
|
+
S: this,
|
|
186
|
+
C: (f, a) => f(...a)
|
|
187
|
+
});
|
|
188
|
+
if (this._errorCount++ > ERROR_LIMIT) {
|
|
189
|
+
await this.rebootNetwork();
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
async rebootNetwork() {
|
|
193
|
+
if (this._rebooting) {
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
this._rebooting = true;
|
|
197
|
+
log("rebooting Messenger/SignalManager", void 0, {
|
|
198
|
+
F: __dxlog_file,
|
|
199
|
+
L: 177,
|
|
200
|
+
S: this,
|
|
201
|
+
C: (f, a) => f(...a)
|
|
202
|
+
});
|
|
203
|
+
await this.close();
|
|
204
|
+
await this._signalManager.close();
|
|
205
|
+
log("pausing", void 0, {
|
|
206
|
+
F: __dxlog_file,
|
|
207
|
+
L: 180,
|
|
208
|
+
S: this,
|
|
209
|
+
C: (f, a) => f(...a)
|
|
210
|
+
});
|
|
211
|
+
await new Promise((resolve) => setTimeout(resolve, NETWORK_REBOOT_DELAY));
|
|
212
|
+
log("done pausing", void 0, {
|
|
213
|
+
F: __dxlog_file,
|
|
214
|
+
L: 182,
|
|
215
|
+
S: this,
|
|
216
|
+
C: (f, a) => f(...a)
|
|
217
|
+
});
|
|
218
|
+
await this.open();
|
|
219
|
+
await this._signalManager.open();
|
|
220
|
+
log("done rebooting", void 0, {
|
|
221
|
+
F: __dxlog_file,
|
|
222
|
+
L: 185,
|
|
223
|
+
S: this,
|
|
224
|
+
C: (f, a) => f(...a)
|
|
225
|
+
});
|
|
226
|
+
this._errorCount = 0;
|
|
227
|
+
this._rebooting = false;
|
|
228
|
+
}
|
|
168
229
|
/**
|
|
169
230
|
* Subscribes onMessage function to messages that contains payload with payloadType.
|
|
170
231
|
* @param payloadType if not specified, onMessage will be subscribed to all types of messages.
|
|
@@ -172,7 +233,7 @@ var Messenger = class {
|
|
|
172
233
|
async listen({ peerId, payloadType, onMessage }) {
|
|
173
234
|
invariant(!this._closed, "Closed", {
|
|
174
235
|
F: __dxlog_file,
|
|
175
|
-
L:
|
|
236
|
+
L: 204,
|
|
176
237
|
S: this,
|
|
177
238
|
A: [
|
|
178
239
|
"!this._closed",
|
|
@@ -236,7 +297,7 @@ var Messenger = class {
|
|
|
236
297
|
async _handleReliablePayload({ author, recipient, payload }) {
|
|
237
298
|
invariant(payload.type_url === "dxos.mesh.messaging.ReliablePayload", void 0, {
|
|
238
299
|
F: __dxlog_file,
|
|
239
|
-
L:
|
|
300
|
+
L: 265,
|
|
240
301
|
S: this,
|
|
241
302
|
A: [
|
|
242
303
|
"payload.type_url === 'dxos.mesh.messaging.ReliablePayload'",
|
|
@@ -250,7 +311,7 @@ var Messenger = class {
|
|
|
250
311
|
messageId: reliablePayload.messageId
|
|
251
312
|
}, {
|
|
252
313
|
F: __dxlog_file,
|
|
253
|
-
L:
|
|
314
|
+
L: 268,
|
|
254
315
|
S: this,
|
|
255
316
|
C: (f, a) => f(...a)
|
|
256
317
|
});
|
|
@@ -272,7 +333,7 @@ var Messenger = class {
|
|
|
272
333
|
async _handleAcknowledgement({ payload }) {
|
|
273
334
|
invariant(payload.type_url === "dxos.mesh.messaging.Acknowledgement", void 0, {
|
|
274
335
|
F: __dxlog_file,
|
|
275
|
-
L:
|
|
336
|
+
L: 290,
|
|
276
337
|
S: this,
|
|
277
338
|
A: [
|
|
278
339
|
"payload.type_url === 'dxos.mesh.messaging.Acknowledgement'",
|
|
@@ -288,7 +349,7 @@ var Messenger = class {
|
|
|
288
349
|
to: author
|
|
289
350
|
}, {
|
|
290
351
|
F: __dxlog_file,
|
|
291
|
-
L:
|
|
352
|
+
L: 303,
|
|
292
353
|
S: this,
|
|
293
354
|
C: (f, a) => f(...a)
|
|
294
355
|
});
|
|
@@ -324,10 +385,31 @@ var Messenger = class {
|
|
|
324
385
|
}
|
|
325
386
|
}
|
|
326
387
|
}
|
|
388
|
+
_performGc() {
|
|
389
|
+
const start = performance.now();
|
|
390
|
+
for (const key of this._toClear.keys()) {
|
|
391
|
+
this._receivedMessages.delete(key);
|
|
392
|
+
}
|
|
393
|
+
this._toClear.clear();
|
|
394
|
+
for (const key of this._receivedMessages.keys()) {
|
|
395
|
+
this._toClear.add(key);
|
|
396
|
+
}
|
|
397
|
+
const elapsed = performance.now() - start;
|
|
398
|
+
if (elapsed > 100) {
|
|
399
|
+
log.warn("GC took too long", {
|
|
400
|
+
elapsed
|
|
401
|
+
}, {
|
|
402
|
+
F: __dxlog_file,
|
|
403
|
+
L: 351,
|
|
404
|
+
S: this,
|
|
405
|
+
C: (f, a) => f(...a)
|
|
406
|
+
});
|
|
407
|
+
}
|
|
408
|
+
}
|
|
327
409
|
};
|
|
328
410
|
|
|
329
411
|
// packages/core/mesh/messaging/src/signal-client/signal-client.ts
|
|
330
|
-
import { DeferredTask, Event, Trigger as Trigger2, asyncTimeout, scheduleTask as scheduleTask2, scheduleTaskInterval, sleep } from "@dxos/async";
|
|
412
|
+
import { DeferredTask, Event, Trigger as Trigger2, asyncTimeout, scheduleTask as scheduleTask2, scheduleTaskInterval as scheduleTaskInterval2, sleep } from "@dxos/async";
|
|
331
413
|
import { Context as Context2, cancelWithContext } from "@dxos/context";
|
|
332
414
|
import { invariant as invariant3 } from "@dxos/invariant";
|
|
333
415
|
import { PublicKey as PublicKey3 } from "@dxos/keys";
|
|
@@ -344,7 +426,7 @@ import { PublicKey as PublicKey2 } from "@dxos/keys";
|
|
|
344
426
|
import { log as log2 } from "@dxos/log";
|
|
345
427
|
import { schema as schema2, trace as trace2 } from "@dxos/protocols";
|
|
346
428
|
import { createProtoRpcPeer } from "@dxos/rpc";
|
|
347
|
-
var __dxlog_file2 = "/
|
|
429
|
+
var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/core/mesh/messaging/src/signal-client/signal-rpc-client.ts";
|
|
348
430
|
var SignalRPCClient = class {
|
|
349
431
|
constructor({ url, callbacks = {} }) {
|
|
350
432
|
this._connectTrigger = new Trigger();
|
|
@@ -579,7 +661,7 @@ var SignalRPCClient = class {
|
|
|
579
661
|
};
|
|
580
662
|
|
|
581
663
|
// packages/core/mesh/messaging/src/signal-client/signal-client.ts
|
|
582
|
-
var __dxlog_file3 = "/
|
|
664
|
+
var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/core/mesh/messaging/src/signal-client/signal-client.ts";
|
|
583
665
|
var DEFAULT_RECONNECT_TIMEOUT = 100;
|
|
584
666
|
var MAX_RECONNECT_TIMEOUT = 5e3;
|
|
585
667
|
var ERROR_RECONCILE_DELAY = 1e3;
|
|
@@ -653,7 +735,7 @@ var SignalClient = class {
|
|
|
653
735
|
await this._reconcileMessageSubscriptions();
|
|
654
736
|
this._reconciled.emit();
|
|
655
737
|
});
|
|
656
|
-
|
|
738
|
+
scheduleTaskInterval2(this._ctx, async () => {
|
|
657
739
|
if (this._state === SignalState.CONNECTED) {
|
|
658
740
|
this._reconcileTask.schedule();
|
|
659
741
|
}
|
|
@@ -1046,7 +1128,7 @@ import { PublicKey as PublicKey4 } from "@dxos/keys";
|
|
|
1046
1128
|
import { log as log4 } from "@dxos/log";
|
|
1047
1129
|
import { schema as schema3 } from "@dxos/protocols";
|
|
1048
1130
|
import { ComplexMap as ComplexMap3, ComplexSet as ComplexSet3 } from "@dxos/util";
|
|
1049
|
-
var __dxlog_file4 = "/
|
|
1131
|
+
var __dxlog_file4 = "/home/runner/work/dxos/dxos/packages/core/mesh/messaging/src/signal-manager/memory-signal-manager.ts";
|
|
1050
1132
|
var MemorySignalManagerContext = class {
|
|
1051
1133
|
constructor() {
|
|
1052
1134
|
// Swarm messages.
|
|
@@ -1319,7 +1401,7 @@ function _ts_decorate(decorators, target, key, desc) {
|
|
|
1319
1401
|
r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
1320
1402
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
1321
1403
|
}
|
|
1322
|
-
var __dxlog_file5 = "/
|
|
1404
|
+
var __dxlog_file5 = "/home/runner/work/dxos/dxos/packages/core/mesh/messaging/src/signal-manager/websocket-signal-manager.ts";
|
|
1323
1405
|
var WebsocketSignalManager = class {
|
|
1324
1406
|
// prettier-ignore
|
|
1325
1407
|
constructor(_hosts) {
|