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

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