@dxos/messaging 0.8.4-main.b97322e → 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.
Files changed (62) hide show
  1. package/dist/lib/neutral/chunk-KKCQXNW4.mjs +694 -0
  2. package/dist/lib/neutral/chunk-KKCQXNW4.mjs.map +7 -0
  3. package/dist/lib/{browser/chunk-QLQS7TUS.mjs → neutral/index.mjs} +420 -1026
  4. package/dist/lib/neutral/index.mjs.map +7 -0
  5. package/dist/lib/{browser → neutral}/meta.json +1 -1
  6. package/dist/lib/{browser → neutral}/testing/index.mjs +13 -7
  7. package/dist/lib/neutral/testing/index.mjs.map +7 -0
  8. package/dist/types/src/messenger.blueprint-test.d.ts.map +1 -1
  9. package/dist/types/src/messenger.d.ts +3 -2
  10. package/dist/types/src/messenger.d.ts.map +1 -1
  11. package/dist/types/src/signal-client/signal-client.d.ts +7 -7
  12. package/dist/types/src/signal-client/signal-client.d.ts.map +1 -1
  13. package/dist/types/src/signal-client/signal-local-state.d.ts +1 -1
  14. package/dist/types/src/signal-client/signal-local-state.d.ts.map +1 -1
  15. package/dist/types/src/signal-client/signal-rpc-client.d.ts +2 -2
  16. package/dist/types/src/signal-client/signal-rpc-client.d.ts.map +1 -1
  17. package/dist/types/src/signal-manager/edge-signal-manager.d.ts +6 -6
  18. package/dist/types/src/signal-manager/edge-signal-manager.d.ts.map +1 -1
  19. package/dist/types/src/signal-manager/memory-signal-manager.d.ts +6 -5
  20. package/dist/types/src/signal-manager/memory-signal-manager.d.ts.map +1 -1
  21. package/dist/types/src/signal-manager/signal-manager.d.ts +1 -1
  22. package/dist/types/src/signal-manager/signal-manager.d.ts.map +1 -1
  23. package/dist/types/src/signal-manager/websocket-signal-manager.d.ts +6 -6
  24. package/dist/types/src/signal-manager/websocket-signal-manager.d.ts.map +1 -1
  25. package/dist/types/src/signal-methods.d.ts +7 -7
  26. package/dist/types/src/signal-methods.d.ts.map +1 -1
  27. package/dist/types/src/testing/test-builder.d.ts +1 -1
  28. package/dist/types/src/testing/test-builder.d.ts.map +1 -1
  29. package/dist/types/src/testing/test-peer.d.ts +1 -1
  30. package/dist/types/src/testing/test-peer.d.ts.map +1 -1
  31. package/dist/types/src/testing/utils.d.ts +1 -1
  32. package/dist/types/src/testing/utils.d.ts.map +1 -1
  33. package/dist/types/tsconfig.tsbuildinfo +1 -1
  34. package/package.json +26 -22
  35. package/src/messenger.blueprint-test.ts +15 -14
  36. package/src/messenger.node.test.ts +7 -38
  37. package/src/messenger.ts +35 -29
  38. package/src/signal-client/signal-client.node.test.ts +13 -11
  39. package/src/signal-client/signal-client.ts +11 -10
  40. package/src/signal-client/signal-local-state.ts +4 -3
  41. package/src/signal-client/signal-rpc-client.node.test.ts +1 -1
  42. package/src/signal-client/signal-rpc-client.ts +5 -5
  43. package/src/signal-manager/edge-signal-manager.ts +32 -18
  44. package/src/signal-manager/memory-signal-manager.ts +19 -15
  45. package/src/signal-manager/signal-manager.ts +1 -1
  46. package/src/signal-manager/websocket-signal-manager.node.test.ts +16 -14
  47. package/src/signal-manager/websocket-signal-manager.ts +12 -11
  48. package/src/signal-methods.ts +8 -8
  49. package/src/testing/test-builder.ts +7 -4
  50. package/src/testing/test-peer.ts +3 -2
  51. package/src/testing/utils.ts +3 -2
  52. package/dist/lib/browser/chunk-QLQS7TUS.mjs.map +0 -7
  53. package/dist/lib/browser/index.mjs +0 -22
  54. package/dist/lib/browser/index.mjs.map +0 -7
  55. package/dist/lib/browser/testing/index.mjs.map +0 -7
  56. package/dist/lib/node-esm/chunk-GIM3VIFP.mjs +0 -2309
  57. package/dist/lib/node-esm/chunk-GIM3VIFP.mjs.map +0 -7
  58. package/dist/lib/node-esm/index.mjs +0 -22
  59. package/dist/lib/node-esm/index.mjs.map +0 -7
  60. package/dist/lib/node-esm/meta.json +0 -1
  61. package/dist/lib/node-esm/testing/index.mjs +0 -143
  62. package/dist/lib/node-esm/testing/index.mjs.map +0 -7
