@dxos/messaging 0.5.8 → 0.5.9-main.079a532
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 +812 -559
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node/index.cjs +778 -545
- package/dist/lib/node/index.cjs.map +4 -4
- package/dist/lib/node/meta.json +1 -1
- package/dist/types/src/messenger-monitor.d.ts +8 -0
- package/dist/types/src/messenger-monitor.d.ts.map +1 -0
- package/dist/types/src/messenger.d.ts +1 -0
- package/dist/types/src/messenger.d.ts.map +1 -1
- package/dist/types/src/signal-client/signal-client-monitor.d.ts +30 -0
- package/dist/types/src/signal-client/signal-client-monitor.d.ts.map +1 -0
- package/dist/types/src/signal-client/signal-client.d.ts +25 -50
- package/dist/types/src/signal-client/signal-client.d.ts.map +1 -1
- package/dist/types/src/signal-client/signal-local-state.d.ts +46 -0
- package/dist/types/src/signal-client/signal-local-state.d.ts.map +1 -0
- package/dist/types/src/signal-client/signal-rpc-client-monitor.d.ts +6 -0
- package/dist/types/src/signal-client/signal-rpc-client-monitor.d.ts.map +1 -0
- package/dist/types/src/signal-client/signal-rpc-client.d.ts +4 -2
- package/dist/types/src/signal-client/signal-rpc-client.d.ts.map +1 -1
- package/dist/types/src/signal-manager/memory-signal-manager.d.ts +0 -2
- package/dist/types/src/signal-manager/memory-signal-manager.d.ts.map +1 -1
- package/dist/types/src/signal-manager/signal-manager.d.ts +0 -2
- package/dist/types/src/signal-manager/signal-manager.d.ts.map +1 -1
- package/dist/types/src/signal-manager/websocket-signal-manager-monitor.d.ts +8 -0
- package/dist/types/src/signal-manager/websocket-signal-manager-monitor.d.ts.map +1 -0
- package/dist/types/src/signal-manager/websocket-signal-manager.d.ts +7 -3
- package/dist/types/src/signal-manager/websocket-signal-manager.d.ts.map +1 -1
- package/dist/types/src/signal-methods.d.ts +6 -4
- package/dist/types/src/signal-methods.d.ts.map +1 -1
- package/package.json +13 -12
- package/src/messenger-monitor.ts +20 -0
- package/src/messenger.ts +16 -5
- package/src/signal-client/signal-client-monitor.ts +111 -0
- package/src/signal-client/signal-client.test.ts +111 -259
- package/src/signal-client/signal-client.ts +141 -252
- package/src/signal-client/signal-local-state.ts +156 -0
- package/src/signal-client/signal-rpc-client-monitor.ts +15 -0
- package/src/signal-client/signal-rpc-client.ts +38 -21
- package/src/signal-manager/memory-signal-manager.ts +0 -2
- package/src/signal-manager/signal-manager.ts +0 -3
- package/src/signal-manager/websocket-signal-manager-monitor.ts +20 -0
- package/src/signal-manager/websocket-signal-manager.ts +48 -26
- package/src/signal-methods.ts +7 -4
|
@@ -1,82 +1,56 @@
|
|
|
1
1
|
import { Event } from '@dxos/async';
|
|
2
2
|
import { type Any } from '@dxos/codec-protobuf';
|
|
3
|
+
import { Resource } from '@dxos/context';
|
|
3
4
|
import { PublicKey } from '@dxos/keys';
|
|
4
5
|
import { type SwarmEvent } from '@dxos/protocols/proto/dxos/mesh/signal';
|
|
5
6
|
import { type Message, type SignalClientMethods, type SignalStatus } from '../signal-methods';
|
|
6
|
-
export type CommandTrace = {
|
|
7
|
-
messageId: string;
|
|
8
|
-
host: string;
|
|
9
|
-
incoming: boolean;
|
|
10
|
-
time: number;
|
|
11
|
-
method: string;
|
|
12
|
-
payload: any;
|
|
13
|
-
response?: any;
|
|
14
|
-
error?: string;
|
|
15
|
-
};
|
|
16
7
|
/**
|
|
17
8
|
* KUBE-specific signaling client.
|
|
18
9
|
* Establishes a websocket connection to signal server and provides RPC methods.
|
|
10
|
+
* Subscription state updates are executed immediately against the local state which
|
|
11
|
+
* is reconciled periodically.
|
|
19
12
|
*/
|
|
20
|
-
export declare class SignalClient implements SignalClientMethods {
|
|
13
|
+
export declare class SignalClient extends Resource implements SignalClientMethods {
|
|
21
14
|
private readonly _host;
|
|
22
|
-
private readonly _onMessage;
|
|
23
|
-
private readonly _onSwarmEvent;
|
|
24
15
|
private readonly _getMetadata?;
|
|
16
|
+
private readonly _monitor;
|
|
25
17
|
private _state;
|
|
26
18
|
private _lastError?;
|
|
27
|
-
|
|
28
|
-
* Number of milliseconds after which the connection will be attempted again in case of error.
|
|
29
|
-
*/
|
|
30
|
-
private _reconnectAfter;
|
|
31
|
-
/**
|
|
32
|
-
* Timestamp of when the connection attempt was began.
|
|
33
|
-
*/
|
|
34
|
-
private _connectionStarted;
|
|
35
|
-
/**
|
|
36
|
-
* Timestamp of last state change.
|
|
37
|
-
*/
|
|
38
|
-
private _lastStateChange;
|
|
39
|
-
private _client?;
|
|
19
|
+
private _lastReconciliationFailed;
|
|
40
20
|
private readonly _clientReady;
|
|
41
|
-
private _ctx?;
|
|
42
21
|
private _connectionCtx?;
|
|
22
|
+
private _client?;
|
|
43
23
|
private _reconcileTask?;
|
|
44
24
|
private _reconnectTask?;
|
|
45
|
-
readonly statusChanged: Event<SignalStatus>;
|
|
46
|
-
readonly commandTrace: Event<CommandTrace>;
|
|
47
|
-
/**
|
|
48
|
-
* Swarm events streams. Keys represent actually joined topic and peerId.
|
|
49
|
-
*/
|
|
50
|
-
private readonly _swarmStreams;
|
|
51
|
-
/**
|
|
52
|
-
* Represent desired joined topic and peerId.
|
|
53
|
-
*/
|
|
54
|
-
private readonly _joinedTopics;
|
|
55
25
|
/**
|
|
56
|
-
*
|
|
26
|
+
* Number of milliseconds after which the connection will be attempted again in case of error.
|
|
57
27
|
*/
|
|
58
|
-
private
|
|
28
|
+
private _reconnectAfter;
|
|
59
29
|
private readonly _instanceId;
|
|
60
|
-
|
|
30
|
+
readonly statusChanged: Event<SignalStatus>;
|
|
61
31
|
/**
|
|
62
32
|
* @param _host Signal server websocket URL.
|
|
33
|
+
* @param onMessage called when a new message is received.
|
|
34
|
+
* @param onSwarmEvent called when a new swarm event is received.
|
|
35
|
+
* @param _getMetadata signal-message metadata provider, called for every message.
|
|
63
36
|
*/
|
|
64
|
-
constructor(_host: string,
|
|
37
|
+
constructor(_host: string, onMessage: (params: {
|
|
65
38
|
author: PublicKey;
|
|
66
39
|
recipient: PublicKey;
|
|
67
40
|
payload: Any;
|
|
68
|
-
}) => Promise<void>,
|
|
41
|
+
}) => Promise<void>, onSwarmEvent: (params: {
|
|
69
42
|
topic: PublicKey;
|
|
70
43
|
swarmEvent: SwarmEvent;
|
|
71
44
|
}) => Promise<void>, _getMetadata?: (() => any) | undefined);
|
|
72
|
-
|
|
73
|
-
|
|
45
|
+
protected _open(): Promise<void>;
|
|
46
|
+
protected _catch(err: Error): Promise<void>;
|
|
47
|
+
protected _close(): Promise<void>;
|
|
74
48
|
getStatus(): SignalStatus;
|
|
75
|
-
join(
|
|
49
|
+
join(args: {
|
|
76
50
|
topic: PublicKey;
|
|
77
51
|
peerId: PublicKey;
|
|
78
52
|
}): Promise<void>;
|
|
79
|
-
leave(
|
|
53
|
+
leave(args: {
|
|
80
54
|
topic: PublicKey;
|
|
81
55
|
peerId: PublicKey;
|
|
82
56
|
}): Promise<void>;
|
|
@@ -84,11 +58,12 @@ export declare class SignalClient implements SignalClientMethods {
|
|
|
84
58
|
subscribeMessages(peerId: PublicKey): Promise<void>;
|
|
85
59
|
unsubscribeMessages(peerId: PublicKey): Promise<void>;
|
|
86
60
|
private _scheduleReconcileAfterError;
|
|
87
|
-
private _setState;
|
|
88
61
|
private _createClient;
|
|
89
|
-
private _incrementReconnectTimeout;
|
|
90
62
|
private _reconnect;
|
|
91
|
-
private
|
|
92
|
-
private
|
|
63
|
+
private _onConnected;
|
|
64
|
+
private _onDisconnected;
|
|
65
|
+
private _setState;
|
|
66
|
+
private _updateReconnectTimeout;
|
|
67
|
+
private _safeResetClient;
|
|
93
68
|
}
|
|
94
69
|
//# sourceMappingURL=signal-client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signal-client.d.ts","sourceRoot":"","sources":["../../../../src/signal-client/signal-client.ts"],"names":[],"mappings":"AAIA,OAAO,EAAgB,KAAK,
|
|
1
|
+
{"version":3,"file":"signal-client.d.ts","sourceRoot":"","sources":["../../../../src/signal-client/signal-client.ts"],"names":[],"mappings":"AAIA,OAAO,EAAgB,KAAK,EAAsD,MAAM,aAAa,CAAC;AACtG,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAmC,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE1E,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvC,OAAO,EAAe,KAAK,UAAU,EAAE,MAAM,wCAAwC,CAAC;AAKtF,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,mBAAmB,EAAE,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAO9F;;;;;GAKG;AAEH,qBAAa,YAAa,SAAQ,QAAS,YAAW,mBAAmB;IAmCrE,OAAO,CAAC,QAAQ,CAAC,KAAK;IAGtB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;IArChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6B;IAEtD,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,UAAU,CAAC,CAAQ;IAC3B,OAAO,CAAC,yBAAyB,CAAS;IAE1C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAiB;IAC9C,OAAO,CAAC,cAAc,CAAC,CAAU;IACjC,OAAO,CAAC,OAAO,CAAC,CAAkB;IAElC,OAAO,CAAC,cAAc,CAAC,CAAe;IACtC,OAAO,CAAC,cAAc,CAAC,CAAe;IAEtC;;OAEG;IACH,OAAO,CAAC,eAAe,CAA6B;IAEpD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA8B;IAO1D,QAAQ,CAAC,aAAa,sBAA6B;IAEnD;;;;;OAKG;gBAEgB,KAAK,EAAE,MAAM,EAC9B,SAAS,EAAE,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,SAAS,CAAC;QAAC,SAAS,EAAE,SAAS,CAAC;QAAC,OAAO,EAAE,GAAG,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,EAC/F,YAAY,EAAE,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,SAAS,CAAC;QAAC,UAAU,EAAE,UAAU,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,EACpE,YAAY,CAAC,SAAQ,GAAG,aAAA;cAalB,KAAK;cA+CL,MAAM,CAAC,GAAG,EAAE,KAAK;cAWjB,MAAM;IAY/B,SAAS,IAAI,YAAY;IAUnB,IAAI,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,SAAS,CAAC;QAAC,MAAM,EAAE,SAAS,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAOlE,KAAK,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,SAAS,CAAC;QAAC,MAAM,EAAE,SAAS,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAMnE,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAQxC,iBAAiB,CAAC,MAAM,EAAE,SAAS;IAMnC,mBAAmB,CAAC,MAAM,EAAE,SAAS;IAK3C,OAAO,CAAC,4BAA4B;IAIpC,OAAO,CAAC,aAAa;YAuDP,UAAU;IAmBxB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,eAAe;IAcvB,OAAO,CAAC,SAAS;IAOjB,OAAO,CAAC,uBAAuB;YAOjB,gBAAgB;CAQ/B"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { Any } from '@dxos/codec-protobuf';
|
|
2
|
+
import { type Context } from '@dxos/context';
|
|
3
|
+
import { PublicKey } from '@dxos/keys';
|
|
4
|
+
import { type SwarmEvent } from '@dxos/protocols/proto/dxos/mesh/signal';
|
|
5
|
+
import { type SignalRPCClient } from './signal-rpc-client';
|
|
6
|
+
export declare class SignalLocalState {
|
|
7
|
+
private readonly _onMessage;
|
|
8
|
+
private readonly _onSwarmEvent;
|
|
9
|
+
/**
|
|
10
|
+
* Swarm events streams. Keys represent actually joined topic and peerId.
|
|
11
|
+
*/
|
|
12
|
+
private readonly _swarmStreams;
|
|
13
|
+
/**
|
|
14
|
+
* Represent desired joined topic and peerId.
|
|
15
|
+
*/
|
|
16
|
+
private readonly _joinedTopics;
|
|
17
|
+
/**
|
|
18
|
+
* Represent desired message subscriptions.
|
|
19
|
+
*/
|
|
20
|
+
private readonly _subscribedMessages;
|
|
21
|
+
constructor(_onMessage: (params: {
|
|
22
|
+
author: PublicKey;
|
|
23
|
+
recipient: PublicKey;
|
|
24
|
+
payload: Any;
|
|
25
|
+
}) => Promise<void>, _onSwarmEvent: (params: {
|
|
26
|
+
topic: PublicKey;
|
|
27
|
+
swarmEvent: SwarmEvent;
|
|
28
|
+
}) => Promise<void>);
|
|
29
|
+
safeCloseStreams(): Promise<{
|
|
30
|
+
failureCount: number;
|
|
31
|
+
}>;
|
|
32
|
+
join({ topic, peerId }: {
|
|
33
|
+
topic: PublicKey;
|
|
34
|
+
peerId: PublicKey;
|
|
35
|
+
}): void;
|
|
36
|
+
leave({ topic, peerId }: {
|
|
37
|
+
topic: PublicKey;
|
|
38
|
+
peerId: PublicKey;
|
|
39
|
+
}): void;
|
|
40
|
+
subscribeMessages(peerId: PublicKey): void;
|
|
41
|
+
unsubscribeMessages(peerId: PublicKey): void;
|
|
42
|
+
reconcile(ctx: Context, client: SignalRPCClient): Promise<void>;
|
|
43
|
+
private _reconcileSwarmSubscriptions;
|
|
44
|
+
private _reconcileMessageSubscriptions;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=signal-local-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal-local-state.d.ts","sourceRoot":"","sources":["../../../../src/signal-client/signal-local-state.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,GAAG,EAAU,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAqB,KAAK,OAAO,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,EAAiC,KAAK,UAAU,EAAE,MAAM,wCAAwC,CAAC;AAGxG,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAG3D,qBAAa,gBAAgB;IAiCzB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAjChC;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,aAAa,CAE5B;IAEF;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,aAAa,CAE5B;IAEF;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAyE;gBAe1F,UAAU,EAAE,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,SAAS,CAAC;QAAC,SAAS,EAAE,SAAS,CAAC;QAAC,OAAO,EAAE,GAAG,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,EAChG,aAAa,EAAE,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,SAAS,CAAC;QAAC,UAAU,EAAE,UAAU,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC;IAGnG,gBAAgB,IAAI,OAAO,CAAC;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IAQ3D,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAAE,KAAK,EAAE,SAAS,CAAC;QAAC,MAAM,EAAE,SAAS,CAAA;KAAE;IAI/D,KAAK,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAAE,KAAK,EAAE,SAAS,CAAC;QAAC,MAAM,EAAE,SAAS,CAAA;KAAE;IAMhE,iBAAiB,CAAC,MAAM,EAAE,SAAS;IAInC,mBAAmB,CAAC,MAAM,EAAE,SAAS;IAOxB,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe;YAM9C,4BAA4B;YAkC5B,8BAA8B;CAkC7C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal-rpc-client-monitor.d.ts","sourceRoot":"","sources":["../../../../src/signal-client/signal-rpc-client-monitor.ts"],"names":[],"mappings":"AAMA,qBAAa,sBAAsB;IAC1B,wBAAwB,CAAC,MAAM,EAAE;QAAE,aAAa,EAAE,MAAM,CAAA;KAAE;CAOlE"}
|
|
@@ -16,14 +16,15 @@ export type SignalRPCClientParams = {
|
|
|
16
16
|
callbacks?: SignalCallbacks;
|
|
17
17
|
};
|
|
18
18
|
export declare class SignalRPCClient {
|
|
19
|
-
private _socket
|
|
20
|
-
private _rpc
|
|
19
|
+
private readonly _socket;
|
|
20
|
+
private readonly _rpc;
|
|
21
21
|
private readonly _connectTrigger;
|
|
22
22
|
private _keepaliveCtx?;
|
|
23
23
|
private _closed;
|
|
24
24
|
private readonly _url;
|
|
25
25
|
private readonly _callbacks;
|
|
26
26
|
private readonly _closeComplete;
|
|
27
|
+
private readonly _monitor;
|
|
27
28
|
constructor({ url, callbacks }: SignalRPCClientParams);
|
|
28
29
|
close(): Promise<void>;
|
|
29
30
|
join({ topic, peerId }: {
|
|
@@ -36,5 +37,6 @@ export declare class SignalRPCClient {
|
|
|
36
37
|
recipient: PublicKey;
|
|
37
38
|
payload: Any;
|
|
38
39
|
}): Promise<void>;
|
|
40
|
+
private _safeCloseRpc;
|
|
39
41
|
}
|
|
40
42
|
//# sourceMappingURL=signal-rpc-client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signal-rpc-client.d.ts","sourceRoot":"","sources":["../../../../src/signal-client/signal-rpc-client.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,GAAG,EAAE,KAAK,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAG7D,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvC,OAAO,EAAE,KAAK,OAAO,IAAI,aAAa,EAAe,MAAM,wCAAwC,CAAC;
|
|
1
|
+
{"version":3,"file":"signal-rpc-client.d.ts","sourceRoot":"","sources":["../../../../src/signal-client/signal-rpc-client.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,GAAG,EAAE,KAAK,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAG7D,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvC,OAAO,EAAE,KAAK,OAAO,IAAI,aAAa,EAAe,MAAM,wCAAwC,CAAC;AAWpG,MAAM,MAAM,eAAe,GAAG;IAC5B,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IAEzB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAE5B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,GAAG,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,eAAe,CAAC;CAC7B,CAAC;AAEF,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAY;IACpC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAyB;IAC9C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiB;IAEjD,OAAO,CAAC,aAAa,CAAC,CAAU;IAEhC,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkB;IAC7C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAEhD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgC;gBAE7C,EAAE,GAAG,EAAE,SAAc,EAAE,EAAE,qBAAqB;IA2FpD,KAAK;IAsBL,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAAE,KAAK,EAAE,SAAS,CAAC;QAAC,MAAM,EAAE,SAAS,CAAA;KAAE;IAa/D,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAWlE,WAAW,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE;QAAE,MAAM,EAAE,SAAS,CAAC;QAAC,SAAS,EAAE,SAAS,CAAC;QAAC,OAAO,EAAE,GAAG,CAAA;KAAE;YAY7F,aAAa;CAQ5B"}
|
|
@@ -4,7 +4,6 @@ import { PublicKey } from '@dxos/keys';
|
|
|
4
4
|
import { type SwarmEvent } from '@dxos/protocols/proto/dxos/mesh/signal';
|
|
5
5
|
import { ComplexMap, ComplexSet } from '@dxos/util';
|
|
6
6
|
import { type SignalManager } from './signal-manager';
|
|
7
|
-
import { type CommandTrace } from '../signal-client';
|
|
8
7
|
import { type SignalStatus } from '../signal-methods';
|
|
9
8
|
/**
|
|
10
9
|
* Common signaling context that connects multiple MemorySignalManager instances.
|
|
@@ -23,7 +22,6 @@ export declare class MemorySignalManagerContext {
|
|
|
23
22
|
export declare class MemorySignalManager implements SignalManager {
|
|
24
23
|
private readonly _context;
|
|
25
24
|
readonly statusChanged: Event<SignalStatus[]>;
|
|
26
|
-
readonly commandTrace: Event<CommandTrace>;
|
|
27
25
|
readonly swarmEvent: Event<{
|
|
28
26
|
topic: PublicKey;
|
|
29
27
|
swarmEvent: SwarmEvent;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-signal-manager.d.ts","sourceRoot":"","sources":["../../../../src/signal-manager/memory-signal-manager.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,EAAW,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,sBAAsB,CAAC;AAGhD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvC,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,wCAAwC,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEpD,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"memory-signal-manager.d.ts","sourceRoot":"","sources":["../../../../src/signal-manager/memory-signal-manager.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,EAAW,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,sBAAsB,CAAC;AAGhD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvC,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,wCAAwC,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEpD,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD;;GAEG;AACH,qBAAa,0BAA0B;IAErC,QAAQ,CAAC,UAAU;eACV,SAAS;oBACJ,UAAU;OACnB;IAGL,QAAQ,CAAC,MAAM,+CAAoE;IAGnF,QAAQ,CAAC,WAAW,6CAAkE;CACvF;AAED;;GAEG;AACH,qBAAa,mBAAoB,YAAW,aAAa;IAuB3C,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAtBrC,QAAQ,CAAC,aAAa,wBAA+B;IACrD,QAAQ,CAAC,UAAU;eACV,SAAS;oBACJ,UAAU;OACnB;IAEL,QAAQ,CAAC,SAAS;gBACR,SAAS;mBACN,SAAS;iBACX,GAAG;OACT;IAEL,gEAAgE;IAChE,OAAO,CAAC,aAAa,CAEnB;IAEF,OAAO,CAAC,IAAI,CAAW;IAGvB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAwB;gBAE1B,QAAQ,EAAE,0BAA0B;IAM3D,IAAI;IAUJ,KAAK;IAkBX,SAAS,IAAI,YAAY,EAAE;IAIrB,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAAE,KAAK,EAAE,SAAS,CAAC;QAAC,MAAM,EAAE,SAAS,CAAA;KAAE;IAoC/D,KAAK,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAAE,KAAK,EAAE,SAAS,CAAC;QAAC,MAAM,EAAE,SAAS,CAAA;KAAE;IAoBhE,WAAW,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE;QAAE,MAAM,EAAE,SAAS,CAAC;QAAC,SAAS,EAAE,SAAS,CAAC;QAAC,OAAO,EAAE,GAAG,CAAA;KAAE;IAoCrG,iBAAiB,CAAC,MAAM,EAAE,SAAS;IAKnC,mBAAmB,CAAC,MAAM,EAAE,SAAS;IAK3C,MAAM;IAIN,QAAQ;CAGT"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { type Event } from '@dxos/async';
|
|
2
2
|
import { type PublicKey } from '@dxos/keys';
|
|
3
3
|
import { type SwarmEvent } from '@dxos/protocols/proto/dxos/mesh/signal';
|
|
4
|
-
import { type CommandTrace } from '../signal-client';
|
|
5
4
|
import { type Message, type SignalMethods, type SignalStatus } from '../signal-methods';
|
|
6
5
|
/**
|
|
7
6
|
* Manages a collection of signaling clients.
|
|
@@ -11,7 +10,6 @@ export interface SignalManager extends SignalMethods {
|
|
|
11
10
|
close(): Promise<void>;
|
|
12
11
|
getStatus(): SignalStatus[];
|
|
13
12
|
statusChanged: Event<SignalStatus[]>;
|
|
14
|
-
commandTrace: Event<CommandTrace>;
|
|
15
13
|
swarmEvent: Event<{
|
|
16
14
|
topic: PublicKey;
|
|
17
15
|
swarmEvent: SwarmEvent;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signal-manager.d.ts","sourceRoot":"","sources":["../../../../src/signal-manager/signal-manager.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,wCAAwC,CAAC;AAEzE,OAAO,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"signal-manager.d.ts","sourceRoot":"","sources":["../../../../src/signal-manager/signal-manager.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,wCAAwC,CAAC;AAEzE,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAExF;;GAEG;AACH,MAAM,WAAW,aAAc,SAAQ,aAAa;IAClD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,SAAS,IAAI,YAAY,EAAE,CAAC;IAE5B,aAAa,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;IACrC,UAAU,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,SAAS,CAAC;QAAC,UAAU,EAAE,UAAU,CAAA;KAAE,CAAC,CAAC;IAChE,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;CAC3B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket-signal-manager-monitor.d.ts","sourceRoot":"","sources":["../../../../src/signal-manager/websocket-signal-manager-monitor.ts"],"names":[],"mappings":"AAMA,qBAAa,6BAA6B;IACjC,uBAAuB;IAIvB,mBAAmB,CAAC,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,OAAO,CAAA;KAAE;CAQhF"}
|
|
@@ -4,7 +4,6 @@ import { PublicKey } from '@dxos/keys';
|
|
|
4
4
|
import { type Runtime } from '@dxos/protocols/proto/dxos/config';
|
|
5
5
|
import { type SwarmEvent } from '@dxos/protocols/proto/dxos/mesh/signal';
|
|
6
6
|
import { type SignalManager } from './signal-manager';
|
|
7
|
-
import { type CommandTrace } from '../signal-client';
|
|
8
7
|
import { type SignalStatus } from '../signal-methods';
|
|
9
8
|
/**
|
|
10
9
|
* Manages connection to multiple Signal Servers over WebSocket
|
|
@@ -13,11 +12,15 @@ export declare class WebsocketSignalManager implements SignalManager {
|
|
|
13
12
|
private readonly _hosts;
|
|
14
13
|
private readonly _getMetadata?;
|
|
15
14
|
private readonly _servers;
|
|
15
|
+
private readonly _monitor;
|
|
16
|
+
/**
|
|
17
|
+
* Used to avoid logging failed server restarts more than once until the server actually recovers.
|
|
18
|
+
*/
|
|
19
|
+
private readonly _failedServersBitfield;
|
|
16
20
|
private _ctx;
|
|
17
21
|
private _opened;
|
|
18
22
|
readonly failureCount: Map<string, number>;
|
|
19
23
|
readonly statusChanged: Event<SignalStatus[]>;
|
|
20
|
-
readonly commandTrace: Event<CommandTrace>;
|
|
21
24
|
readonly swarmEvent: Event<{
|
|
22
25
|
topic: PublicKey;
|
|
23
26
|
swarmEvent: SwarmEvent;
|
|
@@ -46,7 +49,8 @@ export declare class WebsocketSignalManager implements SignalManager {
|
|
|
46
49
|
recipient: PublicKey;
|
|
47
50
|
payload: Any;
|
|
48
51
|
}): Promise<void>;
|
|
49
|
-
checkServerFailure(serverName: string): Promise<void>;
|
|
52
|
+
checkServerFailure(serverName: string, index: number): Promise<void>;
|
|
53
|
+
private _clearServerFailedFlag;
|
|
50
54
|
subscribeMessages(peerId: PublicKey): Promise<void>;
|
|
51
55
|
unsubscribeMessages(peerId: PublicKey): Promise<void>;
|
|
52
56
|
private _initContext;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket-signal-manager.d.ts","sourceRoot":"","sources":["../../../../src/signal-manager/websocket-signal-manager.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,EAAuB,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,sBAAsB,CAAC;AAGhD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvC,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,wCAAwC,CAAC;
|
|
1
|
+
{"version":3,"file":"websocket-signal-manager.d.ts","sourceRoot":"","sources":["../../../../src/signal-manager/websocket-signal-manager.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,EAAuB,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,sBAAsB,CAAC;AAGhD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvC,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,wCAAwC,CAAC;AAGzE,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGtD,OAAO,EAAgD,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAKpG;;GAEG;AACH,qBAAa,sBAAuB,YAAW,aAAa;IA4BxD,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;IA5BhC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA0C;IACnE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAuC;IAEhE;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAa;IAEpD,OAAO,CAAC,IAAI,CAAW;IACvB,OAAO,CAAC,OAAO,CAAS;IAExB,QAAQ,CAAC,YAAY,sBAA6B;IAClD,QAAQ,CAAC,aAAa,wBAA+B;IACrD,QAAQ,CAAC,UAAU;eACV,SAAS;oBACJ,UAAU;OACnB;IAEL,QAAQ,CAAC,SAAS;gBACR,SAAS;mBACN,SAAS;iBACX,GAAG;OACT;IAEL,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA8B;gBAGvC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,EACjC,YAAY,CAAC,SAAQ,GAAG,aAAA;IAyBrC,IAAI;IAgBJ,KAAK;IASL,aAAa,CAAC,UAAU,EAAE,MAAM;IAYtC,SAAS,IAAI,YAAY,EAAE;IAKrB,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAAE,KAAK,EAAE,SAAS,CAAC;QAAC,MAAM,EAAE,SAAS,CAAA;KAAE;IAO/D,KAAK,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAAE,KAAK,EAAE,SAAS,CAAC;QAAC,MAAM,EAAE,SAAS,CAAA;KAAE;IAMhE,WAAW,CAAC,EAChB,MAAM,EACN,SAAS,EACT,OAAO,GACR,EAAE;QACD,MAAM,EAAE,SAAS,CAAC;QAClB,SAAS,EAAE,SAAS,CAAC;QACrB,OAAO,EAAE,GAAG,CAAC;KACd,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBX,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAiB1D,OAAO,CAAC,sBAAsB;IAQxB,iBAAiB,CAAC,MAAM,EAAE,SAAS;IAOnC,mBAAmB,CAAC,MAAM,EAAE,SAAS;IAO3C,OAAO,CAAC,YAAY;YAMN,cAAc;CAO7B"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import { type Any } from '@dxos/codec-protobuf';
|
|
2
1
|
import { type PublicKey } from '@dxos/keys';
|
|
3
2
|
import { type SignalState } from '@dxos/protocols/proto/dxos/mesh/signal';
|
|
4
3
|
export interface Message {
|
|
5
4
|
author: PublicKey;
|
|
6
5
|
recipient: PublicKey;
|
|
7
|
-
payload:
|
|
6
|
+
payload: {
|
|
7
|
+
type_url: string;
|
|
8
|
+
value: Uint8Array;
|
|
9
|
+
};
|
|
8
10
|
}
|
|
9
11
|
export type SignalStatus = {
|
|
10
12
|
host: string;
|
|
@@ -49,8 +51,8 @@ export interface SignalMethods {
|
|
|
49
51
|
* Signaling client.
|
|
50
52
|
*/
|
|
51
53
|
export interface SignalClientMethods extends SignalMethods {
|
|
52
|
-
open(): Promise<
|
|
53
|
-
close(): Promise<
|
|
54
|
+
open(): Promise<this>;
|
|
55
|
+
close(): Promise<this>;
|
|
54
56
|
getStatus(): SignalStatus;
|
|
55
57
|
}
|
|
56
58
|
//# sourceMappingURL=signal-methods.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signal-methods.d.ts","sourceRoot":"","sources":["../../../src/signal-methods.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"signal-methods.d.ts","sourceRoot":"","sources":["../../../src/signal-methods.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,wCAAwC,CAAC;AAE1E,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,SAAS,CAAC;IAClB,SAAS,EAAE,SAAS,CAAC;IACrB,OAAO,EAAE;QACP,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,UAAU,CAAC;KACnB,CAAC;CACH;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,IAAI,CAAC;IACxB,eAAe,EAAE,IAAI,CAAC;CACvB,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,IAAI,EAAE,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,SAAS,CAAC;QAAC,MAAM,EAAE,SAAS,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzE;;OAEG;IACH,KAAK,EAAE,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,SAAS,CAAC;QAAC,MAAM,EAAE,SAAS,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1E;;OAEG;IACH,WAAW,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjD;;OAEG;IAEH,iBAAiB,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAExD;;OAEG;IACH,mBAAmB,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3D;AAED;;GAEG;AACH,MAAM,WAAW,mBAAoB,SAAQ,aAAa;IACxD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,SAAS,IAAI,YAAY,CAAC;CAC3B"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dxos/messaging",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.9-main.079a532",
|
|
4
4
|
"description": "Messaging",
|
|
5
5
|
"homepage": "https://dxos.org",
|
|
6
6
|
"bugs": "https://github.com/dxos/dxos/issues",
|
|
@@ -19,23 +19,24 @@
|
|
|
19
19
|
"dependencies": {
|
|
20
20
|
"isomorphic-ws": "^5.0.0",
|
|
21
21
|
"ws": "^8.14.2",
|
|
22
|
-
"@dxos/
|
|
23
|
-
"@dxos/
|
|
24
|
-
"@dxos/context": "0.5.
|
|
25
|
-
"@dxos/invariant": "0.5.
|
|
26
|
-
"@dxos/
|
|
27
|
-
"@dxos/
|
|
28
|
-
"@dxos/
|
|
29
|
-
"@dxos/
|
|
30
|
-
"@dxos/
|
|
31
|
-
"@dxos/
|
|
22
|
+
"@dxos/async": "0.5.9-main.079a532",
|
|
23
|
+
"@dxos/codec-protobuf": "0.5.9-main.079a532",
|
|
24
|
+
"@dxos/context": "0.5.9-main.079a532",
|
|
25
|
+
"@dxos/invariant": "0.5.9-main.079a532",
|
|
26
|
+
"@dxos/keys": "0.5.9-main.079a532",
|
|
27
|
+
"@dxos/log": "0.5.9-main.079a532",
|
|
28
|
+
"@dxos/node-std": "0.5.9-main.079a532",
|
|
29
|
+
"@dxos/protocols": "0.5.9-main.079a532",
|
|
30
|
+
"@dxos/rpc": "0.5.9-main.079a532",
|
|
31
|
+
"@dxos/tracing": "0.5.9-main.079a532",
|
|
32
|
+
"@dxos/util": "0.5.9-main.079a532"
|
|
32
33
|
},
|
|
33
34
|
"devDependencies": {
|
|
34
35
|
"@types/node": "^18.11.9",
|
|
35
36
|
"earljs": "~0.1.10",
|
|
36
37
|
"typescript": "^5.4.5",
|
|
37
38
|
"wait-for-expect": "^3.0.2",
|
|
38
|
-
"@dxos/signal": "0.5.
|
|
39
|
+
"@dxos/signal": "0.5.9-main.079a532"
|
|
39
40
|
},
|
|
40
41
|
"publishConfig": {
|
|
41
42
|
"access": "public"
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2024 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { trace } from '@dxos/tracing';
|
|
6
|
+
|
|
7
|
+
export class MessengerMonitor {
|
|
8
|
+
public recordMessageAckFailed() {
|
|
9
|
+
trace.metrics.increment('mesh.signal.messenger.failed-ack', 1);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
public recordReliableMessage(params: { sendAttempts: number; sent: boolean }) {
|
|
13
|
+
trace.metrics.increment('mesh.signal.messenger.reliable-send', 1, {
|
|
14
|
+
tags: {
|
|
15
|
+
success: params.sent,
|
|
16
|
+
attempts: params.sendAttempts,
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
}
|
package/src/messenger.ts
CHANGED
|
@@ -12,6 +12,7 @@ import { TimeoutError as ProtocolTimeoutError, schema, trace } from '@dxos/proto
|
|
|
12
12
|
import { type ReliablePayload } from '@dxos/protocols/proto/dxos/mesh/messaging';
|
|
13
13
|
import { ComplexMap, ComplexSet } from '@dxos/util';
|
|
14
14
|
|
|
15
|
+
import { MessengerMonitor } from './messenger-monitor';
|
|
15
16
|
import { type SignalManager } from './signal-manager';
|
|
16
17
|
import { type Message } from './signal-methods';
|
|
17
18
|
import { MESSAGE_TIMEOUT } from './timeouts';
|
|
@@ -32,6 +33,7 @@ const RECEIVED_MESSAGES_GC_INTERVAL = 120_000;
|
|
|
32
33
|
* Reliable messenger that works trough signal network.
|
|
33
34
|
*/
|
|
34
35
|
export class Messenger {
|
|
36
|
+
private readonly _monitor = new MessengerMonitor();
|
|
35
37
|
private readonly _signalManager: SignalManager;
|
|
36
38
|
// { peerId, payloadType } => listeners set
|
|
37
39
|
private readonly _listeners = new ComplexMap<{ peerId: PublicKey; payloadType: string }, Set<OnMessage>>(
|
|
@@ -111,6 +113,7 @@ export class Messenger {
|
|
|
111
113
|
|
|
112
114
|
let messageReceived: () => void;
|
|
113
115
|
let timeoutHit: (err: Error) => void;
|
|
116
|
+
let sendAttempts = 0;
|
|
114
117
|
|
|
115
118
|
const promise = new Promise<void>((resolve, reject) => {
|
|
116
119
|
messageReceived = resolve;
|
|
@@ -122,6 +125,7 @@ export class Messenger {
|
|
|
122
125
|
messageContext,
|
|
123
126
|
async () => {
|
|
124
127
|
log('retrying message', { messageId: reliablePayload.messageId });
|
|
128
|
+
sendAttempts++;
|
|
125
129
|
await this._encodeAndSend({ author, recipient, reliablePayload }).catch((err) =>
|
|
126
130
|
log('failed to send message', { err }),
|
|
127
131
|
);
|
|
@@ -141,6 +145,7 @@ export class Messenger {
|
|
|
141
145
|
),
|
|
142
146
|
);
|
|
143
147
|
void messageContext.dispose();
|
|
148
|
+
this._monitor.recordReliableMessage({ sendAttempts, sent: false });
|
|
144
149
|
},
|
|
145
150
|
MESSAGE_TIMEOUT,
|
|
146
151
|
);
|
|
@@ -149,6 +154,7 @@ export class Messenger {
|
|
|
149
154
|
messageReceived();
|
|
150
155
|
this._onAckCallbacks.delete(reliablePayload.messageId!);
|
|
151
156
|
void messageContext.dispose();
|
|
157
|
+
this._monitor.recordReliableMessage({ sendAttempts, sent: true });
|
|
152
158
|
});
|
|
153
159
|
|
|
154
160
|
await this._encodeAndSend({ author, recipient, reliablePayload });
|
|
@@ -234,11 +240,16 @@ export class Messenger {
|
|
|
234
240
|
|
|
235
241
|
log('handling message', { messageId: reliablePayload.messageId });
|
|
236
242
|
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
243
|
+
try {
|
|
244
|
+
await this._sendAcknowledgement({
|
|
245
|
+
author,
|
|
246
|
+
recipient,
|
|
247
|
+
messageId: reliablePayload.messageId,
|
|
248
|
+
});
|
|
249
|
+
} catch (err) {
|
|
250
|
+
this._monitor.recordMessageAckFailed();
|
|
251
|
+
throw err;
|
|
252
|
+
}
|
|
242
253
|
|
|
243
254
|
// Ignore message if it was already received, i.e. from multiple signal servers.
|
|
244
255
|
if (this._receivedMessages.has(reliablePayload.messageId!)) {
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2024 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { trace } from '@dxos/tracing';
|
|
6
|
+
|
|
7
|
+
import type { Message } from '../signal-methods';
|
|
8
|
+
|
|
9
|
+
export class SignalClientMonitor {
|
|
10
|
+
private readonly _performance = {
|
|
11
|
+
sentMessages: 0,
|
|
12
|
+
receivedMessages: 0,
|
|
13
|
+
reconnectCounter: 0,
|
|
14
|
+
joinCounter: 0,
|
|
15
|
+
leaveCounter: 0,
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Timestamp of when the connection attempt was began.
|
|
20
|
+
*/
|
|
21
|
+
private _connectionStarted = new Date();
|
|
22
|
+
/**
|
|
23
|
+
* Timestamp of last state change.
|
|
24
|
+
*/
|
|
25
|
+
private _lastStateChange = new Date();
|
|
26
|
+
|
|
27
|
+
public getRecordedTimestamps() {
|
|
28
|
+
return {
|
|
29
|
+
connectionStarted: this._connectionStarted,
|
|
30
|
+
lastStateChange: this._lastStateChange,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
public recordStateChangeTime() {
|
|
35
|
+
this._lastStateChange = new Date();
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
public recordConnectionStartTime() {
|
|
39
|
+
this._connectionStarted = new Date();
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
public recordReconnect(params: { success: boolean }) {
|
|
43
|
+
this._performance.reconnectCounter++;
|
|
44
|
+
trace.metrics.increment('mesh.signal.signal-client.reconnect', 1, {
|
|
45
|
+
tags: {
|
|
46
|
+
success: params.success,
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
public recordJoin() {
|
|
52
|
+
this._performance.joinCounter++;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
public recordLeave() {
|
|
56
|
+
this._performance.leaveCounter++;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
public recordMessageReceived(message: Message) {
|
|
60
|
+
this._performance.receivedMessages++;
|
|
61
|
+
trace.metrics.increment('mesh.signal.signal-client.received-total', 1, {
|
|
62
|
+
tags: createIdentityTags(message),
|
|
63
|
+
});
|
|
64
|
+
trace.metrics.distribution('mesh.signal.signal-client.bytes-in', getByteCount(message), {
|
|
65
|
+
tags: createIdentityTags(message),
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
public async recordMessageSending(message: Message, sendMessage: () => Promise<void>) {
|
|
70
|
+
this._performance.sentMessages++;
|
|
71
|
+
const tags = createIdentityTags(message);
|
|
72
|
+
let success = true;
|
|
73
|
+
try {
|
|
74
|
+
const reqStart = Date.now();
|
|
75
|
+
await sendMessage();
|
|
76
|
+
const reqDuration = Date.now() - reqStart;
|
|
77
|
+
trace.metrics.distribution('mesh.signal.signal-client.send-duration', reqDuration, { tags });
|
|
78
|
+
trace.metrics.distribution('mesh.signal.signal-client.bytes-out', getByteCount(message), { tags });
|
|
79
|
+
} catch (err) {
|
|
80
|
+
success = false;
|
|
81
|
+
}
|
|
82
|
+
trace.metrics.increment('mesh.signal.signal-client.sent-total', 1, {
|
|
83
|
+
tags: { ...tags, success },
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
public recordStreamCloseErrors(count: number) {
|
|
88
|
+
trace.metrics.increment('mesh.signal.signal-client.stream-close-errors', count);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
public recordReconciliation(params: { success: boolean }) {
|
|
92
|
+
trace.metrics.increment('mesh.signal.signal-client.reconciliation', 1, {
|
|
93
|
+
tags: {
|
|
94
|
+
success: params.success,
|
|
95
|
+
},
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const getByteCount = (message: Message): number => {
|
|
101
|
+
return (
|
|
102
|
+
message.author.asUint8Array().length +
|
|
103
|
+
message.recipient.asUint8Array().length +
|
|
104
|
+
message.payload.type_url.length +
|
|
105
|
+
message.payload.value.length
|
|
106
|
+
);
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
const createIdentityTags = (message: Message) => {
|
|
110
|
+
return { peer: message.author.toHex() };
|
|
111
|
+
};
|