@dxos/messaging 0.8.4-main.bc674ce → 0.8.4-main.bcb3aa67d6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist/lib/{browser/chunk-5MOQVHHI.mjs → neutral/chunk-KKCQXNW4.mjs} +31 -31
  2. package/dist/lib/neutral/chunk-KKCQXNW4.mjs.map +7 -0
  3. package/dist/lib/{browser → neutral}/index.mjs +28 -28
  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 +3 -3
  7. package/dist/lib/{browser → neutral}/testing/index.mjs.map +3 -3
  8. package/dist/types/src/messenger.blueprint-test.d.ts.map +1 -1
  9. package/dist/types/src/messenger.d.ts +2 -1
  10. package/dist/types/src/messenger.d.ts.map +1 -1
  11. package/dist/types/src/signal-client/signal-client.d.ts +5 -5
  12. package/dist/types/src/signal-client/signal-client.d.ts.map +1 -1
  13. package/dist/types/src/signal-manager/edge-signal-manager.d.ts +5 -5
  14. package/dist/types/src/signal-manager/edge-signal-manager.d.ts.map +1 -1
  15. package/dist/types/src/signal-manager/memory-signal-manager.d.ts +5 -4
  16. package/dist/types/src/signal-manager/memory-signal-manager.d.ts.map +1 -1
  17. package/dist/types/src/signal-manager/websocket-signal-manager.d.ts +5 -5
  18. package/dist/types/src/signal-manager/websocket-signal-manager.d.ts.map +1 -1
  19. package/dist/types/src/signal-methods.d.ts +5 -5
  20. package/dist/types/src/signal-methods.d.ts.map +1 -1
  21. package/dist/types/src/testing/test-builder.d.ts.map +1 -1
  22. package/dist/types/tsconfig.tsbuildinfo +1 -1
  23. package/package.json +19 -21
  24. package/src/messenger.blueprint-test.ts +13 -12
  25. package/src/messenger.ts +30 -24
  26. package/src/signal-client/signal-client.node.test.ts +9 -8
  27. package/src/signal-client/signal-client.ts +4 -4
  28. package/src/signal-manager/edge-signal-manager.ts +10 -6
  29. package/src/signal-manager/memory-signal-manager.ts +17 -14
  30. package/src/signal-manager/websocket-signal-manager.node.test.ts +13 -12
  31. package/src/signal-manager/websocket-signal-manager.ts +8 -8
  32. package/src/signal-methods.ts +5 -5
  33. package/src/testing/test-builder.ts +4 -2
  34. package/dist/lib/browser/chunk-5MOQVHHI.mjs.map +0 -7
  35. package/dist/lib/browser/index.mjs.map +0 -7
  36. package/dist/lib/node-esm/chunk-HBWHJFJZ.mjs +0 -694
  37. package/dist/lib/node-esm/chunk-HBWHJFJZ.mjs.map +0 -7
  38. package/dist/lib/node-esm/index.mjs +0 -1703
  39. package/dist/lib/node-esm/index.mjs.map +0 -7
  40. package/dist/lib/node-esm/meta.json +0 -1
  41. package/dist/lib/node-esm/testing/index.mjs +0 -149
  42. package/dist/lib/node-esm/testing/index.mjs.map +0 -7
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/messaging",
3
- "version": "0.8.4-main.bc674ce",
3
+ "version": "0.8.4-main.bcb3aa67d6",
4
4
  "description": "Messaging",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -16,14 +16,12 @@
16
16
  ".": {
17
17
  "source": "./src/index.ts",
18
18
  "types": "./dist/types/src/index.d.ts",
19
- "browser": "./dist/lib/browser/index.mjs",
20
- "node": "./dist/lib/node-esm/index.mjs"
19
+ "default": "./dist/lib/neutral/index.mjs"
21
20
  },
22
21
  "./testing": {
23
22
  "source": "./src/testing/index.ts",
24
23
  "types": "./dist/types/src/testing/index.d.ts",
25
- "browser": "./dist/lib/browser/testing/index.mjs",
26
- "node": "./dist/lib/node-esm/testing/index.mjs"
24
+ "default": "./dist/lib/neutral/testing/index.mjs"
27
25
  }
28
26
  },
29
27
  "types": "dist/types/src/index.d.ts",
@@ -41,24 +39,24 @@
41
39
  ],
