@dxos/messaging 0.3.0 → 0.3.1-main.0fddbd4

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.
@@ -51,11 +51,9 @@ var import_util = require("@dxos/util");
51
51
  var MESSAGE_TIMEOUT = 1e4;
52
52
 
53
53
  // packages/core/mesh/messaging/src/messenger.ts
54
- var __dxlog_file = "/mnt/ramdisk/work/packages/core/mesh/messaging/src/messenger.ts";
54
+ var __dxlog_file = "/home/runner/work/dxos/dxos/packages/core/mesh/messaging/src/messenger.ts";
55
55
  var ReliablePayload = import_protocols.schema.getCodecForType("dxos.mesh.messaging.ReliablePayload");
56
56
  var Acknowledgement = import_protocols.schema.getCodecForType("dxos.mesh.messaging.Acknowledgement");
57
- var ERROR_LIMIT = 5;
58
- var NETWORK_REBOOT_DELAY = 3e3;
59
57
  var RECEIVED_MESSAGES_GC_INTERVAL = 12e4;
60
58
  var Messenger = class {
61
59
  constructor({ signalManager, retryDelay = 300 }) {
@@ -70,8 +68,6 @@ var Messenger = class {
70
68
  */
71
69
  this._toClear = new import_util.ComplexSet(import_keys.PublicKey.hash);
72
70
  this._closed = true;
73
- this._errorCount = 0;
74
- this._rebooting = false;
75
71
  this._signalManager = signalManager;
76
72
  this._retryDelay = retryDelay;
77
73
  this.open();
@@ -85,14 +81,14 @@ var Messenger = class {
85
81
  id: traceId
86
82
  }), {
87
83
  F: __dxlog_file,
88
- L: 74,
84
+ L: 69,
89
85
  S: this,
90
86
  C: (f, a) => f(...a)
91
87
  });
92
88
  this._ctx = new import_context.Context({
93
89
  onError: (err) => import_log.log.catch(err, void 0, {
94
90
  F: __dxlog_file,
95
- L: 76,
91
+ L: 71,
96
92
  S: this,
97
93
  C: (f, a) => f(...a)
98
94
  })
@@ -102,7 +98,7 @@ var Messenger = class {
102
98
  from: message.author
103
99
  }, {
104
100
  F: __dxlog_file,
105
- L: 80,
101
+ L: 75,
106
102
  S: this,
107
103
  C: (f, a) => f(...a)
108
104
  });
@@ -116,7 +112,7 @@ var Messenger = class {
116
112
  id: traceId
117
113
  }), {
118
114
  F: __dxlog_file,
119
- L: 95,
115
+ L: 90,
120
116
  S: this,
121
117
  C: (f, a) => f(...a)
122
118
  });
