@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.
Files changed (58) hide show
  1. package/dist/lib/browser/chunk-BZOQIXEW.mjs +691 -0
  2. package/dist/lib/browser/chunk-BZOQIXEW.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +256 -923
  4. package/dist/lib/browser/index.mjs.map +4 -4
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/testing/index.mjs +147 -0
  7. package/dist/lib/browser/testing/index.mjs.map +7 -0
  8. package/dist/lib/node/chunk-WDA7H2PO.cjs +688 -0
  9. package/dist/lib/node/chunk-WDA7H2PO.cjs.map +7 -0
  10. package/dist/lib/node/index.cjs +272 -916
  11. package/dist/lib/node/index.cjs.map +4 -4
  12. package/dist/lib/node/meta.json +1 -1
  13. package/dist/lib/node/testing/index.cjs +162 -0
  14. package/dist/lib/node/testing/index.cjs.map +7 -0
  15. package/dist/lib/node-esm/chunk-RAYDHHAO.mjs +683 -0
  16. package/dist/lib/node-esm/chunk-RAYDHHAO.mjs.map +7 -0
  17. package/dist/lib/node-esm/index.mjs +1631 -0
  18. package/dist/lib/node-esm/index.mjs.map +7 -0
  19. package/dist/lib/node-esm/meta.json +1 -0
  20. package/dist/lib/node-esm/testing/index.mjs +146 -0
  21. package/dist/lib/node-esm/testing/index.mjs.map +7 -0
  22. package/dist/types/src/messenger.blueprint-test.d.ts +2 -3
  23. package/dist/types/src/messenger.blueprint-test.d.ts.map +1 -1
  24. package/dist/types/src/messenger.d.ts.map +1 -1
  25. package/dist/types/src/messenger.node.test.d.ts +2 -0
  26. package/dist/types/src/messenger.node.test.d.ts.map +1 -0
  27. package/dist/types/src/signal-client/signal-client.node.test.d.ts +2 -0
  28. package/dist/types/src/signal-client/signal-client.node.test.d.ts.map +1 -0
  29. package/dist/types/src/signal-client/signal-rpc-client.node.test.d.ts +2 -0
  30. package/dist/types/src/signal-client/signal-rpc-client.node.test.d.ts.map +1 -0
  31. package/dist/types/src/signal-manager/edge-signal-manager.d.ts.map +1 -1
  32. package/dist/types/src/signal-manager/websocket-signal-manager.node.test.d.ts +2 -0
  33. package/dist/types/src/signal-manager/websocket-signal-manager.node.test.d.ts.map +1 -0
  34. package/dist/types/src/testing/test-builder.d.ts +3 -4
  35. package/dist/types/src/testing/test-builder.d.ts.map +1 -1
  36. package/dist/types/src/testing/test-peer.d.ts +0 -1
  37. package/dist/types/src/testing/test-peer.d.ts.map +1 -1
  38. package/package.json +32 -21
  39. package/src/messenger.blueprint-test.ts +25 -33
  40. package/src/{messenger.test.ts → messenger.node.test.ts} +6 -19
  41. package/src/messenger.ts +1 -1
  42. package/src/signal-client/{signal-client.test.ts → signal-client.node.test.ts} +9 -8
  43. package/src/signal-client/{signal-rpc-client.test.ts → signal-rpc-client.node.test.ts} +8 -13
  44. package/src/signal-manager/edge-signal-manager.ts +16 -6
  45. package/src/signal-manager/{websocket-signal-manager.test.ts → websocket-signal-manager.node.test.ts} +12 -30
  46. package/src/testing/test-builder.ts +3 -6
  47. package/src/testing/test-peer.ts +5 -7
  48. package/dist/types/src/messenger.test.d.ts +0 -2
  49. package/dist/types/src/messenger.test.d.ts.map +0 -1
  50. package/dist/types/src/signal-client/signal-client.test.d.ts +0 -2
  51. package/dist/types/src/signal-client/signal-client.test.d.ts.map +0 -1
  52. package/dist/types/src/signal-client/signal-rpc-client.test.d.ts +0 -2
  53. package/dist/types/src/signal-client/signal-rpc-client.test.d.ts.map +0 -1
  54. package/dist/types/src/signal-manager/edge-signal-manager.test.d.ts +0 -2
  55. package/dist/types/src/signal-manager/edge-signal-manager.test.d.ts.map +0 -1
  56. package/dist/types/src/signal-manager/websocket-signal-manager.test.d.ts +0 -2
  57. package/dist/types/src/signal-manager/websocket-signal-manager.test.d.ts.map +0 -1
  58. 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.13",
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
- "default": "./dist/lib/node/index.cjs"
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.13",
32
- "@dxos/codec-protobuf": "0.6.13",
33
- "@dxos/edge-client": "0.6.13",
34
- "@dxos/context": "0.6.13",
35
- "@dxos/invariant": "0.6.13",
36
- "@dxos/keys": "0.6.13",
37
- "@dxos/log": "0.6.13",
38
- "@dxos/node-std": "0.6.13",
39
- "@dxos/protocols": "0.6.13",
40
- "@dxos/tracing": "0.6.13",
41
- "@dxos/rpc": "0.6.13",
42
- "@dxos/util": "0.6.13"
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
- "@types/node": "^18.11.9",
46
- "earljs": "~0.1.10",
47
- "typescript": "^5.5.4",
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 'earljs';
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 { type SignalManager, WebsocketSignalManager } from './signal-manager';
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
- afterTest(() => builder.close());
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
- afterTest(() => builder.close());
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
- }).timeout(1_000);
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
- afterTest(() => builder.close());
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
- }).timeout(4_000);
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
- afterTest(() => builder.close());
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
- afterTest(() => builder.close());
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
- }).timeout(1_000);
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
- afterTest(() => builder.close());
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
- }).timeout(5_000);
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
- afterTest(() => builder.close());
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
- }).timeout(5_000);
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 { EdgeSignalManager, WebsocketSignalManager } from './signal-manager';
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
- afterTest(() => builder.close());
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
- }).timeout(1_000);
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 = 300 }: MessengerOptions) {
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
- // eslint-disable-next-line @typescript-eslint/no-var-requires
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).toBeRejected();
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
- afterTest(async () => {
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
- 5000,
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 'earljs';
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
- afterTest(async () => await client.close());
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.asUint8Array());
69
- expect((await received).payload).toBeAnObjectWith(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 { afterAll, beforeAll, describe, test, openAndClose } from '@dxos/test';
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?: (identityKey: PublicKey, deviceKey: PublicKey) => Promise<SignalManager>;
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(identityKey: PublicKey, deviceKey: PublicKey) {
20
+ async createSignalManager(peer: TestPeer): Promise<SignalManager> {
23
21
  const signalManager =
24
- (await this.options.signalManagerFactory?.(identityKey, deviceKey)) ??
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, ).