@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.
@@ -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 = "/mnt/ramdisk/work/packages/core/mesh/messaging/src/messenger.ts";
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((key) => key.toHex());
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: 62,
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: 64,
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: 68,
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: 73,
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: 85,
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: 92,
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: 93,
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: 107,
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: 109,
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: 118,
160
+ L: 140,
149
161
  S: this,
150
162
  C: (f, a) => f(...a)
151
163
  });
152
164
  this._onAckCallbacks.delete(reliablePayload.messageId);
153
- timeoutHit(new TimeoutError(MESSAGE_TIMEOUT, "Message not delivered"));
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: 149,
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: 210,
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: 213,
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: 235,
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: 248,
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 = "/mnt/ramdisk/work/packages/core/mesh/messaging/src/signal-client/signal-rpc-client.ts";
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 = "/mnt/ramdisk/work/packages/core/mesh/messaging/src/signal-client/signal-client.ts";
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
- scheduleTaskInterval(this._ctx, async () => {
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 = "/mnt/ramdisk/work/packages/core/mesh/messaging/src/signal-manager/memory-signal-manager.ts";
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 = "/mnt/ramdisk/work/packages/core/mesh/messaging/src/signal-manager/websocket-signal-manager.ts";
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) {