@@ -131,7 +127,7 @@ var Messenger = class {
131
127
  async sendMessage({ author, recipient, payload }) {
132
128
  (0, import_invariant.invariant)(!this._closed, "Closed", {
133
129
  F: __dxlog_file,
134
- L: 107,
130
+ L: 102,
135
131
  S: this,
136
132
  A: [
137
133
  "!this._closed",
@@ -145,7 +141,7 @@ var Messenger = class {
145
141
  };
146
142
  (0, import_invariant.invariant)(!this._onAckCallbacks.has(reliablePayload.messageId), void 0, {
147
143
  F: __dxlog_file,
148
- L: 114,
144
+ L: 109,
149
145
  S: this,
150
146
  A: [
151
147
  "!this._onAckCallbacks.has(reliablePayload.messageId!)",
@@ -158,7 +154,7 @@ var Messenger = class {
158
154
  recipient
159
155
  }, {
160
156
  F: __dxlog_file,
161
- L: 115,
157
+ L: 110,
162
158
  S: this,
163
159
  C: (f, a) => f(...a)
164
160
  });
@@ -173,7 +169,7 @@ var Messenger = class {
173
169
  messageId: reliablePayload.messageId
174
170
  }, {
175
171
  F: __dxlog_file,
176
- L: 129,
172
+ L: 124,
177
173
  S: this,
178
174
  C: (f, a) => f(...a)
179
175
  });
@@ -185,22 +181,21 @@ var Messenger = class {
185
181
  err
186
182
  }, {
187
183
  F: __dxlog_file,
188
- L: 131,
184
+ L: 126,
189
185
  S: this,
190
186
  C: (f, a) => f(...a)
191
187
  }));
192
188
  }, this._retryDelay);
193
- (0, import_async.scheduleTask)(messageContext, async () => {
189
+ (0, import_async.scheduleTask)(messageContext, () => {
194
190
  (0, import_log.log)("message not delivered", {
195
191
  messageId: reliablePayload.messageId
196
192
  }, {
197
193
  F: __dxlog_file,
198
- L: 140,
194
+ L: 135,
199
195
  S: this,
200
196
  C: (f, a) => f(...a)
201
197
  });
202
198
  this._onAckCallbacks.delete(reliablePayload.messageId);
203
- await this.errorLimitCheck();
204
199
  timeoutHit(new import_protocols.TimeoutError("signaling message not delivered", new import_async.TimeoutError(MESSAGE_TIMEOUT, "Message not delivered")));
205
200
  void messageContext.dispose();
206
201
  }, MESSAGE_TIMEOUT);
@@ -216,54 +211,6 @@ var Messenger = class {
216
211
  });
217
212
  return promise;
218
213
  }
219
- async errorLimitCheck() {
220
- (0, import_log.log)(`checking error limit ${this._errorCount}`, void 0, {
221
- F: __dxlog_file,
222
- L: 165,
223
- S: this,
224
- C: (f, a) => f(...a)
225
- });
226
- if (this._errorCount++ > ERROR_LIMIT) {
227
- await this.rebootNetwork();
228
- }
229
- }
230
- async rebootNetwork() {
231
- if (this._rebooting) {
232
- return;
233
- }
234
- this._rebooting = true;
235
- (0, import_log.log)("rebooting Messenger/SignalManager", void 0, {
236
- F: __dxlog_file,
237
- L: 177,
238
- S: this,
239
- C: (f, a) => f(...a)
240
- });
241
- await this.close();
242
- await this._signalManager.close();
243
- (0, import_log.log)("pausing", void 0, {
244
- F: __dxlog_file,
245
- L: 180,
246
- S: this,
247
- C: (f, a) => f(...a)
248
- });
249
- await new Promise((resolve) => setTimeout(resolve, NETWORK_REBOOT_DELAY));
250
- (0, import_log.log)("done pausing", void 0, {
251
- F: __dxlog_file,
252
- L: 182,
253
- S: this,
254
- C: (f, a) => f(...a)
255
- });
256
- await this.open();
257
- await this._signalManager.open();
258
- (0, import_log.log)("done rebooting", void 0, {
259
- F: __dxlog_file,
260
- L: 185,
261
- S: this,
262
- C: (f, a) => f(...a)
263
- });
264
- this._errorCount = 0;
265
- this._rebooting = false;
266
- }
267
214
  /**
268
215
  * Subscribes onMessage function to messages that contains payload with payloadType.
269
216
  * @param payloadType if not specified, onMessage will be subscribed to all types of messages.
@@ -271,7 +218,7 @@ var Messenger = class {
271
218
  async listen({ peerId, payloadType, onMessage }) {
272
219
  (0, import_invariant.invariant)(!this._closed, "Closed", {
273
220
  F: __dxlog_file,
274
- L: 204,
221
+ L: 171,
275
222
  S: this,
276
223
  A: [
277
224
  "!this._closed",
@@ -335,7 +282,7 @@ var Messenger = class {
335
282
  async _handleReliablePayload({ author, recipient, payload }) {
336
283
  (0, import_invariant.invariant)(payload.type_url === "dxos.mesh.messaging.ReliablePayload", void 0, {
337
284
  F: __dxlog_file,
338
- L: 265,
285
+ L: 232,
339
286
  S: this,
340
287
  A: [
341
288
  "payload.type_url === 'dxos.mesh.messaging.ReliablePayload'",
@@ -349,7 +296,7 @@ var Messenger = class {
349
296
  messageId: reliablePayload.messageId
350
297
  }, {
351
298
  F: __dxlog_file,
352
- L: 268,
299
+ L: 235,
353
300
  S: this,
354
301
  C: (f, a) => f(...a)
355
302
  });
@@ -371,7 +318,7 @@ var Messenger = class {
371
318
  async _handleAcknowledgement({ payload }) {
372
319
  (0, import_invariant.invariant)(payload.type_url === "dxos.mesh.messaging.Acknowledgement", void 0, {
373
320
  F: __dxlog_file,
374
- L: 290,
321
+ L: 257,
375
322
  S: this,
376
323
  A: [
377
324
  "payload.type_url === 'dxos.mesh.messaging.Acknowledgement'",
@@ -387,7 +334,7 @@ var Messenger = class {
387
334
  to: author
388
335
  }, {
389
336
  F: __dxlog_file,
390
- L: 303,
337
+ L: 270,
391
338
  S: this,
392
339
  C: (f, a) => f(...a)
393
340
  });
@@ -438,7 +385,7 @@ var Messenger = class {
438
385
  elapsed
439
386
  }, {
440
387
  F: __dxlog_file,
441
- L: 351,
388
+ L: 318,
442
389
  S: this,
443
390
  C: (f, a) => f(...a)
444
391
  });
@@ -464,7 +411,7 @@ var import_keys2 = require("@dxos/keys");
464
411
  var import_log2 = require("@dxos/log");
465
412
  var import_protocols2 = require("@dxos/protocols");
466
413
  var import_rpc = require("@dxos/rpc");
467
- var __dxlog_file2 = "/mnt/ramdisk/work/packages/core/mesh/messaging/src/signal-client/signal-rpc-client.ts";
414
+ var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/core/mesh/messaging/src/signal-client/signal-rpc-client.ts";
468
415
  var SignalRPCClient = class {
469
416
  constructor({ url, callbacks = {} }) {
470
417
  this._connectTrigger = new import_async2.Trigger();
@@ -699,7 +646,7 @@ var SignalRPCClient = class {
699
646
  };
700
647
 
701
648
  // packages/core/mesh/messaging/src/signal-client/signal-client.ts
702
- var __dxlog_file3 = "/mnt/ramdisk/work/packages/core/mesh/messaging/src/signal-client/signal-client.ts";
649
+ var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/core/mesh/messaging/src/signal-client/signal-client.ts";
703
650
  var DEFAULT_RECONNECT_TIMEOUT = 100;
704
651
  var MAX_RECONNECT_TIMEOUT = 5e3;
705
652
  var ERROR_RECONCILE_DELAY = 1e3;
@@ -1166,7 +1113,7 @@ var import_keys4 = require("@dxos/keys");
1166
1113
  var import_log4 = require("@dxos/log");
1167
1114
  var import_protocols4 = require("@dxos/protocols");
1168
1115
  var import_util3 = require("@dxos/util");
1169
- var __dxlog_file4 = "/mnt/ramdisk/work/packages/core/mesh/messaging/src/signal-manager/memory-signal-manager.ts";
1116
+ var __dxlog_file4 = "/home/runner/work/dxos/dxos/packages/core/mesh/messaging/src/signal-manager/memory-signal-manager.ts";
1170
1117
  var MemorySignalManagerContext = class {
1171
1118
  constructor() {
1172
1119
  // Swarm messages.
@@ -1438,12 +1385,15 @@ function _ts_decorate(decorators, target, key, desc) {
1438
1385
  r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1439
1386
  return c > 3 && r && Object.defineProperty(target, key, r), r;
1440
1387
  }
1441
- var __dxlog_file5 = "/mnt/ramdisk/work/packages/core/mesh/messaging/src/signal-manager/websocket-signal-manager.ts";
1388
+ var __dxlog_file5 = "/home/runner/work/dxos/dxos/packages/core/mesh/messaging/src/signal-manager/websocket-signal-manager.ts";
1389
+ var MAX_SERVER_FAILURES = 5;
1390
+ var WSS_SIGNAL_SERVER_REBOOT_DELAY = 3e3;
1442
1391
  var WebsocketSignalManager = class {
1443
1392
  constructor(_hosts) {
1444
1393
  this._hosts = _hosts;
1445
1394
  this._servers = /* @__PURE__ */ new Map();
1446
1395
  this._opened = false;
1396
+ this.failureCount = /* @__PURE__ */ new Map();
1447
1397
  this.statusChanged = new import_async5.Event();
1448
1398
  this.commandTrace = new import_async5.Event();
1449
1399
  this.swarmEvent = new import_async5.Event();
@@ -1453,7 +1403,7 @@ var WebsocketSignalManager = class {
1453
1403
  hosts: this._hosts
1454
1404
  }, {
1455
1405
  F: __dxlog_file5,
1456
- L: 43,
1406
+ L: 46,
1457
1407
  S: this,
1458
1408
  C: (f, a) => f(...a)
1459
1409
  });
@@ -1464,6 +1414,7 @@ var WebsocketSignalManager = class {
1464
1414
  const server = new SignalClient(host.server, async (message) => this.onMessage.emit(message), async (data) => this.swarmEvent.emit(data));
1465
1415
  server.statusChanged.on(() => this.statusChanged.emit(this.getStatus()));
1466
1416
  this._servers.set(host.server, server);
1417
+ this.failureCount.set(host.server, 0);
1467
1418
  server.commandTrace.on((trace5) => this.commandTrace.emit(trace5));
1468
1419
  }
1469
1420
  }
