@dxos/messaging 0.3.1-main.5e68e9d → 0.3.1-main.b9bb100

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.
@@ -16,6 +16,8 @@ var MESSAGE_TIMEOUT = 1e4;
16
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;
19
21
  var RECEIVED_MESSAGES_GC_INTERVAL = 12e4;
20
22
  var Messenger = class {
21
23
  constructor({ signalManager, retryDelay = 300 }) {
@@ -30,6 +32,8 @@ var Messenger = class {
30
32
  */
31
33
  this._toClear = new ComplexSet(PublicKey.hash);
32
34
  this._closed = true;
35
+ this._errorCount = 0;
36
+ this._rebooting = false;
33
37
  this._signalManager = signalManager;
34
38
  this._retryDelay = retryDelay;
35
39
  this.open();
@@ -43,14 +47,14 @@ var Messenger = class {
43
47
  id: traceId
44
48
  }), {
45
49
  F: __dxlog_file,
46
- L: 69,
50
+ L: 74,
47
51
  S: this,
48
52
  C: (f, a) => f(...a)
49
53
  });
50
54
  this._ctx = new Context({
51
55
  onError: (err) => log.catch(err, void 0, {
52
56
  F: __dxlog_file,
53
- L: 71,
57
+ L: 76,
54
58
  S: this,
55
59
  C: (f, a) => f(...a)
56
60
  })
@@ -60,7 +64,7 @@ var Messenger = class {
60
64
  from: message.author
61
65
  }, {
62
66
  F: __dxlog_file,
63
- L: 75,
67
+ L: 80,
64
68
  S: this,
65
69
  C: (f, a) => f(...a)
66
70
  });
@@ -74,7 +78,7 @@ var Messenger = class {
74
78
  id: traceId
75
79
  }), {
76
80
  F: __dxlog_file,
77
- L: 90,
81
+ L: 95,
78
82
  S: this,
79
83
  C: (f, a) => f(...a)
80
84
  });