42
40
  "dependencies": {
43
41
  "isomorphic-ws": "^5.0.0",
44
- "ws": "^8.14.2",
45
- "@dxos/async": "0.8.4-main.bc674ce",
46
- "@dxos/codec-protobuf": "0.8.4-main.bc674ce",
47
- "@dxos/context": "0.8.4-main.bc674ce",
48
- "@dxos/edge-client": "0.8.4-main.bc674ce",
49
- "@dxos/invariant": "0.8.4-main.bc674ce",
50
- "@dxos/log": "0.8.4-main.bc674ce",
51
- "@dxos/node-std": "0.8.4-main.bc674ce",
52
- "@dxos/keys": "0.8.4-main.bc674ce",
53
- "@dxos/tracing": "0.8.4-main.bc674ce",
54
- "@dxos/rpc": "0.8.4-main.bc674ce",
55
- "@dxos/protocols": "0.8.4-main.bc674ce",
56
- "@dxos/util": "0.8.4-main.bc674ce"
42
+ "ws": "^8.17.1",
43
+ "@dxos/codec-protobuf": "0.8.4-main.bcb3aa67d6",
44
+ "@dxos/async": "0.8.4-main.bcb3aa67d6",
45
+ "@dxos/context": "0.8.4-main.bcb3aa67d6",
46
+ "@dxos/edge-client": "0.8.4-main.bcb3aa67d6",
47
+ "@dxos/keys": "0.8.4-main.bcb3aa67d6",
48
+ "@dxos/node-std": "0.8.4-main.bcb3aa67d6",
49
+ "@dxos/invariant": "0.8.4-main.bcb3aa67d6",
50
+ "@dxos/log": "0.8.4-main.bcb3aa67d6",
51
+ "@dxos/protocols": "0.8.4-main.bcb3aa67d6",
52
+ "@dxos/tracing": "0.8.4-main.bcb3aa67d6",
53
+ "@dxos/util": "0.8.4-main.bcb3aa67d6",
54
+ "@dxos/rpc": "0.8.4-main.bcb3aa67d6"
57
55
  },
58
56
  "devDependencies": {
59
- "@dxos/keyring": "0.8.4-main.bc674ce",
60
- "@dxos/signal": "0.8.4-main.bc674ce",
61
- "@dxos/test-utils": "0.8.4-main.bc674ce"
57
+ "@dxos/keyring": "0.8.4-main.bcb3aa67d6",
58
+ "@dxos/signal": "0.8.4-main.bcb3aa67d6",
59
+ "@dxos/test-utils": "0.8.4-main.bcb3aa67d6"
62
60
  },
63
61
  "publishConfig": {
64
62
  "access": "public"
@@ -5,6 +5,7 @@
5
5
  import { describe, expect, onTestFinished, test } from 'vitest';
6
6
 
7
7
  import { asyncTimeout, latch, sleep } from '@dxos/async';
8
+ import { Context } from '@dxos/context';
8
9
  import { range } from '@dxos/util';
9
10
 
10
11
  import { WebsocketSignalManager } from './signal-manager';
@@ -30,7 +31,7 @@ export const messengerTests = (signalManagerFactory: TestBuilder['createSignalMa
30
31
 
31
32
  const promise = peer2.waitTillReceive(message);
32
33
 
33
- await peer1.messenger.sendMessage(message);
34
+ await peer1.messenger.sendMessage(Context.default(), message);
34
35
 
35
36
  await promise;
36
37
  });
@@ -52,7 +53,7 @@ export const messengerTests = (signalManagerFactory: TestBuilder['createSignalMa
52
53
  };
53
54
 
54
55
  const promise = peer2.waitTillReceive(message);
55
- await peer1.messenger.sendMessage(message);
56
+ await peer1.messenger.sendMessage(Context.default(), message);
56
57
  await asyncTimeout(promise, 1_000);
57
58
  }
58
59
 
@@ -64,7 +65,7 @@ export const messengerTests = (signalManagerFactory: TestBuilder['createSignalMa
64
65
  };
65
66
 
66
67
  const promise = peer3.waitTillReceive(message);
67
- await peer1.messenger.sendMessage(message);
68
+ await peer1.messenger.sendMessage(Context.default(), message);
68
69
  await asyncTimeout(promise, 1_000);
69
70
  }
70
71
 
@@ -76,7 +77,7 @@ export const messengerTests = (signalManagerFactory: TestBuilder['createSignalMa
76
77
  };
77
78
 
78
79
  const promise = peer1.waitTillReceive(message);
79
- await peer2.messenger.sendMessage(message);
80
+ await peer2.messenger.sendMessage(Context.default(), message);
80
81
  await asyncTimeout(promise, 1_000);
81
82
  }
82
83
  });