@@ -1475,7 +1426,7 @@ var WebsocketSignalManager = class {
1475
1426
  hosts: this._hosts
1476
1427
  }, {
1477
1428
  F: __dxlog_file5,
1478
- L: 65,
1429
+ L: 69,
1479
1430
  S: this,
1480
1431
  C: (f, a) => f(...a)
1481
1432
  });
@@ -1483,7 +1434,7 @@ var WebsocketSignalManager = class {
1483
1434
  id: this._instanceId
1484
1435
  }), {
1485
1436
  F: __dxlog_file5,
1486
- L: 66,
1437
+ L: 70,
1487
1438
  S: this,
1488
1439
  C: (f, a) => f(...a)
1489
1440
  });
@@ -1496,7 +1447,7 @@ var WebsocketSignalManager = class {
1496
1447
  id: this._instanceId
1497
1448
  }), {
1498
1449
  F: __dxlog_file5,
1499
- L: 73,
1450
+ L: 77,
1500
1451
  S: this,
1501
1452
  C: (f, a) => f(...a)
1502
1453
  });
@@ -1509,6 +1460,38 @@ var WebsocketSignalManager = class {
1509
1460
  await this._ctx.dispose();
1510
1461
  await Promise.all(Array.from(this._servers.values()).map((server) => server.close()));
1511
1462
  }