package/package.json CHANGED
@@ -1,23 +1,27 @@
1
1
  {
2
2
  "name": "@dxos/messaging",
3
- "version": "0.8.4-main.b97322e",
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",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/dxos/dxos"
10
+ },
7
11
  "license": "MIT",
8
12
  "author": "DXOS.org",
9
- "sideEffects": true,
13
+ "sideEffects": false,
10
14
  "type": "module",
11
15
  "exports": {
12
16
  ".": {
17
+ "source": "./src/index.ts",
13
18
  "types": "./dist/types/src/index.d.ts",
14
- "browser": "./dist/lib/browser/index.mjs",
15
- "node": "./dist/lib/node-esm/index.mjs"
19
+ "default": "./dist/lib/neutral/index.mjs"
16
20
  },
17
21
  "./testing": {
22
+ "source": "./src/testing/index.ts",
18
23
  "types": "./dist/types/src/testing/index.d.ts",
19
- "browser": "./dist/lib/browser/testing/index.mjs",
20
- "node": "./dist/lib/node-esm/testing/index.mjs"
24
+ "default": "./dist/lib/neutral/testing/index.mjs"
21
25
  }
22
26
  },
23
27
  "types": "dist/types/src/index.d.ts",
@@ -35,24 +39,24 @@
35
39
  ],
36
40
  "dependencies": {
37
41
  "isomorphic-ws": "^5.0.0",
38
- "ws": "^8.14.2",
39
- "@dxos/async": "0.8.4-main.b97322e",
40
- "@dxos/codec-protobuf": "0.8.4-main.b97322e",
41
- "@dxos/context": "0.8.4-main.b97322e",
42
- "@dxos/edge-client": "0.8.4-main.b97322e",
43
- "@dxos/invariant": "0.8.4-main.b97322e",
44
- "@dxos/log": "0.8.4-main.b97322e",
45
- "@dxos/node-std": "0.8.4-main.b97322e",
46
- "@dxos/keys": "0.8.4-main.b97322e",
47
- "@dxos/protocols": "0.8.4-main.b97322e",
48
- "@dxos/tracing": "0.8.4-main.b97322e",
49
- "@dxos/util": "0.8.4-main.b97322e",
50
- "@dxos/rpc": "0.8.4-main.b97322e"
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"
51
55
  },
52
56
  "devDependencies": {
53
- "@dxos/keyring": "0.8.4-main.b97322e",
54
- "@dxos/signal": "0.8.4-main.b97322e",
55
- "@dxos/test-utils": "0.8.4-main.b97322e"
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"
56
60
  },
