@dxos/messaging 0.8.4-main.bc674ce → 0.8.4-main.bcb3aa67d6
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/chunk-5MOQVHHI.mjs → neutral/chunk-KKCQXNW4.mjs} +31 -31
- package/dist/lib/neutral/chunk-KKCQXNW4.mjs.map +7 -0
- package/dist/lib/{browser → neutral}/index.mjs +28 -28
- package/dist/lib/neutral/index.mjs.map +7 -0
- package/dist/lib/{browser → neutral}/meta.json +1 -1
- package/dist/lib/{browser → neutral}/testing/index.mjs +3 -3
- package/dist/lib/{browser → neutral}/testing/index.mjs.map +3 -3
- package/dist/types/src/messenger.blueprint-test.d.ts.map +1 -1
- package/dist/types/src/messenger.d.ts +2 -1
- package/dist/types/src/messenger.d.ts.map +1 -1
- package/dist/types/src/signal-client/signal-client.d.ts +5 -5
- package/dist/types/src/signal-client/signal-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/websocket-signal-manager.d.ts +5 -5
- 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/tsconfig.tsbuildinfo +1 -1
- package/package.json +19 -21
- package/src/messenger.blueprint-test.ts +13 -12
- package/src/messenger.ts +30 -24
- package/src/signal-client/signal-client.node.test.ts +9 -8
- package/src/signal-client/signal-client.ts +4 -4
- package/src/signal-manager/edge-signal-manager.ts +10 -6
- package/src/signal-manager/memory-signal-manager.ts +17 -14
- package/src/signal-manager/websocket-signal-manager.node.test.ts +13 -12
- package/src/signal-manager/websocket-signal-manager.ts +8 -8
- package/src/signal-methods.ts +5 -5
- package/src/testing/test-builder.ts +4 -2
- package/dist/lib/browser/chunk-5MOQVHHI.mjs.map +0 -7
- package/dist/lib/browser/index.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-HBWHJFJZ.mjs +0 -694
- package/dist/lib/node-esm/chunk-HBWHJFJZ.mjs.map +0 -7
- package/dist/lib/node-esm/index.mjs +0 -1703
- 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,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dxos/messaging",
|
|
3
|
-
"version": "0.8.4-main.
|
|
3
|
+
"version": "0.8.4-main.bcb3aa67d6",
|
|
4
4
|
"description": "Messaging",
|
|
5
5
|
"homepage": "https://dxos.org",
|
|
6
6
|
"bugs": "https://github.com/dxos/dxos/issues",
|
|
@@ -16,14 +16,12 @@
|
|
|
16
16
|
".": {
|
|
17
17
|
"source": "./src/index.ts",
|
|
18
18
|
"types": "./dist/types/src/index.d.ts",
|
|
19
|
-
"
|
|
20
|
-
"node": "./dist/lib/node-esm/index.mjs"
|
|
19
|
+
"default": "./dist/lib/neutral/index.mjs"
|
|
21
20
|
},
|
|
22
21
|
"./testing": {
|
|
23
22
|
"source": "./src/testing/index.ts",
|
|
24
23
|
"types": "./dist/types/src/testing/index.d.ts",
|
|
25
|
-
"
|
|
26
|
-
"node": "./dist/lib/node-esm/testing/index.mjs"
|
|
24
|
+
"default": "./dist/lib/neutral/testing/index.mjs"
|
|
27
25
|
}
|
|
28
26
|
},
|
|
29
27
|
"types": "dist/types/src/index.d.ts",
|
|
@@ -41,24 +39,24 @@
|
|
|
41
39
|
],
|
|
42
40
|
"dependencies": {
|
|
43
41
|
"isomorphic-ws": "^5.0.0",
|
|
44
|
-
"ws": "^8.
|
|
45
|
-
"@dxos/
|
|
46
|
-
"@dxos/
|
|
47
|
-
"@dxos/context": "0.8.4-main.
|
|
48
|
-
"@dxos/edge-client": "0.8.4-main.
|
|
49
|
-
"@dxos/
|
|
50
|
-
"@dxos/
|
|
51
|
-
"@dxos/
|
|
52
|
-
"@dxos/
|
|
53
|
-
"@dxos/
|
|
54
|
-
"@dxos/
|
|
55
|
-
"@dxos/
|
|
56
|
-
"@dxos/
|
|
42
|
+
"ws": "^8.17.1",
|
|
43
|
+
"@dxos/codec-protobuf": "0.8.4-main.bcb3aa67d6",
|
|
44
|
+
"@dxos/async": "0.8.4-main.bcb3aa67d6",
|
|
45
|
+
"@dxos/context": "0.8.4-main.bcb3aa67d6",
|
|
46
|
+
"@dxos/edge-client": "0.8.4-main.bcb3aa67d6",
|
|
47
|
+
"@dxos/keys": "0.8.4-main.bcb3aa67d6",
|
|
48
|
+
"@dxos/node-std": "0.8.4-main.bcb3aa67d6",
|
|
49
|
+
"@dxos/invariant": "0.8.4-main.bcb3aa67d6",
|
|
50
|
+
"@dxos/log": "0.8.4-main.bcb3aa67d6",
|
|
51
|
+
"@dxos/protocols": "0.8.4-main.bcb3aa67d6",
|
|
52
|
+
"@dxos/tracing": "0.8.4-main.bcb3aa67d6",
|
|
53
|
+
"@dxos/util": "0.8.4-main.bcb3aa67d6",
|
|
54
|
+
"@dxos/rpc": "0.8.4-main.bcb3aa67d6"
|
|
57
55
|
},
|
|
58
56
|
"devDependencies": {
|
|
59
|
-
"@dxos/keyring": "0.8.4-main.
|
|
60
|
-
"@dxos/signal": "0.8.4-main.
|
|
61
|
-
"@dxos/test-utils": "0.8.4-main.
|
|
57
|
+
"@dxos/keyring": "0.8.4-main.bcb3aa67d6",
|
|
58
|
+
"@dxos/signal": "0.8.4-main.bcb3aa67d6",
|
|
59
|
+
"@dxos/test-utils": "0.8.4-main.bcb3aa67d6"
|
|
62
60
|
},
|
|
63
61
|
"publishConfig": {
|
|
64
62
|
"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
|
@@ -101,7 +101,7 @@ export class Messenger {
|
|
|
101
101
|
await this._ctx.dispose();
|
|
102
102
|
}
|
|
103
103
|
|
|
104
|
-
async sendMessage({ author, recipient, payload }: Message): Promise<void> {
|
|
104
|
+
async sendMessage(ctx: Context, { author, recipient, payload }: Message): Promise<void> {
|
|
105
105
|
invariant(!this._closed, 'Closed');
|
|
106
106
|
const messageContext = this._ctx.derive();
|
|
107
107
|
|
|
@@ -127,7 +127,7 @@ export class Messenger {
|
|
|
127
127
|
async () => {
|
|
128
128
|
log('retrying message', { messageId: reliablePayload.messageId });
|
|
129
129
|
sendAttempts++;
|
|
130
|
-
await this._encodeAndSend({ author, recipient, reliablePayload }).catch((err) =>
|
|
130
|
+
await this._encodeAndSend(ctx, { author, recipient, reliablePayload }).catch((err) =>
|
|
131
131
|
log('failed to send message', { err }),
|
|
132
132
|
);
|
|
133
133
|
},
|
|
@@ -158,7 +158,7 @@ export class Messenger {
|
|
|
158
158
|
this._monitor.recordReliableMessage({ sendAttempts, sent: true });
|
|
159
159
|
});
|
|
160
160
|
|
|
161
|
-
await this._encodeAndSend({ author, recipient, reliablePayload });
|
|
161
|
+
await this._encodeAndSend(ctx, { author, recipient, reliablePayload });
|
|
162
162
|
return promise;
|
|
163
163
|
}
|
|
164
164
|
|
|
@@ -204,16 +204,19 @@ export class Messenger {
|
|
|
204
204
|
};
|
|
205
205
|
}
|
|
206
206
|
|
|
207
|
-
private async _encodeAndSend(
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
207
|
+
private async _encodeAndSend(
|
|
208
|
+
ctx: Context,
|
|
209
|
+
{
|
|
210
|
+
author,
|
|
211
|
+
recipient,
|
|
212
|
+
reliablePayload,
|
|
213
|
+
}: {
|
|
214
|
+
author: PeerInfo;
|
|
215
|
+
recipient: PeerInfo;
|
|
216
|
+
reliablePayload: ReliablePayload;
|
|
217
|
+
},
|
|
218
|
+
): Promise<void> {
|
|
219
|
+
await this._signalManager.sendMessage(ctx, {
|
|
217
220
|
author,
|
|
218
221
|
recipient,
|
|
219
222
|
payload: {
|
|
@@ -243,7 +246,7 @@ export class Messenger {
|
|
|
243
246
|
log('handling message', { messageId: reliablePayload.messageId });
|
|
244
247
|
|
|
245
248
|
try {
|
|
246
|
-
await this._sendAcknowledgement({
|
|
249
|
+
await this._sendAcknowledgement(this._ctx, {
|
|
247
250
|
author,
|
|
248
251
|
recipient,
|
|
249
252
|
messageId: reliablePayload.messageId,
|
|
@@ -272,18 +275,21 @@ export class Messenger {
|
|
|
272
275
|
this._onAckCallbacks.get(Acknowledgement.decode(payload.value).messageId)?.();
|
|
273
276
|
}
|
|
274
277
|
|
|
275
|
-
private async _sendAcknowledgement(
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
278
|
+
private async _sendAcknowledgement(
|
|
279
|
+
ctx: Context,
|
|
280
|
+
{
|
|
281
|
+
author,
|
|
282
|
+
recipient,
|
|
283
|
+
messageId,
|
|
284
|
+
}: {
|
|
285
|
+
author: PeerInfo;
|
|
286
|
+
recipient: PeerInfo;
|
|
287
|
+
messageId: PublicKey;
|
|
288
|
+
},
|
|
289
|
+
): Promise<void> {
|
|
284
290
|
log('sending ACK', { messageId, from: recipient, to: author });
|
|
285
291
|
|
|
286
|
-
await this._signalManager.sendMessage({
|
|
292
|
+
await this._signalManager.sendMessage(ctx, {
|
|
287
293
|
author: recipient,
|
|
288
294
|
recipient: author,
|
|
289
295
|
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';
|
|
@@ -43,7 +44,7 @@ describe('SignalClient', () => {
|
|
|
43
44
|
|
|
44
45
|
const message = createMessage(peer2, peer1);
|
|
45
46
|
const receivedMessage = peer1.waitForNextMessage();
|
|
46
|
-
await peer2.client.sendMessage(message);
|
|
47
|
+
await peer2.client.sendMessage(Context.default(), message);
|
|
47
48
|
expect(await receivedMessage).toEqual(message);
|
|
48
49
|
});
|
|
49
50
|
|
|
@@ -51,8 +52,8 @@ describe('SignalClient', () => {
|
|
|
51
52
|
const topic = PublicKey.random();
|
|
52
53
|
const [peer1, peer2] = setupPeers({ peerCount: 2 });
|
|
53
54
|
|
|
54
|
-
await peer1.client.join({ topic, peer: peer1.peerInfo });
|
|
55
|
-
await peer2.client.join({ topic, peer: peer2.peerInfo });
|
|
55
|
+
await peer1.client.join(Context.default(), { topic, peer: peer1.peerInfo });
|
|
56
|
+
await peer2.client.join(Context.default(), { topic, peer: peer2.peerInfo });
|
|
56
57
|
|
|
57
58
|
await peer1.waitForPeer(peer2.peerKey);
|
|
58
59
|
await peer2.waitForPeer(peer1.peerKey);
|
|
@@ -67,7 +68,7 @@ describe('SignalClient', () => {
|
|
|
67
68
|
const message = createMessage(peer2, peer1);
|
|
68
69
|
const receivedMessage = peer1.waitForNextMessage();
|
|
69
70
|
|
|
70
|
-
await peer1.client.sendMessage(message);
|
|
71
|
+
await peer1.client.sendMessage(Context.default(), message);
|
|
71
72
|
expect(await receivedMessage).toEqual(message);
|
|
72
73
|
});
|
|
73
74
|
|
|
@@ -82,7 +83,7 @@ describe('SignalClient', () => {
|
|
|
82
83
|
|
|
83
84
|
{
|
|
84
85
|
const receivedMessage = peer1.waitForNextMessage({ timeout: 1_000 });
|
|
85
|
-
await peer2.client.sendMessage(message);
|
|
86
|
+
await peer2.client.sendMessage(Context.default(), message);
|
|
86
87
|
expect(await receivedMessage).toEqual(message);
|
|
87
88
|
}
|
|
88
89
|
|
|
@@ -91,7 +92,7 @@ describe('SignalClient', () => {
|
|
|
91
92
|
|
|
92
93
|
{
|
|
93
94
|
const receivedMessage = peer1.waitForNextMessage({ timeout: 200 });
|
|
94
|
-
await peer2.client.sendMessage(message);
|
|
95
|
+
await peer2.client.sendMessage(Context.default(), message);
|
|
95
96
|
await expect(receivedMessage).rejects.toBeDefined();
|
|
96
97
|
}
|
|
97
98
|
});
|
|
@@ -106,7 +107,7 @@ describe('SignalClient', () => {
|
|
|
106
107
|
|
|
107
108
|
{
|
|
108
109
|
const waitMessage = peer1.waitForNextMessage();
|
|
109
|
-
await peer2.client.sendMessage(message);
|
|
110
|
+
await peer2.client.sendMessage(Context.default(), message);
|
|
110
111
|
expect(await waitMessage).toEqual(message);
|
|
111
112
|
}
|
|
112
113
|
|
|
@@ -120,7 +121,7 @@ describe('SignalClient', () => {
|
|
|
120
121
|
|
|
121
122
|
{
|
|
122
123
|
const waitMessage = peer1.waitForNextMessage();
|
|
123
|
-
await peer2.client.sendMessage(message);
|
|
124
|
+
await peer2.client.sendMessage(Context.default(), message);
|
|
124
125
|
expect(await waitMessage).toEqual(message);
|
|
125
126
|
}
|
|
126
127
|
});
|
|
@@ -173,24 +173,24 @@ export class SignalClient extends Resource implements SignalClientMethods {
|
|
|
173
173
|
};
|
|
174
174
|
}
|
|
175
175
|
|
|
176
|
-
async join(args: JoinRequest): Promise<void> {
|
|
176
|
+
async join(_ctx: Context, args: JoinRequest): Promise<void> {
|
|
177
177
|
log('joining', { topic: args.topic, peerId: args.peer.peerKey });
|
|
178
178
|
this._monitor.recordJoin();
|
|
179
179
|
this.localState.join({ topic: args.topic, peerId: PublicKey.from(args.peer.peerKey) });
|
|
180
180
|
this._reconcileTask?.schedule();
|
|
181
181
|
}
|
|
182
182
|
|
|
183
|
-
async leave(args: LeaveRequest): Promise<void> {
|
|
183
|
+
async leave(_ctx: Context, args: LeaveRequest): Promise<void> {
|
|
184
184
|
log('leaving', { topic: args.topic, peerId: args.peer.peerKey });
|
|
185
185
|
this._monitor.recordLeave();
|
|
186
186
|
this.localState.leave({ topic: args.topic, peerId: PublicKey.from(args.peer.peerKey) });
|
|
187
187
|
}
|
|
188
188
|
|
|
189
|
-
async query(params: QueryRequest): Promise<SwarmResponse> {
|
|
189
|
+
async query(_ctx: Context, params: QueryRequest): Promise<SwarmResponse> {
|
|
190
190
|
throw new Error('Not implemented');
|
|
191
191
|
}
|
|
192
192
|
|
|
193
|
-
async sendMessage(msg: Message): Promise<void> {
|
|
193
|
+
async sendMessage(_ctx: Context, msg: Message): Promise<void> {
|
|
194
194
|
return this._monitor.recordMessageSending(msg, async () => {
|
|
195
195
|
await this._clientReady.wait();
|
|
196
196
|
invariant(this._state === SignalState.CONNECTED, 'Not connected to Signal Server');
|
|
@@ -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';
|
|
@@ -60,7 +60,7 @@ export class EdgeSignalManager extends Resource implements SignalManager {
|
|
|
60
60
|
/**
|
|
61
61
|
* Warning: PeerInfo is inferred from edgeConnection.
|
|
62
62
|
*/
|
|
63
|
-
async join({ topic, peer }: { topic: PublicKey; peer: PeerInfo }): Promise<void> {
|
|
63
|
+
async join(ctx: Context, { topic, peer }: { topic: PublicKey; peer: PeerInfo }): Promise<void> {
|
|
64
64
|
if (!this._matchSelfPeerInfo(peer)) {
|
|
65
65
|
// NOTE: Could only join swarm with the same peer info as the edge connection.
|
|
66
66
|
log.warn('ignoring peer info on join request', {
|
|
@@ -77,6 +77,7 @@ export class EdgeSignalManager extends Resource implements SignalManager {
|
|
|
77
77
|
|
|
78
78
|
this._swarmPeers.set(topic, { lastState: peer.state, joinedPeers: new ComplexSet<PeerInfo>(PeerInfoHash) });
|
|
79
79
|
await this._edgeConnection.send(
|
|
80
|
+
ctx,
|
|
80
81
|
protocol.createMessage(SwarmRequestSchema, {
|
|
81
82
|
serviceId: EdgeService.SWARM,
|
|
82
83
|
source: createMessageSource(topic, peer),
|
|
@@ -85,10 +86,11 @@ export class EdgeSignalManager extends Resource implements SignalManager {
|
|
|
85
86
|
);
|
|
86
87
|
}
|
|
87
88
|
|
|
88
|
-
async leave({ topic, peer }: { topic: PublicKey; peer: PeerInfo }): Promise<void> {
|
|
89
|
+
async leave(ctx: Context, { topic, peer }: { topic: PublicKey; peer: PeerInfo }): Promise<void> {
|
|
89
90
|
this._swarmPeers.delete(topic);
|
|
90
91
|
try {
|
|
91
92
|
await this._edgeConnection.send(
|
|
93
|
+
ctx,
|
|
92
94
|
protocol.createMessage(SwarmRequestSchema, {
|
|
93
95
|
serviceId: EdgeService.SWARM,
|
|
94
96
|
source: createMessageSource(topic, peer),
|
|
@@ -105,13 +107,14 @@ export class EdgeSignalManager extends Resource implements SignalManager {
|
|
|
105
107
|
}
|
|
106
108
|
}
|
|
107
109
|
|
|
108
|
-
async query({ topic }: { topic: PublicKey }): Promise<SwarmResponse> {
|
|
110
|
+
async query(ctx: Context, { topic }: { topic: PublicKey }): Promise<SwarmResponse> {
|
|
109
111
|
const response = cancelWithContext(
|
|
110
112
|
this._ctx,
|
|
111
113
|
this.swarmState.waitFor((state) => state.swarmKey === topic.toHex()),
|
|
112
114
|
);
|
|
113
115
|
|
|
114
116
|
await this._edgeConnection.send(
|
|
117
|
+
ctx,
|
|
115
118
|
protocol.createMessage(SwarmRequestSchema, {
|
|
116
119
|
serviceId: EdgeService.SWARM,
|
|
117
120
|
source: createMessageSource(topic, {
|
|
@@ -125,7 +128,7 @@ export class EdgeSignalManager extends Resource implements SignalManager {
|
|
|
125
128
|
return response;
|
|
126
129
|
}
|
|
127
130
|
|
|
128
|
-
async sendMessage(message: Message): Promise<void> {
|
|
131
|
+
async sendMessage(ctx: Context, message: Message): Promise<void> {
|
|
129
132
|
if (!this._matchSelfPeerInfo(message.author)) {
|
|
130
133
|
// NOTE: Could only join swarm with the same peer info as the edge connection.
|
|
131
134
|
log.warn('ignoring author on send request', {
|
|
@@ -135,6 +138,7 @@ export class EdgeSignalManager extends Resource implements SignalManager {
|
|
|
135
138
|
}
|
|
136
139
|
|
|
137
140
|
await this._edgeConnection.send(
|
|
141
|
+
ctx,
|
|
138
142
|
protocol.createMessage(bufWkt.AnySchema, {
|
|
139
143
|
serviceId: EdgeService.SIGNAL,
|
|
140
144
|
source: message.author,
|
|
@@ -228,7 +232,7 @@ export class EdgeSignalManager extends Resource implements SignalManager {
|
|
|
228
232
|
private async _rejoinAllSwarms(): Promise<void> {
|
|
229
233
|
log('rejoin swarms', { swarms: Array.from(this._swarmPeers.keys()) });
|
|
230
234
|
for (const [topic, { lastState }] of this._swarmPeers.entries()) {
|
|
231
|
-
await this.join({
|
|
235
|
+
await this.join(this._ctx, {
|
|
232
236
|
topic,
|
|
233
237
|
peer: {
|
|
234
238
|
peerKey: this._edgeConnection.peerKey,
|
|
@@ -63,7 +63,7 @@ export class MemorySignalManager implements SignalManager {
|
|
|
63
63
|
this._ctx = new Context();
|
|
64
64
|
this._ctx.onDispose(this._context.swarmEvent.on((data) => this.swarmEvent.emit(data)));
|
|
65
65
|
|
|
66
|
-
await Promise.all([...this._joinedSwarms.values()].map((value) => this.join(value)));
|
|
66
|
+
await Promise.all([...this._joinedSwarms.values()].map((value) => this.join(this._ctx, value)));
|
|
67
67
|
}
|
|
68
68
|
|
|
69
69
|
async close(): Promise<void> {
|
|
@@ -76,7 +76,7 @@ export class MemorySignalManager implements SignalManager {
|
|
|
76
76
|
[...this._joinedSwarms.values()],
|
|
77
77
|
);
|
|
78
78
|
|
|
79
|
-
await Promise.all([...this._joinedSwarms.values()].map((value) => this.leave(value)));
|
|
79
|
+
await Promise.all([...this._joinedSwarms.values()].map((value) => this.leave(this._ctx, value)));
|
|
80
80
|
|
|
81
81
|
// assign joined swarms back because .leave() deletes it.
|
|
82
82
|
this._joinedSwarms = joinedSwarmsCopy;
|
|
@@ -88,7 +88,7 @@ export class MemorySignalManager implements SignalManager {
|
|
|
88
88
|
return [];
|
|
89
89
|
}
|
|
90
90
|
|
|
91
|
-
async join({ topic, peer }: { topic: PublicKey; peer: PeerInfo }): Promise<void> {
|
|
91
|
+
async join(_ctx: Context, { topic, peer }: { topic: PublicKey; peer: PeerInfo }): Promise<void> {
|
|
92
92
|
invariant(!this._ctx.disposed, 'Closed');
|
|
93
93
|
|
|
94
94
|
this._joinedSwarms.add({ topic, peer });
|
|
@@ -120,7 +120,7 @@ export class MemorySignalManager implements SignalManager {
|
|
|
120
120
|
}
|
|
121
121
|
}
|
|
122
122
|
|
|
123
|
-
async leave({ topic, peer }: { topic: PublicKey; peer: PeerInfo }): Promise<void> {
|
|
123
|
+
async leave(_ctx: Context, { topic, peer }: { topic: PublicKey; peer: PeerInfo }): Promise<void> {
|
|
124
124
|
invariant(!this._ctx.disposed, 'Closed');
|
|
125
125
|
|
|
126
126
|
this._joinedSwarms.delete({ topic, peer });
|
|
@@ -141,19 +141,22 @@ export class MemorySignalManager implements SignalManager {
|
|
|
141
141
|
this._context.swarmEvent.emit(swarmEvent);
|
|
142
142
|
}
|
|
143
143
|
|
|
144
|
-
async query(request: QueryRequest): Promise<SwarmResponse> {
|
|
144
|
+
async query(_ctx: Context, request: QueryRequest): Promise<SwarmResponse> {
|
|
145
145
|
throw new Error('Not implemented');
|
|
146
146
|
}
|
|
147
147
|
|
|
148
|
-
async sendMessage(
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
148
|
+
async sendMessage(
|
|
149
|
+
_ctx: Context,
|
|
150
|
+
{
|
|
151
|
+
author,
|
|
152
|
+
recipient,
|
|
153
|
+
payload,
|
|
154
|
+
}: {
|
|
155
|
+
author: PeerInfo;
|
|
156
|
+
recipient: PeerInfo;
|
|
157
|
+
payload: Any;
|
|
158
|
+
},
|
|
159
|
+
): Promise<void> {
|
|
157
160
|
log('send message', { author, recipient, ...dec(payload) });
|
|
158
161
|
|
|
159
162
|
invariant(recipient);
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import { afterAll, beforeAll, describe, test } from 'vitest';
|
|
6
6
|
|
|
7
7
|
import { asyncTimeout, sleep } from '@dxos/async';
|
|
8
|
+
import { Context } from '@dxos/context';
|
|
8
9
|
import { PublicKey } from '@dxos/keys';
|
|
9
10
|
import { type SignalServerRunner, runTestSignalServer } from '@dxos/signal';
|
|
10
11
|
import { openAndClose } from '@dxos/test-utils';
|
|
@@ -40,9 +41,9 @@ describe.skip('WebSocketSignalManager', () => {
|
|
|
40
41
|
const joined21 = expectPeerAvailable(client2, topic, { peerKey: peer1.toHex() });
|
|
41
42
|
const joined31 = expectPeerAvailable(client3, topic, { peerKey: peer1.toHex() });
|
|
42
43
|
|
|
43
|
-
await client1.join({ topic, peer: { peerKey: peer1.toHex() } });
|
|
44
|
-
await client2.join({ topic, peer: { peerKey: peer2.toHex() } });
|
|
45
|
-
await client3.join({ topic, peer: { peerKey: peer3.toHex() } });
|
|
44
|
+
await client1.join(Context.default(), { topic, peer: { peerKey: peer1.toHex() } });
|
|
45
|
+
await client2.join(Context.default(), { topic, peer: { peerKey: peer2.toHex() } });
|
|
46
|
+
await client3.join(Context.default(), { topic, peer: { peerKey: peer3.toHex() } });
|
|
46
47
|
|
|
47
48
|
await Promise.all([joined12, joined13, joined21, joined31]);
|
|
48
49
|
});
|
|
@@ -57,8 +58,8 @@ describe.skip('WebSocketSignalManager', () => {
|
|
|
57
58
|
const joined12 = expectPeerAvailable(client1, topic, { peerKey: peer2.toHex() });
|
|
58
59
|
const joined21 = expectPeerAvailable(client2, topic, { peerKey: peer1.toHex() });
|
|
59
60
|
|
|
60
|
-
await client1.join({ topic, peer: { peerKey: peer1.toHex() } });
|
|
61
|
-
await client2.join({ topic, peer: { peerKey: peer2.toHex() } });
|
|
61
|
+
await client1.join(Context.default(), { topic, peer: { peerKey: peer1.toHex() } });
|
|
62
|
+
await client2.join(Context.default(), { topic, peer: { peerKey: peer2.toHex() } });
|
|
62
63
|
|
|
63
64
|
await asyncTimeout(Promise.all([joined12, joined21]), 1_000);
|
|
64
65
|
|
|
@@ -67,7 +68,7 @@ describe.skip('WebSocketSignalManager', () => {
|
|
|
67
68
|
const received = expectReceivedMessage(client2.onMessage, message);
|
|
68
69
|
await client2.subscribeMessages({ peerKey: peer2.toHex() });
|
|
69
70
|
await sleep(50);
|
|
70
|
-
await client1.sendMessage(message);
|
|
71
|
+
await client1.sendMessage(Context.default(), message);
|
|
71
72
|
|
|
72
73
|
await asyncTimeout(received, 1_000);
|
|
73
74
|
});
|
|
@@ -82,8 +83,8 @@ describe.skip('WebSocketSignalManager', () => {
|
|
|
82
83
|
const joined12 = expectPeerAvailable(client1, topic, { peerKey: peer2.toHex() });
|
|
83
84
|
const joined21 = expectPeerAvailable(client2, topic, { peerKey: peer1.toHex() });
|
|
84
85
|
|
|
85
|
-
await client1.join({ topic, peer: { peerKey: peer1.toHex() } });
|
|
86
|
-
await client2.join({ topic, peer: { peerKey: peer2.toHex() } });
|
|
86
|
+
await client1.join(Context.default(), { topic, peer: { peerKey: peer1.toHex() } });
|
|
87
|
+
await client2.join(Context.default(), { topic, peer: { peerKey: peer2.toHex() } });
|
|
87
88
|
|
|
88
89
|
await Promise.all([joined12, joined21]);
|
|
89
90
|
});
|
|
@@ -98,15 +99,15 @@ describe.skip('WebSocketSignalManager', () => {
|
|
|
98
99
|
const joined112 = expectPeerAvailable(client1, topic1, { peerKey: peer2.toHex() });
|
|
99
100
|
const joined121 = expectPeerAvailable(client2, topic1, { peerKey: peer1.toHex() });
|
|
100
101
|
|
|
101
|
-
await client1.join({ topic: topic1, peer: { peerKey: peer1.toHex() } });
|
|
102
|
-
await client2.join({ topic: topic1, peer: { peerKey: peer2.toHex() } });
|
|
102
|
+
await client1.join(Context.default(), { topic: topic1, peer: { peerKey: peer1.toHex() } });
|
|
103
|
+
await client2.join(Context.default(), { topic: topic1, peer: { peerKey: peer2.toHex() } });
|
|
103
104
|
await Promise.all([joined112, joined121]);
|
|
104
105
|
|
|
105
106
|
const joined212 = expectPeerAvailable(client1, topic2, { peerKey: peer2.toHex() });
|
|
106
107
|
const joined221 = expectPeerAvailable(client2, topic2, { peerKey: peer1.toHex() });
|
|
107
108
|
|
|
108
|
-
await client1.join({ topic: topic2, peer: { peerKey: peer1.toHex() } });
|
|
109
|
-
await client2.join({ topic: topic2, peer: { peerKey: peer2.toHex() } });
|
|
109
|
+
await client1.join(Context.default(), { topic: topic2, peer: { peerKey: peer1.toHex() } });
|
|
110
|
+
await client2.join(Context.default(), { topic: topic2, peer: { peerKey: peer2.toHex() } });
|
|
110
111
|
await Promise.all([joined212, joined221]);
|
|
111
112
|
});
|
|
112
113
|
});
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
import { Event, sleep, synchronized } from '@dxos/async';
|
|
6
|
-
import { LifecycleState, Resource } from '@dxos/context';
|
|
6
|
+
import { type Context, LifecycleState, Resource } from '@dxos/context';
|
|
7
7
|
import { invariant } from '@dxos/invariant';
|
|
8
8
|
import { PublicKey } from '@dxos/keys';
|
|
9
9
|
import { log } from '@dxos/log';
|
|
@@ -105,30 +105,30 @@ export class WebsocketSignalManager extends Resource implements SignalManager {
|
|
|
105
105
|
}
|
|
106
106
|
|
|
107
107
|
@synchronized
|
|
108
|
-
async join({ topic, peer }: JoinRequest): Promise<void> {
|
|
108
|
+
async join(_ctx: Context, { topic, peer }: JoinRequest): Promise<void> {
|
|
109
109
|
log('join', { topic, peer });
|
|
110
110
|
invariant(this._lifecycleState === LifecycleState.OPEN);
|
|
111
|
-
await this._forEachServer((server) => server.join({ topic, peer }));
|
|
111
|
+
await this._forEachServer((server) => server.join(_ctx, { topic, peer }));
|
|
112
112
|
}
|
|
113
113
|
|
|
114
114
|
@synchronized
|
|
115
|
-
async leave({ topic, peer }: LeaveRequest): Promise<void> {
|
|
115
|
+
async leave(_ctx: Context, { topic, peer }: LeaveRequest): Promise<void> {
|
|
116
116
|
log('leaving', { topic, peer });
|
|
117
117
|
invariant(this._lifecycleState === LifecycleState.OPEN);
|
|
118
|
-
await this._forEachServer((server) => server.leave({ topic, peer }));
|
|
118
|
+
await this._forEachServer((server) => server.leave(_ctx, { topic, peer }));
|
|
119
119
|
}
|
|
120
120
|
|
|
121
|
-
async query({ topic }: QueryRequest): Promise<SwarmResponse> {
|
|
121
|
+
async query(_ctx: Context, { topic }: QueryRequest): Promise<SwarmResponse> {
|
|
122
122
|
throw new Error('Not implemented');
|
|
123
123
|
}
|
|
124
124
|
|
|
125
|
-
async sendMessage({ author, recipient, payload }: Message): Promise<void> {
|
|
125
|
+
async sendMessage(_ctx: Context, { author, recipient, payload }: Message): Promise<void> {
|
|
126
126
|
log('signal', { recipient });
|
|
127
127
|
invariant(this._lifecycleState === LifecycleState.OPEN);
|
|
128
128
|
|
|
129
129
|
void this._forEachServer(async (server, serverName, index) => {
|
|
130
130
|
void server
|
|
131
|
-
.sendMessage({ author, recipient, payload })
|
|
131
|
+
.sendMessage(_ctx, { author, recipient, payload })
|
|
132
132
|
.then(() => this._clearServerFailedFlag(serverName, index))
|
|
133
133
|
.catch((err) => {
|
|
134
134
|
if (err instanceof RateLimitExceededError) {
|