1463
+ async restartServer(serverName) {
1464
+ (0, import_log5.log)("Restarting server", {
1465
+ serverName
1466
+ }, {
1467
+ F: __dxlog_file5,
1468
+ L: 93,
1469
+ S: this,
1470
+ C: (f, a) => f(...a)
1471
+ });
1472
+ (0, import_invariant5.invariant)(this._opened, "server already closed", {
1473
+ F: __dxlog_file5,
1474
+ L: 94,
1475
+ S: this,
1476
+ A: [
1477
+ "this._opened",
1478
+ "'server already closed'"
1479
+ ]
1480
+ });
1481
+ const server = this._servers.get(serverName);
1482
+ (0, import_invariant5.invariant)(server, "server not found", {
1483
+ F: __dxlog_file5,
1484
+ L: 97,
1485
+ S: this,
1486
+ A: [
1487
+ "server",
1488
+ "'server not found'"
1489
+ ]
1490
+ });
1491
+ await server.close();
1492
+ await (0, import_async5.sleep)(WSS_SIGNAL_SERVER_REBOOT_DELAY);
1493
+ await server.open();
1494
+ }
1512
1495
  getStatus() {
1513
1496
  return Array.from(this._servers.values()).map((server) => server.getStatus());
1514
1497
  }
@@ -1518,13 +1501,13 @@ var WebsocketSignalManager = class {
1518
1501
  peerId
1519
1502
  }, {
1520
1503
  F: __dxlog_file5,
1521
- L: 93,
1504
+ L: 110,
1522
1505
  S: this,
1523
1506
  C: (f, a) => f(...a)
1524
1507
  });