57
61
  "publishConfig": {
58
62
  "access": "public"
@@ -2,14 +2,15 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import { describe, expect, test, onTestFinished } from 'vitest';
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';
11
12
  import { type Message } from './signal-methods';
12
- import { messageEqual, PAYLOAD_1, PAYLOAD_2, PAYLOAD_3, TestBuilder } from './testing';
13
+ import { PAYLOAD_1, PAYLOAD_2, PAYLOAD_3, TestBuilder, messageEqual } from './testing';
13
14
 
14
15
  export const messengerTests = (signalManagerFactory: TestBuilder['createSignalManager']) => {
15
16
  test('Message between peers', async () => {
@@ -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: {
@@ -2,48 +2,17 @@
2
2
  // Copyright 2022 DXOS.org
3
3
  //
4
4
 
5
- import { afterAll, onTestFinished, beforeAll, test, describe } from 'vitest';
6
-
7
- import { asyncTimeout } from '@dxos/async';
8
- import { runTestSignalServer, type SignalServerRunner } from '@dxos/signal';
5
+ import { beforeEach, describe } from 'vitest';
9
6
 
10
7
  import { messengerTests } from './messenger.blueprint-test';
11
- import { WebsocketSignalManager } from './signal-manager';
12
- import { type Message } from './signal-methods';
13
- import { PAYLOAD_1, TestBuilder } from './testing';
8
+ import { MemorySignalManager, MemorySignalManagerContext } from './signal-manager';
14
9
 
10
+ // TODO(mykola): Use EDGE signal server.
15
11
  describe('Messenger with WebsocketSignalManager', () => {
16
- let broker: SignalServerRunner;
17
-
18
- beforeAll(async () => {
19
- broker = await runTestSignalServer();
20
- });
21
-
22
- afterAll(() => {
23
- void broker.stop();
12
+ let context: MemorySignalManagerContext;
13
+ beforeEach(async () => {
14
+ context = new MemorySignalManagerContext();
24
15
  });
25
16
 
26
- messengerTests(async () => new WebsocketSignalManager([{ server: broker.url() }]));
27
-
28
- test('Message with broken signal server', { timeout: 1000 }, async () => {
29
- const builder = new TestBuilder({
30
- signalManagerFactory: async () =>
31
- new WebsocketSignalManager([{ server: 'ws://broken.kube.' }, { server: broker.url() }]),
32
- });
33
- onTestFinished(() => builder.close());
34
- const peer1 = await builder.createPeer();
35
- const peer2 = await builder.createPeer();
36
-
37
- const message: Message = {
38
- author: peer1.peerInfo,
39
- recipient: peer2.peerInfo,
40
- payload: PAYLOAD_1,
41
- };
42
-
43
- {
44
- const receivePromise = peer2.waitTillReceive(message);
45
- await peer1.messenger.sendMessage(message);
46
- await asyncTimeout(receivePromise, 1_000);
47
- }
48
- });
17
+ messengerTests(async () => new MemorySignalManager(context));
49
18
  });
package/src/messenger.ts CHANGED
@@ -15,7 +15,7 @@ import { ComplexMap, ComplexSet } from '@dxos/util';
15
15
 
16
16
  import { MessengerMonitor } from './messenger-monitor';
17
17
  import { type SignalManager } from './signal-manager';
18
- import { type PeerInfo, type Message } from './signal-methods';
18
+ import { type Message, type PeerInfo } from './signal-methods';
19
19
  import { MESSAGE_TIMEOUT } from './timeouts';
20
20
 
21
21
  export type OnMessage = (params: Message) => Promise<void>;
@@ -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
- author,
209
- recipient,
210
- reliablePayload,
211
- }: {
212
- author: PeerInfo;
213
- recipient: PeerInfo;
214
- reliablePayload: ReliablePayload;
215
- }): Promise<void> {
216
- await this._signalManager.sendMessage({
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
- author,
277
- recipient,
278
- messageId,
279
- }: {
280
- author: PeerInfo;
281
- recipient: PeerInfo;
282
- messageId: PublicKey;
283
- }): Promise<void> {
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: {
@@ -2,19 +2,21 @@
2
2
  // Copyright 2020 DXOS.org
3
3
  //
4
4
 
5
- import { afterAll, beforeAll, describe, expect, test, onTestFinished } from 'vitest';
5
+ import { afterAll, beforeAll, describe, expect, onTestFinished, test } from 'vitest';
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';
12
- import { runTestSignalServer, type SignalServerRunner } from '@dxos/signal';
13
+ import { type SignalServerRunner, runTestSignalServer } from '@dxos/signal';
13
14
  import { ComplexSet, range } from '@dxos/util';
14
15
 
15
- import { SignalClient } from './signal-client';
16
16
  import { type Message, type PeerInfo } from '../signal-methods';
17
17
 
18
+ import { SignalClient } from './signal-client';
19
+
18
20
  const PAYLOAD: TaggedType<TYPES, 'google.protobuf.Any'> = {
19
21
  '@type': 'google.protobuf.Any',
20
22
  type_url: 'google.protobuf.Any',
@@ -42,7 +44,7 @@ describe('SignalClient', () => {
42
44
 
43
45
  const message = createMessage(peer2, peer1);
44
46
  const receivedMessage = peer1.waitForNextMessage();
45
- await peer2.client.sendMessage(message);
47
+ await peer2.client.sendMessage(Context.default(), message);
46
48
  expect(await receivedMessage).toEqual(message);
47
49
  });
48
50
 
@@ -50,8 +52,8 @@ describe('SignalClient', () => {
50
52
  const topic = PublicKey.random();
51
53
  const [peer1, peer2] = setupPeers({ peerCount: 2 });
52
54
 
53
- await peer1.client.join({ topic, peer: peer1.peerInfo });
54
- 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 });
55
57
 
56
58
  await peer1.waitForPeer(peer2.peerKey);
57
59
  await peer2.waitForPeer(peer1.peerKey);
@@ -66,7 +68,7 @@ describe('SignalClient', () => {
66
68
  const message = createMessage(peer2, peer1);
67
69
  const receivedMessage = peer1.waitForNextMessage();
68
70
 
69
- await peer1.client.sendMessage(message);
71
+ await peer1.client.sendMessage(Context.default(), message);
70
72
  expect(await receivedMessage).toEqual(message);
71
73
  });
72
74
 
@@ -81,7 +83,7 @@ describe('SignalClient', () => {
81
83
 
82
84
  {
83
85
  const receivedMessage = peer1.waitForNextMessage({ timeout: 1_000 });
84
- await peer2.client.sendMessage(message);
86
+ await peer2.client.sendMessage(Context.default(), message);
85
87
  expect(await receivedMessage).toEqual(message);
86
88
  }
87
89
 
@@ -90,7 +92,7 @@ describe('SignalClient', () => {
90
92
 
91
93
  {
92
94
  const receivedMessage = peer1.waitForNextMessage({ timeout: 200 });
93
- await peer2.client.sendMessage(message);
95
+ await peer2.client.sendMessage(Context.default(), message);
94
96
  await expect(receivedMessage).rejects.toBeDefined();
95
97
  }
96
98
  });
@@ -105,7 +107,7 @@ describe('SignalClient', () => {
105
107
 
106
108
  {
107
109
  const waitMessage = peer1.waitForNextMessage();
108
- await peer2.client.sendMessage(message);
110
+ await peer2.client.sendMessage(Context.default(), message);
109
111
  expect(await waitMessage).toEqual(message);
110
112
  }
111
113
 
@@ -119,7 +121,7 @@ describe('SignalClient', () => {
119
121
 
120
122
  {
121
123
  const waitMessage = peer1.waitForNextMessage();
122
- await peer2.client.sendMessage(message);
124
+ await peer2.client.sendMessage(Context.default(), message);
123
125
  expect(await waitMessage).toEqual(message);
124
126
  }
125
127
  });
@@ -3,26 +3,27 @@
3
3
  //
4
4
 
5
5
  import { DeferredTask, Event, Trigger, scheduleTask, scheduleTaskInterval, sleep } from '@dxos/async';
6
- import { type Context, cancelWithContext, Resource } from '@dxos/context';
6
+ import { type Context, Resource, cancelWithContext } from '@dxos/context';
7
7
  import { invariant } from '@dxos/invariant';
8
8
  import { PublicKey } from '@dxos/keys';
9
9
  import { log } from '@dxos/log';
10
10
  import { trace } from '@dxos/protocols';
11
11
  import { type SwarmResponse } from '@dxos/protocols/proto/dxos/edge/messenger';
12
- import { type QueryRequest, type JoinRequest, type LeaveRequest } from '@dxos/protocols/proto/dxos/edge/signal';
12
+ import { type JoinRequest, type LeaveRequest, type QueryRequest } from '@dxos/protocols/proto/dxos/edge/signal';
13
13
  import { SignalState } from '@dxos/protocols/proto/dxos/mesh/signal';
14
14
 
15
- import { SignalClientMonitor } from './signal-client-monitor';
16
- import { SignalLocalState } from './signal-local-state';
17
- import { SignalRPCClient } from './signal-rpc-client';
18
15
  import {
19
- type PeerInfo,
20
16
  type Message,
17
+ type PeerInfo,
21
18
  type SignalClientMethods,
22
19
  type SignalStatus,
23
20
  type SwarmEvent,
24
21
  } from '../signal-methods';
25
22
 
23
+ import { SignalClientMonitor } from './signal-client-monitor';
24
+ import { SignalLocalState } from './signal-local-state';
25
+ import { SignalRPCClient } from './signal-rpc-client';
26
+
26
27
  const DEFAULT_RECONNECT_TIMEOUT = 100;
27
28
  const MAX_RECONNECT_TIMEOUT = 5_000;
28
29
  const ERROR_RECONCILE_DELAY = 1_000;
@@ -172,24 +173,24 @@ export class SignalClient extends Resource implements SignalClientMethods {
172
173
  };
173
174
  }
174
175
 
175
- async join(args: JoinRequest): Promise<void> {
176
+ async join(_ctx: Context, args: JoinRequest): Promise<void> {
176
177
  log('joining', { topic: args.topic, peerId: args.peer.peerKey });
177
178
  this._monitor.recordJoin();
178
179
  this.localState.join({ topic: args.topic, peerId: PublicKey.from(args.peer.peerKey) });
179
180
  this._reconcileTask?.schedule();
180
181
  }
181
182
 
182
- async leave(args: LeaveRequest): Promise<void> {
183
+ async leave(_ctx: Context, args: LeaveRequest): Promise<void> {
183
184
  log('leaving', { topic: args.topic, peerId: args.peer.peerKey });
184
185
  this._monitor.recordLeave();
185
186
  this.localState.leave({ topic: args.topic, peerId: PublicKey.from(args.peer.peerKey) });
186
187
  }
187
188
 
188
- async query(params: QueryRequest): Promise<SwarmResponse> {
189
+ async query(_ctx: Context, params: QueryRequest): Promise<SwarmResponse> {
189
190
  throw new Error('Not implemented');
190
191
  }
191
192
 
192
- async sendMessage(msg: Message): Promise<void> {
193
+ async sendMessage(_ctx: Context, msg: Message): Promise<void> {
193
194
  return this._monitor.recordMessageSending(msg, async () => {
194
195
  await this._clientReady.wait();
195
196
  invariant(this._state === SignalState.CONNECTED, 'Not connected to Signal Server');
@@ -2,9 +2,9 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import { asyncTimeout, Event } from '@dxos/async';
5
+ import { Event, asyncTimeout } from '@dxos/async';
6
6
  import type { Stream } from '@dxos/codec-protobuf/stream';
7
- import { cancelWithContext, type Context } from '@dxos/context';
7
+ import { type Context, cancelWithContext } from '@dxos/context';
8
8
  import { PublicKey } from '@dxos/keys';
9
9
  import { log } from '@dxos/log';
10
10
  import {
@@ -13,9 +13,10 @@ import {
13
13
  } from '@dxos/protocols/proto/dxos/mesh/signal';
14
14
  import { ComplexMap, ComplexSet, safeAwaitAll } from '@dxos/util';
15
15
 
16
- import { type SignalRPCClient } from './signal-rpc-client';
17
16
  import type { Message, SwarmEvent } from '../signal-methods';
18
17
 
18
+ import { type SignalRPCClient } from './signal-rpc-client';
19
+
19
20
  export class SignalLocalState {
20
21
  /**
21
22
  * Swarm events streams. Keys represent actually joined topic and peerId.
@@ -9,7 +9,7 @@ import { PublicKey } from '@dxos/keys';
9
9
  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
- import { runTestSignalServer, type SignalServerRunner } from '@dxos/signal';
12
+ import { type SignalServerRunner, runTestSignalServer } from '@dxos/signal';
13
13
 
14
14
  import { SignalRPCClient } from './signal-rpc-client';
15
15
 
@@ -4,7 +4,7 @@
4
4
 
5
5
  import WebSocket from 'isomorphic-ws';
6
6
 
7
- import { scheduleTaskInterval, TimeoutError, Trigger } from '@dxos/async';
7
+ import { TimeoutError, Trigger, scheduleTaskInterval } from '@dxos/async';
8
8
  import { type Any, type Stream } from '@dxos/codec-protobuf';
9
9
  import { Context } from '@dxos/context';
10
10
  import { invariant } from '@dxos/invariant';
@@ -12,8 +12,8 @@ import { PublicKey } from '@dxos/keys';
12
12
  import { log } from '@dxos/log';
13
13
  import { trace } from '@dxos/protocols';
14
14
  import { schema } from '@dxos/protocols/proto';
15
- import { type Message as SignalMessage, type Signal } from '@dxos/protocols/proto/dxos/mesh/signal';
16
- import { createProtoRpcPeer, type ProtoRpcPeer } from '@dxos/rpc';
15
+ import { type Signal, type Message as SignalMessage } from '@dxos/protocols/proto/dxos/mesh/signal';
16
+ import { type ProtoRpcPeer, createProtoRpcPeer } from '@dxos/rpc';
17
17
 
18
18
  import { SignalRpcClientMonitor } from './signal-rpc-client-monitor';
19
19
 
@@ -36,7 +36,7 @@ export type SignalCallbacks = {
36
36
  getMetadata?: () => any;
37
37
  };
38
38
 
39
- export type SignalRPCClientParams = {
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 = {} }: SignalRPCClientParams) {
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;