@@ -89,7 +93,7 @@ var Messenger = class {
89
93
  async sendMessage({ author, recipient, payload }) {
90
94
  invariant(!this._closed, "Closed", {
91
95
  F: __dxlog_file,
92
- L: 102,
96
+ L: 107,
93
97
  S: this,
94
98
  A: [
95
99
  "!this._closed",
@@ -103,7 +107,7 @@ var Messenger = class {
103
107
  };
104
108
  invariant(!this._onAckCallbacks.has(reliablePayload.messageId), void 0, {
105
109
  F: __dxlog_file,
106
- L: 109,
110
+ L: 114,
107
111
  S: this,
108
112
  A: [
109
113
  "!this._onAckCallbacks.has(reliablePayload.messageId!)",
@@ -116,7 +120,7 @@ var Messenger = class {
116
120
  recipient
117
121
  }, {
118
122
  F: __dxlog_file,
119
- L: 110,
123
+ L: 115,
120
124
  S: this,
121
125
  C: (f, a) => f(...a)
122
126
  });
@@ -131,7 +135,7 @@ var Messenger = class {
131
135
  messageId: reliablePayload.messageId
132
136
  }, {
133
137
  F: __dxlog_file,
134
- L: 124,
138
+ L: 129,
135
139
  S: this,
136
140
  C: (f, a) => f(...a)
137
141
  });
@@ -143,21 +147,22 @@ var Messenger = class {
143
147
  err
144
148
  }, {
145
149
  F: __dxlog_file,
146
- L: 126,
150
+ L: 131,
147
151
  S: this,
148
152
  C: (f, a) => f(...a)
149
153
  }));
150
154
  }, this._retryDelay);
151
- scheduleTask(messageContext, () => {
155
+ scheduleTask(messageContext, async () => {
152
156
  log("message not delivered", {
153
157
  messageId: reliablePayload.messageId
154
158
  }, {
155
159
  F: __dxlog_file,
156
- L: 135,
160
+ L: 140,
157
161
  S: this,
158
162
  C: (f, a) => f(...a)
159
163
  });
160
164
  this._onAckCallbacks.delete(reliablePayload.messageId);
165
+ await this.errorLimitCheck();
161
166
  timeoutHit(new ProtocolTimeoutError("signaling message not delivered", new TimeoutError(MESSAGE_TIMEOUT, "Message not delivered")));
162
167
  void messageContext.dispose();
163
168
  }, MESSAGE_TIMEOUT);
@@ -173,6 +178,54 @@ var Messenger = class {
173
178
  });
174
179
  return promise;
175
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
+ }
176
229
  /**
177
230
  * Subscribes onMessage function to messages that contains payload with payloadType.
178
231
  * @param payloadType if not specified, onMessage will be subscribed to all types of messages.
@@ -180,7 +233,7 @@ var Messenger = class {
180
233
  async listen({ peerId, payloadType, onMessage }) {
181
234
  invariant(!this._closed, "Closed", {
182
235
  F: __dxlog_file,
183
- L: 171,
236
+ L: 204,
184
237
  S: this,
185
238
  A: [
186
239
  "!this._closed",
@@ -244,7 +297,7 @@ var Messenger = class {
244
297
  async _handleReliablePayload({ author, recipient, payload }) {
245
298
  invariant(payload.type_url === "dxos.mesh.messaging.ReliablePayload", void 0, {
246
299
  F: __dxlog_file,
247
- L: 232,
300
+ L: 265,
248
301
  S: this,
249
302
  A: [
250
303
  "payload.type_url === 'dxos.mesh.messaging.ReliablePayload'",
@@ -258,7 +311,7 @@ var Messenger = class {
258
311
  messageId: reliablePayload.messageId
259
312
  }, {
260
313
  F: __dxlog_file,
261
- L: 235,
314
+ L: 268,
262
315
  S: this,
263
316
  C: (f, a) => f(...a)
264
317
  });
@@ -280,7 +333,7 @@ var Messenger = class {
280
333
  async _handleAcknowledgement({ payload }) {
281
334
  invariant(payload.type_url === "dxos.mesh.messaging.Acknowledgement", void 0, {
282
335
  F: __dxlog_file,
283
- L: 257,
336
+ L: 290,
284
337
  S: this,
285
338
  A: [
286
339
  "payload.type_url === 'dxos.mesh.messaging.Acknowledgement'",
@@ -296,7 +349,7 @@ var Messenger = class {
296
349
  to: author
297
350
  }, {
298
351
  F: __dxlog_file,
299
- L: 270,
352
+ L: 303,
300
353
  S: this,
301
354
  C: (f, a) => f(...a)
302
355
  });
@@ -347,7 +400,7 @@ var Messenger = class {
347
400
  elapsed
348
401
  }, {
349
402
  F: __dxlog_file,
350
- L: 318,
403
+ L: 351,
351
404
  S: this,
352
405
  C: (f, a) => f(...a)
353
406
  });
@@ -1331,12 +1384,12 @@ var dec = (payload) => {
1331
1384
  };
1332
1385
 
1333
1386
  // packages/core/mesh/messaging/src/signal-manager/websocket-signal-manager.ts
1334
- import { Event as Event3, sleep as sleep2, synchronized } from "@dxos/async";
1387
+ import { Event as Event3, synchronized } from "@dxos/async";
1335
1388
  import { Context as Context4 } from "@dxos/context";
1336
1389
  import { invariant as invariant5 } from "@dxos/invariant";
1337
1390
  import { PublicKey as PublicKey5 } from "@dxos/keys";
1338
1391
  import { log as log5 } from "@dxos/log";
1339
- import { RateLimitExceededError, trace as trace4 } from "@dxos/protocols";
1392
+ import { trace as trace4 } from "@dxos/protocols";
1340
1393
  function _ts_decorate(decorators, target, key, desc) {
1341
1394
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1342
1395
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
@@ -1348,14 +1401,11 @@ function _ts_decorate(decorators, target, key, desc) {
1348
1401
  return c > 3 && r && Object.defineProperty(target, key, r), r;
1349
1402
  }
1350
1403
  var __dxlog_file5 = "/home/runner/work/dxos/dxos/packages/core/mesh/messaging/src/signal-manager/websocket-signal-manager.ts";
1351
- var MAX_SERVER_FAILURES = 5;
1352
- var WSS_SIGNAL_SERVER_REBOOT_DELAY = 3e3;
1353
1404
  var WebsocketSignalManager = class {
1354
1405
  constructor(_hosts) {
1355
1406
  this._hosts = _hosts;
1356
1407
  this._servers = /* @__PURE__ */ new Map();
1357
1408
  this._opened = false;
1358
- this.failureCount = /* @__PURE__ */ new Map();
1359
1409
  this.statusChanged = new Event3();
1360
1410
  this.commandTrace = new Event3();
1361
1411
  this.swarmEvent = new Event3();
@@ -1365,7 +1415,7 @@ var WebsocketSignalManager = class {
1365
1415
  hosts: this._hosts
1366
1416
  }, {
1367
1417
  F: __dxlog_file5,
1368
- L: 46,
1418
+ L: 43,
1369
1419
  S: this,
1370
1420
  C: (f, a) => f(...a)
1371
1421
  });
@@ -1376,7 +1426,6 @@ var WebsocketSignalManager = class {
1376
1426
  const server = new SignalClient(host.server, async (message) => this.onMessage.emit(message), async (data) => this.swarmEvent.emit(data));
1377
1427
  server.statusChanged.on(() => this.statusChanged.emit(this.getStatus()));
1378
1428
  this._servers.set(host.server, server);
1379
- this.failureCount.set(host.server, 0);
1380
1429
  server.commandTrace.on((trace5) => this.commandTrace.emit(trace5));
1381
1430
  }
1382
1431
  }