1525
1508
  (0, import_invariant5.invariant)(this._opened, "Closed", {
1526
1509
  F: __dxlog_file5,
1527
- L: 94,
1510
+ L: 111,
1528
1511
  S: this,
1529
1512
  A: [
1530
1513
  "this._opened",
@@ -1542,13 +1525,13 @@ var WebsocketSignalManager = class {
1542
1525
  peerId
1543
1526
  }, {
1544
1527
  F: __dxlog_file5,
1545
- L: 100,
1528
+ L: 117,
1546
1529
  S: this,
1547
1530
  C: (f, a) => f(...a)
1548
1531
  });
1549
1532
  (0, import_invariant5.invariant)(this._opened, "Closed", {
1550
1533
  F: __dxlog_file5,
1551
- L: 101,
1534
+ L: 118,
1552
1535
  S: this,
1553
1536
  A: [
1554
1537
  "this._opened",
@@ -1561,44 +1544,75 @@ var WebsocketSignalManager = class {
1561
1544
  }));
1562
1545
  }
1563
1546
  async sendMessage({ author, recipient, payload }) {
1564
- (0, import_log5.log)(`Signal ${recipient}`, void 0, {
1547
+ (0, import_log5.log)(`Signal ${recipient.truncate()}`, void 0, {
1565
1548
  F: __dxlog_file5,
1566
- L: 115,
1549
+ L: 132,
1567
1550
  S: this,
1568
1551
  C: (f, a) => f(...a)
1569
1552
  });
1570
1553
  (0, import_invariant5.invariant)(this._opened, "Closed", {
1571
1554
  F: __dxlog_file5,
1572
- L: 116,
1555
+ L: 133,
1573
1556
  S: this,
1574
1557
  A: [
1575
1558
  "this._opened",
1576
1559
  "'Closed'"
1577
1560
  ]
1578
1561
  });
1579
- void this._forEachServer(async (server) => {
1562
+ void this._forEachServer(async (server, serverName) => {
1580
1563
  void server.sendMessage({
1581
1564
  author,
1582
1565
  recipient,
1583
1566
  payload
1584
- }).catch((err) => (0, import_log5.log)(err, void 0, {
1567
+ }).catch((err) => {
1568
+ if (err instanceof import_protocols5.RateLimitExceededError) {
1569
+ (0, import_log5.log)("WSS rate limit exceeded", {
1570
+ err
1571
+ }, {
1572
+ F: __dxlog_file5,
1573
+ L: 138,
1574
+ S: this,
1575
+ C: (f, a) => f(...a)
1576
+ });
1577
+ } else {
1578
+ (0, import_log5.log)(`error sending to ${serverName}`, {
1579
+ err
1580
+ }, {
1581
+ F: __dxlog_file5,
1582
+ L: 140,
1583
+ S: this,
1584
+ C: (f, a) => f(...a)
1585
+ });
1586
+ void this.checkServerFailure(serverName);
1587
+ }
1588
+ });
1589
+ });
1590
+ }
1591
+ async checkServerFailure(serverName) {
1592
+ const failureCount = this.failureCount.get(serverName) ?? 0;
1593
+ if (failureCount > MAX_SERVER_FAILURES) {
1594
+ import_log5.log.warn(`Too many failures sending to ${serverName} (${failureCount} > ${MAX_SERVER_FAILURES}), restarting`, void 0, {
1585
1595
  F: __dxlog_file5,
1586
- L: 119,
1596
+ L: 151,
1587
1597
  S: this,
1588
1598
  C: (f, a) => f(...a)
1589
- }));
1590
- });
1599
+ });
1600
+ await this.restartServer(serverName);
1601
+ this.failureCount.set(serverName, 0);
1602
+ return;
1603
+ }
1604
+ this.failureCount.set(serverName, (this.failureCount.get(serverName) ?? 0) + 1);
1591
1605
  }
1592
1606
  async subscribeMessages(peerId) {
1593
1607
  (0, import_log5.log)(`Subscribed for message stream peerId=${peerId}`, void 0, {
1594
1608
  F: __dxlog_file5,
1595
- L: 124,
1609
+ L: 160,
1596
1610
  S: this,
1597
1611
  C: (f, a) => f(...a)
1598
1612
  });
1599
1613
  (0, import_invariant5.invariant)(this._opened, "Closed", {
1600
1614
  F: __dxlog_file5,
1601
- L: 125,
1615
+ L: 161,
1602
1616
  S: this,
1603
1617
  A: [
1604
1618
  "this._opened",
@@ -1610,13 +1624,13 @@ var WebsocketSignalManager = class {
1610
1624
  async unsubscribeMessages(peerId) {
1611
1625
  (0, import_log5.log)(`Subscribed for message stream peerId=${peerId}`, void 0, {
1612
1626
  F: __dxlog_file5,
1613
- L: 131,
1627
+ L: 167,
1614
1628
  S: this,
1615
1629
  C: (f, a) => f(...a)
1616
1630
  });
1617
1631
  (0, import_invariant5.invariant)(this._opened, "Closed", {
1618
1632
  F: __dxlog_file5,
1619
- L: 132,
1633
+ L: 168,
1620
1634
  S: this,
1621
1635
  A: [
1622
1636
  "this._opened",
@@ -1629,25 +1643,31 @@ var WebsocketSignalManager = class {
1629
1643
  this._ctx = new import_context4.Context({
1630
1644
  onError: (err) => import_log5.log.catch(err, void 0, {
1631
1645
  F: __dxlog_file5,
1632
- L: 139,
1646
+ L: 175,
1633
1647
  S: this,
1634
1648
  C: (f, a) => f(...a)
1635
1649
  })
1636
1650
  });
1637
1651
  }
1638
1652
  async _forEachServer(fn) {
1639
- return Promise.all(Array.from(this._servers.values()).map(fn));
1653
+ return Promise.all(Array.from(this._servers.entries()).map(([serverName, server]) => fn(server, serverName)));
1640
1654
  }
1641
1655
  };
1642
1656
  _ts_decorate([
1643
1657
  import_async5.synchronized
1644
1658
  ], WebsocketSignalManager.prototype, "open", null);
1659
+ _ts_decorate([
1660
+ import_async5.synchronized
1661
+ ], WebsocketSignalManager.prototype, "close", null);
1645
1662
  _ts_decorate([
1646
1663
  import_async5.synchronized
1647
1664
  ], WebsocketSignalManager.prototype, "join", null);
1648
1665
  _ts_decorate([
1649
1666
  import_async5.synchronized
1650
1667
  ], WebsocketSignalManager.prototype, "leave", null);
1668
+ _ts_decorate([
1669
+ import_async5.synchronized
1670
+ ], WebsocketSignalManager.prototype, "checkServerFailure", null);
1651
1671
  // Annotate the CommonJS export names for ESM import in node:
1652
1672
  0 && (module.exports = {
1653
1673
  MemorySignalManager,