@dxos/messaging 0.8.4-main.ae835ea → 0.8.4-main.bc2380dfbc
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/LICENSE +102 -5
- package/dist/lib/neutral/chunk-EC4H56J5.mjs +497 -0
- package/dist/lib/neutral/chunk-EC4H56J5.mjs.map +7 -0
- package/dist/lib/neutral/index.mjs +1249 -0
- package/dist/lib/neutral/index.mjs.map +7 -0
- package/dist/lib/neutral/meta.json +1 -0
- package/dist/lib/{browser → neutral}/testing/index.mjs +4 -9
- package/dist/lib/neutral/testing/index.mjs.map +7 -0
- package/dist/types/src/messenger-monitor.d.ts.map +1 -1
- package/dist/types/src/messenger.blueprint-test.d.ts +1 -1
- package/dist/types/src/messenger.blueprint-test.d.ts.map +1 -1
- package/dist/types/src/messenger.d.ts +3 -2
- package/dist/types/src/messenger.d.ts.map +1 -1
- package/dist/types/src/signal-client/signal-client-monitor.d.ts.map +1 -1
- package/dist/types/src/signal-client/signal-client.d.ts +5 -6
- package/dist/types/src/signal-client/signal-client.d.ts.map +1 -1
- package/dist/types/src/signal-client/signal-local-state.d.ts.map +1 -1
- package/dist/types/src/signal-client/signal-rpc-client-monitor.d.ts.map +1 -1
- package/dist/types/src/signal-client/signal-rpc-client.d.ts +3 -3
- package/dist/types/src/signal-client/signal-rpc-client.d.ts.map +1 -1
- package/dist/types/src/signal-manager/edge-signal-manager.d.ts +5 -5
- package/dist/types/src/signal-manager/edge-signal-manager.d.ts.map +1 -1
- package/dist/types/src/signal-manager/memory-signal-manager.d.ts +5 -4
- package/dist/types/src/signal-manager/memory-signal-manager.d.ts.map +1 -1
- package/dist/types/src/signal-manager/utils.d.ts.map +1 -1
- package/dist/types/src/signal-manager/websocket-signal-manager-monitor.d.ts.map +1 -1
- package/dist/types/src/signal-manager/websocket-signal-manager.d.ts +5 -6
- package/dist/types/src/signal-manager/websocket-signal-manager.d.ts.map +1 -1
- package/dist/types/src/signal-methods.d.ts +5 -5
- package/dist/types/src/signal-methods.d.ts.map +1 -1
- package/dist/types/src/testing/test-builder.d.ts.map +1 -1
- package/dist/types/src/testing/test-peer.d.ts.map +1 -1
- package/dist/types/src/testing/utils.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +25 -30
- package/src/messenger.blueprint-test.ts +13 -12
- package/src/messenger.ts +37 -32
- package/src/signal-client/signal-client.node.test.ts +9 -9
- package/src/signal-client/signal-client.ts +6 -10
- package/src/signal-client/signal-local-state.ts +0 -1
- package/src/signal-client/signal-rpc-client.ts +4 -6
- package/src/signal-manager/edge-signal-manager.ts +10 -7
- package/src/signal-manager/memory-signal-manager.ts +17 -15
- package/src/signal-manager/websocket-signal-manager.node.test.ts +13 -13
- package/src/signal-manager/websocket-signal-manager.ts +9 -16
- package/src/signal-methods.ts +5 -5
- package/src/testing/test-builder.ts +4 -3
- package/src/testing/test-peer.ts +0 -1
- package/src/testing/utils.ts +0 -1
- package/dist/lib/browser/chunk-L7NDSF6K.mjs +0 -2380
- package/dist/lib/browser/chunk-L7NDSF6K.mjs.map +0 -7
- package/dist/lib/browser/index.mjs +0 -22
- package/dist/lib/browser/index.mjs.map +0 -7
- package/dist/lib/browser/meta.json +0 -1
- package/dist/lib/browser/testing/index.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-PVWR5V42.mjs +0 -2380
- package/dist/lib/node-esm/chunk-PVWR5V42.mjs.map +0 -7
- package/dist/lib/node-esm/index.mjs +0 -22
- package/dist/lib/node-esm/index.mjs.map +0 -7
- package/dist/lib/node-esm/meta.json +0 -1
- package/dist/lib/node-esm/testing/index.mjs +0 -149
- package/dist/lib/node-esm/testing/index.mjs.map +0 -7
package/package.json
CHANGED
|
@@ -1,35 +1,30 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dxos/messaging",
|
|
3
|
-
"version": "0.8.4-main.
|
|
3
|
+
"version": "0.8.4-main.bc2380dfbc",
|
|
4
4
|
"description": "Messaging",
|
|
5
5
|
"homepage": "https://dxos.org",
|
|
6
6
|
"bugs": "https://github.com/dxos/dxos/issues",
|
|
7
|
-
"
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/dxos/dxos"
|
|
10
|
+
},
|
|
11
|
+
"license": "FSL-1.1-Apache-2.0",
|
|
8
12
|
"author": "DXOS.org",
|
|
9
|
-
"sideEffects":
|
|
13
|
+
"sideEffects": false,
|
|
10
14
|
"type": "module",
|
|
11
15
|
"exports": {
|
|
12
16
|
".": {
|
|
13
17
|
"source": "./src/index.ts",
|
|
14
18
|
"types": "./dist/types/src/index.d.ts",
|
|
15
|
-
"
|
|
16
|
-
"node": "./dist/lib/node-esm/index.mjs"
|
|
19
|
+
"default": "./dist/lib/neutral/index.mjs"
|
|
17
20
|
},
|
|
18
21
|
"./testing": {
|
|
19
22
|
"source": "./src/testing/index.ts",
|
|
20
23
|
"types": "./dist/types/src/testing/index.d.ts",
|
|
21
|
-
"
|
|
22
|
-
"node": "./dist/lib/node-esm/testing/index.mjs"
|
|
24
|
+
"default": "./dist/lib/neutral/testing/index.mjs"
|
|
23
25
|
}
|
|
24
26
|
},
|
|
25
27
|
"types": "dist/types/src/index.d.ts",
|
|
26
|
-
"typesVersions": {
|
|
27
|
-
"*": {
|
|
28
|
-
"testing": [
|
|
29
|
-
"dist/types/src/testing/index.d.ts"
|
|
30
|
-
]
|
|
31
|
-
}
|
|
32
|
-
},
|
|
33
28
|
"files": [
|
|
34
29
|
"dist",
|
|
35
30
|
"src",
|
|
@@ -37,24 +32,24 @@
|
|
|
37
32
|
],
|
|
38
33
|
"dependencies": {
|
|
39
34
|
"isomorphic-ws": "^5.0.0",
|
|
40
|
-
"ws": "^8.
|
|
41
|
-
"@dxos/async": "0.8.4-main.
|
|
42
|
-
"@dxos/
|
|
43
|
-
"@dxos/
|
|
44
|
-
"@dxos/
|
|
45
|
-
"@dxos/
|
|
46
|
-
"@dxos/
|
|
47
|
-
"@dxos/
|
|
48
|
-
"@dxos/
|
|
49
|
-
"@dxos/
|
|
50
|
-
"@dxos/
|
|
51
|
-
"@dxos/
|
|
52
|
-
"@dxos/
|
|
35
|
+
"ws": "^8.17.1",
|
|
36
|
+
"@dxos/async": "0.8.4-main.bc2380dfbc",
|
|
37
|
+
"@dxos/invariant": "0.8.4-main.bc2380dfbc",
|
|
38
|
+
"@dxos/context": "0.8.4-main.bc2380dfbc",
|
|
39
|
+
"@dxos/codec-protobuf": "0.8.4-main.bc2380dfbc",
|
|
40
|
+
"@dxos/log": "0.8.4-main.bc2380dfbc",
|
|
41
|
+
"@dxos/edge-client": "0.8.4-main.bc2380dfbc",
|
|
42
|
+
"@dxos/keys": "0.8.4-main.bc2380dfbc",
|
|
43
|
+
"@dxos/node-std": "0.8.4-main.bc2380dfbc",
|
|
44
|
+
"@dxos/rpc": "0.8.4-main.bc2380dfbc",
|
|
45
|
+
"@dxos/util": "0.8.4-main.bc2380dfbc",
|
|
46
|
+
"@dxos/tracing": "0.8.4-main.bc2380dfbc",
|
|
47
|
+
"@dxos/protocols": "0.8.4-main.bc2380dfbc"
|
|
53
48
|
},
|
|
54
49
|
"devDependencies": {
|
|
55
|
-
"@dxos/keyring": "0.8.4-main.
|
|
56
|
-
"@dxos/test-utils": "0.8.4-main.
|
|
57
|
-
"@dxos/signal": "0.8.4-main.
|
|
50
|
+
"@dxos/keyring": "0.8.4-main.bc2380dfbc",
|
|
51
|
+
"@dxos/test-utils": "0.8.4-main.bc2380dfbc",
|
|
52
|
+
"@dxos/signal": "0.8.4-main.bc2380dfbc"
|
|
58
53
|
},
|
|
59
54
|
"publishConfig": {
|
|
60
55
|
"access": "public"
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import { describe, expect, onTestFinished, test } from 'vitest';
|
|
6
6
|
|
|
7
7
|
import { asyncTimeout, latch, sleep } from '@dxos/async';
|
|
8
|
+
import { Context } from '@dxos/context';
|
|
8
9
|
import { range } from '@dxos/util';
|
|
9
10
|
|
|
10
11
|
import { WebsocketSignalManager } from './signal-manager';
|
|
@@ -30,7 +31,7 @@ export const messengerTests = (signalManagerFactory: TestBuilder['createSignalMa
|
|
|
30
31
|
|
|
31
32
|
const promise = peer2.waitTillReceive(message);
|
|
32
33
|
|
|
33
|
-
await peer1.messenger.sendMessage(message);
|
|
34
|
+
await peer1.messenger.sendMessage(Context.default(), message);
|
|
34
35
|
|
|
35
36
|
await promise;
|
|
36
37
|
});
|
|
@@ -52,7 +53,7 @@ export const messengerTests = (signalManagerFactory: TestBuilder['createSignalMa
|
|
|
52
53
|
};
|
|
53
54
|
|
|
54
55
|
const promise = peer2.waitTillReceive(message);
|
|
55
|
-
await peer1.messenger.sendMessage(message);
|
|
56
|
+
await peer1.messenger.sendMessage(Context.default(), message);
|
|
56
57
|
await asyncTimeout(promise, 1_000);
|
|
57
58
|
}
|
|
58
59
|
|
|
@@ -64,7 +65,7 @@ export const messengerTests = (signalManagerFactory: TestBuilder['createSignalMa
|
|
|
64
65
|
};
|
|
65
66
|
|
|
66
67
|
const promise = peer3.waitTillReceive(message);
|
|
67
|
-
await peer1.messenger.sendMessage(message);
|
|
68
|
+
await peer1.messenger.sendMessage(Context.default(), message);
|
|
68
69
|
await asyncTimeout(promise, 1_000);
|
|
69
70
|
}
|
|
70
71
|
|
|
@@ -76,7 +77,7 @@ export const messengerTests = (signalManagerFactory: TestBuilder['createSignalMa
|
|
|
76
77
|
};
|
|
77
78
|
|
|
78
79
|
const promise = peer1.waitTillReceive(message);
|
|
79
|
-
await peer2.messenger.sendMessage(message);
|
|
80
|
+
await peer2.messenger.sendMessage(Context.default(), message);
|
|
80
81
|
await asyncTimeout(promise, 1_000);
|
|
81
82
|
}
|
|
82
83
|
});
|
|
@@ -128,7 +129,7 @@ export const messengerTests = (signalManagerFactory: TestBuilder['createSignalMa
|
|
|
128
129
|
};
|
|
129
130
|
const promise = peer2.waitTillReceive(message);
|
|
130
131
|
|
|
131
|
-
await peer1.messenger.sendMessage(message);
|
|
132
|
+
await peer1.messenger.sendMessage(Context.default(), message);
|
|
132
133
|
|
|
133
134
|
// 3 listeners (default one that was returned by setupPeer() and 2 that listen for type "1") should receive message.
|
|
134
135
|
await asyncTimeout(promise, 1_000);
|
|
@@ -175,7 +176,7 @@ export const messengerTests = (signalManagerFactory: TestBuilder['createSignalMa
|
|
|
175
176
|
};
|
|
176
177
|
|
|
177
178
|
const receivePromise = peer2.waitTillReceive(message);
|
|
178
|
-
await peer1.messenger.sendMessage(message);
|
|
179
|
+
await peer1.messenger.sendMessage(Context.default(), message);
|
|
179
180
|
|
|
180
181
|
// 2 subscribed listeners should receive message.
|
|
181
182
|
await asyncTimeout(receivePromise, 1_000);
|
|
@@ -195,7 +196,7 @@ export const messengerTests = (signalManagerFactory: TestBuilder['createSignalMa
|
|
|
195
196
|
};
|
|
196
197
|
|
|
197
198
|
const receivePromise = peer2.waitTillReceive(message);
|
|
198
|
-
await peer1.messenger.sendMessage(message);
|
|
199
|
+
await peer1.messenger.sendMessage(Context.default(), message);
|
|
199
200
|
|
|
200
201
|
// 1 listener that was not unsubscribed should receive message.
|
|
201
202
|
await asyncTimeout(receivePromise, 1_000);
|
|
@@ -221,7 +222,7 @@ export const messengerTests = (signalManagerFactory: TestBuilder['createSignalMa
|
|
|
221
222
|
|
|
222
223
|
{
|
|
223
224
|
const receivePromise = peer2.waitTillReceive(message);
|
|
224
|
-
await peer1.messenger.sendMessage(message);
|
|
225
|
+
await peer1.messenger.sendMessage(Context.default(), message);
|
|
225
226
|
await asyncTimeout(receivePromise, 1_000);
|
|
226
227
|
}
|
|
227
228
|
|
|
@@ -236,7 +237,7 @@ export const messengerTests = (signalManagerFactory: TestBuilder['createSignalMa
|
|
|
236
237
|
|
|
237
238
|
{
|
|
238
239
|
const receivePromise = peer2.waitTillReceive(message);
|
|
239
|
-
await peer1.messenger.sendMessage(message);
|
|
240
|
+
await peer1.messenger.sendMessage(Context.default(), message);
|
|
240
241
|
await asyncTimeout(receivePromise, 1_000);
|
|
241
242
|
}
|
|
242
243
|
});
|
|
@@ -275,7 +276,7 @@ export const messengerTests = (signalManagerFactory: TestBuilder['createSignalMa
|
|
|
275
276
|
Array(3)
|
|
276
277
|
.fill(0)
|
|
277
278
|
.forEach(async () => {
|
|
278
|
-
await peer2.messenger.sendMessage(message);
|
|
279
|
+
await peer2.messenger.sendMessage(Context.default(), message);
|
|
279
280
|
});
|
|
280
281
|
|
|
281
282
|
// expect to receive 3 messages.
|
|
@@ -302,7 +303,7 @@ export const messengerTests = (signalManagerFactory: TestBuilder['createSignalMa
|
|
|
302
303
|
count = inc();
|
|
303
304
|
});
|
|
304
305
|
// sending message.
|
|
305
|
-
await peer2.messenger.sendMessage({
|
|
306
|
+
await peer2.messenger.sendMessage(Context.default(), {
|
|
306
307
|
author: peer2.peerInfo,
|
|
307
308
|
recipient: peer1.peerInfo,
|
|
308
309
|
payload: PAYLOAD_1,
|
|
@@ -322,7 +323,7 @@ export const messengerTests = (signalManagerFactory: TestBuilder['createSignalMa
|
|
|
322
323
|
void range(100).map(async () => {
|
|
323
324
|
const peer = await builder.createPeer();
|
|
324
325
|
|
|
325
|
-
void peer.messenger.sendMessage({
|
|
326
|
+
void peer.messenger.sendMessage(Context.default(), {
|
|
326
327
|
author: peer.peerInfo,
|
|
327
328
|
recipient: peer.peerInfo,
|
|
328
329
|
payload: {
|
package/src/messenger.ts
CHANGED
|
@@ -8,7 +8,7 @@ import { Context } from '@dxos/context';
|
|
|
8
8
|
import { invariant } from '@dxos/invariant';
|
|
9
9
|
import { PublicKey } from '@dxos/keys';
|
|
10
10
|
import { log } from '@dxos/log';
|
|
11
|
-
import { TimeoutError as ProtocolTimeoutError
|
|
11
|
+
import { TimeoutError as ProtocolTimeoutError } from '@dxos/protocols';
|
|
12
12
|
import { schema } from '@dxos/protocols/proto';
|
|
13
13
|
import { type ReliablePayload } from '@dxos/protocols/proto/dxos/mesh/messaging';
|
|
14
14
|
import { ComplexMap, ComplexSet } from '@dxos/util';
|
|
@@ -68,8 +68,7 @@ export class Messenger {
|
|
|
68
68
|
if (!this._closed) {
|
|
69
69
|
return;
|
|
70
70
|
}
|
|
71
|
-
|
|
72
|
-
log.trace('dxos.mesh.messenger.open', trace.begin({ id: traceId }));
|
|
71
|
+
log('opening messenger');
|
|
73
72
|
this._ctx = new Context({
|
|
74
73
|
onError: (err) => log.catch(err),
|
|
75
74
|
});
|
|
@@ -90,7 +89,7 @@ export class Messenger {
|
|
|
90
89
|
);
|
|
91
90
|
|
|
92
91
|
this._closed = false;
|
|
93
|
-
log
|
|
92
|
+
log('opened messenger');
|
|
94
93
|
}
|
|
95
94
|
|
|
96
95
|
async close(): Promise<void> {
|
|
@@ -101,7 +100,7 @@ export class Messenger {
|
|
|
101
100
|
await this._ctx.dispose();
|
|
102
101
|
}
|
|
103
102
|
|
|
104
|
-
async sendMessage({ author, recipient, payload }: Message): Promise<void> {
|
|
103
|
+
async sendMessage(ctx: Context, { author, recipient, payload }: Message): Promise<void> {
|
|
105
104
|
invariant(!this._closed, 'Closed');
|
|
106
105
|
const messageContext = this._ctx.derive();
|
|
107
106
|
|
|
@@ -127,7 +126,7 @@ export class Messenger {
|
|
|
127
126
|
async () => {
|
|
128
127
|
log('retrying message', { messageId: reliablePayload.messageId });
|
|
129
128
|
sendAttempts++;
|
|
130
|
-
await this._encodeAndSend({ author, recipient, reliablePayload }).catch((err) =>
|
|
129
|
+
await this._encodeAndSend(ctx, { author, recipient, reliablePayload }).catch((err) =>
|
|
131
130
|
log('failed to send message', { err }),
|
|
132
131
|
);
|
|
133
132
|
},
|
|
@@ -140,10 +139,10 @@ export class Messenger {
|
|
|
140
139
|
log('message not delivered', { messageId: reliablePayload.messageId });
|
|
141
140
|
this._onAckCallbacks.delete(reliablePayload.messageId!);
|
|
142
141
|
timeoutHit(
|
|
143
|
-
new ProtocolTimeoutError(
|
|
144
|
-
'signaling message not delivered',
|
|
145
|
-
new TimeoutError(MESSAGE_TIMEOUT, 'Message not delivered'),
|
|
146
|
-
),
|
|
142
|
+
new ProtocolTimeoutError({
|
|
143
|
+
message: 'signaling message not delivered',
|
|
144
|
+
cause: new TimeoutError(MESSAGE_TIMEOUT, 'Message not delivered'),
|
|
145
|
+
}),
|
|
147
146
|
);
|
|
148
147
|
void messageContext.dispose();
|
|
149
148
|
this._monitor.recordReliableMessage({ sendAttempts, sent: false });
|
|
@@ -158,7 +157,7 @@ export class Messenger {
|
|
|
158
157
|
this._monitor.recordReliableMessage({ sendAttempts, sent: true });
|
|
159
158
|
});
|
|
160
159
|
|
|
161
|
-
await this._encodeAndSend({ author, recipient, reliablePayload });
|
|
160
|
+
await this._encodeAndSend(ctx, { author, recipient, reliablePayload });
|
|
162
161
|
return promise;
|
|
163
162
|
}
|
|
164
163
|
|
|
@@ -204,16 +203,19 @@ export class Messenger {
|
|
|
204
203
|
};
|
|
205
204
|
}
|
|
206
205
|
|
|
207
|
-
private async _encodeAndSend(
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
206
|
+
private async _encodeAndSend(
|
|
207
|
+
ctx: Context,
|
|
208
|
+
{
|
|
209
|
+
author,
|
|
210
|
+
recipient,
|
|
211
|
+
reliablePayload,
|
|
212
|
+
}: {
|
|
213
|
+
author: PeerInfo;
|
|
214
|
+
recipient: PeerInfo;
|
|
215
|
+
reliablePayload: ReliablePayload;
|
|
216
|
+
},
|
|
217
|
+
): Promise<void> {
|
|
218
|
+
await this._signalManager.sendMessage(ctx, {
|
|
217
219
|
author,
|
|
218
220
|
recipient,
|
|
219
221
|
payload: {
|
|
@@ -243,7 +245,7 @@ export class Messenger {
|
|
|
243
245
|
log('handling message', { messageId: reliablePayload.messageId });
|
|
244
246
|
|
|
245
247
|
try {
|
|
246
|
-
await this._sendAcknowledgement({
|
|
248
|
+
await this._sendAcknowledgement(this._ctx, {
|
|
247
249
|
author,
|
|
248
250
|
recipient,
|
|
249
251
|
messageId: reliablePayload.messageId,
|
|
@@ -272,18 +274,21 @@ export class Messenger {
|
|
|
272
274
|
this._onAckCallbacks.get(Acknowledgement.decode(payload.value).messageId)?.();
|
|
273
275
|
}
|
|
274
276
|
|
|
275
|
-
private async _sendAcknowledgement(
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
277
|
+
private async _sendAcknowledgement(
|
|
278
|
+
ctx: Context,
|
|
279
|
+
{
|
|
280
|
+
author,
|
|
281
|
+
recipient,
|
|
282
|
+
messageId,
|
|
283
|
+
}: {
|
|
284
|
+
author: PeerInfo;
|
|
285
|
+
recipient: PeerInfo;
|
|
286
|
+
messageId: PublicKey;
|
|
287
|
+
},
|
|
288
|
+
): Promise<void> {
|
|
284
289
|
log('sending ACK', { messageId, from: recipient, to: author });
|
|
285
290
|
|
|
286
|
-
await this._signalManager.sendMessage({
|
|
291
|
+
await this._signalManager.sendMessage(ctx, {
|
|
287
292
|
author: recipient,
|
|
288
293
|
recipient: author,
|
|
289
294
|
payload: {
|
|
@@ -6,6 +6,7 @@ import { afterAll, beforeAll, describe, expect, onTestFinished, test } from 'vit
|
|
|
6
6
|
|
|
7
7
|
import { asyncTimeout, waitForCondition } from '@dxos/async';
|
|
8
8
|
import { type Any, type TaggedType } from '@dxos/codec-protobuf';
|
|
9
|
+
import { Context } from '@dxos/context';
|
|
9
10
|
import { PublicKey } from '@dxos/keys';
|
|
10
11
|
import { log } from '@dxos/log';
|
|
11
12
|
import { type TYPES } from '@dxos/protocols/proto';
|
|
@@ -13,7 +14,6 @@ import { type SignalServerRunner, runTestSignalServer } from '@dxos/signal';
|
|
|
13
14
|
import { ComplexSet, range } from '@dxos/util';
|
|
14
15
|
|
|
15
16
|
import { type Message, type PeerInfo } from '../signal-methods';
|
|
16
|
-
|
|
17
17
|
import { SignalClient } from './signal-client';
|
|
18
18
|
|
|
19
19
|
const PAYLOAD: TaggedType<TYPES, 'google.protobuf.Any'> = {
|
|
@@ -43,7 +43,7 @@ describe('SignalClient', () => {
|
|
|
43
43
|
|
|
44
44
|
const message = createMessage(peer2, peer1);
|
|
45
45
|
const receivedMessage = peer1.waitForNextMessage();
|
|
46
|
-
await peer2.client.sendMessage(message);
|
|
46
|
+
await peer2.client.sendMessage(Context.default(), message);
|
|
47
47
|
expect(await receivedMessage).toEqual(message);
|
|
48
48
|
});
|
|
49
49
|
|
|
@@ -51,8 +51,8 @@ describe('SignalClient', () => {
|
|
|
51
51
|
const topic = PublicKey.random();
|
|
52
52
|
const [peer1, peer2] = setupPeers({ peerCount: 2 });
|
|
53
53
|
|
|
54
|
-
await peer1.client.join({ topic, peer: peer1.peerInfo });
|
|
55
|
-
await peer2.client.join({ topic, peer: peer2.peerInfo });
|
|
54
|
+
await peer1.client.join(Context.default(), { topic, peer: peer1.peerInfo });
|
|
55
|
+
await peer2.client.join(Context.default(), { topic, peer: peer2.peerInfo });
|
|
56
56
|
|
|
57
57
|
await peer1.waitForPeer(peer2.peerKey);
|
|
58
58
|
await peer2.waitForPeer(peer1.peerKey);
|
|
@@ -67,7 +67,7 @@ describe('SignalClient', () => {
|
|
|
67
67
|
const message = createMessage(peer2, peer1);
|
|
68
68
|
const receivedMessage = peer1.waitForNextMessage();
|
|
69
69
|
|
|
70
|
-
await peer1.client.sendMessage(message);
|
|
70
|
+
await peer1.client.sendMessage(Context.default(), message);
|
|
71
71
|
expect(await receivedMessage).toEqual(message);
|
|
72
72
|
});
|
|
73
73
|
|
|
@@ -82,7 +82,7 @@ describe('SignalClient', () => {
|
|
|
82
82
|
|
|
83
83
|
{
|
|
84
84
|
const receivedMessage = peer1.waitForNextMessage({ timeout: 1_000 });
|
|
85
|
-
await peer2.client.sendMessage(message);
|
|
85
|
+
await peer2.client.sendMessage(Context.default(), message);
|
|
86
86
|
expect(await receivedMessage).toEqual(message);
|
|
87
87
|
}
|
|
88
88
|
|
|
@@ -91,7 +91,7 @@ describe('SignalClient', () => {
|
|
|
91
91
|
|
|
92
92
|
{
|
|
93
93
|
const receivedMessage = peer1.waitForNextMessage({ timeout: 200 });
|
|
94
|
-
await peer2.client.sendMessage(message);
|
|
94
|
+
await peer2.client.sendMessage(Context.default(), message);
|
|
95
95
|
await expect(receivedMessage).rejects.toBeDefined();
|
|
96
96
|
}
|
|
97
97
|
});
|
|
@@ -106,7 +106,7 @@ describe('SignalClient', () => {
|
|
|
106
106
|
|
|
107
107
|
{
|
|
108
108
|
const waitMessage = peer1.waitForNextMessage();
|
|
109
|
-
await peer2.client.sendMessage(message);
|
|
109
|
+
await peer2.client.sendMessage(Context.default(), message);
|
|
110
110
|
expect(await waitMessage).toEqual(message);
|
|
111
111
|
}
|
|
112
112
|
|
|
@@ -120,7 +120,7 @@ describe('SignalClient', () => {
|
|
|
120
120
|
|
|
121
121
|
{
|
|
122
122
|
const waitMessage = peer1.waitForNextMessage();
|
|
123
|
-
await peer2.client.sendMessage(message);
|
|
123
|
+
await peer2.client.sendMessage(Context.default(), message);
|
|
124
124
|
expect(await waitMessage).toEqual(message);
|
|
125
125
|
}
|
|
126
126
|
});
|
|
@@ -7,7 +7,6 @@ import { type Context, Resource, cancelWithContext } from '@dxos/context';
|
|
|
7
7
|
import { invariant } from '@dxos/invariant';
|
|
8
8
|
import { PublicKey } from '@dxos/keys';
|
|
9
9
|
import { log } from '@dxos/log';
|
|
10
|
-
import { trace } from '@dxos/protocols';
|
|
11
10
|
import { type SwarmResponse } from '@dxos/protocols/proto/dxos/edge/messenger';
|
|
12
11
|
import { type JoinRequest, type LeaveRequest, type QueryRequest } from '@dxos/protocols/proto/dxos/edge/signal';
|
|
13
12
|
import { SignalState } from '@dxos/protocols/proto/dxos/mesh/signal';
|
|
@@ -19,7 +18,6 @@ import {
|
|
|
19
18
|
type SignalStatus,
|
|
20
19
|
type SwarmEvent,
|
|
21
20
|
} from '../signal-methods';
|
|
22
|
-
|
|
23
21
|
import { SignalClientMonitor } from './signal-client-monitor';
|
|
24
22
|
import { SignalLocalState } from './signal-local-state';
|
|
25
23
|
import { SignalRPCClient } from './signal-rpc-client';
|
|
@@ -57,8 +55,6 @@ export class SignalClient extends Resource implements SignalClientMethods {
|
|
|
57
55
|
*/
|
|
58
56
|
private _reconnectAfter = DEFAULT_RECONNECT_TIMEOUT;
|
|
59
57
|
|
|
60
|
-
private readonly _instanceId = PublicKey.random().toHex();
|
|
61
|
-
|
|
62
58
|
/**
|
|
63
59
|
* @internal
|
|
64
60
|
*/
|
|
@@ -94,7 +90,7 @@ export class SignalClient extends Resource implements SignalClientMethods {
|
|
|
94
90
|
}
|
|
95
91
|
|
|
96
92
|
protected override async _open(): Promise<void> {
|
|
97
|
-
log
|
|
93
|
+
log('opening signal client');
|
|
98
94
|
|
|
99
95
|
if ([SignalState.CONNECTED, SignalState.CONNECTING].includes(this._state)) {
|
|
100
96
|
return;
|
|
@@ -137,7 +133,7 @@ export class SignalClient extends Resource implements SignalClientMethods {
|
|
|
137
133
|
});
|
|
138
134
|
|
|
139
135
|
this._createClient();
|
|
140
|
-
log
|
|
136
|
+
log('opened signal client');
|
|
141
137
|
}
|
|
142
138
|
|
|
143
139
|
protected override async _catch(err: Error): Promise<void> {
|
|
@@ -173,24 +169,24 @@ export class SignalClient extends Resource implements SignalClientMethods {
|
|
|
173
169
|
};
|
|
174
170
|
}
|
|
175
171
|
|
|
176
|
-
async join(args: JoinRequest): Promise<void> {
|
|
172
|
+
async join(_ctx: Context, args: JoinRequest): Promise<void> {
|
|
177
173
|
log('joining', { topic: args.topic, peerId: args.peer.peerKey });
|
|
178
174
|
this._monitor.recordJoin();
|
|
179
175
|
this.localState.join({ topic: args.topic, peerId: PublicKey.from(args.peer.peerKey) });
|
|
180
176
|
this._reconcileTask?.schedule();
|
|
181
177
|
}
|
|
182
178
|
|
|
183
|
-
async leave(args: LeaveRequest): Promise<void> {
|
|
179
|
+
async leave(_ctx: Context, args: LeaveRequest): Promise<void> {
|
|
184
180
|
log('leaving', { topic: args.topic, peerId: args.peer.peerKey });
|
|
185
181
|
this._monitor.recordLeave();
|
|
186
182
|
this.localState.leave({ topic: args.topic, peerId: PublicKey.from(args.peer.peerKey) });
|
|
187
183
|
}
|
|
188
184
|
|
|
189
|
-
async query(params: QueryRequest): Promise<SwarmResponse> {
|
|
185
|
+
async query(_ctx: Context, params: QueryRequest): Promise<SwarmResponse> {
|
|
190
186
|
throw new Error('Not implemented');
|
|
191
187
|
}
|
|
192
188
|
|
|
193
|
-
async sendMessage(msg: Message): Promise<void> {
|
|
189
|
+
async sendMessage(_ctx: Context, msg: Message): Promise<void> {
|
|
194
190
|
return this._monitor.recordMessageSending(msg, async () => {
|
|
195
191
|
await this._clientReady.wait();
|
|
196
192
|
invariant(this._state === SignalState.CONNECTED, 'Not connected to Signal Server');
|
|
@@ -10,7 +10,6 @@ import { Context } from '@dxos/context';
|
|
|
10
10
|
import { invariant } from '@dxos/invariant';
|
|
11
11
|
import { PublicKey } from '@dxos/keys';
|
|
12
12
|
import { log } from '@dxos/log';
|
|
13
|
-
import { trace } from '@dxos/protocols';
|
|
14
13
|
import { schema } from '@dxos/protocols/proto';
|
|
15
14
|
import { type Signal, type Message as SignalMessage } from '@dxos/protocols/proto/dxos/mesh/signal';
|
|
16
15
|
import { type ProtoRpcPeer, createProtoRpcPeer } from '@dxos/rpc';
|
|
@@ -36,7 +35,7 @@ export type SignalCallbacks = {
|
|
|
36
35
|
getMetadata?: () => any;
|
|
37
36
|
};
|
|
38
37
|
|
|
39
|
-
export type
|
|
38
|
+
export type SignalRPCClientProps = {
|
|
40
39
|
url: string;
|
|
41
40
|
callbacks?: SignalCallbacks;
|
|
42
41
|
};
|
|
@@ -61,9 +60,8 @@ export class SignalRPCClient {
|
|
|
61
60
|
|
|
62
61
|
private readonly _monitor = new SignalRpcClientMonitor();
|
|
63
62
|
|
|
64
|
-
constructor({ url, callbacks = {} }:
|
|
65
|
-
|
|
66
|
-
log.trace('dxos.mesh.signal-rpc-client.constructor', trace.begin({ id: traceId }));
|
|
63
|
+
constructor({ url, callbacks = {} }: SignalRPCClientProps) {
|
|
64
|
+
log('creating signal rpc client', { url });
|
|
67
65
|
this._url = url;
|
|
68
66
|
this._callbacks = callbacks;
|
|
69
67
|
this._socket = new WebSocket(this._url);
|
|
@@ -149,7 +147,7 @@ export class SignalRPCClient {
|
|
|
149
147
|
log.warn(`Socket ${event.type ?? 'unknown'} error`, { message: event.message, url: this._url });
|
|
150
148
|
};
|
|
151
149
|
|
|
152
|
-
log
|
|
150
|
+
log('created signal rpc client', { url });
|
|
153
151
|
}
|
|
154
152
|
|
|
155
153
|
async close(): Promise<void> {
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
import { Event, scheduleMicroTask } from '@dxos/async';
|
|
6
|
-
import { Resource, cancelWithContext } from '@dxos/context';
|
|
6
|
+
import { type Context, Resource, cancelWithContext } from '@dxos/context';
|
|
7
7
|
import { type EdgeConnection, EdgeIdentityChangedError, protocol } from '@dxos/edge-client';
|
|
8
8
|
import { invariant } from '@dxos/invariant';
|
|
9
9
|
import { PublicKey } from '@dxos/keys';
|
|
@@ -21,7 +21,6 @@ import { type SwarmResponse } from '@dxos/protocols/proto/dxos/edge/messenger';
|
|
|
21
21
|
import { ComplexMap, ComplexSet } from '@dxos/util';
|
|
22
22
|
|
|
23
23
|
import { type Message, type PeerInfo, PeerInfoHash, type SwarmEvent } from '../signal-methods';
|
|
24
|
-
|
|
25
24
|
import { type SignalManager } from './signal-manager';
|
|
26
25
|
|
|
27
26
|
export class EdgeSignalManager extends Resource implements SignalManager {
|
|
@@ -60,7 +59,7 @@ export class EdgeSignalManager extends Resource implements SignalManager {
|
|
|
60
59
|
/**
|
|
61
60
|
* Warning: PeerInfo is inferred from edgeConnection.
|
|
62
61
|
*/
|
|
63
|
-
async join({ topic, peer }: { topic: PublicKey; peer: PeerInfo }): Promise<void> {
|
|
62
|
+
async join(ctx: Context, { topic, peer }: { topic: PublicKey; peer: PeerInfo }): Promise<void> {
|
|
64
63
|
if (!this._matchSelfPeerInfo(peer)) {
|
|
65
64
|
// NOTE: Could only join swarm with the same peer info as the edge connection.
|
|
66
65
|
log.warn('ignoring peer info on join request', {
|
|
@@ -77,6 +76,7 @@ export class EdgeSignalManager extends Resource implements SignalManager {
|
|
|
77
76
|
|
|
78
77
|
this._swarmPeers.set(topic, { lastState: peer.state, joinedPeers: new ComplexSet<PeerInfo>(PeerInfoHash) });
|
|
79
78
|
await this._edgeConnection.send(
|
|
79
|
+
ctx,
|
|
80
80
|
protocol.createMessage(SwarmRequestSchema, {
|
|
81
81
|
serviceId: EdgeService.SWARM,
|
|
82
82
|
source: createMessageSource(topic, peer),
|
|
@@ -85,10 +85,11 @@ export class EdgeSignalManager extends Resource implements SignalManager {
|
|
|
85
85
|
);
|
|
86
86
|
}
|
|
87
87
|
|
|
88
|
-
async leave({ topic, peer }: { topic: PublicKey; peer: PeerInfo }): Promise<void> {
|
|
88
|
+
async leave(ctx: Context, { topic, peer }: { topic: PublicKey; peer: PeerInfo }): Promise<void> {
|
|
89
89
|
this._swarmPeers.delete(topic);
|
|
90
90
|
try {
|
|
91
91
|
await this._edgeConnection.send(
|
|
92
|
+
ctx,
|
|
92
93
|
protocol.createMessage(SwarmRequestSchema, {
|
|
93
94
|
serviceId: EdgeService.SWARM,
|
|
94
95
|
source: createMessageSource(topic, peer),
|
|
@@ -105,13 +106,14 @@ export class EdgeSignalManager extends Resource implements SignalManager {
|
|
|
105
106
|
}
|
|
106
107
|
}
|
|
107
108
|
|
|
108
|
-
async query({ topic }: { topic: PublicKey }): Promise<SwarmResponse> {
|
|
109
|
+
async query(ctx: Context, { topic }: { topic: PublicKey }): Promise<SwarmResponse> {
|
|
109
110
|
const response = cancelWithContext(
|
|
110
111
|
this._ctx,
|
|
111
112
|
this.swarmState.waitFor((state) => state.swarmKey === topic.toHex()),
|
|
112
113
|
);
|
|
113
114
|
|
|
114
115
|
await this._edgeConnection.send(
|
|
116
|
+
ctx,
|
|
115
117
|
protocol.createMessage(SwarmRequestSchema, {
|
|
116
118
|
serviceId: EdgeService.SWARM,
|
|
117
119
|
source: createMessageSource(topic, {
|
|
@@ -125,7 +127,7 @@ export class EdgeSignalManager extends Resource implements SignalManager {
|
|
|
125
127
|
return response;
|
|
126
128
|
}
|
|
127
129
|
|
|
128
|
-
async sendMessage(message: Message): Promise<void> {
|
|
130
|
+
async sendMessage(ctx: Context, message: Message): Promise<void> {
|
|
129
131
|
if (!this._matchSelfPeerInfo(message.author)) {
|
|
130
132
|
// NOTE: Could only join swarm with the same peer info as the edge connection.
|
|
131
133
|
log.warn('ignoring author on send request', {
|
|
@@ -135,6 +137,7 @@ export class EdgeSignalManager extends Resource implements SignalManager {
|
|
|
135
137
|
}
|
|
136
138
|
|
|
137
139
|
await this._edgeConnection.send(
|
|
140
|
+
ctx,
|
|
138
141
|
protocol.createMessage(bufWkt.AnySchema, {
|
|
139
142
|
serviceId: EdgeService.SIGNAL,
|
|
140
143
|
source: message.author,
|
|
@@ -228,7 +231,7 @@ export class EdgeSignalManager extends Resource implements SignalManager {
|
|
|
228
231
|
private async _rejoinAllSwarms(): Promise<void> {
|
|
229
232
|
log('rejoin swarms', { swarms: Array.from(this._swarmPeers.keys()) });
|
|
230
233
|
for (const [topic, { lastState }] of this._swarmPeers.entries()) {
|
|
231
|
-
await this.join({
|
|
234
|
+
await this.join(this._ctx, {
|
|
232
235
|
topic,
|
|
233
236
|
peer: {
|
|
234
237
|
peerKey: this._edgeConnection.peerKey,
|