@@ -1388,7 +1437,7 @@ var WebsocketSignalManager = class {
1388
1437
  hosts: this._hosts
1389
1438
  }, {
1390
1439
  F: __dxlog_file5,
1391
- L: 69,
1440
+ L: 65,
1392
1441
  S: this,
1393
1442
  C: (f, a) => f(...a)
1394
1443
  });
@@ -1396,7 +1445,7 @@ var WebsocketSignalManager = class {
1396
1445
  id: this._instanceId
1397
1446
  }), {
1398
1447
  F: __dxlog_file5,
1399
- L: 70,
1448
+ L: 66,
1400
1449
  S: this,
1401
1450
  C: (f, a) => f(...a)
1402
1451
  });
@@ -1409,7 +1458,7 @@ var WebsocketSignalManager = class {
1409
1458
  id: this._instanceId
1410
1459
  }), {
1411
1460
  F: __dxlog_file5,
1412
- L: 77,
1461
+ L: 73,
1413
1462
  S: this,
1414
1463
  C: (f, a) => f(...a)
1415
1464
  });
@@ -1422,38 +1471,6 @@ var WebsocketSignalManager = class {
1422
1471
  await this._ctx.dispose();
1423
1472
  await Promise.all(Array.from(this._servers.values()).map((server) => server.close()));
1424
1473
  }
1425
- async restartServer(serverName) {
1426
- log5("Restarting server", {
1427
- serverName
1428
- }, {
1429
- F: __dxlog_file5,
1430
- L: 93,
1431
- S: this,
1432
- C: (f, a) => f(...a)
1433
- });
1434
- invariant5(this._opened, "server already closed", {
1435
- F: __dxlog_file5,
1436
- L: 94,
1437
- S: this,
1438
- A: [
1439
- "this._opened",
1440
- "'server already closed'"
1441
- ]
1442
- });
1443
- const server = this._servers.get(serverName);
1444
- invariant5(server, "server not found", {
1445
- F: __dxlog_file5,
1446
- L: 97,
1447
- S: this,
1448
- A: [
1449
- "server",
1450
- "'server not found'"
1451
- ]
1452
- });
1453
- await server.close();
1454
- await sleep2(WSS_SIGNAL_SERVER_REBOOT_DELAY);
1455
- await server.open();
1456
- }
1457
1474
  getStatus() {
1458
1475
  return Array.from(this._servers.values()).map((server) => server.getStatus());
1459
1476
  }
@@ -1463,13 +1480,13 @@ var WebsocketSignalManager = class {
1463
1480
  peerId
1464
1481
  }, {
1465
1482
  F: __dxlog_file5,
1466
- L: 110,
1483
+ L: 93,
1467
1484
  S: this,
1468
1485
  C: (f, a) => f(...a)
1469
1486
  });
