@dxos/messaging 0.4.5 → 0.4.6-main.3500f01
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 +34 -27
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node/index.cjs +29 -22
- package/dist/lib/node/index.cjs.map +3 -3
- package/dist/lib/node/meta.json +1 -1
- package/dist/types/src/signal-client/signal-rpc-client.d.ts +1 -0
- package/dist/types/src/signal-client/signal-rpc-client.d.ts.map +1 -1
- package/package.json +12 -12
- package/src/signal-client/signal-rpc-client.ts +18 -1
|
@@ -363,8 +363,8 @@ var Messenger = class {
|
|
|
363
363
|
};
|
|
364
364
|
|
|
365
365
|
// packages/core/mesh/messaging/src/signal-client/signal-client.ts
|
|
366
|
-
import { DeferredTask, Event, Trigger as Trigger2, asyncTimeout, scheduleTask as scheduleTask2, scheduleTaskInterval as
|
|
367
|
-
import { Context as
|
|
366
|
+
import { DeferredTask, Event, Trigger as Trigger2, asyncTimeout, scheduleTask as scheduleTask2, scheduleTaskInterval as scheduleTaskInterval3, sleep } from "@dxos/async";
|
|
367
|
+
import { Context as Context3, cancelWithContext } from "@dxos/context";
|
|
368
368
|
import { invariant as invariant3 } from "@dxos/invariant";
|
|
369
369
|
import { PublicKey as PublicKey3 } from "@dxos/keys";
|
|
370
370
|
import { log as log3 } from "@dxos/log";
|
|
@@ -374,13 +374,15 @@ import { ComplexMap as ComplexMap2, ComplexSet as ComplexSet2 } from "@dxos/util
|
|
|
374
374
|
|
|
375
375
|
// packages/core/mesh/messaging/src/signal-client/signal-rpc-client.ts
|
|
376
376
|
import WebSocket from "isomorphic-ws";
|
|
377
|
-
import { Trigger } from "@dxos/async";
|
|
377
|
+
import { scheduleTaskInterval as scheduleTaskInterval2, Trigger } from "@dxos/async";
|
|
378
|
+
import { Context as Context2 } from "@dxos/context";
|
|
378
379
|
import { invariant as invariant2 } from "@dxos/invariant";
|
|
379
380
|
import { PublicKey as PublicKey2 } from "@dxos/keys";
|
|
380
381
|
import { log as log2 } from "@dxos/log";
|
|
381
382
|
import { schema as schema2, trace as trace2 } from "@dxos/protocols";
|
|
382
383
|
import { createProtoRpcPeer } from "@dxos/rpc";
|
|
383
384
|
var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/core/mesh/messaging/src/signal-client/signal-rpc-client.ts";
|
|
385
|
+
var SIGNAL_KEEPALIVE_INTERVAL = 1e4;
|
|
384
386
|
var SignalRPCClient = class {
|
|
385
387
|
constructor({ url, callbacks = {} }) {
|
|
386
388
|
this._connectTrigger = new Trigger();
|
|
@@ -390,7 +392,7 @@ var SignalRPCClient = class {
|
|
|
390
392
|
id: traceId
|
|
391
393
|
}), {
|
|
392
394
|
F: __dxlog_file2,
|
|
393
|
-
L:
|
|
395
|
+
L: 53,
|
|
394
396
|
S: this,
|
|
395
397
|
C: (f, a) => f(...a)
|
|
396
398
|
});
|
|
@@ -412,7 +414,7 @@ var SignalRPCClient = class {
|
|
|
412
414
|
} catch (err) {
|
|
413
415
|
log2.warn("send error", err, {
|
|
414
416
|
F: __dxlog_file2,
|
|
415
|
-
L:
|
|
417
|
+
L: 72,
|
|
416
418
|
S: this,
|
|
417
419
|
C: (f, a) => f(...a)
|
|
418
420
|
});
|
|
@@ -437,12 +439,16 @@ var SignalRPCClient = class {
|
|
|
437
439
|
await this._rpc.open();
|
|
438
440
|
log2(`RPC open ${this._url}`, void 0, {
|
|
439
441
|
F: __dxlog_file2,
|
|
440
|
-
L:
|
|
442
|
+
L: 93,
|
|
441
443
|
S: this,
|
|
442
444
|
C: (f, a) => f(...a)
|
|
443
445
|
});
|
|
444
446
|
this._callbacks.onConnected?.();
|
|
445
447
|
this._connectTrigger.wake();
|
|
448
|
+
this._keepaliveCtx = new Context2();
|
|
449
|
+
scheduleTaskInterval2(this._keepaliveCtx, async () => {
|
|
450
|
+
this._socket?.send("__ping__");
|
|
451
|
+
}, SIGNAL_KEEPALIVE_INTERVAL);
|
|
446
452
|
} catch (err) {
|
|
447
453
|
this._callbacks.onError?.(err);
|
|
448
454
|
}
|
|
@@ -450,7 +456,7 @@ var SignalRPCClient = class {
|
|
|
450
456
|
this._socket.onclose = async () => {
|
|
451
457
|
log2(`Disconnected ${this._url}`, void 0, {
|
|
452
458
|
F: __dxlog_file2,
|
|
453
|
-
L:
|
|
459
|
+
L: 114,
|
|
454
460
|
S: this,
|
|
455
461
|
C: (f, a) => f(...a)
|
|
456
462
|
});
|
|
@@ -468,7 +474,7 @@ var SignalRPCClient = class {
|
|
|
468
474
|
} catch (err) {
|
|
469
475
|
log2.catch(err, void 0, {
|
|
470
476
|
F: __dxlog_file2,
|
|
471
|
-
L:
|
|
477
|
+
L: 131,
|
|
472
478
|
S: this,
|
|
473
479
|
C: (f, a) => f(...a)
|
|
474
480
|
});
|
|
@@ -478,7 +484,7 @@ var SignalRPCClient = class {
|
|
|
478
484
|
url: this._url
|
|
479
485
|
}, {
|
|
480
486
|
F: __dxlog_file2,
|
|
481
|
-
L:
|
|
487
|
+
L: 135,
|
|
482
488
|
S: this,
|
|
483
489
|
C: (f, a) => f(...a)
|
|
484
490
|
});
|
|
@@ -487,12 +493,13 @@ var SignalRPCClient = class {
|
|
|
487
493
|
id: traceId
|
|
488
494
|
}), {
|
|
489
495
|
F: __dxlog_file2,
|
|
490
|
-
L:
|
|
496
|
+
L: 138,
|
|
491
497
|
S: this,
|
|
492
498
|
C: (f, a) => f(...a)
|
|
493
499
|
});
|
|
494
500
|
}
|
|
495
501
|
async close() {
|
|
502
|
+
await this._keepaliveCtx?.dispose();
|
|
496
503
|
this._closed = true;
|
|
497
504
|
try {
|
|
498
505
|
await this._rpc?.close();
|
|
@@ -500,7 +507,7 @@ var SignalRPCClient = class {
|
|
|
500
507
|
} catch (err) {
|
|
501
508
|
log2.warn("close error", err, {
|
|
502
509
|
F: __dxlog_file2,
|
|
503
|
-
L:
|
|
510
|
+
L: 148,
|
|
504
511
|
S: this,
|
|
505
512
|
C: (f, a) => f(...a)
|
|
506
513
|
});
|
|
@@ -512,14 +519,14 @@ var SignalRPCClient = class {
|
|
|
512
519
|
peerId
|
|
513
520
|
}, {
|
|
514
521
|
F: __dxlog_file2,
|
|
515
|
-
L:
|
|
522
|
+
L: 153,
|
|
516
523
|
S: this,
|
|
517
524
|
C: (f, a) => f(...a)
|
|
518
525
|
});
|
|
519
526
|
await this._connectTrigger.wait();
|
|
520
527
|
invariant2(!this._closed, "SignalRPCClient is closed", {
|
|
521
528
|
F: __dxlog_file2,
|
|
522
|
-
L:
|
|
529
|
+
L: 155,
|
|
523
530
|
S: this,
|
|
524
531
|
A: [
|
|
525
532
|
"!this._closed",
|
|
@@ -528,7 +535,7 @@ var SignalRPCClient = class {
|
|
|
528
535
|
});
|
|
529
536
|
invariant2(this._rpc, "Rpc is not initialized", {
|
|
530
537
|
F: __dxlog_file2,
|
|
531
|
-
L:
|
|
538
|
+
L: 156,
|
|
532
539
|
S: this,
|
|
533
540
|
A: [
|
|
534
541
|
"this._rpc",
|
|
@@ -547,13 +554,13 @@ var SignalRPCClient = class {
|
|
|
547
554
|
peerId
|
|
548
555
|
}, {
|
|
549
556
|
F: __dxlog_file2,
|
|
550
|
-
L:
|
|
557
|
+
L: 166,
|
|
551
558
|
S: this,
|
|
552
559
|
C: (f, a) => f(...a)
|
|
553
560
|
});
|
|
554
561
|
invariant2(!this._closed, "SignalRPCClient is closed", {
|
|
555
562
|
F: __dxlog_file2,
|
|
556
|
-
L:
|
|
563
|
+
L: 167,
|
|
557
564
|
S: this,
|
|
558
565
|
A: [
|
|
559
566
|
"!this._closed",
|
|
@@ -563,7 +570,7 @@ var SignalRPCClient = class {
|
|
|
563
570
|
await this._connectTrigger.wait();
|
|
564
571
|
invariant2(this._rpc, "Rpc is not initialized", {
|
|
565
572
|
F: __dxlog_file2,
|
|
566
|
-
L:
|
|
573
|
+
L: 169,
|
|
567
574
|
S: this,
|
|
568
575
|
A: [
|
|
569
576
|
"this._rpc",
|
|
@@ -583,13 +590,13 @@ var SignalRPCClient = class {
|
|
|
583
590
|
payload
|
|
584
591
|
}, {
|
|
585
592
|
F: __dxlog_file2,
|
|
586
|
-
L:
|
|
593
|
+
L: 178,
|
|
587
594
|
S: this,
|
|
588
595
|
C: (f, a) => f(...a)
|
|
589
596
|
});
|
|
590
597
|
invariant2(!this._closed, "SignalRPCClient is closed", {
|
|
591
598
|
F: __dxlog_file2,
|
|
592
|
-
L:
|
|
599
|
+
L: 179,
|
|
593
600
|
S: this,
|
|
594
601
|
A: [
|
|
595
602
|
"!this._closed",
|
|
@@ -599,7 +606,7 @@ var SignalRPCClient = class {
|
|
|
599
606
|
await this._connectTrigger.wait();
|
|
600
607
|
invariant2(this._rpc, "Rpc is not initialized", {
|
|
601
608
|
F: __dxlog_file2,
|
|
602
|
-
L:
|
|
609
|
+
L: 181,
|
|
603
610
|
S: this,
|
|
604
611
|
A: [
|
|
605
612
|
"this._rpc",
|
|
@@ -668,7 +675,7 @@ var SignalClient = class {
|
|
|
668
675
|
].includes(this._state)) {
|
|
669
676
|
return;
|
|
670
677
|
}
|
|
671
|
-
this._ctx = new
|
|
678
|
+
this._ctx = new Context3({
|
|
672
679
|
onError: (err) => {
|
|
673
680
|
if (this._state === SignalState.CLOSED || this._ctx?.disposed) {
|
|
674
681
|
return;
|
|
@@ -689,7 +696,7 @@ var SignalClient = class {
|
|
|
689
696
|
await this._reconcileMessageSubscriptions();
|
|
690
697
|
this._reconciled.emit();
|
|
691
698
|
});
|
|
692
|
-
|
|
699
|
+
scheduleTaskInterval3(this._ctx, async () => {
|
|
693
700
|
if (this._state === SignalState.CONNECTED) {
|
|
694
701
|
this._reconcileTask.schedule();
|
|
695
702
|
}
|
|
@@ -1076,7 +1083,7 @@ var SignalClient = class {
|
|
|
1076
1083
|
|
|
1077
1084
|
// packages/core/mesh/messaging/src/signal-manager/memory-signal-manager.ts
|
|
1078
1085
|
import { Event as Event2, Trigger as Trigger3 } from "@dxos/async";
|
|
1079
|
-
import { Context as
|
|
1086
|
+
import { Context as Context4 } from "@dxos/context";
|
|
1080
1087
|
import { invariant as invariant4 } from "@dxos/invariant";
|
|
1081
1088
|
import { PublicKey as PublicKey4 } from "@dxos/keys";
|
|
1082
1089
|
import { log as log4 } from "@dxos/log";
|
|
@@ -1102,14 +1109,14 @@ var MemorySignalManager = class {
|
|
|
1102
1109
|
this.onMessage = new Event2();
|
|
1103
1110
|
this._joinedSwarms = new ComplexSet3(({ topic, peerId }) => topic.toHex() + peerId.toHex());
|
|
1104
1111
|
this._freezeTrigger = new Trigger3().wake();
|
|
1105
|
-
this._ctx = new
|
|
1112
|
+
this._ctx = new Context4();
|
|
1106
1113
|
this._ctx.onDispose(this._context.swarmEvent.on((data) => this.swarmEvent.emit(data)));
|
|
1107
1114
|
}
|
|
1108
1115
|
async open() {
|
|
1109
1116
|
if (!this._ctx.disposed) {
|
|
1110
1117
|
return;
|
|
1111
1118
|
}
|
|
1112
|
-
this._ctx = new
|
|
1119
|
+
this._ctx = new Context4();
|
|
1113
1120
|
this._ctx.onDispose(this._context.swarmEvent.on((data) => this.swarmEvent.emit(data)));
|
|
1114
1121
|
await Promise.all([
|
|
1115
1122
|
...this._joinedSwarms.values()
|
|
@@ -1339,7 +1346,7 @@ var dec = (payload) => {
|
|
|
1339
1346
|
|
|
1340
1347
|
// packages/core/mesh/messaging/src/signal-manager/websocket-signal-manager.ts
|
|
1341
1348
|
import { Event as Event3, sleep as sleep2, synchronized } from "@dxos/async";
|
|
1342
|
-
import { Context as
|
|
1349
|
+
import { Context as Context5 } from "@dxos/context";
|
|
1343
1350
|
import { invariant as invariant5 } from "@dxos/invariant";
|
|
1344
1351
|
import { PublicKey as PublicKey5 } from "@dxos/keys";
|
|
1345
1352
|
import { log as log5 } from "@dxos/log";
|
|
@@ -1619,7 +1626,7 @@ var WebsocketSignalManager = class {
|
|
|
1619
1626
|
await this._forEachServer(async (server) => server.unsubscribeMessages(peerId));
|
|
1620
1627
|
}
|
|
1621
1628
|
_initContext() {
|
|
1622
|
-
this._ctx = new
|
|
1629
|
+
this._ctx = new Context5({
|
|
1623
1630
|
onError: (err) => log5.catch(err, void 0, {
|
|
1624
1631
|
F: __dxlog_file5,
|
|
1625
1632
|
L: 178,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/messenger.ts", "../../../src/timeouts.ts", "../../../src/signal-client/signal-client.ts", "../../../src/signal-client/signal-rpc-client.ts", "../../../src/signal-manager/memory-signal-manager.ts", "../../../src/signal-manager/websocket-signal-manager.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2022 DXOS.org\n//\n\nimport { TimeoutError, scheduleExponentialBackoffTaskInterval, scheduleTask, scheduleTaskInterval } from '@dxos/async';\nimport { type Any } from '@dxos/codec-protobuf';\nimport { Context } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { TimeoutError as ProtocolTimeoutError, schema, trace } from '@dxos/protocols';\nimport { ReliablePayload } from '@dxos/protocols/proto/dxos/mesh/messaging';\nimport { ComplexMap, ComplexSet } from '@dxos/util';\n\nimport { type SignalManager } from './signal-manager';\nimport { type Message } from './signal-methods';\nimport { MESSAGE_TIMEOUT } from './timeouts';\n\nexport type OnMessage = (params: { author: PublicKey; recipient: PublicKey; payload: Any }) => Promise<void>;\n\nexport interface MessengerOptions {\n signalManager: SignalManager;\n retryDelay?: number;\n}\n\nconst ReliablePayload = schema.getCodecForType('dxos.mesh.messaging.ReliablePayload');\nconst Acknowledgement = schema.getCodecForType('dxos.mesh.messaging.Acknowledgement');\n\nconst RECEIVED_MESSAGES_GC_INTERVAL = 120_000;\n\n/**\n * Reliable messenger that works trough signal network.\n */\nexport class Messenger {\n private readonly _signalManager: SignalManager;\n // { peerId, payloadType } => listeners set\n private readonly _listeners = new ComplexMap<{ peerId: PublicKey; payloadType: string }, Set<OnMessage>>(\n ({ peerId, payloadType }) => peerId.toHex() + payloadType,\n );\n\n // peerId => listeners set\n private readonly _defaultListeners = new ComplexMap<PublicKey, Set<OnMessage>>(PublicKey.hash);\n\n private readonly _onAckCallbacks = new ComplexMap<PublicKey, () => void>(PublicKey.hash);\n\n private readonly _receivedMessages = new ComplexSet<PublicKey>(PublicKey.hash);\n\n /**\n * Keys scheduled to be cleared from _receivedMessages on the next iteration.\n */\n private readonly _toClear = new ComplexSet<PublicKey>(PublicKey.hash);\n\n private _ctx!: Context;\n private _closed = true;\n private readonly _retryDelay: number;\n\n constructor({ signalManager, retryDelay = 300 }: MessengerOptions) {\n this._signalManager = signalManager;\n this._retryDelay = retryDelay;\n\n this.open();\n }\n\n open() {\n if (!this._closed) {\n return;\n }\n const traceId = PublicKey.random().toHex();\n log.trace('dxos.mesh.messenger.open', trace.begin({ id: traceId }));\n this._ctx = new Context({\n onError: (err) => log.catch(err),\n });\n this._ctx.onDispose(\n this._signalManager.onMessage.on(async (message) => {\n log('received message', { from: message.author });\n await this._handleMessage(message);\n }),\n );\n\n // Clear the map periodically.\n scheduleTaskInterval(\n this._ctx,\n async () => {\n this._performGc();\n },\n RECEIVED_MESSAGES_GC_INTERVAL,\n );\n\n this._closed = false;\n log.trace('dxos.mesh.messenger.open', trace.end({ id: traceId }));\n }\n\n async close() {\n if (this._closed) {\n return;\n }\n this._closed = true;\n await this._ctx.dispose();\n }\n\n async sendMessage({ author, recipient, payload }: Message): Promise<void> {\n invariant(!this._closed, 'Closed');\n const messageContext = this._ctx.derive();\n\n const reliablePayload: ReliablePayload = {\n messageId: PublicKey.random(),\n payload,\n };\n invariant(!this._onAckCallbacks.has(reliablePayload.messageId!));\n log('send message', { messageId: reliablePayload.messageId, author, recipient });\n\n let messageReceived: () => void;\n let timeoutHit: (err: Error) => void;\n\n const promise = new Promise<void>((resolve, reject) => {\n messageReceived = resolve;\n timeoutHit = reject;\n });\n\n // Setting retry interval if signal was not acknowledged.\n scheduleExponentialBackoffTaskInterval(\n messageContext,\n async () => {\n log('retrying message', { messageId: reliablePayload.messageId });\n await this._encodeAndSend({ author, recipient, reliablePayload }).catch((err) =>\n log('failed to send message', { err }),\n );\n },\n this._retryDelay,\n );\n\n scheduleTask(\n messageContext,\n () => {\n log('message not delivered', { messageId: reliablePayload.messageId });\n this._onAckCallbacks.delete(reliablePayload.messageId!);\n timeoutHit(\n new ProtocolTimeoutError(\n 'signaling message not delivered',\n new TimeoutError(MESSAGE_TIMEOUT, 'Message not delivered'),\n ),\n );\n void messageContext.dispose();\n },\n MESSAGE_TIMEOUT,\n );\n\n this._onAckCallbacks.set(reliablePayload.messageId, () => {\n messageReceived();\n this._onAckCallbacks.delete(reliablePayload.messageId!);\n void messageContext.dispose();\n });\n\n await this._encodeAndSend({ author, recipient, reliablePayload });\n return promise;\n }\n\n /**\n * Subscribes onMessage function to messages that contains payload with payloadType.\n * @param payloadType if not specified, onMessage will be subscribed to all types of messages.\n */\n async listen({\n peerId,\n payloadType,\n onMessage,\n }: {\n peerId: PublicKey;\n payloadType?: string;\n onMessage: OnMessage;\n }): Promise<ListeningHandle> {\n invariant(!this._closed, 'Closed');\n\n await this._signalManager.subscribeMessages(peerId);\n let listeners: Set<OnMessage> | undefined;\n\n if (!payloadType) {\n listeners = this._defaultListeners.get(peerId);\n if (!listeners) {\n listeners = new Set();\n this._defaultListeners.set(peerId, listeners);\n }\n } else {\n listeners = this._listeners.get({ peerId, payloadType });\n if (!listeners) {\n listeners = new Set();\n this._listeners.set({ peerId, payloadType }, listeners);\n }\n }\n\n listeners.add(onMessage);\n\n return {\n unsubscribe: async () => {\n listeners!.delete(onMessage);\n },\n };\n }\n\n private async _encodeAndSend({\n author,\n recipient,\n reliablePayload,\n }: {\n author: PublicKey;\n recipient: PublicKey;\n reliablePayload: ReliablePayload;\n }): Promise<void> {\n await this._signalManager.sendMessage({\n author,\n recipient,\n payload: {\n type_url: 'dxos.mesh.messaging.ReliablePayload',\n value: ReliablePayload.encode(reliablePayload, { preserveAny: true }),\n },\n });\n }\n\n private async _handleMessage(message: Message): Promise<void> {\n switch (message.payload.type_url) {\n case 'dxos.mesh.messaging.ReliablePayload': {\n await this._handleReliablePayload(message);\n break;\n }\n case 'dxos.mesh.messaging.Acknowledgement': {\n await this._handleAcknowledgement({ payload: message.payload });\n break;\n }\n }\n }\n\n private async _handleReliablePayload({ author, recipient, payload }: Message) {\n invariant(payload.type_url === 'dxos.mesh.messaging.ReliablePayload');\n const reliablePayload: ReliablePayload = ReliablePayload.decode(payload.value, { preserveAny: true });\n\n log('handling message', { messageId: reliablePayload.messageId });\n\n await this._sendAcknowledgement({\n author,\n recipient,\n messageId: reliablePayload.messageId,\n });\n\n if (this._receivedMessages.has(reliablePayload.messageId!)) {\n return;\n }\n\n this._receivedMessages.add(reliablePayload.messageId!);\n\n await this._callListeners({\n author,\n recipient,\n payload: reliablePayload.payload,\n });\n }\n\n private async _handleAcknowledgement({ payload }: { payload: Any }) {\n invariant(payload.type_url === 'dxos.mesh.messaging.Acknowledgement');\n this._onAckCallbacks.get(Acknowledgement.decode(payload.value).messageId)?.();\n }\n\n private async _sendAcknowledgement({\n author,\n recipient,\n messageId,\n }: {\n author: PublicKey;\n recipient: PublicKey;\n messageId: PublicKey;\n }): Promise<void> {\n log('sending ACK', { messageId, from: recipient, to: author });\n\n await this._signalManager.sendMessage({\n author: recipient,\n recipient: author,\n payload: {\n type_url: 'dxos.mesh.messaging.Acknowledgement',\n value: Acknowledgement.encode({ messageId }),\n },\n });\n }\n\n private async _callListeners(message: Message): Promise<void> {\n {\n const defaultListenerMap = this._defaultListeners.get(message.recipient);\n if (defaultListenerMap) {\n for (const listener of defaultListenerMap) {\n await listener(message);\n }\n }\n }\n\n {\n const listenerMap = this._listeners.get({\n peerId: message.recipient,\n payloadType: message.payload.type_url,\n });\n if (listenerMap) {\n for (const listener of listenerMap) {\n await listener(message);\n }\n }\n }\n }\n\n private _performGc() {\n const start = performance.now();\n\n for (const key of this._toClear.keys()) {\n this._receivedMessages.delete(key);\n }\n this._toClear.clear();\n for (const key of this._receivedMessages.keys()) {\n this._toClear.add(key);\n }\n\n const elapsed = performance.now() - start;\n if (elapsed > 100) {\n log.warn('GC took too long', { elapsed });\n }\n }\n}\n\nexport interface ListeningHandle {\n unsubscribe: () => Promise<void>;\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\n/**\n * Timeout for retrying messages.\n */\nexport const MESSAGE_TIMEOUT = 10_000;\n", "//\n// Copyright 2020 DXOS.org\n//\n\nimport { DeferredTask, Event, Trigger, asyncTimeout, scheduleTask, scheduleTaskInterval, sleep } from '@dxos/async';\nimport { type Any, type Stream } from '@dxos/codec-protobuf';\nimport { Context, cancelWithContext } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { trace } from '@dxos/protocols';\nimport { type Message as SignalMessage, SignalState, type SwarmEvent } from '@dxos/protocols/proto/dxos/mesh/signal';\nimport { ComplexMap, ComplexSet } from '@dxos/util';\n\nimport { SignalRPCClient } from './signal-rpc-client';\nimport { type Message, type SignalMethods } from '../signal-methods';\n\nconst DEFAULT_RECONNECT_TIMEOUT = 100;\nconst MAX_RECONNECT_TIMEOUT = 5000;\nconst ERROR_RECONCILE_DELAY = 1000;\nconst RECONCILE_INTERVAL = 5_000;\n\nexport type SignalStatus = {\n host: string;\n state: SignalState;\n error?: string;\n reconnectIn: number;\n connectionStarted: Date;\n lastStateChange: Date;\n};\n\nexport type CommandTrace = {\n messageId: string;\n host: string;\n incoming: boolean;\n time: number;\n method: string;\n payload: any;\n response?: any;\n error?: string;\n};\n\n/**\n * Establishes a websocket connection to signal server and provides RPC methods.\n */\nexport class SignalClient implements SignalMethods {\n private _state = SignalState.CLOSED;\n\n private _lastError?: Error;\n\n /**\n * Number of milliseconds after which the connection will be attempted again in case of error.\n */\n private _reconnectAfter = DEFAULT_RECONNECT_TIMEOUT;\n\n /**\n * Timestamp of when the connection attempt was began.\n */\n private _connectionStarted = new Date();\n\n /**\n * Timestamp of last state change.\n */\n private _lastStateChange = new Date();\n\n private _client?: SignalRPCClient;\n private readonly _clientReady = new Trigger();\n\n private _ctx?: Context;\n\n private _connectionCtx?: Context;\n\n private _reconcileTask?: DeferredTask;\n private _reconnectTask?: DeferredTask;\n\n readonly statusChanged = new Event<SignalStatus>();\n readonly commandTrace = new Event<CommandTrace>();\n\n /**\n * Swarm events streams. Keys represent actually joined topic and peerId.\n */\n private readonly _swarmStreams = new ComplexMap<{ topic: PublicKey; peerId: PublicKey }, Stream<SwarmEvent>>(\n ({ topic, peerId }) => topic.toHex() + peerId.toHex(),\n );\n\n /**\n * Represent desired joined topic and peerId.\n */\n private readonly _joinedTopics = new ComplexSet<{ topic: PublicKey; peerId: PublicKey }>(\n ({ topic, peerId }) => topic.toHex() + peerId.toHex(),\n );\n\n /**\n * Message streams. Keys represents actually subscribed peers.\n * @internal\n */\n public readonly _messageStreams = new ComplexMap<PublicKey, Stream<SignalMessage>>((key) => key.toHex());\n\n /**\n * Represent desired message subscriptions.\n */\n private readonly _subscribedMessages = new ComplexSet<{ peerId: PublicKey }>(({ peerId }) => peerId.toHex());\n\n /**\n * Event to use in tests to wait till subscription is successfully established.\n * @internal\n */\n public _reconciled = new Event();\n\n private readonly _instanceId = PublicKey.random().toHex();\n\n private readonly _performance = {\n sentMessages: 0,\n receivedMessages: 0,\n reconnectCounter: 0,\n joinCounter: 0,\n leaveCounter: 0,\n };\n\n /**\n * @param _host Signal server websocket URL.\n * @param _onMessage\n */\n constructor(\n private readonly _host: string,\n private readonly _onMessage: (params: { author: PublicKey; recipient: PublicKey; payload: Any }) => Promise<void>,\n private readonly _onSwarmEvent: (params: { topic: PublicKey; swarmEvent: SwarmEvent }) => Promise<void>,\n ) {\n if (!this._host.startsWith('wss://') && !this._host.startsWith('ws://')) {\n throw new Error(`Signal server requires a websocket URL. Provided: ${this._host}`);\n }\n }\n\n open() {\n log.trace('dxos.mesh.signal-client.open', trace.begin({ id: this._instanceId }));\n\n if ([SignalState.CONNECTED, SignalState.CONNECTING].includes(this._state)) {\n return;\n }\n\n this._ctx = new Context({\n onError: (err) => {\n if (this._state === SignalState.CLOSED || this._ctx?.disposed) {\n return;\n }\n if (this._state === SignalState.CONNECTED) {\n log.warn('SignalClient error:', err);\n }\n this._scheduleReconcileAfterError();\n },\n });\n\n this._reconcileTask = new DeferredTask(this._ctx, async () => {\n await this._reconcileSwarmSubscriptions();\n await this._reconcileMessageSubscriptions();\n this._reconciled.emit();\n });\n\n // Reconcile subscriptions periodically.\n scheduleTaskInterval(\n this._ctx,\n async () => {\n if (this._state === SignalState.CONNECTED) {\n this._reconcileTask!.schedule();\n }\n },\n RECONCILE_INTERVAL,\n );\n\n this._reconnectTask = new DeferredTask(this._ctx, async () => {\n await this._reconnect();\n });\n\n this._setState(SignalState.CONNECTING);\n this._createClient();\n log.trace('dxos.mesh.signal-client.open', trace.end({ id: this._instanceId }));\n }\n\n async close() {\n log('closing...');\n if ([SignalState.CLOSED].includes(this._state)) {\n return;\n }\n\n await this._ctx?.dispose();\n\n this._clientReady.reset();\n await this._client?.close();\n this._client = undefined;\n this._setState(SignalState.CLOSED);\n log('closed');\n }\n\n getStatus(): SignalStatus {\n return {\n host: this._host,\n state: this._state,\n error: this._lastError?.message,\n reconnectIn: this._reconnectAfter,\n connectionStarted: this._connectionStarted,\n lastStateChange: this._lastStateChange,\n };\n }\n\n async join({ topic, peerId }: { topic: PublicKey; peerId: PublicKey }): Promise<void> {\n log('joining', { topic, peerId });\n this._performance.joinCounter++;\n this._joinedTopics.add({ topic, peerId });\n this._reconcileTask!.schedule();\n }\n\n async leave({ topic, peerId }: { topic: PublicKey; peerId: PublicKey }): Promise<void> {\n this._performance.leaveCounter++;\n log('leaving', { topic, peerId });\n\n void this._swarmStreams.get({ topic, peerId })?.close();\n this._swarmStreams.delete({ topic, peerId });\n this._joinedTopics.delete({ topic, peerId });\n }\n\n async sendMessage(msg: Message): Promise<void> {\n this._performance.sentMessages++;\n await this._clientReady.wait();\n invariant(this._state === SignalState.CONNECTED, 'Not connected to Signal Server');\n await this._client!.sendMessage(msg);\n }\n\n async subscribeMessages(peerId: PublicKey) {\n log('subscribing to messages', { peerId });\n this._subscribedMessages.add({ peerId });\n this._reconcileTask!.schedule();\n }\n\n async unsubscribeMessages(peerId: PublicKey) {\n log('unsubscribing from messages', { peerId });\n this._subscribedMessages.delete({ peerId });\n void this._messageStreams.get(peerId)?.close();\n this._messageStreams.delete(peerId);\n }\n\n private _scheduleReconcileAfterError() {\n scheduleTask(\n this._ctx!,\n () => {\n this._reconcileTask!.schedule();\n },\n ERROR_RECONCILE_DELAY,\n );\n }\n\n private _setState(newState: SignalState) {\n this._state = newState;\n this._lastStateChange = new Date();\n log('signal state changed', { status: this.getStatus() });\n this.statusChanged.emit(this.getStatus());\n }\n\n private _createClient() {\n log('creating client', { host: this._host, state: this._state });\n invariant(!this._client, 'Client already created');\n\n this._connectionStarted = new Date();\n\n // Create new context for each connection.\n this._connectionCtx = this._ctx!.derive();\n this._connectionCtx.onDispose(async () => {\n log('connection context disposed');\n await Promise.all(Array.from(this._swarmStreams.values()).map((stream) => stream.close()));\n await Promise.all(Array.from(this._messageStreams.values()).map((stream) => stream.close()));\n this._swarmStreams.clear();\n this._messageStreams.clear();\n });\n\n try {\n this._client = new SignalRPCClient({\n url: this._host,\n callbacks: {\n onConnected: () => {\n log('socket connected');\n this._lastError = undefined;\n this._reconnectAfter = DEFAULT_RECONNECT_TIMEOUT;\n this._setState(SignalState.CONNECTED);\n this._clientReady.wake();\n this._reconcileTask!.schedule();\n },\n\n onDisconnected: () => {\n log('socket disconnected', { state: this._state });\n if (this._state === SignalState.ERROR) {\n // Ignore disconnects after error.\n // Handled by error handler before disconnect handler.\n this._setState(SignalState.DISCONNECTED);\n return;\n }\n if (this._state !== SignalState.CONNECTED && this._state !== SignalState.CONNECTING) {\n this._incrementReconnectTimeout();\n }\n this._setState(SignalState.DISCONNECTED);\n this._reconnectTask!.schedule();\n },\n\n onError: (error) => {\n log('socket error', { error, state: this._state });\n this._lastError = error;\n if (this._state !== SignalState.CONNECTED && this._state !== SignalState.CONNECTING) {\n this._incrementReconnectTimeout();\n }\n this._setState(SignalState.ERROR);\n\n this._reconnectTask!.schedule();\n },\n },\n });\n } catch (err: any) {\n if (this._state !== SignalState.CONNECTED && this._state !== SignalState.CONNECTING) {\n this._incrementReconnectTimeout();\n }\n this._lastError = err;\n this._setState(SignalState.DISCONNECTED);\n this._reconnectTask!.schedule();\n }\n }\n\n private _incrementReconnectTimeout() {\n this._reconnectAfter *= 2;\n this._reconnectAfter = Math.min(this._reconnectAfter, MAX_RECONNECT_TIMEOUT);\n }\n\n private async _reconnect() {\n log(`reconnecting in ${this._reconnectAfter}ms`, { state: this._state });\n this._performance.reconnectCounter++;\n\n if (this._state === SignalState.RECONNECTING) {\n log.warn('Signal api already reconnecting.');\n return;\n }\n\n if (this._state === SignalState.CLOSED) {\n return;\n }\n\n // Close client if it wasn't already closed.\n this._clientReady.reset();\n await this._connectionCtx?.dispose();\n this._client?.close().catch(() => {});\n this._client = undefined;\n\n await cancelWithContext(this._ctx!, sleep(this._reconnectAfter));\n\n this._setState(SignalState.RECONNECTING);\n\n this._createClient();\n }\n\n private async _reconcileSwarmSubscriptions(): Promise<void> {\n await asyncTimeout(cancelWithContext(this._connectionCtx!, this._clientReady.wait()), 5_000);\n // Copy Client reference to avoid client change during the reconcile.\n const client = this._client!;\n invariant(this._state === SignalState.CONNECTED, 'Not connected to Signal Server');\n\n // Unsubscribe from topics that are no longer needed.\n for (const { topic, peerId } of this._swarmStreams.keys()) {\n // Join desired topics.\n if (this._joinedTopics.has({ topic, peerId })) {\n continue;\n }\n\n void this._swarmStreams.get({ topic, peerId })?.close();\n this._swarmStreams.delete({ topic, peerId });\n }\n\n // Subscribe to topics that are needed.\n for (const { topic, peerId } of this._joinedTopics.values()) {\n // Join desired topics.\n if (this._swarmStreams.has({ topic, peerId })) {\n continue;\n }\n\n const swarmStream = await asyncTimeout(\n cancelWithContext(this._connectionCtx!, client.join({ topic, peerId })),\n 5000,\n );\n // Subscribing to swarm events.\n // TODO(mykola): What happens when the swarm stream is closed? Maybe send leave event for each peer?\n swarmStream.subscribe(async (swarmEvent: SwarmEvent) => {\n log('swarm event', { swarmEvent });\n await this._onSwarmEvent({ topic, swarmEvent });\n });\n\n // Saving swarm stream.\n this._swarmStreams.set({ topic, peerId }, swarmStream);\n }\n }\n\n private async _reconcileMessageSubscriptions(): Promise<void> {\n await asyncTimeout(cancelWithContext(this._connectionCtx!, this._clientReady.wait()), 5_000);\n // Copy Client reference to avoid client change during the reconcile.\n const client = this._client!;\n invariant(this._state === SignalState.CONNECTED, 'Not connected to Signal Server');\n\n // Unsubscribe from messages that are no longer needed.\n for (const peerId of this._messageStreams.keys()) {\n // Join desired topics.\n if (this._subscribedMessages.has({ peerId })) {\n continue;\n }\n\n void this._messageStreams.get(peerId)?.close();\n this._messageStreams.delete(peerId);\n }\n\n // Subscribe to messages that are needed.\n for (const { peerId } of this._subscribedMessages.values()) {\n if (this._messageStreams.has(peerId)) {\n continue;\n }\n\n const messageStream = await asyncTimeout(\n cancelWithContext(this._connectionCtx!, client.receiveMessages(peerId)),\n 5000,\n );\n messageStream.subscribe(async (message: SignalMessage) => {\n this._performance.receivedMessages++;\n await this._onMessage({\n author: PublicKey.from(message.author),\n recipient: PublicKey.from(message.recipient),\n payload: message.payload,\n });\n });\n\n // Saving message stream.\n this._messageStreams.set(peerId, messageStream);\n }\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport WebSocket from 'isomorphic-ws';\n\nimport { Trigger } from '@dxos/async';\nimport { type Any, type Stream } from '@dxos/codec-protobuf';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { schema, trace } from '@dxos/protocols';\nimport { type Message as SignalMessage, type Signal } from '@dxos/protocols/proto/dxos/mesh/signal';\nimport { createProtoRpcPeer, type ProtoRpcPeer } from '@dxos/rpc';\n\ninterface Services {\n Signal: Signal;\n}\n\nexport type SignalCallbacks = {\n onConnected?: () => void;\n\n /**\n * Called on disconnect.\n * In case of error, `onError` will be called first and then `onDisconnected`.\n */\n onDisconnected?: () => void;\n\n onError?: (error: Error) => void;\n};\n\nexport type SignalRPCClientParams = {\n url: string;\n callbacks?: SignalCallbacks;\n};\n\nexport class SignalRPCClient {\n private _socket?: WebSocket;\n private _rpc?: ProtoRpcPeer<Services>;\n private readonly _connectTrigger = new Trigger();\n\n private _closed = false;\n\n private readonly _url: string;\n private readonly _callbacks: SignalCallbacks;\n\n constructor({ url, callbacks = {} }: SignalRPCClientParams) {\n const traceId = PublicKey.random().toHex();\n log.trace('dxos.mesh.signal-rpc-client.constructor', trace.begin({ id: traceId }));\n this._url = url;\n this._callbacks = callbacks;\n this._socket = new WebSocket(this._url);\n\n this._rpc = createProtoRpcPeer({\n requested: {\n Signal: schema.getService('dxos.mesh.signal.Signal'),\n },\n noHandshake: true,\n port: {\n send: (msg) => {\n if (this._closed) {\n // Do not send messages after close.\n return;\n }\n try {\n this._socket!.send(msg);\n } catch (err) {\n log.warn('send error', err);\n }\n },\n subscribe: (cb) => {\n this._socket!.onmessage = async (msg: WebSocket.MessageEvent) => {\n if (typeof Blob !== 'undefined' && msg.data instanceof Blob) {\n cb(Buffer.from(await msg.data.arrayBuffer()));\n } else {\n cb(msg.data as any);\n }\n };\n },\n },\n encodingOptions: {\n preserveAny: true,\n },\n });\n\n this._socket.onopen = async () => {\n try {\n await this._rpc!.open();\n log(`RPC open ${this._url}`);\n this._callbacks.onConnected?.();\n this._connectTrigger.wake();\n } catch (err: any) {\n this._callbacks.onError?.(err);\n }\n };\n\n this._socket.onclose = async () => {\n log(`Disconnected ${this._url}`);\n this._callbacks.onDisconnected?.();\n await this.close();\n };\n\n this._socket.onerror = async (event: WebSocket.ErrorEvent) => {\n if (this._closed) {\n // Ignore errors after close.\n return;\n }\n\n this._callbacks.onError?.(event.error ?? new Error(event.message));\n this._connectTrigger.reset();\n\n try {\n await this._rpc?.close();\n } catch (err) {\n log.catch(err);\n }\n this._closed = true;\n\n log.warn(event.message ?? 'Socket error', { url: this._url });\n };\n\n log.trace('dxos.mesh.signal-rpc-client.constructor', trace.end({ id: traceId }));\n }\n\n async close() {\n this._closed = true;\n try {\n await this._rpc?.close();\n this._socket?.close();\n } catch (err) {\n log.warn('close error', err);\n }\n }\n\n async join({ topic, peerId }: { topic: PublicKey; peerId: PublicKey }) {\n log('join', { topic, peerId });\n await this._connectTrigger.wait();\n invariant(!this._closed, 'SignalRPCClient is closed');\n invariant(this._rpc, 'Rpc is not initialized');\n const swarmStream = this._rpc.rpc.Signal.join({\n swarm: topic.asUint8Array(),\n peer: peerId.asUint8Array(),\n });\n await swarmStream.waitUntilReady();\n return swarmStream;\n }\n\n async receiveMessages(peerId: PublicKey): Promise<Stream<SignalMessage>> {\n log('receiveMessages', { peerId });\n invariant(!this._closed, 'SignalRPCClient is closed');\n await this._connectTrigger.wait();\n invariant(this._rpc, 'Rpc is not initialized');\n const messageStream = this._rpc.rpc.Signal.receiveMessages({\n peer: peerId.asUint8Array(),\n });\n await messageStream.waitUntilReady();\n return messageStream;\n }\n\n async sendMessage({ author, recipient, payload }: { author: PublicKey; recipient: PublicKey; payload: Any }) {\n log('sendMessage', { author, recipient, payload });\n invariant(!this._closed, 'SignalRPCClient is closed');\n await this._connectTrigger.wait();\n invariant(this._rpc, 'Rpc is not initialized');\n await this._rpc.rpc.Signal.sendMessage({\n author: author.asUint8Array(),\n recipient: recipient.asUint8Array(),\n payload,\n });\n }\n}\n", "//\n// Copyright 2020 DXOS.org\n//\n\nimport { Event, Trigger } from '@dxos/async';\nimport { type Any } from '@dxos/codec-protobuf';\nimport { Context } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { schema } from '@dxos/protocols';\nimport { type SwarmEvent } from '@dxos/protocols/proto/dxos/mesh/signal';\nimport { ComplexMap, ComplexSet } from '@dxos/util';\n\nimport { type SignalManager } from './signal-manager';\nimport { type CommandTrace, type SignalStatus } from '../signal-client';\n\n/**\n * Common signaling context that connects multiple MemorySignalManager instances.\n */\nexport class MemorySignalManagerContext {\n // Swarm messages.\n readonly swarmEvent = new Event<{\n topic: PublicKey;\n swarmEvent: SwarmEvent;\n }>();\n\n // Mapping from topic to set of peers.\n readonly swarms = new ComplexMap<PublicKey, ComplexSet<PublicKey>>(PublicKey.hash);\n\n // Map of connections for each peer for signaling.\n readonly connections = new ComplexMap<PublicKey, MemorySignalManager>(PublicKey.hash);\n}\n\n/**\n * In memory signal manager for testing.\n */\nexport class MemorySignalManager implements SignalManager {\n readonly statusChanged = new Event<SignalStatus[]>();\n readonly commandTrace = new Event<CommandTrace>();\n readonly swarmEvent = new Event<{\n topic: PublicKey;\n swarmEvent: SwarmEvent;\n }>();\n\n readonly onMessage = new Event<{\n author: PublicKey;\n recipient: PublicKey;\n payload: Any;\n }>();\n\n /** Will be used to emit SwarmEvents on .open() and .close() */\n private _joinedSwarms = new ComplexSet<{ topic: PublicKey; peerId: PublicKey }>(\n ({ topic, peerId }) => topic.toHex() + peerId.toHex(),\n );\n\n private _ctx!: Context;\n\n // TODO(dmaretskyi): Replace with callback.\n private readonly _freezeTrigger = new Trigger().wake();\n\n constructor(private readonly _context: MemorySignalManagerContext) {\n this._ctx = new Context();\n\n this._ctx.onDispose(this._context.swarmEvent.on((data) => this.swarmEvent.emit(data)));\n }\n\n async open() {\n if (!this._ctx.disposed) {\n return;\n }\n this._ctx = new Context();\n this._ctx.onDispose(this._context.swarmEvent.on((data) => this.swarmEvent.emit(data)));\n\n await Promise.all([...this._joinedSwarms.values()].map((value) => this.join(value)));\n }\n\n async close() {\n if (this._ctx.disposed) {\n return;\n }\n // save copy of joined swarms.\n const joinedSwarmsCopy = new ComplexSet<{ topic: PublicKey; peerId: PublicKey }>(\n ({ topic, peerId }) => topic.toHex() + peerId.toHex(),\n [...this._joinedSwarms.values()],\n );\n\n await Promise.all([...this._joinedSwarms.values()].map((value) => this.leave(value)));\n\n // assign joined swarms back because .leave() deletes it.\n this._joinedSwarms = joinedSwarmsCopy;\n\n await this._ctx.dispose();\n }\n\n getStatus(): SignalStatus[] {\n return [];\n }\n\n async join({ topic, peerId }: { topic: PublicKey; peerId: PublicKey }) {\n invariant(!this._ctx.disposed, 'Closed');\n\n this._joinedSwarms.add({ topic, peerId });\n\n if (!this._context.swarms.has(topic)) {\n this._context.swarms.set(topic, new ComplexSet(PublicKey.hash));\n }\n\n this._context.swarms.get(topic)!.add(peerId);\n this._context.swarmEvent.emit({\n topic,\n swarmEvent: {\n peerAvailable: {\n peer: peerId.asUint8Array(),\n since: new Date(),\n },\n },\n });\n\n // Emitting swarm events for each peer.\n for (const [topic, peerIds] of this._context.swarms) {\n Array.from(peerIds).forEach((peerId) => {\n this.swarmEvent.emit({\n topic,\n swarmEvent: {\n peerAvailable: {\n peer: peerId.asUint8Array(),\n since: new Date(),\n },\n },\n });\n });\n }\n }\n\n async leave({ topic, peerId }: { topic: PublicKey; peerId: PublicKey }) {\n invariant(!this._ctx.disposed, 'Closed');\n\n this._joinedSwarms.delete({ topic, peerId });\n\n if (!this._context.swarms.has(topic)) {\n this._context.swarms.set(topic, new ComplexSet(PublicKey.hash));\n }\n\n this._context.swarms.get(topic)!.delete(peerId);\n\n const swarmEvent: SwarmEvent = {\n peerLeft: {\n peer: peerId.asUint8Array(),\n },\n };\n\n this._context.swarmEvent.emit({ topic, swarmEvent });\n }\n\n async sendMessage({ author, recipient, payload }: { author: PublicKey; recipient: PublicKey; payload: Any }) {\n log('send message', { author, recipient, ...dec(payload) });\n\n invariant(recipient);\n invariant(!this._ctx.disposed, 'Closed');\n\n await this._freezeTrigger.wait();\n\n const remote = this._context.connections.get(recipient);\n if (!remote) {\n log.warn('recipient is not subscribed for messages', { author, recipient });\n return;\n }\n\n if (remote._ctx.disposed) {\n log.warn('recipient is disposed', { author, recipient });\n return;\n }\n\n remote._freezeTrigger\n .wait()\n .then(() => {\n if (remote._ctx.disposed) {\n log.warn('recipient is disposed', { author, recipient });\n return;\n }\n\n log('receive message', { author, recipient, ...dec(payload) });\n\n remote.onMessage.emit({ author, recipient, payload });\n })\n .catch((err) => {\n log.error('error while waiting for freeze', { err });\n });\n }\n\n async subscribeMessages(peerId: PublicKey) {\n log('subscribing', { peerId });\n this._context.connections.set(peerId, this);\n }\n\n async unsubscribeMessages(peerId: PublicKey) {\n log('unsubscribing', { peerId });\n this._context.connections.delete(peerId);\n }\n\n freeze() {\n this._freezeTrigger.reset();\n }\n\n unfreeze() {\n this._freezeTrigger.wake();\n }\n}\nconst dec = (payload: Any) => {\n if (!payload.type_url.endsWith('ReliablePayload')) {\n return {};\n }\n\n const relPayload = schema.getCodecForType('dxos.mesh.messaging.ReliablePayload').decode(payload.value);\n\n if (typeof relPayload?.payload?.data === 'object') {\n return { payload: Object.keys(relPayload?.payload?.data)[0], sessionId: relPayload?.payload?.sessionId };\n }\n\n return {};\n};\n", "//\n// Copyright 2020 DXOS.org\n//\n\nimport { Event, sleep, synchronized } from '@dxos/async';\nimport { type Any } from '@dxos/codec-protobuf';\nimport { Context } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { RateLimitExceededError, TimeoutError, trace } from '@dxos/protocols';\nimport { type Runtime } from '@dxos/protocols/proto/dxos/config';\nimport { type SwarmEvent } from '@dxos/protocols/proto/dxos/mesh/signal';\n\nimport { type SignalManager } from './signal-manager';\nimport { type CommandTrace, SignalClient, type SignalStatus } from '../signal-client';\n\nconst MAX_SERVER_FAILURES = 5;\nconst WSS_SIGNAL_SERVER_REBOOT_DELAY = 3_000;\n/**\n * Manages connection to multiple Signal Servers over WebSocket\n */\nexport class WebsocketSignalManager implements SignalManager {\n private readonly _servers = new Map<string, SignalClient>();\n\n private _ctx!: Context;\n private _opened = false;\n\n readonly failureCount = new Map<string, number>();\n readonly statusChanged = new Event<SignalStatus[]>();\n readonly commandTrace = new Event<CommandTrace>();\n readonly swarmEvent = new Event<{\n topic: PublicKey;\n swarmEvent: SwarmEvent;\n }>();\n\n readonly onMessage = new Event<{\n author: PublicKey;\n recipient: PublicKey;\n payload: Any;\n }>();\n\n private readonly _instanceId = PublicKey.random().toHex();\n\n constructor(private readonly _hosts: Runtime.Services.Signal[]) {\n log('Created WebsocketSignalManager', { hosts: this._hosts });\n for (const host of this._hosts) {\n if (this._servers.has(host.server)) {\n continue;\n }\n const server = new SignalClient(\n host.server,\n async (message) => this.onMessage.emit(message),\n async (data) => this.swarmEvent.emit(data),\n );\n server.statusChanged.on(() => this.statusChanged.emit(this.getStatus()));\n\n this._servers.set(host.server, server);\n this.failureCount.set(host.server, 0);\n server.commandTrace.on((trace) => this.commandTrace.emit(trace));\n }\n }\n\n @synchronized\n async open() {\n if (this._opened) {\n return;\n }\n log('open signal manager', { hosts: this._hosts });\n log.trace('dxos.mesh.websocket-signal-manager.open', trace.begin({ id: this._instanceId }));\n\n this._initContext();\n\n [...this._servers.values()].forEach((server) => server.open());\n\n this._opened = true;\n log.trace('dxos.mesh.websocket-signal-manager.open', trace.end({ id: this._instanceId }));\n }\n\n @synchronized\n async close() {\n if (!this._opened) {\n return;\n }\n this._opened = false;\n\n await this._ctx.dispose();\n\n await Promise.all(Array.from(this._servers.values()).map((server) => server.close()));\n }\n\n async restartServer(serverName: string) {\n log('Restarting server', { serverName });\n invariant(this._opened, 'server already closed');\n\n const server = this._servers.get(serverName);\n invariant(server, 'server not found');\n\n await server.close();\n await sleep(WSS_SIGNAL_SERVER_REBOOT_DELAY);\n await server.open();\n }\n\n getStatus(): SignalStatus[] {\n return Array.from(this._servers.values()).map((server) => server.getStatus());\n }\n\n @synchronized\n async join({ topic, peerId }: { topic: PublicKey; peerId: PublicKey }) {\n log('Join', { topic, peerId });\n invariant(this._opened, 'Closed');\n await this._forEachServer((server) => server.join({ topic, peerId }));\n }\n\n @synchronized\n async leave({ topic, peerId }: { topic: PublicKey; peerId: PublicKey }) {\n log('leaving', { topic, peerId });\n invariant(this._opened, 'Closed');\n\n await this._forEachServer((server) => server.leave({ topic, peerId }));\n }\n\n async sendMessage({\n author,\n recipient,\n payload,\n }: {\n author: PublicKey;\n recipient: PublicKey;\n payload: Any;\n }): Promise<void> {\n log(`Signal ${recipient.truncate()}`);\n invariant(this._opened, 'Closed');\n\n void this._forEachServer(async (server, serverName) => {\n void server.sendMessage({ author, recipient, payload }).catch((err) => {\n if (err instanceof RateLimitExceededError) {\n log.info('WSS rate limit exceeded', { err });\n } else if (err instanceof TimeoutError || err.constructor.name === 'TimeoutError') {\n log.info('WSS sendMessage timeout', { err });\n void this.checkServerFailure(serverName);\n } else {\n log.info(`error sending to ${serverName}`, { err });\n void this.checkServerFailure(serverName);\n }\n });\n });\n }\n\n @synchronized\n async checkServerFailure(serverName: string) {\n const failureCount = this.failureCount.get(serverName!) ?? 0;\n if (failureCount > MAX_SERVER_FAILURES) {\n log.warn(`Too many failures sending to ${serverName} (${failureCount} > ${MAX_SERVER_FAILURES}), restarting`);\n await this.restartServer(serverName!);\n this.failureCount.set(serverName!, 0);\n return;\n }\n this.failureCount.set(serverName!, (this.failureCount.get(serverName!) ?? 0) + 1);\n }\n\n async subscribeMessages(peerId: PublicKey) {\n log(`Subscribed for message stream peerId=${peerId}`);\n invariant(this._opened, 'Closed');\n\n await this._forEachServer(async (server) => server.subscribeMessages(peerId));\n }\n\n async unsubscribeMessages(peerId: PublicKey) {\n log(`Subscribed for message stream peerId=${peerId}`);\n invariant(this._opened, 'Closed');\n\n await this._forEachServer(async (server) => server.unsubscribeMessages(peerId));\n }\n\n private _initContext() {\n this._ctx = new Context({\n onError: (err) => log.catch(err),\n });\n }\n\n private async _forEachServer<ReturnType>(\n fn: (server: SignalClient, serverName: string) => Promise<ReturnType>,\n ): Promise<ReturnType[]> {\n return Promise.all(Array.from(this._servers.entries()).map(([serverName, server]) => fn(server, serverName)));\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["TimeoutError", "scheduleExponentialBackoffTaskInterval", "scheduleTask", "scheduleTaskInterval", "Context", "invariant", "PublicKey", "log", "ProtocolTimeoutError", "schema", "trace", "ComplexMap", "ComplexSet", "MESSAGE_TIMEOUT", "ReliablePayload", "schema", "getCodecForType", "Acknowledgement", "RECEIVED_MESSAGES_GC_INTERVAL", "Messenger", "constructor", "signalManager", "retryDelay", "_listeners", "ComplexMap", "peerId", "payloadType", "toHex", "_defaultListeners", "PublicKey", "hash", "_onAckCallbacks", "_receivedMessages", "ComplexSet", "_toClear", "_closed", "_signalManager", "_retryDelay", "open", "traceId", "random", "log", "trace", "begin", "id", "_ctx", "Context", "onError", "err", "catch", "onDispose", "onMessage", "on", "message", "from", "author", "_handleMessage", "scheduleTaskInterval", "_performGc", "end", "close", "dispose", "sendMessage", "recipient", "payload", "invariant", "messageContext", "derive", "reliablePayload", "messageId", "has", "messageReceived", "timeoutHit", "promise", "Promise", "resolve", "reject", "scheduleExponentialBackoffTaskInterval", "_encodeAndSend", "scheduleTask", "delete", "ProtocolTimeoutError", "TimeoutError", "MESSAGE_TIMEOUT", "set", "listen", "subscribeMessages", "listeners", "get", "Set", "add", "unsubscribe", "type_url", "value", "encode", "preserveAny", "_handleReliablePayload", "_handleAcknowledgement", "decode", "_sendAcknowledgement", "_callListeners", "to", "defaultListenerMap", "listener", "listenerMap", "start", "performance", "now", "key", "keys", "clear", "elapsed", "warn", "DeferredTask", "Event", "Trigger", "asyncTimeout", "scheduleTask", "scheduleTaskInterval", "sleep", "Context", "cancelWithContext", "invariant", "PublicKey", "log", "trace", "SignalState", "ComplexMap", "ComplexSet", "WebSocket", "Trigger", "invariant", "PublicKey", "log", "schema", "trace", "createProtoRpcPeer", "SignalRPCClient", "constructor", "url", "callbacks", "_connectTrigger", "_closed", "traceId", "random", "toHex", "begin", "id", "_url", "_callbacks", "_socket", "_rpc", "requested", "Signal", "getService", "noHandshake", "port", "send", "msg", "err", "warn", "subscribe", "cb", "onmessage", "Blob", "data", "Buffer", "from", "arrayBuffer", "encodingOptions", "preserveAny", "onopen", "open", "onConnected", "wake", "onError", "onclose", "onDisconnected", "close", "onerror", "event", "error", "Error", "message", "reset", "catch", "end", "join", "topic", "peerId", "wait", "swarmStream", "rpc", "swarm", "asUint8Array", "peer", "waitUntilReady", "receiveMessages", "messageStream", "sendMessage", "author", "recipient", "payload", "DEFAULT_RECONNECT_TIMEOUT", "MAX_RECONNECT_TIMEOUT", "ERROR_RECONCILE_DELAY", "RECONCILE_INTERVAL", "SignalClient", "constructor", "_host", "_onMessage", "_onSwarmEvent", "_state", "SignalState", "CLOSED", "_reconnectAfter", "_connectionStarted", "Date", "_lastStateChange", "_clientReady", "Trigger", "statusChanged", "Event", "commandTrace", "_swarmStreams", "ComplexMap", "topic", "peerId", "toHex", "_joinedTopics", "ComplexSet", "_messageStreams", "key", "_subscribedMessages", "_reconciled", "_instanceId", "PublicKey", "random", "_performance", "sentMessages", "receivedMessages", "reconnectCounter", "joinCounter", "leaveCounter", "startsWith", "Error", "open", "log", "trace", "begin", "id", "CONNECTED", "CONNECTING", "includes", "_ctx", "Context", "onError", "err", "disposed", "warn", "_scheduleReconcileAfterError", "_reconcileTask", "DeferredTask", "_reconcileSwarmSubscriptions", "_reconcileMessageSubscriptions", "emit", "scheduleTaskInterval", "schedule", "_reconnectTask", "_reconnect", "_setState", "_createClient", "end", "close", "dispose", "reset", "_client", "undefined", "getStatus", "host", "state", "error", "_lastError", "message", "reconnectIn", "connectionStarted", "lastStateChange", "join", "add", "leave", "get", "delete", "sendMessage", "msg", "wait", "invariant", "subscribeMessages", "unsubscribeMessages", "scheduleTask", "newState", "status", "_connectionCtx", "derive", "onDispose", "Promise", "all", "Array", "from", "values", "map", "stream", "clear", "SignalRPCClient", "url", "callbacks", "onConnected", "wake", "onDisconnected", "ERROR", "DISCONNECTED", "_incrementReconnectTimeout", "Math", "min", "RECONNECTING", "catch", "cancelWithContext", "sleep", "asyncTimeout", "client", "keys", "has", "swarmStream", "subscribe", "swarmEvent", "set", "messageStream", "receiveMessages", "author", "recipient", "payload", "Event", "Trigger", "Context", "invariant", "PublicKey", "log", "schema", "ComplexMap", "ComplexSet", "MemorySignalManagerContext", "swarmEvent", "swarms", "hash", "connections", "MemorySignalManager", "constructor", "_context", "statusChanged", "commandTrace", "onMessage", "_joinedSwarms", "topic", "peerId", "toHex", "_freezeTrigger", "wake", "_ctx", "onDispose", "on", "data", "emit", "open", "disposed", "Promise", "all", "values", "map", "value", "join", "close", "joinedSwarmsCopy", "leave", "dispose", "getStatus", "add", "has", "set", "get", "peerAvailable", "peer", "asUint8Array", "since", "Date", "peerIds", "Array", "from", "forEach", "delete", "peerLeft", "sendMessage", "author", "recipient", "payload", "dec", "wait", "remote", "warn", "then", "catch", "err", "error", "subscribeMessages", "unsubscribeMessages", "freeze", "reset", "unfreeze", "type_url", "endsWith", "relPayload", "getCodecForType", "decode", "Object", "keys", "sessionId", "Event", "sleep", "synchronized", "Context", "invariant", "PublicKey", "log", "RateLimitExceededError", "TimeoutError", "trace", "MAX_SERVER_FAILURES", "WSS_SIGNAL_SERVER_REBOOT_DELAY", "WebsocketSignalManager", "constructor", "_hosts", "_servers", "Map", "_opened", "failureCount", "statusChanged", "Event", "commandTrace", "swarmEvent", "onMessage", "_instanceId", "PublicKey", "random", "toHex", "log", "hosts", "host", "has", "server", "SignalClient", "message", "emit", "data", "on", "getStatus", "set", "trace", "open", "begin", "id", "_initContext", "values", "forEach", "end", "close", "_ctx", "dispose", "Promise", "all", "Array", "from", "map", "restartServer", "serverName", "invariant", "get", "sleep", "join", "topic", "peerId", "_forEachServer", "leave", "sendMessage", "author", "recipient", "payload", "truncate", "catch", "err", "RateLimitExceededError", "info", "TimeoutError", "name", "checkServerFailure", "warn", "subscribeMessages", "unsubscribeMessages", "Context", "onError", "fn", "entries", "synchronized"]
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2022 DXOS.org\n//\n\nimport { TimeoutError, scheduleExponentialBackoffTaskInterval, scheduleTask, scheduleTaskInterval } from '@dxos/async';\nimport { type Any } from '@dxos/codec-protobuf';\nimport { Context } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { TimeoutError as ProtocolTimeoutError, schema, trace } from '@dxos/protocols';\nimport { ReliablePayload } from '@dxos/protocols/proto/dxos/mesh/messaging';\nimport { ComplexMap, ComplexSet } from '@dxos/util';\n\nimport { type SignalManager } from './signal-manager';\nimport { type Message } from './signal-methods';\nimport { MESSAGE_TIMEOUT } from './timeouts';\n\nexport type OnMessage = (params: { author: PublicKey; recipient: PublicKey; payload: Any }) => Promise<void>;\n\nexport interface MessengerOptions {\n signalManager: SignalManager;\n retryDelay?: number;\n}\n\nconst ReliablePayload = schema.getCodecForType('dxos.mesh.messaging.ReliablePayload');\nconst Acknowledgement = schema.getCodecForType('dxos.mesh.messaging.Acknowledgement');\n\nconst RECEIVED_MESSAGES_GC_INTERVAL = 120_000;\n\n/**\n * Reliable messenger that works trough signal network.\n */\nexport class Messenger {\n private readonly _signalManager: SignalManager;\n // { peerId, payloadType } => listeners set\n private readonly _listeners = new ComplexMap<{ peerId: PublicKey; payloadType: string }, Set<OnMessage>>(\n ({ peerId, payloadType }) => peerId.toHex() + payloadType,\n );\n\n // peerId => listeners set\n private readonly _defaultListeners = new ComplexMap<PublicKey, Set<OnMessage>>(PublicKey.hash);\n\n private readonly _onAckCallbacks = new ComplexMap<PublicKey, () => void>(PublicKey.hash);\n\n private readonly _receivedMessages = new ComplexSet<PublicKey>(PublicKey.hash);\n\n /**\n * Keys scheduled to be cleared from _receivedMessages on the next iteration.\n */\n private readonly _toClear = new ComplexSet<PublicKey>(PublicKey.hash);\n\n private _ctx!: Context;\n private _closed = true;\n private readonly _retryDelay: number;\n\n constructor({ signalManager, retryDelay = 300 }: MessengerOptions) {\n this._signalManager = signalManager;\n this._retryDelay = retryDelay;\n\n this.open();\n }\n\n open() {\n if (!this._closed) {\n return;\n }\n const traceId = PublicKey.random().toHex();\n log.trace('dxos.mesh.messenger.open', trace.begin({ id: traceId }));\n this._ctx = new Context({\n onError: (err) => log.catch(err),\n });\n this._ctx.onDispose(\n this._signalManager.onMessage.on(async (message) => {\n log('received message', { from: message.author });\n await this._handleMessage(message);\n }),\n );\n\n // Clear the map periodically.\n scheduleTaskInterval(\n this._ctx,\n async () => {\n this._performGc();\n },\n RECEIVED_MESSAGES_GC_INTERVAL,\n );\n\n this._closed = false;\n log.trace('dxos.mesh.messenger.open', trace.end({ id: traceId }));\n }\n\n async close() {\n if (this._closed) {\n return;\n }\n this._closed = true;\n await this._ctx.dispose();\n }\n\n async sendMessage({ author, recipient, payload }: Message): Promise<void> {\n invariant(!this._closed, 'Closed');\n const messageContext = this._ctx.derive();\n\n const reliablePayload: ReliablePayload = {\n messageId: PublicKey.random(),\n payload,\n };\n invariant(!this._onAckCallbacks.has(reliablePayload.messageId!));\n log('send message', { messageId: reliablePayload.messageId, author, recipient });\n\n let messageReceived: () => void;\n let timeoutHit: (err: Error) => void;\n\n const promise = new Promise<void>((resolve, reject) => {\n messageReceived = resolve;\n timeoutHit = reject;\n });\n\n // Setting retry interval if signal was not acknowledged.\n scheduleExponentialBackoffTaskInterval(\n messageContext,\n async () => {\n log('retrying message', { messageId: reliablePayload.messageId });\n await this._encodeAndSend({ author, recipient, reliablePayload }).catch((err) =>\n log('failed to send message', { err }),\n );\n },\n this._retryDelay,\n );\n\n scheduleTask(\n messageContext,\n () => {\n log('message not delivered', { messageId: reliablePayload.messageId });\n this._onAckCallbacks.delete(reliablePayload.messageId!);\n timeoutHit(\n new ProtocolTimeoutError(\n 'signaling message not delivered',\n new TimeoutError(MESSAGE_TIMEOUT, 'Message not delivered'),\n ),\n );\n void messageContext.dispose();\n },\n MESSAGE_TIMEOUT,\n );\n\n this._onAckCallbacks.set(reliablePayload.messageId, () => {\n messageReceived();\n this._onAckCallbacks.delete(reliablePayload.messageId!);\n void messageContext.dispose();\n });\n\n await this._encodeAndSend({ author, recipient, reliablePayload });\n return promise;\n }\n\n /**\n * Subscribes onMessage function to messages that contains payload with payloadType.\n * @param payloadType if not specified, onMessage will be subscribed to all types of messages.\n */\n async listen({\n peerId,\n payloadType,\n onMessage,\n }: {\n peerId: PublicKey;\n payloadType?: string;\n onMessage: OnMessage;\n }): Promise<ListeningHandle> {\n invariant(!this._closed, 'Closed');\n\n await this._signalManager.subscribeMessages(peerId);\n let listeners: Set<OnMessage> | undefined;\n\n if (!payloadType) {\n listeners = this._defaultListeners.get(peerId);\n if (!listeners) {\n listeners = new Set();\n this._defaultListeners.set(peerId, listeners);\n }\n } else {\n listeners = this._listeners.get({ peerId, payloadType });\n if (!listeners) {\n listeners = new Set();\n this._listeners.set({ peerId, payloadType }, listeners);\n }\n }\n\n listeners.add(onMessage);\n\n return {\n unsubscribe: async () => {\n listeners!.delete(onMessage);\n },\n };\n }\n\n private async _encodeAndSend({\n author,\n recipient,\n reliablePayload,\n }: {\n author: PublicKey;\n recipient: PublicKey;\n reliablePayload: ReliablePayload;\n }): Promise<void> {\n await this._signalManager.sendMessage({\n author,\n recipient,\n payload: {\n type_url: 'dxos.mesh.messaging.ReliablePayload',\n value: ReliablePayload.encode(reliablePayload, { preserveAny: true }),\n },\n });\n }\n\n private async _handleMessage(message: Message): Promise<void> {\n switch (message.payload.type_url) {\n case 'dxos.mesh.messaging.ReliablePayload': {\n await this._handleReliablePayload(message);\n break;\n }\n case 'dxos.mesh.messaging.Acknowledgement': {\n await this._handleAcknowledgement({ payload: message.payload });\n break;\n }\n }\n }\n\n private async _handleReliablePayload({ author, recipient, payload }: Message) {\n invariant(payload.type_url === 'dxos.mesh.messaging.ReliablePayload');\n const reliablePayload: ReliablePayload = ReliablePayload.decode(payload.value, { preserveAny: true });\n\n log('handling message', { messageId: reliablePayload.messageId });\n\n await this._sendAcknowledgement({\n author,\n recipient,\n messageId: reliablePayload.messageId,\n });\n\n if (this._receivedMessages.has(reliablePayload.messageId!)) {\n return;\n }\n\n this._receivedMessages.add(reliablePayload.messageId!);\n\n await this._callListeners({\n author,\n recipient,\n payload: reliablePayload.payload,\n });\n }\n\n private async _handleAcknowledgement({ payload }: { payload: Any }) {\n invariant(payload.type_url === 'dxos.mesh.messaging.Acknowledgement');\n this._onAckCallbacks.get(Acknowledgement.decode(payload.value).messageId)?.();\n }\n\n private async _sendAcknowledgement({\n author,\n recipient,\n messageId,\n }: {\n author: PublicKey;\n recipient: PublicKey;\n messageId: PublicKey;\n }): Promise<void> {\n log('sending ACK', { messageId, from: recipient, to: author });\n\n await this._signalManager.sendMessage({\n author: recipient,\n recipient: author,\n payload: {\n type_url: 'dxos.mesh.messaging.Acknowledgement',\n value: Acknowledgement.encode({ messageId }),\n },\n });\n }\n\n private async _callListeners(message: Message): Promise<void> {\n {\n const defaultListenerMap = this._defaultListeners.get(message.recipient);\n if (defaultListenerMap) {\n for (const listener of defaultListenerMap) {\n await listener(message);\n }\n }\n }\n\n {\n const listenerMap = this._listeners.get({\n peerId: message.recipient,\n payloadType: message.payload.type_url,\n });\n if (listenerMap) {\n for (const listener of listenerMap) {\n await listener(message);\n }\n }\n }\n }\n\n private _performGc() {\n const start = performance.now();\n\n for (const key of this._toClear.keys()) {\n this._receivedMessages.delete(key);\n }\n this._toClear.clear();\n for (const key of this._receivedMessages.keys()) {\n this._toClear.add(key);\n }\n\n const elapsed = performance.now() - start;\n if (elapsed > 100) {\n log.warn('GC took too long', { elapsed });\n }\n }\n}\n\nexport interface ListeningHandle {\n unsubscribe: () => Promise<void>;\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\n/**\n * Timeout for retrying messages.\n */\nexport const MESSAGE_TIMEOUT = 10_000;\n", "//\n// Copyright 2020 DXOS.org\n//\n\nimport { DeferredTask, Event, Trigger, asyncTimeout, scheduleTask, scheduleTaskInterval, sleep } from '@dxos/async';\nimport { type Any, type Stream } from '@dxos/codec-protobuf';\nimport { Context, cancelWithContext } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { trace } from '@dxos/protocols';\nimport { type Message as SignalMessage, SignalState, type SwarmEvent } from '@dxos/protocols/proto/dxos/mesh/signal';\nimport { ComplexMap, ComplexSet } from '@dxos/util';\n\nimport { SignalRPCClient } from './signal-rpc-client';\nimport { type Message, type SignalMethods } from '../signal-methods';\n\nconst DEFAULT_RECONNECT_TIMEOUT = 100;\nconst MAX_RECONNECT_TIMEOUT = 5000;\nconst ERROR_RECONCILE_DELAY = 1000;\nconst RECONCILE_INTERVAL = 5_000;\n\nexport type SignalStatus = {\n host: string;\n state: SignalState;\n error?: string;\n reconnectIn: number;\n connectionStarted: Date;\n lastStateChange: Date;\n};\n\nexport type CommandTrace = {\n messageId: string;\n host: string;\n incoming: boolean;\n time: number;\n method: string;\n payload: any;\n response?: any;\n error?: string;\n};\n\n/**\n * Establishes a websocket connection to signal server and provides RPC methods.\n */\nexport class SignalClient implements SignalMethods {\n private _state = SignalState.CLOSED;\n\n private _lastError?: Error;\n\n /**\n * Number of milliseconds after which the connection will be attempted again in case of error.\n */\n private _reconnectAfter = DEFAULT_RECONNECT_TIMEOUT;\n\n /**\n * Timestamp of when the connection attempt was began.\n */\n private _connectionStarted = new Date();\n\n /**\n * Timestamp of last state change.\n */\n private _lastStateChange = new Date();\n\n private _client?: SignalRPCClient;\n private readonly _clientReady = new Trigger();\n\n private _ctx?: Context;\n\n private _connectionCtx?: Context;\n\n private _reconcileTask?: DeferredTask;\n private _reconnectTask?: DeferredTask;\n\n readonly statusChanged = new Event<SignalStatus>();\n readonly commandTrace = new Event<CommandTrace>();\n\n /**\n * Swarm events streams. Keys represent actually joined topic and peerId.\n */\n private readonly _swarmStreams = new ComplexMap<{ topic: PublicKey; peerId: PublicKey }, Stream<SwarmEvent>>(\n ({ topic, peerId }) => topic.toHex() + peerId.toHex(),\n );\n\n /**\n * Represent desired joined topic and peerId.\n */\n private readonly _joinedTopics = new ComplexSet<{ topic: PublicKey; peerId: PublicKey }>(\n ({ topic, peerId }) => topic.toHex() + peerId.toHex(),\n );\n\n /**\n * Message streams. Keys represents actually subscribed peers.\n * @internal\n */\n public readonly _messageStreams = new ComplexMap<PublicKey, Stream<SignalMessage>>((key) => key.toHex());\n\n /**\n * Represent desired message subscriptions.\n */\n private readonly _subscribedMessages = new ComplexSet<{ peerId: PublicKey }>(({ peerId }) => peerId.toHex());\n\n /**\n * Event to use in tests to wait till subscription is successfully established.\n * @internal\n */\n public _reconciled = new Event();\n\n private readonly _instanceId = PublicKey.random().toHex();\n\n private readonly _performance = {\n sentMessages: 0,\n receivedMessages: 0,\n reconnectCounter: 0,\n joinCounter: 0,\n leaveCounter: 0,\n };\n\n /**\n * @param _host Signal server websocket URL.\n * @param _onMessage\n */\n constructor(\n private readonly _host: string,\n private readonly _onMessage: (params: { author: PublicKey; recipient: PublicKey; payload: Any }) => Promise<void>,\n private readonly _onSwarmEvent: (params: { topic: PublicKey; swarmEvent: SwarmEvent }) => Promise<void>,\n ) {\n if (!this._host.startsWith('wss://') && !this._host.startsWith('ws://')) {\n throw new Error(`Signal server requires a websocket URL. Provided: ${this._host}`);\n }\n }\n\n open() {\n log.trace('dxos.mesh.signal-client.open', trace.begin({ id: this._instanceId }));\n\n if ([SignalState.CONNECTED, SignalState.CONNECTING].includes(this._state)) {\n return;\n }\n\n this._ctx = new Context({\n onError: (err) => {\n if (this._state === SignalState.CLOSED || this._ctx?.disposed) {\n return;\n }\n if (this._state === SignalState.CONNECTED) {\n log.warn('SignalClient error:', err);\n }\n this._scheduleReconcileAfterError();\n },\n });\n\n this._reconcileTask = new DeferredTask(this._ctx, async () => {\n await this._reconcileSwarmSubscriptions();\n await this._reconcileMessageSubscriptions();\n this._reconciled.emit();\n });\n\n // Reconcile subscriptions periodically.\n scheduleTaskInterval(\n this._ctx,\n async () => {\n if (this._state === SignalState.CONNECTED) {\n this._reconcileTask!.schedule();\n }\n },\n RECONCILE_INTERVAL,\n );\n\n this._reconnectTask = new DeferredTask(this._ctx, async () => {\n await this._reconnect();\n });\n\n this._setState(SignalState.CONNECTING);\n this._createClient();\n log.trace('dxos.mesh.signal-client.open', trace.end({ id: this._instanceId }));\n }\n\n async close() {\n log('closing...');\n if ([SignalState.CLOSED].includes(this._state)) {\n return;\n }\n\n await this._ctx?.dispose();\n\n this._clientReady.reset();\n await this._client?.close();\n this._client = undefined;\n this._setState(SignalState.CLOSED);\n log('closed');\n }\n\n getStatus(): SignalStatus {\n return {\n host: this._host,\n state: this._state,\n error: this._lastError?.message,\n reconnectIn: this._reconnectAfter,\n connectionStarted: this._connectionStarted,\n lastStateChange: this._lastStateChange,\n };\n }\n\n async join({ topic, peerId }: { topic: PublicKey; peerId: PublicKey }): Promise<void> {\n log('joining', { topic, peerId });\n this._performance.joinCounter++;\n this._joinedTopics.add({ topic, peerId });\n this._reconcileTask!.schedule();\n }\n\n async leave({ topic, peerId }: { topic: PublicKey; peerId: PublicKey }): Promise<void> {\n this._performance.leaveCounter++;\n log('leaving', { topic, peerId });\n\n void this._swarmStreams.get({ topic, peerId })?.close();\n this._swarmStreams.delete({ topic, peerId });\n this._joinedTopics.delete({ topic, peerId });\n }\n\n async sendMessage(msg: Message): Promise<void> {\n this._performance.sentMessages++;\n await this._clientReady.wait();\n invariant(this._state === SignalState.CONNECTED, 'Not connected to Signal Server');\n await this._client!.sendMessage(msg);\n }\n\n async subscribeMessages(peerId: PublicKey) {\n log('subscribing to messages', { peerId });\n this._subscribedMessages.add({ peerId });\n this._reconcileTask!.schedule();\n }\n\n async unsubscribeMessages(peerId: PublicKey) {\n log('unsubscribing from messages', { peerId });\n this._subscribedMessages.delete({ peerId });\n void this._messageStreams.get(peerId)?.close();\n this._messageStreams.delete(peerId);\n }\n\n private _scheduleReconcileAfterError() {\n scheduleTask(\n this._ctx!,\n () => {\n this._reconcileTask!.schedule();\n },\n ERROR_RECONCILE_DELAY,\n );\n }\n\n private _setState(newState: SignalState) {\n this._state = newState;\n this._lastStateChange = new Date();\n log('signal state changed', { status: this.getStatus() });\n this.statusChanged.emit(this.getStatus());\n }\n\n private _createClient() {\n log('creating client', { host: this._host, state: this._state });\n invariant(!this._client, 'Client already created');\n\n this._connectionStarted = new Date();\n\n // Create new context for each connection.\n this._connectionCtx = this._ctx!.derive();\n this._connectionCtx.onDispose(async () => {\n log('connection context disposed');\n await Promise.all(Array.from(this._swarmStreams.values()).map((stream) => stream.close()));\n await Promise.all(Array.from(this._messageStreams.values()).map((stream) => stream.close()));\n this._swarmStreams.clear();\n this._messageStreams.clear();\n });\n\n try {\n this._client = new SignalRPCClient({\n url: this._host,\n callbacks: {\n onConnected: () => {\n log('socket connected');\n this._lastError = undefined;\n this._reconnectAfter = DEFAULT_RECONNECT_TIMEOUT;\n this._setState(SignalState.CONNECTED);\n this._clientReady.wake();\n this._reconcileTask!.schedule();\n },\n\n onDisconnected: () => {\n log('socket disconnected', { state: this._state });\n if (this._state === SignalState.ERROR) {\n // Ignore disconnects after error.\n // Handled by error handler before disconnect handler.\n this._setState(SignalState.DISCONNECTED);\n return;\n }\n if (this._state !== SignalState.CONNECTED && this._state !== SignalState.CONNECTING) {\n this._incrementReconnectTimeout();\n }\n this._setState(SignalState.DISCONNECTED);\n this._reconnectTask!.schedule();\n },\n\n onError: (error) => {\n log('socket error', { error, state: this._state });\n this._lastError = error;\n if (this._state !== SignalState.CONNECTED && this._state !== SignalState.CONNECTING) {\n this._incrementReconnectTimeout();\n }\n this._setState(SignalState.ERROR);\n\n this._reconnectTask!.schedule();\n },\n },\n });\n } catch (err: any) {\n if (this._state !== SignalState.CONNECTED && this._state !== SignalState.CONNECTING) {\n this._incrementReconnectTimeout();\n }\n this._lastError = err;\n this._setState(SignalState.DISCONNECTED);\n this._reconnectTask!.schedule();\n }\n }\n\n private _incrementReconnectTimeout() {\n this._reconnectAfter *= 2;\n this._reconnectAfter = Math.min(this._reconnectAfter, MAX_RECONNECT_TIMEOUT);\n }\n\n private async _reconnect() {\n log(`reconnecting in ${this._reconnectAfter}ms`, { state: this._state });\n this._performance.reconnectCounter++;\n\n if (this._state === SignalState.RECONNECTING) {\n log.warn('Signal api already reconnecting.');\n return;\n }\n\n if (this._state === SignalState.CLOSED) {\n return;\n }\n\n // Close client if it wasn't already closed.\n this._clientReady.reset();\n await this._connectionCtx?.dispose();\n this._client?.close().catch(() => {});\n this._client = undefined;\n\n await cancelWithContext(this._ctx!, sleep(this._reconnectAfter));\n\n this._setState(SignalState.RECONNECTING);\n\n this._createClient();\n }\n\n private async _reconcileSwarmSubscriptions(): Promise<void> {\n await asyncTimeout(cancelWithContext(this._connectionCtx!, this._clientReady.wait()), 5_000);\n // Copy Client reference to avoid client change during the reconcile.\n const client = this._client!;\n invariant(this._state === SignalState.CONNECTED, 'Not connected to Signal Server');\n\n // Unsubscribe from topics that are no longer needed.\n for (const { topic, peerId } of this._swarmStreams.keys()) {\n // Join desired topics.\n if (this._joinedTopics.has({ topic, peerId })) {\n continue;\n }\n\n void this._swarmStreams.get({ topic, peerId })?.close();\n this._swarmStreams.delete({ topic, peerId });\n }\n\n // Subscribe to topics that are needed.\n for (const { topic, peerId } of this._joinedTopics.values()) {\n // Join desired topics.\n if (this._swarmStreams.has({ topic, peerId })) {\n continue;\n }\n\n const swarmStream = await asyncTimeout(\n cancelWithContext(this._connectionCtx!, client.join({ topic, peerId })),\n 5000,\n );\n // Subscribing to swarm events.\n // TODO(mykola): What happens when the swarm stream is closed? Maybe send leave event for each peer?\n swarmStream.subscribe(async (swarmEvent: SwarmEvent) => {\n log('swarm event', { swarmEvent });\n await this._onSwarmEvent({ topic, swarmEvent });\n });\n\n // Saving swarm stream.\n this._swarmStreams.set({ topic, peerId }, swarmStream);\n }\n }\n\n private async _reconcileMessageSubscriptions(): Promise<void> {\n await asyncTimeout(cancelWithContext(this._connectionCtx!, this._clientReady.wait()), 5_000);\n // Copy Client reference to avoid client change during the reconcile.\n const client = this._client!;\n invariant(this._state === SignalState.CONNECTED, 'Not connected to Signal Server');\n\n // Unsubscribe from messages that are no longer needed.\n for (const peerId of this._messageStreams.keys()) {\n // Join desired topics.\n if (this._subscribedMessages.has({ peerId })) {\n continue;\n }\n\n void this._messageStreams.get(peerId)?.close();\n this._messageStreams.delete(peerId);\n }\n\n // Subscribe to messages that are needed.\n for (const { peerId } of this._subscribedMessages.values()) {\n if (this._messageStreams.has(peerId)) {\n continue;\n }\n\n const messageStream = await asyncTimeout(\n cancelWithContext(this._connectionCtx!, client.receiveMessages(peerId)),\n 5000,\n );\n messageStream.subscribe(async (message: SignalMessage) => {\n this._performance.receivedMessages++;\n await this._onMessage({\n author: PublicKey.from(message.author),\n recipient: PublicKey.from(message.recipient),\n payload: message.payload,\n });\n });\n\n // Saving message stream.\n this._messageStreams.set(peerId, messageStream);\n }\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport WebSocket from 'isomorphic-ws';\n\nimport { scheduleTaskInterval, Trigger } from '@dxos/async';\nimport { type Any, type Stream } from '@dxos/codec-protobuf';\nimport { Context } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { schema, trace } from '@dxos/protocols';\nimport { type Message as SignalMessage, type Signal } from '@dxos/protocols/proto/dxos/mesh/signal';\nimport { createProtoRpcPeer, type ProtoRpcPeer } from '@dxos/rpc';\n\nconst SIGNAL_KEEPALIVE_INTERVAL = 10000;\n\ninterface Services {\n Signal: Signal;\n}\n\nexport type SignalCallbacks = {\n onConnected?: () => void;\n\n /**\n * Called on disconnect.\n * In case of error, `onError` will be called first and then `onDisconnected`.\n */\n onDisconnected?: () => void;\n\n onError?: (error: Error) => void;\n};\n\nexport type SignalRPCClientParams = {\n url: string;\n callbacks?: SignalCallbacks;\n};\n\nexport class SignalRPCClient {\n private _socket?: WebSocket;\n private _rpc?: ProtoRpcPeer<Services>;\n private readonly _connectTrigger = new Trigger();\n private _keepaliveCtx?: Context;\n\n private _closed = false;\n\n private readonly _url: string;\n private readonly _callbacks: SignalCallbacks;\n\n constructor({ url, callbacks = {} }: SignalRPCClientParams) {\n const traceId = PublicKey.random().toHex();\n log.trace('dxos.mesh.signal-rpc-client.constructor', trace.begin({ id: traceId }));\n this._url = url;\n this._callbacks = callbacks;\n this._socket = new WebSocket(this._url);\n\n this._rpc = createProtoRpcPeer({\n requested: {\n Signal: schema.getService('dxos.mesh.signal.Signal'),\n },\n noHandshake: true,\n port: {\n send: (msg) => {\n if (this._closed) {\n // Do not send messages after close.\n return;\n }\n try {\n this._socket!.send(msg);\n } catch (err) {\n log.warn('send error', err);\n }\n },\n subscribe: (cb) => {\n this._socket!.onmessage = async (msg: WebSocket.MessageEvent) => {\n if (typeof Blob !== 'undefined' && msg.data instanceof Blob) {\n cb(Buffer.from(await msg.data.arrayBuffer()));\n } else {\n cb(msg.data as any);\n }\n };\n },\n },\n encodingOptions: {\n preserveAny: true,\n },\n });\n\n this._socket.onopen = async () => {\n try {\n await this._rpc!.open();\n log(`RPC open ${this._url}`);\n this._callbacks.onConnected?.();\n this._connectTrigger.wake();\n this._keepaliveCtx = new Context();\n scheduleTaskInterval(\n this._keepaliveCtx,\n async () => {\n // TODO(nf): use RFC6455 ping/pong once implemented in the browser?\n // TODO(nf): check for pong response from server (once implemented)\n // Current implementation of signal server ignores all text data messages, and does not send a response.\n // However this is enough to detect breakages in the connection as TCP will reset the connection if ACKs are not received.\n this._socket?.send('__ping__');\n },\n SIGNAL_KEEPALIVE_INTERVAL,\n );\n } catch (err: any) {\n this._callbacks.onError?.(err);\n }\n };\n\n this._socket.onclose = async () => {\n log(`Disconnected ${this._url}`);\n this._callbacks.onDisconnected?.();\n await this.close();\n };\n\n this._socket.onerror = async (event: WebSocket.ErrorEvent) => {\n if (this._closed) {\n // Ignore errors after close.\n return;\n }\n\n this._callbacks.onError?.(event.error ?? new Error(event.message));\n this._connectTrigger.reset();\n\n try {\n await this._rpc?.close();\n } catch (err) {\n log.catch(err);\n }\n this._closed = true;\n\n log.warn(event.message ?? 'Socket error', { url: this._url });\n };\n\n log.trace('dxos.mesh.signal-rpc-client.constructor', trace.end({ id: traceId }));\n }\n\n async close() {\n await this._keepaliveCtx?.dispose();\n this._closed = true;\n try {\n await this._rpc?.close();\n this._socket?.close();\n } catch (err) {\n log.warn('close error', err);\n }\n }\n\n async join({ topic, peerId }: { topic: PublicKey; peerId: PublicKey }) {\n log('join', { topic, peerId });\n await this._connectTrigger.wait();\n invariant(!this._closed, 'SignalRPCClient is closed');\n invariant(this._rpc, 'Rpc is not initialized');\n const swarmStream = this._rpc.rpc.Signal.join({\n swarm: topic.asUint8Array(),\n peer: peerId.asUint8Array(),\n });\n await swarmStream.waitUntilReady();\n return swarmStream;\n }\n\n async receiveMessages(peerId: PublicKey): Promise<Stream<SignalMessage>> {\n log('receiveMessages', { peerId });\n invariant(!this._closed, 'SignalRPCClient is closed');\n await this._connectTrigger.wait();\n invariant(this._rpc, 'Rpc is not initialized');\n const messageStream = this._rpc.rpc.Signal.receiveMessages({\n peer: peerId.asUint8Array(),\n });\n await messageStream.waitUntilReady();\n return messageStream;\n }\n\n async sendMessage({ author, recipient, payload }: { author: PublicKey; recipient: PublicKey; payload: Any }) {\n log('sendMessage', { author, recipient, payload });\n invariant(!this._closed, 'SignalRPCClient is closed');\n await this._connectTrigger.wait();\n invariant(this._rpc, 'Rpc is not initialized');\n await this._rpc.rpc.Signal.sendMessage({\n author: author.asUint8Array(),\n recipient: recipient.asUint8Array(),\n payload,\n });\n }\n}\n", "//\n// Copyright 2020 DXOS.org\n//\n\nimport { Event, Trigger } from '@dxos/async';\nimport { type Any } from '@dxos/codec-protobuf';\nimport { Context } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { schema } from '@dxos/protocols';\nimport { type SwarmEvent } from '@dxos/protocols/proto/dxos/mesh/signal';\nimport { ComplexMap, ComplexSet } from '@dxos/util';\n\nimport { type SignalManager } from './signal-manager';\nimport { type CommandTrace, type SignalStatus } from '../signal-client';\n\n/**\n * Common signaling context that connects multiple MemorySignalManager instances.\n */\nexport class MemorySignalManagerContext {\n // Swarm messages.\n readonly swarmEvent = new Event<{\n topic: PublicKey;\n swarmEvent: SwarmEvent;\n }>();\n\n // Mapping from topic to set of peers.\n readonly swarms = new ComplexMap<PublicKey, ComplexSet<PublicKey>>(PublicKey.hash);\n\n // Map of connections for each peer for signaling.\n readonly connections = new ComplexMap<PublicKey, MemorySignalManager>(PublicKey.hash);\n}\n\n/**\n * In memory signal manager for testing.\n */\nexport class MemorySignalManager implements SignalManager {\n readonly statusChanged = new Event<SignalStatus[]>();\n readonly commandTrace = new Event<CommandTrace>();\n readonly swarmEvent = new Event<{\n topic: PublicKey;\n swarmEvent: SwarmEvent;\n }>();\n\n readonly onMessage = new Event<{\n author: PublicKey;\n recipient: PublicKey;\n payload: Any;\n }>();\n\n /** Will be used to emit SwarmEvents on .open() and .close() */\n private _joinedSwarms = new ComplexSet<{ topic: PublicKey; peerId: PublicKey }>(\n ({ topic, peerId }) => topic.toHex() + peerId.toHex(),\n );\n\n private _ctx!: Context;\n\n // TODO(dmaretskyi): Replace with callback.\n private readonly _freezeTrigger = new Trigger().wake();\n\n constructor(private readonly _context: MemorySignalManagerContext) {\n this._ctx = new Context();\n\n this._ctx.onDispose(this._context.swarmEvent.on((data) => this.swarmEvent.emit(data)));\n }\n\n async open() {\n if (!this._ctx.disposed) {\n return;\n }\n this._ctx = new Context();\n this._ctx.onDispose(this._context.swarmEvent.on((data) => this.swarmEvent.emit(data)));\n\n await Promise.all([...this._joinedSwarms.values()].map((value) => this.join(value)));\n }\n\n async close() {\n if (this._ctx.disposed) {\n return;\n }\n // save copy of joined swarms.\n const joinedSwarmsCopy = new ComplexSet<{ topic: PublicKey; peerId: PublicKey }>(\n ({ topic, peerId }) => topic.toHex() + peerId.toHex(),\n [...this._joinedSwarms.values()],\n );\n\n await Promise.all([...this._joinedSwarms.values()].map((value) => this.leave(value)));\n\n // assign joined swarms back because .leave() deletes it.\n this._joinedSwarms = joinedSwarmsCopy;\n\n await this._ctx.dispose();\n }\n\n getStatus(): SignalStatus[] {\n return [];\n }\n\n async join({ topic, peerId }: { topic: PublicKey; peerId: PublicKey }) {\n invariant(!this._ctx.disposed, 'Closed');\n\n this._joinedSwarms.add({ topic, peerId });\n\n if (!this._context.swarms.has(topic)) {\n this._context.swarms.set(topic, new ComplexSet(PublicKey.hash));\n }\n\n this._context.swarms.get(topic)!.add(peerId);\n this._context.swarmEvent.emit({\n topic,\n swarmEvent: {\n peerAvailable: {\n peer: peerId.asUint8Array(),\n since: new Date(),\n },\n },\n });\n\n // Emitting swarm events for each peer.\n for (const [topic, peerIds] of this._context.swarms) {\n Array.from(peerIds).forEach((peerId) => {\n this.swarmEvent.emit({\n topic,\n swarmEvent: {\n peerAvailable: {\n peer: peerId.asUint8Array(),\n since: new Date(),\n },\n },\n });\n });\n }\n }\n\n async leave({ topic, peerId }: { topic: PublicKey; peerId: PublicKey }) {\n invariant(!this._ctx.disposed, 'Closed');\n\n this._joinedSwarms.delete({ topic, peerId });\n\n if (!this._context.swarms.has(topic)) {\n this._context.swarms.set(topic, new ComplexSet(PublicKey.hash));\n }\n\n this._context.swarms.get(topic)!.delete(peerId);\n\n const swarmEvent: SwarmEvent = {\n peerLeft: {\n peer: peerId.asUint8Array(),\n },\n };\n\n this._context.swarmEvent.emit({ topic, swarmEvent });\n }\n\n async sendMessage({ author, recipient, payload }: { author: PublicKey; recipient: PublicKey; payload: Any }) {\n log('send message', { author, recipient, ...dec(payload) });\n\n invariant(recipient);\n invariant(!this._ctx.disposed, 'Closed');\n\n await this._freezeTrigger.wait();\n\n const remote = this._context.connections.get(recipient);\n if (!remote) {\n log.warn('recipient is not subscribed for messages', { author, recipient });\n return;\n }\n\n if (remote._ctx.disposed) {\n log.warn('recipient is disposed', { author, recipient });\n return;\n }\n\n remote._freezeTrigger\n .wait()\n .then(() => {\n if (remote._ctx.disposed) {\n log.warn('recipient is disposed', { author, recipient });\n return;\n }\n\n log('receive message', { author, recipient, ...dec(payload) });\n\n remote.onMessage.emit({ author, recipient, payload });\n })\n .catch((err) => {\n log.error('error while waiting for freeze', { err });\n });\n }\n\n async subscribeMessages(peerId: PublicKey) {\n log('subscribing', { peerId });\n this._context.connections.set(peerId, this);\n }\n\n async unsubscribeMessages(peerId: PublicKey) {\n log('unsubscribing', { peerId });\n this._context.connections.delete(peerId);\n }\n\n freeze() {\n this._freezeTrigger.reset();\n }\n\n unfreeze() {\n this._freezeTrigger.wake();\n }\n}\nconst dec = (payload: Any) => {\n if (!payload.type_url.endsWith('ReliablePayload')) {\n return {};\n }\n\n const relPayload = schema.getCodecForType('dxos.mesh.messaging.ReliablePayload').decode(payload.value);\n\n if (typeof relPayload?.payload?.data === 'object') {\n return { payload: Object.keys(relPayload?.payload?.data)[0], sessionId: relPayload?.payload?.sessionId };\n }\n\n return {};\n};\n", "//\n// Copyright 2020 DXOS.org\n//\n\nimport { Event, sleep, synchronized } from '@dxos/async';\nimport { type Any } from '@dxos/codec-protobuf';\nimport { Context } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { RateLimitExceededError, TimeoutError, trace } from '@dxos/protocols';\nimport { type Runtime } from '@dxos/protocols/proto/dxos/config';\nimport { type SwarmEvent } from '@dxos/protocols/proto/dxos/mesh/signal';\n\nimport { type SignalManager } from './signal-manager';\nimport { type CommandTrace, SignalClient, type SignalStatus } from '../signal-client';\n\nconst MAX_SERVER_FAILURES = 5;\nconst WSS_SIGNAL_SERVER_REBOOT_DELAY = 3_000;\n/**\n * Manages connection to multiple Signal Servers over WebSocket\n */\nexport class WebsocketSignalManager implements SignalManager {\n private readonly _servers = new Map<string, SignalClient>();\n\n private _ctx!: Context;\n private _opened = false;\n\n readonly failureCount = new Map<string, number>();\n readonly statusChanged = new Event<SignalStatus[]>();\n readonly commandTrace = new Event<CommandTrace>();\n readonly swarmEvent = new Event<{\n topic: PublicKey;\n swarmEvent: SwarmEvent;\n }>();\n\n readonly onMessage = new Event<{\n author: PublicKey;\n recipient: PublicKey;\n payload: Any;\n }>();\n\n private readonly _instanceId = PublicKey.random().toHex();\n\n constructor(private readonly _hosts: Runtime.Services.Signal[]) {\n log('Created WebsocketSignalManager', { hosts: this._hosts });\n for (const host of this._hosts) {\n if (this._servers.has(host.server)) {\n continue;\n }\n const server = new SignalClient(\n host.server,\n async (message) => this.onMessage.emit(message),\n async (data) => this.swarmEvent.emit(data),\n );\n server.statusChanged.on(() => this.statusChanged.emit(this.getStatus()));\n\n this._servers.set(host.server, server);\n this.failureCount.set(host.server, 0);\n server.commandTrace.on((trace) => this.commandTrace.emit(trace));\n }\n }\n\n @synchronized\n async open() {\n if (this._opened) {\n return;\n }\n log('open signal manager', { hosts: this._hosts });\n log.trace('dxos.mesh.websocket-signal-manager.open', trace.begin({ id: this._instanceId }));\n\n this._initContext();\n\n [...this._servers.values()].forEach((server) => server.open());\n\n this._opened = true;\n log.trace('dxos.mesh.websocket-signal-manager.open', trace.end({ id: this._instanceId }));\n }\n\n @synchronized\n async close() {\n if (!this._opened) {\n return;\n }\n this._opened = false;\n\n await this._ctx.dispose();\n\n await Promise.all(Array.from(this._servers.values()).map((server) => server.close()));\n }\n\n async restartServer(serverName: string) {\n log('Restarting server', { serverName });\n invariant(this._opened, 'server already closed');\n\n const server = this._servers.get(serverName);\n invariant(server, 'server not found');\n\n await server.close();\n await sleep(WSS_SIGNAL_SERVER_REBOOT_DELAY);\n await server.open();\n }\n\n getStatus(): SignalStatus[] {\n return Array.from(this._servers.values()).map((server) => server.getStatus());\n }\n\n @synchronized\n async join({ topic, peerId }: { topic: PublicKey; peerId: PublicKey }) {\n log('Join', { topic, peerId });\n invariant(this._opened, 'Closed');\n await this._forEachServer((server) => server.join({ topic, peerId }));\n }\n\n @synchronized\n async leave({ topic, peerId }: { topic: PublicKey; peerId: PublicKey }) {\n log('leaving', { topic, peerId });\n invariant(this._opened, 'Closed');\n\n await this._forEachServer((server) => server.leave({ topic, peerId }));\n }\n\n async sendMessage({\n author,\n recipient,\n payload,\n }: {\n author: PublicKey;\n recipient: PublicKey;\n payload: Any;\n }): Promise<void> {\n log(`Signal ${recipient.truncate()}`);\n invariant(this._opened, 'Closed');\n\n void this._forEachServer(async (server, serverName) => {\n void server.sendMessage({ author, recipient, payload }).catch((err) => {\n if (err instanceof RateLimitExceededError) {\n log.info('WSS rate limit exceeded', { err });\n } else if (err instanceof TimeoutError || err.constructor.name === 'TimeoutError') {\n log.info('WSS sendMessage timeout', { err });\n void this.checkServerFailure(serverName);\n } else {\n log.info(`error sending to ${serverName}`, { err });\n void this.checkServerFailure(serverName);\n }\n });\n });\n }\n\n @synchronized\n async checkServerFailure(serverName: string) {\n const failureCount = this.failureCount.get(serverName!) ?? 0;\n if (failureCount > MAX_SERVER_FAILURES) {\n log.warn(`Too many failures sending to ${serverName} (${failureCount} > ${MAX_SERVER_FAILURES}), restarting`);\n await this.restartServer(serverName!);\n this.failureCount.set(serverName!, 0);\n return;\n }\n this.failureCount.set(serverName!, (this.failureCount.get(serverName!) ?? 0) + 1);\n }\n\n async subscribeMessages(peerId: PublicKey) {\n log(`Subscribed for message stream peerId=${peerId}`);\n invariant(this._opened, 'Closed');\n\n await this._forEachServer(async (server) => server.subscribeMessages(peerId));\n }\n\n async unsubscribeMessages(peerId: PublicKey) {\n log(`Subscribed for message stream peerId=${peerId}`);\n invariant(this._opened, 'Closed');\n\n await this._forEachServer(async (server) => server.unsubscribeMessages(peerId));\n }\n\n private _initContext() {\n this._ctx = new Context({\n onError: (err) => log.catch(err),\n });\n }\n\n private async _forEachServer<ReturnType>(\n fn: (server: SignalClient, serverName: string) => Promise<ReturnType>,\n ): Promise<ReturnType[]> {\n return Promise.all(Array.from(this._servers.entries()).map(([serverName, server]) => fn(server, serverName)));\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["TimeoutError", "scheduleExponentialBackoffTaskInterval", "scheduleTask", "scheduleTaskInterval", "Context", "invariant", "PublicKey", "log", "ProtocolTimeoutError", "schema", "trace", "ComplexMap", "ComplexSet", "MESSAGE_TIMEOUT", "ReliablePayload", "schema", "getCodecForType", "Acknowledgement", "RECEIVED_MESSAGES_GC_INTERVAL", "Messenger", "constructor", "signalManager", "retryDelay", "_listeners", "ComplexMap", "peerId", "payloadType", "toHex", "_defaultListeners", "PublicKey", "hash", "_onAckCallbacks", "_receivedMessages", "ComplexSet", "_toClear", "_closed", "_signalManager", "_retryDelay", "open", "traceId", "random", "log", "trace", "begin", "id", "_ctx", "Context", "onError", "err", "catch", "onDispose", "onMessage", "on", "message", "from", "author", "_handleMessage", "scheduleTaskInterval", "_performGc", "end", "close", "dispose", "sendMessage", "recipient", "payload", "invariant", "messageContext", "derive", "reliablePayload", "messageId", "has", "messageReceived", "timeoutHit", "promise", "Promise", "resolve", "reject", "scheduleExponentialBackoffTaskInterval", "_encodeAndSend", "scheduleTask", "delete", "ProtocolTimeoutError", "TimeoutError", "MESSAGE_TIMEOUT", "set", "listen", "subscribeMessages", "listeners", "get", "Set", "add", "unsubscribe", "type_url", "value", "encode", "preserveAny", "_handleReliablePayload", "_handleAcknowledgement", "decode", "_sendAcknowledgement", "_callListeners", "to", "defaultListenerMap", "listener", "listenerMap", "start", "performance", "now", "key", "keys", "clear", "elapsed", "warn", "DeferredTask", "Event", "Trigger", "asyncTimeout", "scheduleTask", "scheduleTaskInterval", "sleep", "Context", "cancelWithContext", "invariant", "PublicKey", "log", "trace", "SignalState", "ComplexMap", "ComplexSet", "WebSocket", "scheduleTaskInterval", "Trigger", "Context", "invariant", "PublicKey", "log", "schema", "trace", "createProtoRpcPeer", "SIGNAL_KEEPALIVE_INTERVAL", "SignalRPCClient", "constructor", "url", "callbacks", "_connectTrigger", "_closed", "traceId", "random", "toHex", "begin", "id", "_url", "_callbacks", "_socket", "_rpc", "requested", "Signal", "getService", "noHandshake", "port", "send", "msg", "err", "warn", "subscribe", "cb", "onmessage", "Blob", "data", "Buffer", "from", "arrayBuffer", "encodingOptions", "preserveAny", "onopen", "open", "onConnected", "wake", "_keepaliveCtx", "onError", "onclose", "onDisconnected", "close", "onerror", "event", "error", "Error", "message", "reset", "catch", "end", "dispose", "join", "topic", "peerId", "wait", "swarmStream", "rpc", "swarm", "asUint8Array", "peer", "waitUntilReady", "receiveMessages", "messageStream", "sendMessage", "author", "recipient", "payload", "DEFAULT_RECONNECT_TIMEOUT", "MAX_RECONNECT_TIMEOUT", "ERROR_RECONCILE_DELAY", "RECONCILE_INTERVAL", "SignalClient", "constructor", "_host", "_onMessage", "_onSwarmEvent", "_state", "SignalState", "CLOSED", "_reconnectAfter", "_connectionStarted", "Date", "_lastStateChange", "_clientReady", "Trigger", "statusChanged", "Event", "commandTrace", "_swarmStreams", "ComplexMap", "topic", "peerId", "toHex", "_joinedTopics", "ComplexSet", "_messageStreams", "key", "_subscribedMessages", "_reconciled", "_instanceId", "PublicKey", "random", "_performance", "sentMessages", "receivedMessages", "reconnectCounter", "joinCounter", "leaveCounter", "startsWith", "Error", "open", "log", "trace", "begin", "id", "CONNECTED", "CONNECTING", "includes", "_ctx", "Context", "onError", "err", "disposed", "warn", "_scheduleReconcileAfterError", "_reconcileTask", "DeferredTask", "_reconcileSwarmSubscriptions", "_reconcileMessageSubscriptions", "emit", "scheduleTaskInterval", "schedule", "_reconnectTask", "_reconnect", "_setState", "_createClient", "end", "close", "dispose", "reset", "_client", "undefined", "getStatus", "host", "state", "error", "_lastError", "message", "reconnectIn", "connectionStarted", "lastStateChange", "join", "add", "leave", "get", "delete", "sendMessage", "msg", "wait", "invariant", "subscribeMessages", "unsubscribeMessages", "scheduleTask", "newState", "status", "_connectionCtx", "derive", "onDispose", "Promise", "all", "Array", "from", "values", "map", "stream", "clear", "SignalRPCClient", "url", "callbacks", "onConnected", "wake", "onDisconnected", "ERROR", "DISCONNECTED", "_incrementReconnectTimeout", "Math", "min", "RECONNECTING", "catch", "cancelWithContext", "sleep", "asyncTimeout", "client", "keys", "has", "swarmStream", "subscribe", "swarmEvent", "set", "messageStream", "receiveMessages", "author", "recipient", "payload", "Event", "Trigger", "Context", "invariant", "PublicKey", "log", "schema", "ComplexMap", "ComplexSet", "MemorySignalManagerContext", "swarmEvent", "swarms", "hash", "connections", "MemorySignalManager", "constructor", "_context", "statusChanged", "commandTrace", "onMessage", "_joinedSwarms", "topic", "peerId", "toHex", "_freezeTrigger", "wake", "_ctx", "onDispose", "on", "data", "emit", "open", "disposed", "Promise", "all", "values", "map", "value", "join", "close", "joinedSwarmsCopy", "leave", "dispose", "getStatus", "add", "has", "set", "get", "peerAvailable", "peer", "asUint8Array", "since", "Date", "peerIds", "Array", "from", "forEach", "delete", "peerLeft", "sendMessage", "author", "recipient", "payload", "dec", "wait", "remote", "warn", "then", "catch", "err", "error", "subscribeMessages", "unsubscribeMessages", "freeze", "reset", "unfreeze", "type_url", "endsWith", "relPayload", "getCodecForType", "decode", "Object", "keys", "sessionId", "Event", "sleep", "synchronized", "Context", "invariant", "PublicKey", "log", "RateLimitExceededError", "TimeoutError", "trace", "MAX_SERVER_FAILURES", "WSS_SIGNAL_SERVER_REBOOT_DELAY", "WebsocketSignalManager", "constructor", "_hosts", "_servers", "Map", "_opened", "failureCount", "statusChanged", "Event", "commandTrace", "swarmEvent", "onMessage", "_instanceId", "PublicKey", "random", "toHex", "log", "hosts", "host", "has", "server", "SignalClient", "message", "emit", "data", "on", "getStatus", "set", "trace", "open", "begin", "id", "_initContext", "values", "forEach", "end", "close", "_ctx", "dispose", "Promise", "all", "Array", "from", "map", "restartServer", "serverName", "invariant", "get", "sleep", "join", "topic", "peerId", "_forEachServer", "leave", "sendMessage", "author", "recipient", "payload", "truncate", "catch", "err", "RateLimitExceededError", "info", "TimeoutError", "name", "checkServerFailure", "warn", "subscribeMessages", "unsubscribeMessages", "Context", "onError", "fn", "entries", "synchronized"]
|
|
7
7
|
}
|