@dxos/messaging 0.6.13 → 0.6.14-main.2b6a0f3
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-BZOQIXEW.mjs +691 -0
- package/dist/lib/browser/chunk-BZOQIXEW.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +256 -923
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +147 -0
- package/dist/lib/browser/testing/index.mjs.map +7 -0
- package/dist/lib/node/chunk-WDA7H2PO.cjs +688 -0
- package/dist/lib/node/chunk-WDA7H2PO.cjs.map +7 -0
- package/dist/lib/node/index.cjs +272 -916
- package/dist/lib/node/index.cjs.map +4 -4
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/testing/index.cjs +162 -0
- package/dist/lib/node/testing/index.cjs.map +7 -0
- package/dist/lib/node-esm/chunk-RAYDHHAO.mjs +683 -0
- package/dist/lib/node-esm/chunk-RAYDHHAO.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +1631 -0
- package/dist/lib/node-esm/index.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -0
- package/dist/lib/node-esm/testing/index.mjs +146 -0
- package/dist/lib/node-esm/testing/index.mjs.map +7 -0
- package/dist/types/src/messenger.blueprint-test.d.ts +2 -3
- package/dist/types/src/messenger.blueprint-test.d.ts.map +1 -1
- package/dist/types/src/messenger.d.ts.map +1 -1
- package/dist/types/src/messenger.node.test.d.ts +2 -0
- package/dist/types/src/messenger.node.test.d.ts.map +1 -0
- package/dist/types/src/signal-client/signal-client.node.test.d.ts +2 -0
- package/dist/types/src/signal-client/signal-client.node.test.d.ts.map +1 -0
- package/dist/types/src/signal-client/signal-rpc-client.node.test.d.ts +2 -0
- package/dist/types/src/signal-client/signal-rpc-client.node.test.d.ts.map +1 -0
- package/dist/types/src/signal-manager/edge-signal-manager.d.ts.map +1 -1
- package/dist/types/src/signal-manager/websocket-signal-manager.node.test.d.ts +2 -0
- package/dist/types/src/signal-manager/websocket-signal-manager.node.test.d.ts.map +1 -0
- package/dist/types/src/testing/test-builder.d.ts +3 -4
- package/dist/types/src/testing/test-builder.d.ts.map +1 -1
- package/dist/types/src/testing/test-peer.d.ts +0 -1
- package/dist/types/src/testing/test-peer.d.ts.map +1 -1
- package/package.json +32 -21
- package/src/messenger.blueprint-test.ts +25 -33
- package/src/{messenger.test.ts → messenger.node.test.ts} +6 -19
- package/src/messenger.ts +1 -1
- package/src/signal-client/{signal-client.test.ts → signal-client.node.test.ts} +9 -8
- package/src/signal-client/{signal-rpc-client.test.ts → signal-rpc-client.node.test.ts} +8 -13
- package/src/signal-manager/edge-signal-manager.ts +16 -6
- package/src/signal-manager/{websocket-signal-manager.test.ts → websocket-signal-manager.node.test.ts} +12 -30
- package/src/testing/test-builder.ts +3 -6
- package/src/testing/test-peer.ts +5 -7
- package/dist/types/src/messenger.test.d.ts +0 -2
- package/dist/types/src/messenger.test.d.ts.map +0 -1
- package/dist/types/src/signal-client/signal-client.test.d.ts +0 -2
- package/dist/types/src/signal-client/signal-client.test.d.ts.map +0 -1
- package/dist/types/src/signal-client/signal-rpc-client.test.d.ts +0 -2
- package/dist/types/src/signal-client/signal-rpc-client.test.d.ts.map +0 -1
- package/dist/types/src/signal-manager/edge-signal-manager.test.d.ts +0 -2
- package/dist/types/src/signal-manager/edge-signal-manager.test.d.ts.map +0 -1
- package/dist/types/src/signal-manager/websocket-signal-manager.test.d.ts +0 -2
- package/dist/types/src/signal-manager/websocket-signal-manager.test.d.ts.map +0 -1
- package/src/signal-manager/edge-signal-manager.test.ts +0 -67
package/package.json
CHANGED
|
@@ -1,23 +1,37 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dxos/messaging",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.14-main.2b6a0f3",
|
|
4
4
|
"description": "Messaging",
|
|
5
5
|
"homepage": "https://dxos.org",
|
|
6
6
|
"bugs": "https://github.com/dxos/dxos/issues",
|
|
7
7
|
"license": "MIT",
|
|
8
8
|
"author": "DXOS.org",
|
|
9
|
+
"sideEffects": false,
|
|
9
10
|
"exports": {
|
|
10
11
|
".": {
|
|
11
12
|
"browser": "./dist/lib/browser/index.mjs",
|
|
12
13
|
"node": {
|
|
13
|
-
"
|
|
14
|
+
"require": "./dist/lib/node/index.cjs",
|
|
15
|
+
"default": "./dist/lib/node-esm/index.mjs"
|
|
14
16
|
},
|
|
15
17
|
"types": "./dist/types/src/index.d.ts"
|
|
18
|
+
},
|
|
19
|
+
"./testing": {
|
|
20
|
+
"browser": "./dist/lib/browser/testing/index.mjs",
|
|
21
|
+
"node": {
|
|
22
|
+
"require": "./dist/lib/node/testing/index.cjs",
|
|
23
|
+
"default": "./dist/lib/node-esm/testing/index.mjs"
|
|
24
|
+
},
|
|
25
|
+
"types": "./dist/types/src/testing/index.d.ts"
|
|
16
26
|
}
|
|
17
27
|
},
|
|
18
28
|
"types": "dist/types/src/index.d.ts",
|
|
19
29
|
"typesVersions": {
|
|
20
|
-
"*": {
|
|
30
|
+
"*": {
|
|
31
|
+
"testing": [
|
|
32
|
+
"dist/types/src/testing/index.d.ts"
|
|
33
|
+
]
|
|
34
|
+
}
|
|
21
35
|
},
|
|
22
36
|
"files": [
|
|
23
37
|
"dist",
|
|
@@ -25,28 +39,25 @@
|
|
|
25
39
|
"README.md"
|
|
26
40
|
],
|
|
27
41
|
"dependencies": {
|
|
28
|
-
"@bufbuild/protobuf": "^2.0.0",
|
|
29
42
|
"isomorphic-ws": "^5.0.0",
|
|
30
43
|
"ws": "^8.14.2",
|
|
31
|
-
"@dxos/async": "0.6.
|
|
32
|
-
"@dxos/codec-protobuf": "0.6.
|
|
33
|
-
"@dxos/
|
|
34
|
-
"@dxos/
|
|
35
|
-
"@dxos/invariant": "0.6.
|
|
36
|
-
"@dxos/keys": "0.6.
|
|
37
|
-
"@dxos/log": "0.6.
|
|
38
|
-
"@dxos/node-std": "0.6.
|
|
39
|
-
"@dxos/
|
|
40
|
-
"@dxos/tracing": "0.6.
|
|
41
|
-
"@dxos/
|
|
42
|
-
"@dxos/
|
|
44
|
+
"@dxos/async": "0.6.14-main.2b6a0f3",
|
|
45
|
+
"@dxos/codec-protobuf": "0.6.14-main.2b6a0f3",
|
|
46
|
+
"@dxos/context": "0.6.14-main.2b6a0f3",
|
|
47
|
+
"@dxos/edge-client": "0.6.14-main.2b6a0f3",
|
|
48
|
+
"@dxos/invariant": "0.6.14-main.2b6a0f3",
|
|
49
|
+
"@dxos/keys": "0.6.14-main.2b6a0f3",
|
|
50
|
+
"@dxos/log": "0.6.14-main.2b6a0f3",
|
|
51
|
+
"@dxos/node-std": "0.6.14-main.2b6a0f3",
|
|
52
|
+
"@dxos/rpc": "0.6.14-main.2b6a0f3",
|
|
53
|
+
"@dxos/tracing": "0.6.14-main.2b6a0f3",
|
|
54
|
+
"@dxos/util": "0.6.14-main.2b6a0f3",
|
|
55
|
+
"@dxos/protocols": "0.6.14-main.2b6a0f3"
|
|
43
56
|
},
|
|
44
57
|
"devDependencies": {
|
|
45
|
-
"@
|
|
46
|
-
"
|
|
47
|
-
"
|
|
48
|
-
"wait-for-expect": "^3.0.2",
|
|
49
|
-
"@dxos/signal": "0.6.13"
|
|
58
|
+
"@dxos/signal": "0.6.14-main.2b6a0f3",
|
|
59
|
+
"@dxos/keyring": "0.6.14-main.2b6a0f3",
|
|
60
|
+
"@dxos/test-utils": "0.6.14-main.2b6a0f3"
|
|
50
61
|
},
|
|
51
62
|
"publishConfig": {
|
|
52
63
|
"access": "public"
|
|
@@ -2,25 +2,21 @@
|
|
|
2
2
|
// Copyright 2024 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import { expect } from '
|
|
5
|
+
import { describe, expect, test, onTestFinished } from 'vitest';
|
|
6
6
|
|
|
7
7
|
import { asyncTimeout, latch, sleep } from '@dxos/async';
|
|
8
|
-
import { type PublicKey } from '@dxos/keys';
|
|
9
|
-
import { describe, test, afterTest } from '@dxos/test';
|
|
10
8
|
import { range } from '@dxos/util';
|
|
11
9
|
|
|
12
|
-
import {
|
|
10
|
+
import { WebsocketSignalManager } from './signal-manager';
|
|
13
11
|
import { type Message } from './signal-methods';
|
|
14
12
|
import { messageEqual, PAYLOAD_1, PAYLOAD_2, PAYLOAD_3, TestBuilder } from './testing';
|
|
15
13
|
|
|
16
|
-
export const messengerTests = (
|
|
17
|
-
signalManagerFactory: (identityKey: PublicKey, deviceKey: PublicKey) => Promise<SignalManager>,
|
|
18
|
-
) => {
|
|
14
|
+
export const messengerTests = (signalManagerFactory: TestBuilder['createSignalManager']) => {
|
|
19
15
|
test('Message between peers', async () => {
|
|
20
16
|
const builder = new TestBuilder({
|
|
21
17
|
signalManagerFactory,
|
|
22
18
|
});
|
|
23
|
-
|
|
19
|
+
onTestFinished(() => builder.close());
|
|
24
20
|
const peer1 = await builder.createPeer();
|
|
25
21
|
const peer2 = await builder.createPeer();
|
|
26
22
|
|
|
@@ -39,11 +35,11 @@ export const messengerTests = (
|
|
|
39
35
|
await promise;
|
|
40
36
|
});
|
|
41
37
|
|
|
42
|
-
test('Message 3 peers', async () => {
|
|
38
|
+
test('Message 3 peers', { timeout: 1_000 }, async () => {
|
|
43
39
|
const builder = new TestBuilder({
|
|
44
40
|
signalManagerFactory,
|
|
45
41
|
});
|
|
46
|
-
|
|
42
|
+
onTestFinished(() => builder.close());
|
|
47
43
|
const peer1 = await builder.createPeer();
|
|
48
44
|
const peer2 = await builder.createPeer();
|
|
49
45
|
const peer3 = await builder.createPeer();
|
|
@@ -83,13 +79,13 @@ export const messengerTests = (
|
|
|
83
79
|
await peer2.messenger.sendMessage(message);
|
|
84
80
|
await asyncTimeout(promise, 1_000);
|
|
85
81
|
}
|
|
86
|
-
})
|
|
82
|
+
});
|
|
87
83
|
|
|
88
|
-
test('Message routing', async () => {
|
|
84
|
+
test('Message routing', { timeout: 4_000 }, async () => {
|
|
89
85
|
const builder = new TestBuilder({
|
|
90
86
|
signalManagerFactory,
|
|
91
87
|
});
|
|
92
|
-
|
|
88
|
+
onTestFinished(() => builder.close());
|
|
93
89
|
const peer1 = await builder.createPeer();
|
|
94
90
|
const peer2 = await builder.createPeer();
|
|
95
91
|
|
|
@@ -140,13 +136,13 @@ export const messengerTests = (
|
|
|
140
136
|
expect(messageEqual(message, onMessage2[0])).toEqual(true);
|
|
141
137
|
expect(onMessage3.length === 0);
|
|
142
138
|
}
|
|
143
|
-
})
|
|
139
|
+
});
|
|
144
140
|
|
|
145
|
-
test('Unsubscribe listener', async () => {
|
|
141
|
+
test.skip('Unsubscribe listener', { timeout: 1_000 }, async () => {
|
|
146
142
|
const builder = new TestBuilder({
|
|
147
143
|
signalManagerFactory,
|
|
148
144
|
});
|
|
149
|
-
|
|
145
|
+
onTestFinished(() => builder.close());
|
|
150
146
|
const peer1 = await builder.createPeer();
|
|
151
147
|
const peer2 = await builder.createPeer();
|
|
152
148
|
|
|
@@ -207,15 +203,13 @@ export const messengerTests = (
|
|
|
207
203
|
expect(messages1.length).toEqual(2);
|
|
208
204
|
expect(messages2.length).toEqual(1);
|
|
209
205
|
}
|
|
210
|
-
})
|
|
211
|
-
.tag('flaky')
|
|
212
|
-
.timeout(1_000);
|
|
206
|
+
});
|
|
213
207
|
|
|
214
|
-
test('re-entrant message', async () => {
|
|
208
|
+
test('re-entrant message', { timeout: 1_000 }, async () => {
|
|
215
209
|
const builder = new TestBuilder({
|
|
216
210
|
signalManagerFactory,
|
|
217
211
|
});
|
|
218
|
-
|
|
212
|
+
onTestFinished(() => builder.close());
|
|
219
213
|
const peer1 = await builder.createPeer();
|
|
220
214
|
const peer2 = await builder.createPeer();
|
|
221
215
|
|
|
@@ -245,9 +239,9 @@ export const messengerTests = (
|
|
|
245
239
|
await peer1.messenger.sendMessage(message);
|
|
246
240
|
await asyncTimeout(receivePromise, 1_000);
|
|
247
241
|
}
|
|
248
|
-
})
|
|
242
|
+
});
|
|
249
243
|
|
|
250
|
-
describe('Reliability', () => {
|
|
244
|
+
describe('Reliability', { timeout: 5_000 }, () => {
|
|
251
245
|
test('message with non reliable connection', async () => {
|
|
252
246
|
// Simulate unreliable connection.
|
|
253
247
|
// Only each 3rd message is sent.
|
|
@@ -264,7 +258,7 @@ export const messengerTests = (
|
|
|
264
258
|
signalManagerFactory,
|
|
265
259
|
messageDisruption: unreliableConnection,
|
|
266
260
|
});
|
|
267
|
-
|
|
261
|
+
onTestFinished(() => builder.close());
|
|
268
262
|
const peer1 = await builder.createPeer();
|
|
269
263
|
await peer1.open();
|
|
270
264
|
const peer2 = await builder.createPeer();
|
|
@@ -286,9 +280,9 @@ export const messengerTests = (
|
|
|
286
280
|
|
|
287
281
|
// expect to receive 3 messages.
|
|
288
282
|
await receivePromise;
|
|
289
|
-
})
|
|
283
|
+
});
|
|
290
284
|
|
|
291
|
-
test('ignoring doubled messages', async () => {
|
|
285
|
+
test('ignoring doubled messages', { timeout: 5_000 }, async () => {
|
|
292
286
|
// Message got doubled going through signal network.
|
|
293
287
|
const doublingMessage = (data: Message) => [data, data];
|
|
294
288
|
|
|
@@ -296,7 +290,7 @@ export const messengerTests = (
|
|
|
296
290
|
signalManagerFactory,
|
|
297
291
|
messageDisruption: doublingMessage,
|
|
298
292
|
});
|
|
299
|
-
|
|
293
|
+
onTestFinished(() => builder.close());
|
|
300
294
|
const peer1 = await builder.createPeer();
|
|
301
295
|
await peer1.open();
|
|
302
296
|
const peer2 = await builder.createPeer();
|
|
@@ -317,10 +311,10 @@ export const messengerTests = (
|
|
|
317
311
|
await asyncTimeout(promise(), 1000);
|
|
318
312
|
expect(count).toEqual(1);
|
|
319
313
|
});
|
|
320
|
-
})
|
|
314
|
+
});
|
|
321
315
|
|
|
322
|
-
describe('load', () => {
|
|
323
|
-
test('many connections to KUBE', async () => {
|
|
316
|
+
describe.skip('load', () => {
|
|
317
|
+
test('many connections to KUBE', { timeout: 5_000 }, async () => {
|
|
324
318
|
const builder = new TestBuilder({
|
|
325
319
|
signalManagerFactory: async () =>
|
|
326
320
|
new WebsocketSignalManager([{ server: 'wss://dev.kube.dxos.org/.well-known/dx/signal' }]),
|
|
@@ -339,8 +333,6 @@ export const messengerTests = (
|
|
|
339
333
|
});
|
|
340
334
|
|
|
341
335
|
await sleep(1000000);
|
|
342
|
-
})
|
|
343
|
-
.tag('stress')
|
|
344
|
-
.timeout(5_000);
|
|
336
|
+
});
|
|
345
337
|
});
|
|
346
338
|
};
|
|
@@ -2,14 +2,13 @@
|
|
|
2
2
|
// Copyright 2022 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
+
import { afterAll, onTestFinished, beforeAll, test, describe } from 'vitest';
|
|
6
|
+
|
|
5
7
|
import { asyncTimeout } from '@dxos/async';
|
|
6
|
-
import { EdgeClient } from '@dxos/edge-client';
|
|
7
|
-
import { type PublicKey } from '@dxos/keys';
|
|
8
8
|
import { runTestSignalServer, type SignalServerRunner } from '@dxos/signal';
|
|
9
|
-
import { afterAll, afterTest, beforeAll, openAndClose, test, describe } from '@dxos/test';
|
|
10
9
|
|
|
11
10
|
import { messengerTests } from './messenger.blueprint-test';
|
|
12
|
-
import {
|
|
11
|
+
import { WebsocketSignalManager } from './signal-manager';
|
|
13
12
|
import { type Message } from './signal-methods';
|
|
14
13
|
import { PAYLOAD_1, TestBuilder } from './testing';
|
|
15
14
|
|
|
@@ -26,12 +25,12 @@ describe('Messenger with WebsocketSignalManager', () => {
|
|
|
26
25
|
|
|
27
26
|
messengerTests(async () => new WebsocketSignalManager([{ server: broker.url() }]));
|
|
28
27
|
|
|
29
|
-
test('Message with broken signal server', async () => {
|
|
28
|
+
test('Message with broken signal server', { timeout: 1000 }, async () => {
|
|
30
29
|
const builder = new TestBuilder({
|
|
31
30
|
signalManagerFactory: async () =>
|
|
32
31
|
new WebsocketSignalManager([{ server: 'ws://broken.kube.' }, { server: broker.url() }]),
|
|
33
32
|
});
|
|
34
|
-
|
|
33
|
+
onTestFinished(() => builder.close());
|
|
35
34
|
const peer1 = await builder.createPeer();
|
|
36
35
|
const peer2 = await builder.createPeer();
|
|
37
36
|
|
|
@@ -46,17 +45,5 @@ describe('Messenger with WebsocketSignalManager', () => {
|
|
|
46
45
|
await peer1.messenger.sendMessage(message);
|
|
47
46
|
await asyncTimeout(receivePromise, 1_000);
|
|
48
47
|
}
|
|
49
|
-
})
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
// TODO(mykola): Expects wrangler dev in edge repo to run. Skip to pass CI.
|
|
53
|
-
describe.skip('Messenger with EdgeSignalManager', () => {
|
|
54
|
-
const edgeSignalFactory = async (identityKey: PublicKey, deviceKey: PublicKey) => {
|
|
55
|
-
const client = new EdgeClient(identityKey.toHex(), deviceKey.toHex(), { socketEndpoint: 'ws://localhost:8787' });
|
|
56
|
-
await openAndClose(client);
|
|
57
|
-
|
|
58
|
-
return new EdgeSignalManager({ edgeConnection: client });
|
|
59
|
-
};
|
|
60
|
-
|
|
61
|
-
messengerTests(edgeSignalFactory);
|
|
48
|
+
});
|
|
62
49
|
});
|
package/src/messenger.ts
CHANGED
|
@@ -57,7 +57,7 @@ export class Messenger {
|
|
|
57
57
|
private _closed = true;
|
|
58
58
|
private readonly _retryDelay: number;
|
|
59
59
|
|
|
60
|
-
constructor({ signalManager, retryDelay =
|
|
60
|
+
constructor({ signalManager, retryDelay = 1000 }: MessengerOptions) {
|
|
61
61
|
this._signalManager = signalManager;
|
|
62
62
|
this._retryDelay = retryDelay;
|
|
63
63
|
|
|
@@ -2,15 +2,14 @@
|
|
|
2
2
|
// Copyright 2020 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
import { expect } from 'earljs';
|
|
5
|
+
import { afterAll, beforeAll, describe, expect, test, onTestFinished } from 'vitest';
|
|
7
6
|
|
|
8
7
|
import { asyncTimeout, waitForCondition } from '@dxos/async';
|
|
9
8
|
import { type Any, type TaggedType } from '@dxos/codec-protobuf';
|
|
10
9
|
import { PublicKey } from '@dxos/keys';
|
|
10
|
+
import { log } from '@dxos/log';
|
|
11
11
|
import { type TYPES } from '@dxos/protocols/proto';
|
|
12
12
|
import { runTestSignalServer, type SignalServerRunner } from '@dxos/signal';
|
|
13
|
-
import { afterAll, beforeAll, describe, test, afterTest } from '@dxos/test';
|
|
14
13
|
import { ComplexSet, range } from '@dxos/util';
|
|
15
14
|
|
|
16
15
|
import { SignalClient } from './signal-client';
|
|
@@ -30,7 +29,9 @@ describe('SignalClient', () => {
|
|
|
30
29
|
});
|
|
31
30
|
|
|
32
31
|
afterAll(async () => {
|
|
32
|
+
log.info('begin stop');
|
|
33
33
|
await broker1.stop();
|
|
34
|
+
log.info('end stop');
|
|
34
35
|
});
|
|
35
36
|
|
|
36
37
|
test('message between 2 clients', async () => {
|
|
@@ -79,7 +80,7 @@ describe('SignalClient', () => {
|
|
|
79
80
|
const message = createMessage(peer2, peer1);
|
|
80
81
|
|
|
81
82
|
{
|
|
82
|
-
const receivedMessage = peer1.waitForNextMessage();
|
|
83
|
+
const receivedMessage = peer1.waitForNextMessage({ timeout: 1_000 });
|
|
83
84
|
await peer2.client.sendMessage(message);
|
|
84
85
|
expect(await receivedMessage).toEqual(message);
|
|
85
86
|
}
|
|
@@ -90,7 +91,7 @@ describe('SignalClient', () => {
|
|
|
90
91
|
{
|
|
91
92
|
const receivedMessage = peer1.waitForNextMessage({ timeout: 200 });
|
|
92
93
|
await peer2.client.sendMessage(message);
|
|
93
|
-
await expect(receivedMessage).
|
|
94
|
+
await expect(receivedMessage).rejects.toBeDefined();
|
|
94
95
|
}
|
|
95
96
|
});
|
|
96
97
|
|
|
@@ -138,7 +139,7 @@ describe('SignalClient', () => {
|
|
|
138
139
|
});
|
|
139
140
|
|
|
140
141
|
void client.open();
|
|
141
|
-
|
|
142
|
+
onTestFinished(async () => {
|
|
142
143
|
await client.close();
|
|
143
144
|
});
|
|
144
145
|
return {
|
|
@@ -146,10 +147,10 @@ describe('SignalClient', () => {
|
|
|
146
147
|
identityKey,
|
|
147
148
|
client,
|
|
148
149
|
peerInfo: { peerKey: peerKey.toHex(), identityKey: identityKey.toHex() },
|
|
149
|
-
waitForNextMessage: async () => {
|
|
150
|
+
waitForNextMessage: async ({ timeout = 5_000 } = {}) => {
|
|
150
151
|
return asyncTimeout(
|
|
151
152
|
client.onMessage.waitFor(() => true),
|
|
152
|
-
|
|
153
|
+
timeout,
|
|
153
154
|
);
|
|
154
155
|
},
|
|
155
156
|
waitForPeer: (peerId: PublicKey) => waitForCondition({ condition: () => peers.has(peerId) }),
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Copyright 2022 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import { expect } from '
|
|
5
|
+
import { afterAll, beforeAll, describe, expect, onTestFinished, test } from 'vitest';
|
|
6
6
|
|
|
7
7
|
import { type Any } from '@dxos/codec-protobuf';
|
|
8
8
|
import { PublicKey } from '@dxos/keys';
|
|
@@ -10,7 +10,6 @@ import { log } from '@dxos/log';
|
|
|
10
10
|
import { schema } from '@dxos/protocols/proto';
|
|
11
11
|
import { type Message as SignalMessage, type SwarmEvent } from '@dxos/protocols/proto/dxos/mesh/signal';
|
|
12
12
|
import { runTestSignalServer, type SignalServerRunner } from '@dxos/signal';
|
|
13
|
-
import { afterAll, afterTest, beforeAll, describe, test } from '@dxos/test';
|
|
14
13
|
|
|
15
14
|
import { SignalRPCClient } from './signal-rpc-client';
|
|
16
15
|
|
|
@@ -28,11 +27,11 @@ describe('SignalRPCClient', () => {
|
|
|
28
27
|
// TODO(burdon): Convert to TestBuilder pattern.
|
|
29
28
|
const setupClient = async () => {
|
|
30
29
|
const client = new SignalRPCClient({ url: broker.url() });
|
|
31
|
-
|
|
30
|
+
onTestFinished(async () => await client.close());
|
|
32
31
|
return client;
|
|
33
32
|
};
|
|
34
33
|
|
|
35
|
-
test('signal between 2 peers', async () => {
|
|
34
|
+
test('signal between 2 peers', { timeout: 2_000 }, async () => {
|
|
36
35
|
const client1 = await setupClient();
|
|
37
36
|
const client2 = await setupClient();
|
|
38
37
|
|
|
@@ -65,14 +64,12 @@ describe('SignalRPCClient', () => {
|
|
|
65
64
|
payload,
|
|
66
65
|
});
|
|
67
66
|
|
|
68
|
-
expect((await received).author).toEqual(peerId2.
|
|
69
|
-
expect((await received).payload).
|
|
67
|
+
expect((await received).author).toEqual(peerId2.asBuffer());
|
|
68
|
+
expect((await received).payload).toEqual(expect.objectContaining(payload));
|
|
70
69
|
void stream1.close();
|
|
71
|
-
})
|
|
72
|
-
.timeout(2_000)
|
|
73
|
-
.retries(2);
|
|
70
|
+
});
|
|
74
71
|
|
|
75
|
-
test('join', async () => {
|
|
72
|
+
test('join', { timeout: 2_000 }, async () => {
|
|
76
73
|
const client1 = await setupClient();
|
|
77
74
|
const client2 = await setupClient();
|
|
78
75
|
|
|
@@ -101,7 +98,5 @@ describe('SignalRPCClient', () => {
|
|
|
101
98
|
expect((await promise).peerAvailable?.peer).toEqual(peerId2.asBuffer());
|
|
102
99
|
void stream1.close();
|
|
103
100
|
void stream2.close();
|
|
104
|
-
})
|
|
105
|
-
.timeout(2_000)
|
|
106
|
-
.retries(2);
|
|
101
|
+
});
|
|
107
102
|
});
|
|
@@ -2,8 +2,6 @@
|
|
|
2
2
|
// Copyright 2024 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import { AnySchema } from '@bufbuild/protobuf/wkt';
|
|
6
|
-
|
|
7
5
|
import { Event } from '@dxos/async';
|
|
8
6
|
import { Resource } from '@dxos/context';
|
|
9
7
|
import { type EdgeConnection, protocol } from '@dxos/edge-client';
|
|
@@ -11,11 +9,13 @@ import { invariant } from '@dxos/invariant';
|
|
|
11
9
|
import { PublicKey } from '@dxos/keys';
|
|
12
10
|
import { log } from '@dxos/log';
|
|
13
11
|
import { EdgeService } from '@dxos/protocols';
|
|
12
|
+
import { type buf, bufWkt } from '@dxos/protocols/buf';
|
|
14
13
|
import {
|
|
15
14
|
SwarmRequestSchema,
|
|
16
15
|
SwarmRequest_Action as SwarmRequestAction,
|
|
17
16
|
SwarmResponseSchema,
|
|
18
17
|
type Message as EdgeMessage,
|
|
18
|
+
type PeerSchema,
|
|
19
19
|
} from '@dxos/protocols/buf/dxos/edge/messenger_pb';
|
|
20
20
|
import { ComplexMap, ComplexSet } from '@dxos/util';
|
|
21
21
|
|
|
@@ -63,6 +63,7 @@ export class EdgeSignalManager extends Resource implements SignalManager {
|
|
|
63
63
|
await this._edgeConnection.send(
|
|
64
64
|
protocol.createMessage(SwarmRequestSchema, {
|
|
65
65
|
serviceId: EdgeService.SWARM_SERVICE_ID,
|
|
66
|
+
source: createMessageSource(topic, peer),
|
|
66
67
|
payload: { action: SwarmRequestAction.JOIN, swarmKeys: [topic.toHex()] },
|
|
67
68
|
}),
|
|
68
69
|
);
|
|
@@ -73,6 +74,7 @@ export class EdgeSignalManager extends Resource implements SignalManager {
|
|
|
73
74
|
await this._edgeConnection.send(
|
|
74
75
|
protocol.createMessage(SwarmRequestSchema, {
|
|
75
76
|
serviceId: EdgeService.SWARM_SERVICE_ID,
|
|
77
|
+
source: createMessageSource(topic, peer),
|
|
76
78
|
payload: { action: SwarmRequestAction.LEAVE, swarmKeys: [topic.toHex()] },
|
|
77
79
|
}),
|
|
78
80
|
);
|
|
@@ -88,7 +90,7 @@ export class EdgeSignalManager extends Resource implements SignalManager {
|
|
|
88
90
|
}
|
|
89
91
|
|
|
90
92
|
await this._edgeConnection.send(
|
|
91
|
-
protocol.createMessage(AnySchema, {
|
|
93
|
+
protocol.createMessage(bufWkt.AnySchema, {
|
|
92
94
|
serviceId: EdgeService.SIGNAL_SERVICE_ID,
|
|
93
95
|
source: message.author,
|
|
94
96
|
target: [message.recipient],
|
|
@@ -126,7 +128,7 @@ export class EdgeSignalManager extends Resource implements SignalManager {
|
|
|
126
128
|
return;
|
|
127
129
|
}
|
|
128
130
|
const oldPeers = this._swarmPeers.get(topic)!;
|
|
129
|
-
const timestamp = new Date(Date.parse(message.timestamp));
|
|
131
|
+
const timestamp = message.timestamp ? new Date(Date.parse(message.timestamp)) : new Date();
|
|
130
132
|
const newPeers = new ComplexSet<PeerInfo>(PeerInfoHash, payload.peers);
|
|
131
133
|
|
|
132
134
|
// Emit new available peers in the swarm.
|
|
@@ -155,8 +157,8 @@ export class EdgeSignalManager extends Resource implements SignalManager {
|
|
|
155
157
|
}
|
|
156
158
|
|
|
157
159
|
private _processMessage(message: EdgeMessage) {
|
|
158
|
-
invariant(protocol.getPayloadType(message) === AnySchema.typeName, 'Wrong payload type');
|
|
159
|
-
const payload = protocol.getPayload(message, AnySchema);
|
|
160
|
+
invariant(protocol.getPayloadType(message) === bufWkt.AnySchema.typeName, 'Wrong payload type');
|
|
161
|
+
const payload = protocol.getPayload(message, bufWkt.AnySchema);
|
|
160
162
|
invariant(message.source, 'source is missing');
|
|
161
163
|
invariant(message.target, 'target is missing');
|
|
162
164
|
invariant(message.target.length === 1, 'target should have exactly one item');
|
|
@@ -188,3 +190,11 @@ export class EdgeSignalManager extends Resource implements SignalManager {
|
|
|
188
190
|
}
|
|
189
191
|
}
|
|
190
192
|
}
|
|
193
|
+
|
|
194
|
+
const createMessageSource = (topic: PublicKey, peerInfo: PeerInfo): buf.MessageInitShape<typeof PeerSchema> => {
|
|
195
|
+
return {
|
|
196
|
+
swarmKey: topic.toHex(),
|
|
197
|
+
identityKey: peerInfo.identityKey,
|
|
198
|
+
peerKey: peerInfo.peerKey,
|
|
199
|
+
};
|
|
200
|
+
};
|
|
@@ -2,37 +2,31 @@
|
|
|
2
2
|
// Copyright 2023 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
+
import { afterAll, beforeAll, describe, test } from 'vitest';
|
|
6
|
+
|
|
5
7
|
import { asyncTimeout, sleep } from '@dxos/async';
|
|
6
8
|
import { PublicKey } from '@dxos/keys';
|
|
7
9
|
import { runTestSignalServer, type SignalServerRunner } from '@dxos/signal';
|
|
8
|
-
import {
|
|
10
|
+
import { openAndClose } from '@dxos/test-utils';
|
|
9
11
|
|
|
10
12
|
import { WebsocketSignalManager } from './websocket-signal-manager';
|
|
11
13
|
import { createMessage, expectPeerAvailable, expectReceivedMessage } from '../testing';
|
|
12
14
|
|
|
13
|
-
describe('WebSocketSignalManager', () => {
|
|
15
|
+
describe.skip('WebSocketSignalManager', () => {
|
|
14
16
|
let broker1: SignalServerRunner;
|
|
15
17
|
let broker2: SignalServerRunner;
|
|
16
18
|
|
|
17
19
|
beforeAll(async () => {
|
|
18
|
-
if (!mochaExecutor.tags.includes('e2e')) {
|
|
19
|
-
return;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
20
|
broker1 = await runTestSignalServer({ port: 5001 });
|
|
23
21
|
broker2 = await runTestSignalServer({ port: 5002 });
|
|
24
22
|
});
|
|
25
23
|
|
|
26
24
|
afterAll(() => {
|
|
27
|
-
if (!mochaExecutor.tags.includes('e2e')) {
|
|
28
|
-
return;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
25
|
void broker1.stop();
|
|
32
26
|
void broker2.stop();
|
|
33
27
|
});
|
|
34
28
|
|
|
35
|
-
test('join swarm with two brokers', async () => {
|
|
29
|
+
test('join swarm with two brokers', { timeout: 1_000 }, async () => {
|
|
36
30
|
const client1 = new WebsocketSignalManager([{ server: broker1.url() }, { server: broker2.url() }]);
|
|
37
31
|
const client2 = new WebsocketSignalManager([{ server: broker1.url() }]);
|
|
38
32
|
const client3 = new WebsocketSignalManager([{ server: broker2.url() }]);
|
|
@@ -50,12 +44,9 @@ describe('WebSocketSignalManager', () => {
|
|
|
50
44
|
await client3.join({ topic, peer: { peerKey: peer3.toHex() } });
|
|
51
45
|
|
|
52
46
|
await Promise.all([joined12, joined13, joined21, joined31]);
|
|
53
|
-
})
|
|
54
|
-
.timeout(1_000)
|
|
55
|
-
.retries(2)
|
|
56
|
-
.tag('e2e');
|
|
47
|
+
});
|
|
57
48
|
|
|
58
|
-
test('join single swarm with doubled brokers', async () => {
|
|
49
|
+
test('join single swarm with doubled brokers', { timeout: 1_000 }, async () => {
|
|
59
50
|
const client1 = new WebsocketSignalManager([{ server: broker1.url() }, { server: broker2.url() }]);
|
|
60
51
|
const client2 = new WebsocketSignalManager([{ server: broker1.url() }, { server: broker2.url() }]);
|
|
61
52
|
await openAndClose(client1, client2);
|
|
@@ -78,12 +69,9 @@ describe('WebSocketSignalManager', () => {
|
|
|
78
69
|
await client1.sendMessage(message);
|
|
79
70
|
|
|
80
71
|
await asyncTimeout(received, 1_000);
|
|
81
|
-
})
|
|
82
|
-
.timeout(1_000)
|
|
83
|
-
.retries(2)
|
|
84
|
-
.tag('e2e');
|
|
72
|
+
});
|
|
85
73
|
|
|
86
|
-
test('works with one broken server', async () => {
|
|
74
|
+
test('works with one broken server', { timeout: 1_000 }, async () => {
|
|
87
75
|
const client1 = new WebsocketSignalManager([{ server: 'ws://broken.server/signal' }, { server: broker1.url() }]);
|
|
88
76
|
const client2 = new WebsocketSignalManager([{ server: 'ws://broken.server/signal' }, { server: broker1.url() }]);
|
|
89
77
|
await openAndClose(client1, client2);
|
|
@@ -97,12 +85,9 @@ describe('WebSocketSignalManager', () => {
|
|
|
97
85
|
await client2.join({ topic, peer: { peerKey: peer2.toHex() } });
|
|
98
86
|
|
|
99
87
|
await Promise.all([joined12, joined21]);
|
|
100
|
-
})
|
|
101
|
-
.timeout(1_000)
|
|
102
|
-
.retries(2)
|
|
103
|
-
.tag('e2e');
|
|
88
|
+
});
|
|
104
89
|
|
|
105
|
-
test('join two swarms with a broken signal server', async () => {
|
|
90
|
+
test('join two swarms with a broken signal server', { timeout: 1_000 }, async () => {
|
|
106
91
|
const client1 = new WebsocketSignalManager([{ server: 'ws://broken.server/signal' }, { server: broker1.url() }]);
|
|
107
92
|
const client2 = new WebsocketSignalManager([{ server: 'ws://broken.server/signal' }, { server: broker1.url() }]);
|
|
108
93
|
await openAndClose(client1, client2);
|
|
@@ -122,8 +107,5 @@ describe('WebSocketSignalManager', () => {
|
|
|
122
107
|
await client1.join({ topic: topic2, peer: { peerKey: peer1.toHex() } });
|
|
123
108
|
await client2.join({ topic: topic2, peer: { peerKey: peer2.toHex() } });
|
|
124
109
|
await Promise.all([joined212, joined221]);
|
|
125
|
-
})
|
|
126
|
-
.timeout(1_000)
|
|
127
|
-
.retries(2)
|
|
128
|
-
.tag('e2e');
|
|
110
|
+
});
|
|
129
111
|
});
|
|
@@ -2,14 +2,12 @@
|
|
|
2
2
|
// Copyright 2022 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import { type PublicKey } from '@dxos/keys';
|
|
6
|
-
|
|
7
5
|
import { TestPeer } from './test-peer';
|
|
8
6
|
import { type SignalManager, MemorySignalManager, MemorySignalManagerContext } from '../signal-manager';
|
|
9
7
|
import { type Message } from '../signal-methods';
|
|
10
8
|
|
|
11
9
|
export type TestBuilderOptions = {
|
|
12
|
-
signalManagerFactory?: (
|
|
10
|
+
signalManagerFactory?: (peer: TestPeer) => Promise<SignalManager>;
|
|
13
11
|
messageDisruption?: (msg: Message) => Message[];
|
|
14
12
|
};
|
|
15
13
|
|
|
@@ -19,10 +17,9 @@ export class TestBuilder {
|
|
|
19
17
|
|
|
20
18
|
constructor(public options: TestBuilderOptions) {}
|
|
21
19
|
|
|
22
|
-
async createSignalManager(
|
|
20
|
+
async createSignalManager(peer: TestPeer): Promise<SignalManager> {
|
|
23
21
|
const signalManager =
|
|
24
|
-
(await this.options.signalManagerFactory?.(
|
|
25
|
-
new MemorySignalManager(this._signalContext);
|
|
22
|
+
(await this.options.signalManagerFactory?.(peer)) ?? new MemorySignalManager(this._signalContext);
|
|
26
23
|
|
|
27
24
|
if (this.options.messageDisruption) {
|
|
28
25
|
// Imitates signal network disruptions (e. g. message doubling, ).
|