1470
1487
  invariant5(this._opened, "Closed", {
1471
1488
  F: __dxlog_file5,
1472
- L: 111,
1489
+ L: 94,
1473
1490
  S: this,
1474
1491
  A: [
1475
1492
  "this._opened",
@@ -1487,13 +1504,13 @@ var WebsocketSignalManager = class {
1487
1504
  peerId
1488
1505
  }, {
1489
1506
  F: __dxlog_file5,
1490
- L: 117,
1507
+ L: 100,
1491
1508
  S: this,
1492
1509
  C: (f, a) => f(...a)
1493
1510
  });
1494
1511
  invariant5(this._opened, "Closed", {
1495
1512
  F: __dxlog_file5,
1496
- L: 118,
1513
+ L: 101,
1497
1514
  S: this,
1498
1515
  A: [
1499
1516
  "this._opened",
@@ -1506,75 +1523,44 @@ var WebsocketSignalManager = class {
1506
1523
  }));
1507
1524
  }
1508
1525
  async sendMessage({ author, recipient, payload }) {
1509
- log5(`Signal ${recipient.truncate()}`, void 0, {
1526
+ log5(`Signal ${recipient}`, void 0, {
1510
1527
  F: __dxlog_file5,
1511
- L: 132,
1528
+ L: 115,
1512
1529
  S: this,
1513
1530
  C: (f, a) => f(...a)
1514
1531
  });
1515
1532
  invariant5(this._opened, "Closed", {
1516
1533
  F: __dxlog_file5,
1517
- L: 133,
1534
+ L: 116,
1518
1535
  S: this,
1519
1536
  A: [
1520
1537
  "this._opened",
1521
1538
  "'Closed'"
1522
1539
  ]
1523
1540
  });
1524
- void this._forEachServer(async (server, serverName) => {
1541
+ void this._forEachServer(async (server) => {
1525
1542
  void server.sendMessage({
1526
1543
  author,
1527
1544
  recipient,
1528
1545
  payload
1529
- }).catch((err) => {
1530
- if (err instanceof RateLimitExceededError) {
1531
- log5("WSS rate limit exceeded", {
1532
- err
1533
- }, {
1534
- F: __dxlog_file5,
1535
- L: 138,
1536
- S: this,
1537
- C: (f, a) => f(...a)
1538
- });
1539
- } else {
1540
- log5(`error sending to ${serverName}`, {
1541
- err
1542
- }, {
1543
- F: __dxlog_file5,
1544
- L: 140,
1545
- S: this,
1546
- C: (f, a) => f(...a)
1547
- });
1548
- void this.checkServerFailure(serverName);
1549
- }
1550
- });
1551
- });
1552
- }
1553
- async checkServerFailure(serverName) {
1554
- const failureCount = this.failureCount.get(serverName) ?? 0;
1555
- if (failureCount > MAX_SERVER_FAILURES) {
1556
- log5.warn(`Too many failures sending to ${serverName} (${failureCount} > ${MAX_SERVER_FAILURES}), restarting`, void 0, {
1546
+ }).catch((err) => log5(err, void 0, {
1557
1547
  F: __dxlog_file5,
1558
- L: 151,
1548
+ L: 119,
1559
1549
  S: this,
1560
1550
  C: (f, a) => f(...a)
1561
- });
1562
- await this.restartServer(serverName);
1563
- this.failureCount.set(serverName, 0);
1564
- return;
1565
- }
1566
- this.failureCount.set(serverName, (this.failureCount.get(serverName) ?? 0) + 1);
1551
+ }));
1552
+ });
1567
1553
  }
1568
1554
  async subscribeMessages(peerId) {
1569
1555
  log5(`Subscribed for message stream peerId=${peerId}`, void 0, {
1570
1556
  F: __dxlog_file5,
1571
- L: 160,
1557
+ L: 124,
1572
1558
  S: this,
1573
1559
  C: (f, a) => f(...a)
1574
1560
  });
1575
1561
  invariant5(this._opened, "Closed", {
1576
1562
  F: __dxlog_file5,
1577
- L: 161,
1563
+ L: 125,
1578
1564
  S: this,
1579
1565
  A: [
1580
1566
  "this._opened",
@@ -1586,13 +1572,13 @@ var WebsocketSignalManager = class {
1586
1572
  async unsubscribeMessages(peerId) {
1587
1573
  log5(`Subscribed for message stream peerId=${peerId}`, void 0, {
1588
1574
  F: __dxlog_file5,
1589
- L: 167,
1575
+ L: 131,
1590
1576
  S: this,
1591
1577
  C: (f, a) => f(...a)
1592
1578
  });
1593
1579
  invariant5(this._opened, "Closed", {
1594
1580
  F: __dxlog_file5,
1595
- L: 168,
1581
+ L: 132,
1596
1582
  S: this,
1597
1583
  A: [
1598
1584
  "this._opened",
@@ -1605,31 +1591,25 @@ var WebsocketSignalManager = class {
1605
1591
  this._ctx = new Context4({
1606
1592
  onError: (err) => log5.catch(err, void 0, {
1607
1593
  F: __dxlog_file5,
1608
- L: 175,
1594
+ L: 139,
1609
1595
  S: this,
1610
1596
  C: (f, a) => f(...a)
1611
1597
  })
1612
1598
  });
1613
1599
  }
1614
1600
  async _forEachServer(fn) {
1615
- return Promise.all(Array.from(this._servers.entries()).map(([serverName, server]) => fn(server, serverName)));
1601
+ return Promise.all(Array.from(this._servers.values()).map(fn));
1616
1602
  }
1617
1603
  };
1618
1604
  _ts_decorate([
1619
1605
  synchronized
1620
1606
  ], WebsocketSignalManager.prototype, "open", null);
1621
- _ts_decorate([
1622
- synchronized
1623
- ], WebsocketSignalManager.prototype, "close", null);
1624
1607
  _ts_decorate([
1625
1608
  synchronized
1626
1609
  ], WebsocketSignalManager.prototype, "join", null);
1627
1610
  _ts_decorate([
1628
1611
  synchronized
1629
1612
  ], WebsocketSignalManager.prototype, "leave", null);
1630
- _ts_decorate([
1631
- synchronized
1632
- ], WebsocketSignalManager.prototype, "checkServerFailure", null);
1633
1613
  export {
1634
1614
  MemorySignalManager,
1635
1615
  MemorySignalManagerContext,