@dxos/messaging 0.8.4-main.72ec0f3 → 0.8.4-main.74a063c4e0
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/neutral/chunk-ZNKR3G44.mjs +694 -0
- package/dist/lib/neutral/chunk-ZNKR3G44.mjs.map +7 -0
- package/dist/lib/{browser/chunk-L7NDSF6K.mjs → neutral/index.mjs} +315 -992
- 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 +4 -4
- package/dist/lib/neutral/testing/index.mjs.map +7 -0
- 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-client/signal-local-state.d.ts.map +1 -1
- package/dist/types/src/signal-client/signal-rpc-client.d.ts +2 -2
- 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/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/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 +24 -22
- package/src/messenger.blueprint-test.ts +13 -12
- package/src/messenger.ts +34 -28
- package/src/signal-client/signal-client.node.test.ts +9 -9
- package/src/signal-client/signal-client.ts +4 -5
- package/src/signal-client/signal-local-state.ts +0 -1
- package/src/signal-client/signal-rpc-client.ts +2 -2
- 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 +8 -9
- 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.map +0 -7
- package/dist/lib/browser/index.mjs +0 -22
- package/dist/lib/browser/index.mjs.map +0 -7
- 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,25 +1,27 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dxos/messaging",
|
|
3
|
-
"version": "0.8.4-main.
|
|
3
|
+
"version": "0.8.4-main.74a063c4e0",
|
|
4
4
|
"description": "Messaging",
|
|
5
5
|
"homepage": "https://dxos.org",
|
|
6
6
|
"bugs": "https://github.com/dxos/dxos/issues",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/dxos/dxos"
|
|
10
|
+
},
|
|
7
11
|
"license": "MIT",
|
|
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",
|
|
@@ -37,24 +39,24 @@
|
|
|
37
39
|
],
|
|
38
40
|
"dependencies": {
|
|
39
41
|
"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/
|
|
42
|
+
"ws": "^8.17.1",
|
|
43
|
+
"@dxos/async": "0.8.4-main.74a063c4e0",
|
|
44
|
+
"@dxos/context": "0.8.4-main.74a063c4e0",
|
|
45
|
+
"@dxos/edge-client": "0.8.4-main.74a063c4e0",
|
|
46
|
+
"@dxos/invariant": "0.8.4-main.74a063c4e0",
|
|
47
|
+
"@dxos/keys": "0.8.4-main.74a063c4e0",
|
|
48
|
+
"@dxos/log": "0.8.4-main.74a063c4e0",
|
|
49
|
+
"@dxos/codec-protobuf": "0.8.4-main.74a063c4e0",
|
|
50
|
+
"@dxos/node-std": "0.8.4-main.74a063c4e0",
|
|
51
|
+
"@dxos/protocols": "0.8.4-main.74a063c4e0",
|
|
52
|
+
"@dxos/tracing": "0.8.4-main.74a063c4e0",
|
|
53
|
+
"@dxos/util": "0.8.4-main.74a063c4e0",
|
|
54
|
+
"@dxos/rpc": "0.8.4-main.74a063c4e0"
|
|
53
55
|
},
|
|
54
56
|
"devDependencies": {
|
|
55
|
-
"@dxos/keyring": "0.8.4-main.
|
|
56
|
-
"@dxos/
|
|
57
|
-
"@dxos/
|
|
57
|
+
"@dxos/keyring": "0.8.4-main.74a063c4e0",
|
|
58
|
+
"@dxos/test-utils": "0.8.4-main.74a063c4e0",
|
|
59
|
+
"@dxos/signal": "0.8.4-main.74a063c4e0"
|
|
58
60
|
},
|
|
59
61
|
"publishConfig": {
|
|
60
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
|
},
|
|
@@ -140,10 +140,10 @@ export class Messenger {
|
|
|
140
140
|
log('message not delivered', { messageId: reliablePayload.messageId });
|
|
141
141
|
this._onAckCallbacks.delete(reliablePayload.messageId!);
|
|
142
142
|
timeoutHit(
|
|
143
|
-
new ProtocolTimeoutError(
|
|
144
|
-
'signaling message not delivered',
|
|
145
|
-
new TimeoutError(MESSAGE_TIMEOUT, 'Message not delivered'),
|
|
146
|
-
),
|
|
143
|
+
new ProtocolTimeoutError({
|
|
144
|
+
message: 'signaling message not delivered',
|
|
145
|
+
cause: new TimeoutError(MESSAGE_TIMEOUT, 'Message not delivered'),
|
|
146
|
+
}),
|
|
147
147
|
);
|
|
148
148
|
void messageContext.dispose();
|
|
149
149
|
this._monitor.recordReliableMessage({ sendAttempts, sent: false });
|
|
@@ -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';
|
|
@@ -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
|
});
|
|
@@ -19,7 +19,6 @@ import {
|
|
|
19
19
|
type SignalStatus,
|
|
20
20
|
type SwarmEvent,
|
|
21
21
|
} from '../signal-methods';
|
|
22
|
-
|
|
23
22
|
import { SignalClientMonitor } from './signal-client-monitor';
|
|
24
23
|
import { SignalLocalState } from './signal-local-state';
|
|
25
24
|
import { SignalRPCClient } from './signal-rpc-client';
|
|
@@ -173,24 +172,24 @@ export class SignalClient extends Resource implements SignalClientMethods {
|
|
|
173
172
|
};
|
|
174
173
|
}
|
|
175
174
|
|
|
176
|
-
async join(args: JoinRequest): Promise<void> {
|
|
175
|
+
async join(_ctx: Context, args: JoinRequest): Promise<void> {
|
|
177
176
|
log('joining', { topic: args.topic, peerId: args.peer.peerKey });
|
|
178
177
|
this._monitor.recordJoin();
|
|
179
178
|
this.localState.join({ topic: args.topic, peerId: PublicKey.from(args.peer.peerKey) });
|
|
180
179
|
this._reconcileTask?.schedule();
|
|
181
180
|
}
|
|
182
181
|
|
|
183
|
-
async leave(args: LeaveRequest): Promise<void> {
|
|
182
|
+
async leave(_ctx: Context, args: LeaveRequest): Promise<void> {
|
|
184
183
|
log('leaving', { topic: args.topic, peerId: args.peer.peerKey });
|
|
185
184
|
this._monitor.recordLeave();
|
|
186
185
|
this.localState.leave({ topic: args.topic, peerId: PublicKey.from(args.peer.peerKey) });
|
|
187
186
|
}
|
|
188
187
|
|
|
189
|
-
async query(params: QueryRequest): Promise<SwarmResponse> {
|
|
188
|
+
async query(_ctx: Context, params: QueryRequest): Promise<SwarmResponse> {
|
|
190
189
|
throw new Error('Not implemented');
|
|
191
190
|
}
|
|
192
191
|
|
|
193
|
-
async sendMessage(msg: Message): Promise<void> {
|
|
192
|
+
async sendMessage(_ctx: Context, msg: Message): Promise<void> {
|
|
194
193
|
return this._monitor.recordMessageSending(msg, async () => {
|
|
195
194
|
await this._clientReady.wait();
|
|
196
195
|
invariant(this._state === SignalState.CONNECTED, 'Not connected to Signal Server');
|
|
@@ -36,7 +36,7 @@ export type SignalCallbacks = {
|
|
|
36
36
|
getMetadata?: () => any;
|
|
37
37
|
};
|
|
38
38
|
|
|
39
|
-
export type
|
|
39
|
+
export type SignalRPCClientProps = {
|
|
40
40
|
url: string;
|
|
41
41
|
callbacks?: SignalCallbacks;
|
|
42
42
|
};
|
|
@@ -61,7 +61,7 @@ export class SignalRPCClient {
|
|
|
61
61
|
|
|
62
62
|
private readonly _monitor = new SignalRpcClientMonitor();
|
|
63
63
|
|
|
64
|
-
constructor({ url, callbacks = {} }:
|
|
64
|
+
constructor({ url, callbacks = {} }: SignalRPCClientProps) {
|
|
65
65
|
const traceId = PublicKey.random().toHex();
|
|
66
66
|
log.trace('dxos.mesh.signal-rpc-client.constructor', trace.begin({ id: traceId }));
|
|
67
67
|
this._url = url;
|
|
@@ -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,
|
|
@@ -14,7 +14,6 @@ import { type QueryRequest } from '@dxos/protocols/proto/dxos/edge/signal';
|
|
|
14
14
|
import { ComplexMap, ComplexSet } from '@dxos/util';
|
|
15
15
|
|
|
16
16
|
import { type Message, type PeerInfo, PeerInfoHash, type SignalStatus, type SwarmEvent } from '../signal-methods';
|
|
17
|
-
|
|
18
17
|
import { type SignalManager } from './signal-manager';
|
|
19
18
|
|
|
20
19
|
/**
|
|
@@ -63,7 +62,7 @@ export class MemorySignalManager implements SignalManager {
|
|
|
63
62
|
this._ctx = new Context();
|
|
64
63
|
this._ctx.onDispose(this._context.swarmEvent.on((data) => this.swarmEvent.emit(data)));
|
|
65
64
|
|
|
66
|
-
await Promise.all([...this._joinedSwarms.values()].map((value) => this.join(value)));
|
|
65
|
+
await Promise.all([...this._joinedSwarms.values()].map((value) => this.join(this._ctx, value)));
|
|
67
66
|
}
|
|
68
67
|
|
|
69
68
|
async close(): Promise<void> {
|
|
@@ -76,7 +75,7 @@ export class MemorySignalManager implements SignalManager {
|
|
|
76
75
|
[...this._joinedSwarms.values()],
|
|
77
76
|
);
|
|
78
77
|
|
|
79
|
-
await Promise.all([...this._joinedSwarms.values()].map((value) => this.leave(value)));
|
|
78
|
+
await Promise.all([...this._joinedSwarms.values()].map((value) => this.leave(this._ctx, value)));
|
|
80
79
|
|
|
81
80
|
// assign joined swarms back because .leave() deletes it.
|
|
82
81
|
this._joinedSwarms = joinedSwarmsCopy;
|
|
@@ -88,7 +87,7 @@ export class MemorySignalManager implements SignalManager {
|
|
|
88
87
|
return [];
|
|
89
88
|
}
|
|
90
89
|
|
|
91
|
-
async join({ topic, peer }: { topic: PublicKey; peer: PeerInfo }): Promise<void> {
|
|
90
|
+
async join(_ctx: Context, { topic, peer }: { topic: PublicKey; peer: PeerInfo }): Promise<void> {
|
|
92
91
|
invariant(!this._ctx.disposed, 'Closed');
|
|
93
92
|
|
|
94
93
|
this._joinedSwarms.add({ topic, peer });
|
|
@@ -120,7 +119,7 @@ export class MemorySignalManager implements SignalManager {
|
|
|
120
119
|
}
|
|
121
120
|
}
|
|
122
121
|
|
|
123
|
-
async leave({ topic, peer }: { topic: PublicKey; peer: PeerInfo }): Promise<void> {
|
|
122
|
+
async leave(_ctx: Context, { topic, peer }: { topic: PublicKey; peer: PeerInfo }): Promise<void> {
|
|
124
123
|
invariant(!this._ctx.disposed, 'Closed');
|
|
125
124
|
|
|
126
125
|
this._joinedSwarms.delete({ topic, peer });
|
|
@@ -141,19 +140,22 @@ export class MemorySignalManager implements SignalManager {
|
|
|
141
140
|
this._context.swarmEvent.emit(swarmEvent);
|
|
142
141
|
}
|
|
143
142
|
|
|
144
|
-
async query(request: QueryRequest): Promise<SwarmResponse> {
|
|
143
|
+
async query(_ctx: Context, request: QueryRequest): Promise<SwarmResponse> {
|
|
145
144
|
throw new Error('Not implemented');
|
|
146
145
|
}
|
|
147
146
|
|
|
148
|
-
async sendMessage(
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
147
|
+
async sendMessage(
|
|
148
|
+
_ctx: Context,
|
|
149
|
+
{
|
|
150
|
+
author,
|
|
151
|
+
recipient,
|
|
152
|
+
payload,
|
|
153
|
+
}: {
|
|
154
|
+
author: PeerInfo;
|
|
155
|
+
recipient: PeerInfo;
|
|
156
|
+
payload: Any;
|
|
157
|
+
},
|
|
158
|
+
): Promise<void> {
|
|
157
159
|
log('send message', { author, recipient, ...dec(payload) });
|
|
158
160
|
|
|
159
161
|
invariant(recipient);
|