@@ -128,7 +129,7 @@ export const messengerTests = (signalManagerFactory: TestBuilder['createSignalMa
128
129
  };
129
130
  const promise = peer2.waitTillReceive(message);
130
131
 
131
- await peer1.messenger.sendMessage(message);
132
+ await peer1.messenger.sendMessage(Context.default(), message);
132
133
 
133
134
  // 3 listeners (default one that was returned by setupPeer() and 2 that listen for type "1") should receive message.
134
135
  await asyncTimeout(promise, 1_000);
@@ -175,7 +176,7 @@ export const messengerTests = (signalManagerFactory: TestBuilder['createSignalMa
175
176
  };
176
177
 
177
178
  const receivePromise = peer2.waitTillReceive(message);
178
- await peer1.messenger.sendMessage(message);
179
+ await peer1.messenger.sendMessage(Context.default(), message);
179
180
 
180
181
  // 2 subscribed listeners should receive message.
181
182
  await asyncTimeout(receivePromise, 1_000);
@@ -195,7 +196,7 @@ export const messengerTests = (signalManagerFactory: TestBuilder['createSignalMa
195
196
  };
196
197
 
197
198
  const receivePromise = peer2.waitTillReceive(message);
198
- await peer1.messenger.sendMessage(message);
199
+ await peer1.messenger.sendMessage(Context.default(), message);
199
200
 
200
201
  // 1 listener that was not unsubscribed should receive message.
201
202
  await asyncTimeout(receivePromise, 1_000);
@@ -221,7 +222,7 @@ export const messengerTests = (signalManagerFactory: TestBuilder['createSignalMa
221
222
 
222
223
  {
223
224
  const receivePromise = peer2.waitTillReceive(message);
224
- await peer1.messenger.sendMessage(message);
225
+ await peer1.messenger.sendMessage(Context.default(), message);
225
226
  await asyncTimeout(receivePromise, 1_000);
226
227
  }
227
228
 
@@ -236,7 +237,7 @@ export const messengerTests = (signalManagerFactory: TestBuilder['createSignalMa
236
237
 
237
238
  {
238
239
  const receivePromise = peer2.waitTillReceive(message);
239
- await peer1.messenger.sendMessage(message);
240
+ await peer1.messenger.sendMessage(Context.default(), message);
240
241
  await asyncTimeout(receivePromise, 1_000);
241
242
  }
242
243
  });
@@ -275,7 +276,7 @@ export const messengerTests = (signalManagerFactory: TestBuilder['createSignalMa
275
276
  Array(3)
276
277
  .fill(0)
277
278
  .forEach(async () => {
278
- await peer2.messenger.sendMessage(message);
279
+ await peer2.messenger.sendMessage(Context.default(), message);
279
280
  });
280
281
 
281
282
  // expect to receive 3 messages.
@@ -302,7 +303,7 @@ export const messengerTests = (signalManagerFactory: TestBuilder['createSignalMa
302
303
  count = inc();
303
304
  });
304
305
  // sending message.
305
- await peer2.messenger.sendMessage({
306
+ await peer2.messenger.sendMessage(Context.default(), {
306
307
  author: peer2.peerInfo,
307
308
  recipient: peer1.peerInfo,
308
309
  payload: PAYLOAD_1,
@@ -322,7 +323,7 @@ export const messengerTests = (signalManagerFactory: TestBuilder['createSignalMa
322
323
  void range(100).map(async () => {
323
324
  const peer = await builder.createPeer();
324
325
 
325
- void peer.messenger.sendMessage({
326
+ void peer.messenger.sendMessage(Context.default(), {
326
327
  author: peer.peerInfo,
327
328
  recipient: peer.peerInfo,
328
329
  payload: {
package/src/messenger.ts CHANGED
@@ -101,7 +101,7 @@ export class Messenger {
101
101
  await this._ctx.dispose();
102
102
  }
103
103
 
104
- async sendMessage({ author, recipient, payload }: Message): Promise<void> {
104
+ async sendMessage(ctx: Context, { author, recipient, payload }: Message): Promise<void> {
105
105
  invariant(!this._closed, 'Closed');
106
106
  const messageContext = this._ctx.derive();
107
107
 
@@ -127,7 +127,7 @@ export class Messenger {
127
127
  async () => {
128
128
  log('retrying message', { messageId: reliablePayload.messageId });
129
129
  sendAttempts++;
130
- await this._encodeAndSend({ author, recipient, reliablePayload }).catch((err) =>
130
+ await this._encodeAndSend(ctx, { author, recipient, reliablePayload }).catch((err) =>
131
131
  log('failed to send message', { err }),
132
132
  );
133
133
  },
@@ -158,7 +158,7 @@ export class Messenger {
158
158
  this._monitor.recordReliableMessage({ sendAttempts, sent: true });
159
159
  });
160
160
 
161
- await this._encodeAndSend({ author, recipient, reliablePayload });
161
+ await this._encodeAndSend(ctx, { author, recipient, reliablePayload });
162
162
  return promise;
163
163
  }
164
164
 
@@ -204,16 +204,19 @@ export class Messenger {
204
204
  };
205
205
  }
206
206
 
207
- private async _encodeAndSend({
208
- 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: {
@@ -6,6 +6,7 @@ import { afterAll, beforeAll, describe, expect, onTestFinished, test } from 'vit
6
6
 
7
7
  import { asyncTimeout, waitForCondition } from '@dxos/async';
8
8
  import { type Any, type TaggedType } from '@dxos/codec-protobuf';
9
+ import { Context } from '@dxos/context';
9
10
  import { PublicKey } from '@dxos/keys';
10
11
  import { log } from '@dxos/log';
11
12
  import { type TYPES } from '@dxos/protocols/proto';
@@ -43,7 +44,7 @@ describe('SignalClient', () => {
43
44
 
44
45
  const message = createMessage(peer2, peer1);
45
46
  const receivedMessage = peer1.waitForNextMessage();
46
- await peer2.client.sendMessage(message);
47
+ await peer2.client.sendMessage(Context.default(), message);
47
48
  expect(await receivedMessage).toEqual(message);
48
49
  });
49
50
 
@@ -51,8 +52,8 @@ describe('SignalClient', () => {
51
52
  const topic = PublicKey.random();
52
53
  const [peer1, peer2] = setupPeers({ peerCount: 2 });
53
54
 
54
- await peer1.client.join({ topic, peer: peer1.peerInfo });
55
- await peer2.client.join({ topic, peer: peer2.peerInfo });
55
+ await peer1.client.join(Context.default(), { topic, peer: peer1.peerInfo });
56
+ await peer2.client.join(Context.default(), { topic, peer: peer2.peerInfo });
56
57
 
57
58
  await peer1.waitForPeer(peer2.peerKey);
58
59
  await peer2.waitForPeer(peer1.peerKey);
@@ -67,7 +68,7 @@ describe('SignalClient', () => {
67
68
  const message = createMessage(peer2, peer1);
68
69
  const receivedMessage = peer1.waitForNextMessage();
69
70
 
70
- await peer1.client.sendMessage(message);
71
+ await peer1.client.sendMessage(Context.default(), message);
71
72
  expect(await receivedMessage).toEqual(message);
72
73
  });
73
74
 
@@ -82,7 +83,7 @@ describe('SignalClient', () => {
82
83
 
83
84
  {
84
85
  const receivedMessage = peer1.waitForNextMessage({ timeout: 1_000 });
85
- await peer2.client.sendMessage(message);
86
+ await peer2.client.sendMessage(Context.default(), message);
86
87
  expect(await receivedMessage).toEqual(message);
87
88
  }
88
89
 
@@ -91,7 +92,7 @@ describe('SignalClient', () => {
91
92
 
92
93
  {
93
94
  const receivedMessage = peer1.waitForNextMessage({ timeout: 200 });
94
- await peer2.client.sendMessage(message);
95
+ await peer2.client.sendMessage(Context.default(), message);
95
96
  await expect(receivedMessage).rejects.toBeDefined();
96
97
  }
97
98
  });
@@ -106,7 +107,7 @@ describe('SignalClient', () => {
106
107
 
107
108
  {
108
109
  const waitMessage = peer1.waitForNextMessage();
109
- await peer2.client.sendMessage(message);
110
+ await peer2.client.sendMessage(Context.default(), message);
110
111
  expect(await waitMessage).toEqual(message);
111
112
  }
112
113
 
@@ -120,7 +121,7 @@ describe('SignalClient', () => {
120
121
 
121
122
  {
122
123
  const waitMessage = peer1.waitForNextMessage();
123
- await peer2.client.sendMessage(message);
124
+ await peer2.client.sendMessage(Context.default(), message);
124
125
  expect(await waitMessage).toEqual(message);
125
126
  }
126
127
  });
@@ -173,24 +173,24 @@ export class SignalClient extends Resource implements SignalClientMethods {
173
173
  };
174
174
  }
175
175
 
176
- async join(args: JoinRequest): Promise<void> {
176
+ async join(_ctx: Context, args: JoinRequest): Promise<void> {
177
177
  log('joining', { topic: args.topic, peerId: args.peer.peerKey });
178
178
  this._monitor.recordJoin();
179
179
  this.localState.join({ topic: args.topic, peerId: PublicKey.from(args.peer.peerKey) });
180
180
  this._reconcileTask?.schedule();
181
181
  }
182
182
 
183
- async leave(args: LeaveRequest): Promise<void> {
183
+ async leave(_ctx: Context, args: LeaveRequest): Promise<void> {
184
184
  log('leaving', { topic: args.topic, peerId: args.peer.peerKey });
185
185
  this._monitor.recordLeave();
186
186
  this.localState.leave({ topic: args.topic, peerId: PublicKey.from(args.peer.peerKey) });
187
187
  }
188
188
 
189
- async query(params: QueryRequest): Promise<SwarmResponse> {
189
+ async query(_ctx: Context, params: QueryRequest): Promise<SwarmResponse> {
190
190
  throw new Error('Not implemented');
191
191
  }
192
192
 
193
- async sendMessage(msg: Message): Promise<void> {
193
+ async sendMessage(_ctx: Context, msg: Message): Promise<void> {
194
194
  return this._monitor.recordMessageSending(msg, async () => {
195
195
  await this._clientReady.wait();
196
196
  invariant(this._state === SignalState.CONNECTED, 'Not connected to Signal Server');
@@ -3,7 +3,7 @@
3
3
  //
4
4
 
5
5
  import { Event, scheduleMicroTask } from '@dxos/async';
6
- import { Resource, cancelWithContext } from '@dxos/context';
6
+ import { type Context, Resource, cancelWithContext } from '@dxos/context';
7
7
  import { type EdgeConnection, EdgeIdentityChangedError, protocol } from '@dxos/edge-client';
8
8
  import { invariant } from '@dxos/invariant';
9
9
  import { PublicKey } from '@dxos/keys';
@@ -60,7 +60,7 @@ export class EdgeSignalManager extends Resource implements SignalManager {
60
60
  /**
61
61
  * Warning: PeerInfo is inferred from edgeConnection.
62
62
  */
63
- async join({ topic, peer }: { topic: PublicKey; peer: PeerInfo }): Promise<void> {
63
+ async join(ctx: Context, { topic, peer }: { topic: PublicKey; peer: PeerInfo }): Promise<void> {
64
64
  if (!this._matchSelfPeerInfo(peer)) {
65
65
  // NOTE: Could only join swarm with the same peer info as the edge connection.
66
66
  log.warn('ignoring peer info on join request', {
@@ -77,6 +77,7 @@ export class EdgeSignalManager extends Resource implements SignalManager {
77
77
 
78
78
  this._swarmPeers.set(topic, { lastState: peer.state, joinedPeers: new ComplexSet<PeerInfo>(PeerInfoHash) });
79
79
  await this._edgeConnection.send(
80
+ ctx,
80
81
  protocol.createMessage(SwarmRequestSchema, {
81
82
  serviceId: EdgeService.SWARM,
82
83
  source: createMessageSource(topic, peer),
@@ -85,10 +86,11 @@ export class EdgeSignalManager extends Resource implements SignalManager {
85
86
  );
86
87
  }
87
88
 
88
- async leave({ topic, peer }: { topic: PublicKey; peer: PeerInfo }): Promise<void> {
89
+ async leave(ctx: Context, { topic, peer }: { topic: PublicKey; peer: PeerInfo }): Promise<void> {
89
90
  this._swarmPeers.delete(topic);
90
91
  try {
91
92
  await this._edgeConnection.send(
93
+ ctx,
92
94
  protocol.createMessage(SwarmRequestSchema, {
93
95
  serviceId: EdgeService.SWARM,
94
96
  source: createMessageSource(topic, peer),
@@ -105,13 +107,14 @@ export class EdgeSignalManager extends Resource implements SignalManager {
105
107
  }
106
108
  }
107
109
 
108
- async query({ topic }: { topic: PublicKey }): Promise<SwarmResponse> {
110
+ async query(ctx: Context, { topic }: { topic: PublicKey }): Promise<SwarmResponse> {
109
111
  const response = cancelWithContext(
110
112
  this._ctx,
111
113
  this.swarmState.waitFor((state) => state.swarmKey === topic.toHex()),
112
114
  );
113
115
 
114
116
  await this._edgeConnection.send(
117
+ ctx,
115
118
  protocol.createMessage(SwarmRequestSchema, {
116
119
  serviceId: EdgeService.SWARM,
117
120
  source: createMessageSource(topic, {
@@ -125,7 +128,7 @@ export class EdgeSignalManager extends Resource implements SignalManager {
125
128
  return response;
126
129
  }
127
130
 
128
- async sendMessage(message: Message): Promise<void> {
131
+ async sendMessage(ctx: Context, message: Message): Promise<void> {
129
132
  if (!this._matchSelfPeerInfo(message.author)) {
130
133
  // NOTE: Could only join swarm with the same peer info as the edge connection.
131
134
  log.warn('ignoring author on send request', {
@@ -135,6 +138,7 @@ export class EdgeSignalManager extends Resource implements SignalManager {
135
138
  }
136
139
 
137
140
  await this._edgeConnection.send(
141
+ ctx,
138
142
  protocol.createMessage(bufWkt.AnySchema, {
139
143
  serviceId: EdgeService.SIGNAL,
140
144
  source: message.author,
@@ -228,7 +232,7 @@ export class EdgeSignalManager extends Resource implements SignalManager {
228
232
  private async _rejoinAllSwarms(): Promise<void> {
229
233
  log('rejoin swarms', { swarms: Array.from(this._swarmPeers.keys()) });
230
234
  for (const [topic, { lastState }] of this._swarmPeers.entries()) {
231
- await this.join({
235
+ await this.join(this._ctx, {
232
236
  topic,
233
237
  peer: {
234
238
  peerKey: this._edgeConnection.peerKey,
@@ -63,7 +63,7 @@ export class MemorySignalManager implements SignalManager {
63
63
  this._ctx = new Context();
64
64
  this._ctx.onDispose(this._context.swarmEvent.on((data) => this.swarmEvent.emit(data)));
65
65
 
66
- await Promise.all([...this._joinedSwarms.values()].map((value) => this.join(value)));
66
+ await Promise.all([...this._joinedSwarms.values()].map((value) => this.join(this._ctx, value)));
67
67
  }
68
68
 
69
69
  async close(): Promise<void> {
@@ -76,7 +76,7 @@ export class MemorySignalManager implements SignalManager {
76
76
  [...this._joinedSwarms.values()],
77
77
  );
78
78
 
79
- await Promise.all([...this._joinedSwarms.values()].map((value) => this.leave(value)));
79
+ await Promise.all([...this._joinedSwarms.values()].map((value) => this.leave(this._ctx, value)));
80
80
 
81
81
  // assign joined swarms back because .leave() deletes it.
82
82
  this._joinedSwarms = joinedSwarmsCopy;
@@ -88,7 +88,7 @@ export class MemorySignalManager implements SignalManager {
88
88
  return [];
89
89
  }
90
90
 
91
- async join({ topic, peer }: { topic: PublicKey; peer: PeerInfo }): Promise<void> {
91
+ async join(_ctx: Context, { topic, peer }: { topic: PublicKey; peer: PeerInfo }): Promise<void> {
92
92
  invariant(!this._ctx.disposed, 'Closed');
93
93
 
94
94
  this._joinedSwarms.add({ topic, peer });
@@ -120,7 +120,7 @@ export class MemorySignalManager implements SignalManager {
120
120
  }
121
121
  }
122
122
 
123
- async leave({ topic, peer }: { topic: PublicKey; peer: PeerInfo }): Promise<void> {
123
+ async leave(_ctx: Context, { topic, peer }: { topic: PublicKey; peer: PeerInfo }): Promise<void> {
124
124
  invariant(!this._ctx.disposed, 'Closed');
125
125
 
126
126
  this._joinedSwarms.delete({ topic, peer });
@@ -141,19 +141,22 @@ export class MemorySignalManager implements SignalManager {
141
141
  this._context.swarmEvent.emit(swarmEvent);
142
142
  }
143
143
 
144
- async query(request: QueryRequest): Promise<SwarmResponse> {
144
+ async query(_ctx: Context, request: QueryRequest): Promise<SwarmResponse> {
145
145
  throw new Error('Not implemented');
146
146
  }
147
147
 
148
- async sendMessage({
149
- author,
150
- recipient,
151
- payload,
152
- }: {
153
- author: PeerInfo;
154
- recipient: PeerInfo;
155
- payload: Any;
156
- }): Promise<void> {
148
+ async sendMessage(
149
+ _ctx: Context,
150
+ {
151
+ author,
152
+ recipient,
153
+ payload,
154
+ }: {
155
+ author: PeerInfo;
156
+ recipient: PeerInfo;
157
+ payload: Any;
158
+ },
159
+ ): Promise<void> {
157
160
  log('send message', { author, recipient, ...dec(payload) });
158
161
 
159
162
  invariant(recipient);
@@ -5,6 +5,7 @@
5
5
  import { afterAll, beforeAll, describe, test } from 'vitest';
6
6
 
7
7
  import { asyncTimeout, sleep } from '@dxos/async';
8
+ import { Context } from '@dxos/context';
8
9
  import { PublicKey } from '@dxos/keys';
9
10
  import { type SignalServerRunner, runTestSignalServer } from '@dxos/signal';
10
11
  import { openAndClose } from '@dxos/test-utils';
@@ -40,9 +41,9 @@ describe.skip('WebSocketSignalManager', () => {
40
41
  const joined21 = expectPeerAvailable(client2, topic, { peerKey: peer1.toHex() });
41
42
  const joined31 = expectPeerAvailable(client3, topic, { peerKey: peer1.toHex() });
42
43
 
43
- await client1.join({ topic, peer: { peerKey: peer1.toHex() } });
44
- await client2.join({ topic, peer: { peerKey: peer2.toHex() } });
45
- await client3.join({ topic, peer: { peerKey: peer3.toHex() } });
44
+ await client1.join(Context.default(), { topic, peer: { peerKey: peer1.toHex() } });
45
+ await client2.join(Context.default(), { topic, peer: { peerKey: peer2.toHex() } });
46
+ await client3.join(Context.default(), { topic, peer: { peerKey: peer3.toHex() } });
46
47
 
47
48
  await Promise.all([joined12, joined13, joined21, joined31]);
48
49
  });
@@ -57,8 +58,8 @@ describe.skip('WebSocketSignalManager', () => {
57
58
  const joined12 = expectPeerAvailable(client1, topic, { peerKey: peer2.toHex() });
58
59
  const joined21 = expectPeerAvailable(client2, topic, { peerKey: peer1.toHex() });
59
60
 
60
- await client1.join({ topic, peer: { peerKey: peer1.toHex() } });
61
- await client2.join({ topic, peer: { peerKey: peer2.toHex() } });
61
+ await client1.join(Context.default(), { topic, peer: { peerKey: peer1.toHex() } });
62
+ await client2.join(Context.default(), { topic, peer: { peerKey: peer2.toHex() } });
62
63
 
63
64
  await asyncTimeout(Promise.all([joined12, joined21]), 1_000);
64
65
 
@@ -67,7 +68,7 @@ describe.skip('WebSocketSignalManager', () => {
67
68
  const received = expectReceivedMessage(client2.onMessage, message);
68
69
  await client2.subscribeMessages({ peerKey: peer2.toHex() });
69
70
  await sleep(50);
70
- await client1.sendMessage(message);
71
+ await client1.sendMessage(Context.default(), message);
71
72
 
72
73
  await asyncTimeout(received, 1_000);
73
74
  });
@@ -82,8 +83,8 @@ describe.skip('WebSocketSignalManager', () => {
82
83
  const joined12 = expectPeerAvailable(client1, topic, { peerKey: peer2.toHex() });
83
84
  const joined21 = expectPeerAvailable(client2, topic, { peerKey: peer1.toHex() });
84
85
 
85
- await client1.join({ topic, peer: { peerKey: peer1.toHex() } });
86
- await client2.join({ topic, peer: { peerKey: peer2.toHex() } });
86
+ await client1.join(Context.default(), { topic, peer: { peerKey: peer1.toHex() } });
87
+ await client2.join(Context.default(), { topic, peer: { peerKey: peer2.toHex() } });
87
88
 
88
89
  await Promise.all([joined12, joined21]);
89
90
  });
@@ -98,15 +99,15 @@ describe.skip('WebSocketSignalManager', () => {
98
99
  const joined112 = expectPeerAvailable(client1, topic1, { peerKey: peer2.toHex() });
99
100
  const joined121 = expectPeerAvailable(client2, topic1, { peerKey: peer1.toHex() });
100
101
 
101
- await client1.join({ topic: topic1, peer: { peerKey: peer1.toHex() } });
102
- await client2.join({ topic: topic1, peer: { peerKey: peer2.toHex() } });
102
+ await client1.join(Context.default(), { topic: topic1, peer: { peerKey: peer1.toHex() } });
103
+ await client2.join(Context.default(), { topic: topic1, peer: { peerKey: peer2.toHex() } });
103
104
  await Promise.all([joined112, joined121]);
104
105
 
105
106
  const joined212 = expectPeerAvailable(client1, topic2, { peerKey: peer2.toHex() });
106
107
  const joined221 = expectPeerAvailable(client2, topic2, { peerKey: peer1.toHex() });
107
108
 
108
- await client1.join({ topic: topic2, peer: { peerKey: peer1.toHex() } });
109
- await client2.join({ topic: topic2, peer: { peerKey: peer2.toHex() } });
109
+ await client1.join(Context.default(), { topic: topic2, peer: { peerKey: peer1.toHex() } });
110
+ await client2.join(Context.default(), { topic: topic2, peer: { peerKey: peer2.toHex() } });
110
111
  await Promise.all([joined212, joined221]);
111
112
  });
112
113
  });
@@ -3,7 +3,7 @@
3
3
  //
4
4
 
5
5
  import { Event, sleep, synchronized } from '@dxos/async';
6
- import { LifecycleState, Resource } from '@dxos/context';
6
+ import { type Context, LifecycleState, Resource } from '@dxos/context';
7
7
  import { invariant } from '@dxos/invariant';
8
8
  import { PublicKey } from '@dxos/keys';
9
9
  import { log } from '@dxos/log';
@@ -105,30 +105,30 @@ export class WebsocketSignalManager extends Resource implements SignalManager {
105
105
  }
106
106
 
107
107
  @synchronized
108
- async join({ topic, peer }: JoinRequest): Promise<void> {
108
+ async join(_ctx: Context, { topic, peer }: JoinRequest): Promise<void> {
109
109
  log('join', { topic, peer });
110
110
  invariant(this._lifecycleState === LifecycleState.OPEN);
111
- await this._forEachServer((server) => server.join({ topic, peer }));
111
+ await this._forEachServer((server) => server.join(_ctx, { topic, peer }));
112
112
  }
113
113
 
114
114
  @synchronized
115
- async leave({ topic, peer }: LeaveRequest): Promise<void> {
115
+ async leave(_ctx: Context, { topic, peer }: LeaveRequest): Promise<void> {
116
116
  log('leaving', { topic, peer });
117
117
  invariant(this._lifecycleState === LifecycleState.OPEN);
118
- await this._forEachServer((server) => server.leave({ topic, peer }));
118
+ await this._forEachServer((server) => server.leave(_ctx, { topic, peer }));
119
119
  }
120
120
 
121
- async query({ topic }: QueryRequest): Promise<SwarmResponse> {
121
+ async query(_ctx: Context, { topic }: QueryRequest): Promise<SwarmResponse> {
122
122
  throw new Error('Not implemented');
123
123
  }
124
124
 
125
- async sendMessage({ author, recipient, payload }: Message): Promise<void> {
125
+ async sendMessage(_ctx: Context, { author, recipient, payload }: Message): Promise<void> {
126
126
  log('signal', { recipient });
127
127
  invariant(this._lifecycleState === LifecycleState.OPEN);
128
128
 
129
129
  void this._forEachServer(async (server, serverName, index) => {
130
130
  void server
131
- .sendMessage({ author, recipient, payload })
131
+ .sendMessage(_ctx, { author, recipient, payload })
132
132
  .then(() => this._clearServerFailedFlag(serverName, index))
133
133
  .catch((err) => {
134
134
  if (err instanceof RateLimitExceededError) {