@dxos/messaging 0.10.0 → 0.11.1

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 (88) hide show
  1. package/dist/lib/chunk-memory-signal-manager.mjs +652 -0
  2. package/dist/lib/chunk-memory-signal-manager.mjs.map +1 -0
  3. package/dist/lib/index.mjs +377 -0
  4. package/dist/lib/index.mjs.map +1 -0
  5. package/dist/lib/testing.mjs +288 -0
  6. package/dist/lib/testing.mjs.map +1 -0
  7. package/dist/types/src/index.d.ts +0 -1
  8. package/dist/types/src/index.d.ts.map +1 -1
  9. package/dist/types/src/messenger.blueprint-test.d.ts.map +1 -1
  10. package/dist/types/src/messenger.d.ts +1 -1
  11. package/dist/types/src/messenger.d.ts.map +1 -1
  12. package/dist/types/src/signal-manager/edge-signal-manager.d.ts +21 -4
  13. package/dist/types/src/signal-manager/edge-signal-manager.d.ts.map +1 -1
  14. package/dist/types/src/signal-manager/edge-signal-manager.test.d.ts +2 -0
  15. package/dist/types/src/signal-manager/edge-signal-manager.test.d.ts.map +1 -0
  16. package/dist/types/src/signal-manager/index.d.ts +1 -2
  17. package/dist/types/src/signal-manager/index.d.ts.map +1 -1
  18. package/dist/types/src/signal-manager/memory-signal-manager.d.ts +12 -10
  19. package/dist/types/src/signal-manager/memory-signal-manager.d.ts.map +1 -1
  20. package/dist/types/src/signal-manager/memory-signal-manager.test.d.ts +2 -0
  21. package/dist/types/src/signal-manager/memory-signal-manager.test.d.ts.map +1 -0
  22. package/dist/types/src/signal-manager/signal-manager.d.ts +5 -0
  23. package/dist/types/src/signal-manager/signal-manager.d.ts.map +1 -1
  24. package/dist/types/src/signal-manager/utils.d.ts +6 -4
  25. package/dist/types/src/signal-manager/utils.d.ts.map +1 -1
  26. package/dist/types/src/signal-methods.d.ts +33 -22
  27. package/dist/types/src/signal-methods.d.ts.map +1 -1
  28. package/dist/types/src/testing/index.d.ts +1 -0
  29. package/dist/types/src/testing/index.d.ts.map +1 -1
  30. package/dist/types/src/testing/test-edge-mesh.d.ts +61 -0
  31. package/dist/types/src/testing/test-edge-mesh.d.ts.map +1 -0
  32. package/dist/types/tsconfig.tsbuildinfo +1 -1
  33. package/package.json +19 -19
  34. package/src/index.ts +0 -1
  35. package/src/messenger.blueprint-test.ts +0 -25
  36. package/src/messenger.node.test.ts +1 -1
  37. package/src/messenger.ts +42 -18
  38. package/src/signal-manager/edge-signal-manager.test.ts +193 -0
  39. package/src/signal-manager/edge-signal-manager.ts +145 -12
  40. package/src/signal-manager/index.ts +1 -2
  41. package/src/signal-manager/memory-signal-manager.test.ts +199 -0
  42. package/src/signal-manager/memory-signal-manager.ts +87 -47
  43. package/src/signal-manager/signal-manager.ts +7 -0
  44. package/src/signal-manager/utils.ts +30 -21
  45. package/src/signal-methods.ts +37 -26
  46. package/src/testing/index.ts +1 -0
  47. package/src/testing/test-edge-mesh.ts +196 -0
  48. package/src/testing/utils.ts +2 -2
  49. package/dist/lib/neutral/chunk-EC4H56J5.mjs +0 -497
  50. package/dist/lib/neutral/chunk-EC4H56J5.mjs.map +0 -7
  51. package/dist/lib/neutral/index.mjs +0 -1249
  52. package/dist/lib/neutral/index.mjs.map +0 -7
  53. package/dist/lib/neutral/meta.json +0 -1
  54. package/dist/lib/neutral/testing/index.mjs +0 -155
  55. package/dist/lib/neutral/testing/index.mjs.map +0 -7
  56. package/dist/types/src/signal-client/index.d.ts +0 -2
  57. package/dist/types/src/signal-client/index.d.ts.map +0 -1
  58. package/dist/types/src/signal-client/signal-client-monitor.d.ts +0 -30
  59. package/dist/types/src/signal-client/signal-client-monitor.d.ts.map +0 -1
  60. package/dist/types/src/signal-client/signal-client.d.ts +0 -59
  61. package/dist/types/src/signal-client/signal-client.d.ts.map +0 -1
  62. package/dist/types/src/signal-client/signal-client.node.test.d.ts +0 -2
  63. package/dist/types/src/signal-client/signal-client.node.test.d.ts.map +0 -1
  64. package/dist/types/src/signal-client/signal-local-state.d.ts +0 -38
  65. package/dist/types/src/signal-client/signal-local-state.d.ts.map +0 -1
  66. package/dist/types/src/signal-client/signal-rpc-client-monitor.d.ts +0 -6
  67. package/dist/types/src/signal-client/signal-rpc-client-monitor.d.ts.map +0 -1
  68. package/dist/types/src/signal-client/signal-rpc-client.d.ts +0 -47
  69. package/dist/types/src/signal-client/signal-rpc-client.d.ts.map +0 -1
  70. package/dist/types/src/signal-client/signal-rpc-client.node.test.d.ts +0 -2
  71. package/dist/types/src/signal-client/signal-rpc-client.node.test.d.ts.map +0 -1
  72. package/dist/types/src/signal-manager/websocket-signal-manager-monitor.d.ts +0 -8
  73. package/dist/types/src/signal-manager/websocket-signal-manager-monitor.d.ts.map +0 -1
  74. package/dist/types/src/signal-manager/websocket-signal-manager.d.ts +0 -41
  75. package/dist/types/src/signal-manager/websocket-signal-manager.d.ts.map +0 -1
  76. package/dist/types/src/signal-manager/websocket-signal-manager.node.test.d.ts +0 -2
  77. package/dist/types/src/signal-manager/websocket-signal-manager.node.test.d.ts.map +0 -1
  78. package/src/signal-client/index.ts +0 -5
  79. package/src/signal-client/signal-client-monitor.ts +0 -111
  80. package/src/signal-client/signal-client.node.test.ts +0 -185
  81. package/src/signal-client/signal-client.ts +0 -339
  82. package/src/signal-client/signal-local-state.ts +0 -174
  83. package/src/signal-client/signal-rpc-client-monitor.ts +0 -15
  84. package/src/signal-client/signal-rpc-client.node.test.ts +0 -102
  85. package/src/signal-client/signal-rpc-client.ts +0 -227
  86. package/src/signal-manager/websocket-signal-manager-monitor.ts +0 -20
  87. package/src/signal-manager/websocket-signal-manager.node.test.ts +0 -112
  88. package/src/signal-manager/websocket-signal-manager.ts +0 -188
@@ -0,0 +1,288 @@
1
+ import { i as Messenger, n as MemorySignalManagerContext, t as MemorySignalManager } from "./chunk-memory-signal-manager.mjs";
2
+ import { Event, asyncTimeout } from "@dxos/async";
3
+ import { Resource } from "@dxos/context";
4
+ import { invariant } from "@dxos/invariant";
5
+ import { PublicKey } from "@dxos/keys";
6
+ import { log } from "@dxos/log";
7
+ import { EdgeService } from "@dxos/protocols";
8
+ import { PeerSchema, protocol } from "@dxos/edge-client";
9
+ import { buf } from "@dxos/protocols/buf";
10
+ import { SwarmRequestSchema, SwarmRequest_Action } from "@dxos/protocols/buf/dxos/edge/messenger_pb";
11
+ import { createDidFromIdentityKey } from "@dxos/credentials";
12
+ //#region src/testing/test-messages.ts
13
+ var PAYLOAD_1 = {
14
+ "@type": "google.protobuf.Any",
15
+ "type_url": "dxos.Example1",
16
+ "value": Buffer.from("1")
17
+ };
18
+ var PAYLOAD_2 = {
19
+ "@type": "google.protobuf.Any",
20
+ "type_url": "dxos.Example2",
21
+ "value": Buffer.from("2")
22
+ };
23
+ var PAYLOAD_3 = {
24
+ "@type": "google.protobuf.Any",
25
+ "type_url": "dxos.Example3",
26
+ "value": Buffer.from("3")
27
+ };
28
+ //#endregion
29
+ //#region src/testing/utils.ts
30
+ var expectPeerAvailable = (client, expectedTopic, peer) => asyncTimeout(client.swarmEvent.waitFor(({ peerAvailable, topic }) => !!peerAvailable && peer.peerKey === peerAvailable.peer.peerKey && expectedTopic.equals(topic)), 6e3);
31
+ var expectPeerLeft = (client, expectedTopic, peer) => asyncTimeout(client.swarmEvent.waitFor(({ peerLeft, topic }) => !!peerLeft && peer.peerKey === peerLeft.peer.peerKey && expectedTopic.equals(topic)), 6e3);
32
+ var expectReceivedMessage = (event, expectedMessage) => {
33
+ return asyncTimeout(event.waitFor((msg) => msg.author.peerKey === expectedMessage.author.peerKey && msg.recipient?.peerKey === expectedMessage.recipient?.peerKey && PublicKey.from(msg.payload.value).equals(expectedMessage.payload.value)), 5e3);
34
+ };
35
+ var createMessage = (author, recipient, payload = PAYLOAD_1) => ({
36
+ author,
37
+ recipient,
38
+ payload
39
+ });
40
+ var messageEqual = (msg1, msg2) => msg1.author.peerKey === msg2.author.peerKey && msg1.recipient?.peerKey === msg2.recipient?.peerKey && PublicKey.from(msg1.payload.value).equals(msg2.payload.value);
41
+ //#endregion
42
+ //#region src/testing/test-peer.ts
43
+ var __dxlog_file = "/__w/dxos/dxos/packages/core/mesh/messaging/src/testing/test-peer.ts";
44
+ var TestPeer = class extends Resource {
45
+ testBuilder;
46
+ /**
47
+ * Undefined until `_open()`: a `createSignalManager` factory (e.g. edge's) may install its own
48
+ * signer-backed key, otherwise a random one is generated. Read via {@link peerInfo} after opening.
49
+ */
50
+ peerId;
51
+ signalManager;
52
+ messenger;
53
+ defaultReceived = new Event();
54
+ /** DID derived from {@link peerId} in `_open()`, mirroring `createDeviceEdgeIdentity`. */
55
+ _identityDid;
56
+ constructor(testBuilder) {
57
+ super();
58
+ this.testBuilder = testBuilder;
59
+ }
60
+ get peerInfo() {
61
+ invariant(this.peerId && this._identityDid, "TestPeer not open", {
62
+ "~LogMeta": "~LogMeta",
63
+ F: __dxlog_file,
64
+ L: 38,
65
+ S: this,
66
+ A: ["this.peerId && this._identityDid", "'TestPeer not open'"]
67
+ });
68
+ return buf.create(PeerSchema, {
69
+ peerKey: this.peerId.toHex(),
70
+ identityDid: this._identityDid
71
+ });
72
+ }
73
+ async waitTillReceive(message) {
74
+ return expectReceivedMessage(this.defaultReceived, message);
75
+ }
76
+ async waitForPeerAvailable(topic, peer) {
77
+ return expectPeerAvailable(this.signalManager, topic, peer);
78
+ }
79
+ async waitForPeerLeft(topic, peer) {
80
+ return expectPeerLeft(this.signalManager, topic, peer);
81
+ }
82
+ async _open() {
83
+ this.signalManager = await this.testBuilder.createSignalManager(this);
84
+ this.peerId ??= PublicKey.random();
85
+ this._identityDid = await createDidFromIdentityKey(this.peerId);
86
+ this.messenger = new Messenger({
87
+ signalManager: this.signalManager,
88
+ retryDelay: 300
89
+ });
90
+ await this.signalManager.open();
91
+ this.messenger.open();
92
+ await this.messenger.listen({
93
+ peer: this.peerInfo,
94
+ onMessage: async (msg) => {
95
+ this.defaultReceived.emit(msg);
96
+ }
97
+ }).catch((err) => log.catch(err, void 0, {
98
+ "~LogMeta": "~LogMeta",
99
+ F: __dxlog_file,
100
+ L: 71,
101
+ S: this
102
+ }));
103
+ }
104
+ async _close() {
105
+ await this.messenger.close();
106
+ await this.signalManager.close();
107
+ }
108
+ };
109
+ //#endregion
110
+ //#region src/testing/test-builder.ts
111
+ var TestBuilder = class {
112
+ options;
113
+ _signalContext = new MemorySignalManagerContext();
114
+ _peers = [];
115
+ constructor(options) {
116
+ this.options = options;
117
+ }
118
+ async createSignalManager(peer) {
119
+ const signalManager = await this.options.signalManagerFactory?.(peer) ?? new MemorySignalManager(this._signalContext);
120
+ if (this.options.messageDisruption) {
121
+ const trueSend = signalManager.sendMessage.bind(signalManager);
122
+ signalManager.sendMessage = async (ctx, message) => {
123
+ for (const msg of this.options.messageDisruption(message)) await trueSend(ctx, msg);
124
+ };
125
+ }
126
+ return signalManager;
127
+ }
128
+ async createPeer() {
129
+ const peer = new TestPeer(this);
130
+ await peer.open();
131
+ this._peers.push(peer);
132
+ return peer;
133
+ }
134
+ async createPeers(count) {
135
+ return Promise.all(Array.from({ length: count }, () => this.createPeer()));
136
+ }
137
+ async close() {
138
+ await Promise.all(this._peers.map((peer) => peer.close()));
139
+ }
140
+ };
141
+ //#endregion
142
+ //#region src/testing/test-edge-mesh.ts
143
+ /**
144
+ * In-memory stand-in for the EDGE router + swarm, feature-complete for the messaging paths
145
+ * {@link EdgeSignalManager} exercises: swarm membership (JOIN/LEAVE), tag subscriptions (SUBSCRIBE),
146
+ * point-to-point relay, and tag broadcast fan-out (DX-1125). Multiple {@link TestEdgeConnection}s
147
+ * attach to one mesh, so a broadcast from one client is delivered to the matching subscribers of
148
+ * another — mirroring the real edge without a WebSocket or Durable Object.
149
+ */
150
+ var TestEdgeMesh = class {
151
+ /** peerKey -> connection. */
152
+ _connections = /* @__PURE__ */ new Map();
153
+ /** swarmKey -> (peerKey -> subscription tags). */
154
+ _subscriptions = /* @__PURE__ */ new Map();
155
+ /** swarmKey -> set of member peerKeys. */
156
+ _members = /* @__PURE__ */ new Map();
157
+ createConnection({ peerKey, identityDid }) {
158
+ const connection = new TestEdgeConnection({
159
+ peerKey,
160
+ identityDid,
161
+ mesh: this
162
+ });
163
+ this._connections.set(peerKey, connection);
164
+ return connection;
165
+ }
166
+ removeConnection(peerKey) {
167
+ this._connections.delete(peerKey);
168
+ for (const members of this._members.values()) members.delete(peerKey);
169
+ for (const subs of this._subscriptions.values()) subs.delete(peerKey);
170
+ }
171
+ /** Handle a message sent by a client connection. */
172
+ receive(fromPeerKey, message) {
173
+ switch (message.serviceId) {
174
+ case EdgeService.SWARM:
175
+ this._handleSwarmRequest(fromPeerKey, message);
176
+ break;
177
+ case EdgeService.SIGNAL:
178
+ this._handleSignal(fromPeerKey, message);
179
+ break;
180
+ }
181
+ }
182
+ _handleSwarmRequest(fromPeerKey, message) {
183
+ const request = protocol.getPayload(message, SwarmRequestSchema);
184
+ const swarmKeys = request.swarmKeys ?? [];
185
+ switch (request.action) {
186
+ case SwarmRequest_Action.JOIN:
187
+ for (const swarmKey of swarmKeys) this._memberSet(swarmKey).add(fromPeerKey);
188
+ break;
189
+ case SwarmRequest_Action.LEAVE:
190
+ for (const swarmKey of swarmKeys) {
191
+ this._memberSet(swarmKey).delete(fromPeerKey);
192
+ this._subscriptionMap(swarmKey).delete(fromPeerKey);
193
+ }
194
+ break;
195
+ case SwarmRequest_Action.SUBSCRIBE:
196
+ for (const swarmKey of swarmKeys) this._subscriptionMap(swarmKey).set(fromPeerKey, request.subscribeTags ?? []);
197
+ break;
198
+ }
199
+ }
200
+ _handleSignal(fromPeerKey, message) {
201
+ const tags = message.tags ?? [];
202
+ const targets = message.target ?? [];
203
+ if (tags.length > 0 && targets.length === 0) {
204
+ const swarmKey = message.source?.swarmKey;
205
+ if (!swarmKey) return;
206
+ for (const [peerKey, subscriptionTags] of this._subscriptionMap(swarmKey)) {
207
+ if (peerKey === fromPeerKey) continue;
208
+ if (subscriptionTags.some((tag) => tags.includes(tag))) this._connections.get(peerKey)?.deliver(message);
209
+ }
210
+ return;
211
+ }
212
+ for (const target of targets) if (target.peerKey) this._connections.get(target.peerKey)?.deliver(message);
213
+ }
214
+ _memberSet(swarmKey) {
215
+ let set = this._members.get(swarmKey);
216
+ if (!set) {
217
+ set = /* @__PURE__ */ new Set();
218
+ this._members.set(swarmKey, set);
219
+ }
220
+ return set;
221
+ }
222
+ _subscriptionMap(swarmKey) {
223
+ let map = this._subscriptions.get(swarmKey);
224
+ if (!map) {
225
+ map = /* @__PURE__ */ new Map();
226
+ this._subscriptions.set(swarmKey, map);
227
+ }
228
+ return map;
229
+ }
230
+ };
231
+ /**
232
+ * In-memory {@link EdgeConnection} bound to a {@link TestEdgeMesh}. Only the members
233
+ * {@link EdgeSignalManager} uses are functional; the rest are inert stubs.
234
+ */
235
+ var TestEdgeConnection = class {
236
+ statusChanged = new Event();
237
+ _messageListeners = /* @__PURE__ */ new Set();
238
+ _peerKey;
239
+ _identityDid;
240
+ _mesh;
241
+ constructor({ peerKey, identityDid, mesh }) {
242
+ this._peerKey = peerKey;
243
+ this._identityDid = identityDid;
244
+ this._mesh = mesh;
245
+ }
246
+ get info() {
247
+ return {
248
+ peerKey: this._peerKey,
249
+ identityDid: this._identityDid
250
+ };
251
+ }
252
+ get identityDid() {
253
+ return this._identityDid;
254
+ }
255
+ get peerKey() {
256
+ return this._peerKey;
257
+ }
258
+ get isOpen() {
259
+ return true;
260
+ }
261
+ get status() {
262
+ return {};
263
+ }
264
+ setIdentity() {}
265
+ async send(_ctx, message) {
266
+ this._mesh.receive(this._peerKey, message);
267
+ }
268
+ onMessage(listener) {
269
+ this._messageListeners.add(listener);
270
+ return () => this._messageListeners.delete(listener);
271
+ }
272
+ onReconnected(listener, opts) {
273
+ if (opts?.emitCurrentState !== false) listener();
274
+ return () => {};
275
+ }
276
+ /** Deliver a message from the mesh to this connection's listeners. */
277
+ deliver(message) {
278
+ for (const listener of this._messageListeners) listener(message);
279
+ }
280
+ async open() {}
281
+ async close() {
282
+ this._mesh.removeConnection(this._peerKey);
283
+ }
284
+ };
285
+ //#endregion
286
+ export { PAYLOAD_1, PAYLOAD_2, PAYLOAD_3, TestBuilder, TestEdgeConnection, TestEdgeMesh, TestPeer, createMessage, expectPeerAvailable, expectPeerLeft, expectReceivedMessage, messageEqual };
287
+
288
+ //# sourceMappingURL=testing.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.mjs","names":[],"sources":["../../src/testing/test-messages.ts","../../src/testing/utils.ts","../../src/testing/test-peer.ts","../../src/testing/test-builder.ts","../../src/testing/test-edge-mesh.ts"],"sourcesContent":["//\n// Copyright 2022 DXOS.org\n//\n\nimport { type TaggedType } from '@dxos/codec-protobuf';\nimport { type TYPES } from '@dxos/protocols/proto';\n\nexport const PAYLOAD_1: TaggedType<TYPES, 'google.protobuf.Any'> = {\n '@type': 'google.protobuf.Any',\n 'type_url': 'dxos.Example1',\n 'value': Buffer.from('1'),\n};\n\nexport const PAYLOAD_2: TaggedType<TYPES, 'google.protobuf.Any'> = {\n '@type': 'google.protobuf.Any',\n 'type_url': 'dxos.Example2',\n 'value': Buffer.from('2'),\n};\n\nexport const PAYLOAD_3: TaggedType<TYPES, 'google.protobuf.Any'> = {\n '@type': 'google.protobuf.Any',\n 'type_url': 'dxos.Example3',\n 'value': Buffer.from('3'),\n};\n","//\n// Copyright 2022 DXOS.org\n//\n\nimport { type Event, asyncTimeout } from '@dxos/async';\nimport { type Any } from '@dxos/codec-protobuf';\nimport { PublicKey } from '@dxos/keys';\n\nimport { type Message, type PeerInfo, type SignalMethods } from '../signal-methods';\nimport { PAYLOAD_1 } from './test-messages';\n\nexport const expectPeerAvailable = (client: SignalMethods, expectedTopic: PublicKey, peer: PeerInfo) =>\n asyncTimeout(\n client.swarmEvent.waitFor(\n ({ peerAvailable, topic }) =>\n !!peerAvailable && peer.peerKey === peerAvailable.peer.peerKey && expectedTopic.equals(topic),\n ),\n 6000,\n );\n\nexport const expectPeerLeft = (client: SignalMethods, expectedTopic: PublicKey, peer: PeerInfo) =>\n asyncTimeout(\n client.swarmEvent.waitFor(\n ({ peerLeft, topic }) => !!peerLeft && peer.peerKey === peerLeft.peer.peerKey && expectedTopic.equals(topic),\n ),\n 6000,\n );\n\nexport const expectReceivedMessage = (event: Event<Message>, expectedMessage: Message) => {\n return asyncTimeout(\n event.waitFor(\n (msg) =>\n msg.author.peerKey === expectedMessage.author.peerKey &&\n msg.recipient?.peerKey === expectedMessage.recipient?.peerKey &&\n PublicKey.from(msg.payload.value).equals(expectedMessage.payload.value),\n ),\n 5000,\n );\n};\n\nexport const createMessage = (author: PeerInfo, recipient: PeerInfo, payload: Any = PAYLOAD_1): Message => ({\n author,\n recipient,\n payload,\n});\n\nexport const messageEqual = (msg1: Message, msg2: Message) =>\n msg1.author.peerKey === msg2.author.peerKey &&\n msg1.recipient?.peerKey === msg2.recipient?.peerKey &&\n PublicKey.from(msg1.payload.value).equals(msg2.payload.value);\n","//\n// Copyright 2022 DXOS.org\n//\n\nimport { Event } from '@dxos/async';\nimport { Resource } from '@dxos/context';\nimport { createDidFromIdentityKey } from '@dxos/credentials';\nimport { PeerSchema } from '@dxos/edge-client';\nimport { invariant } from '@dxos/invariant';\nimport { type IdentityDid, PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { buf } from '@dxos/protocols/buf';\n\nimport { Messenger } from '../messenger';\nimport { type SignalManager } from '../signal-manager';\nimport { type Message, type PeerInfo } from '../signal-methods';\nimport { type TestBuilder } from './test-builder';\nimport { expectPeerAvailable, expectPeerLeft, expectReceivedMessage } from './utils';\n\nexport class TestPeer extends Resource {\n /**\n * Undefined until `_open()`: a `createSignalManager` factory (e.g. edge's) may install its own\n * signer-backed key, otherwise a random one is generated. Read via {@link peerInfo} after opening.\n */\n public peerId?: PublicKey;\n public signalManager!: SignalManager;\n public messenger!: Messenger;\n public defaultReceived = new Event<Message>();\n\n /** DID derived from {@link peerId} in `_open()`, mirroring `createDeviceEdgeIdentity`. */\n private _identityDid?: IdentityDid;\n\n constructor(private readonly testBuilder: TestBuilder) {\n super();\n }\n\n get peerInfo(): PeerInfo {\n invariant(this.peerId && this._identityDid, 'TestPeer not open');\n return buf.create(PeerSchema, { peerKey: this.peerId.toHex(), identityDid: this._identityDid });\n }\n\n async waitTillReceive(message: Message): Promise<Message> {\n return expectReceivedMessage(this.defaultReceived, message);\n }\n\n async waitForPeerAvailable(topic: PublicKey, peer: PeerInfo) {\n return expectPeerAvailable(this.signalManager, topic, peer);\n }\n\n async waitForPeerLeft(topic: PublicKey, peer: PeerInfo) {\n return expectPeerLeft(this.signalManager, topic, peer);\n }\n\n protected override async _open(): Promise<void> {\n // `createSignalManager` (e.g. edge's factory) may populate `peerId` with its own signer-backed\n // key; otherwise fall back to a random one. Derive the DID only after `peerId` is settled.\n this.signalManager = await this.testBuilder.createSignalManager(this);\n this.peerId ??= PublicKey.random();\n this._identityDid = await createDidFromIdentityKey(this.peerId);\n this.messenger = new Messenger({ signalManager: this.signalManager, retryDelay: 300 });\n\n await this.signalManager.open();\n this.messenger.open();\n await this.messenger\n .listen({\n peer: this.peerInfo,\n onMessage: async (msg) => {\n this.defaultReceived.emit(msg);\n },\n })\n .catch((err) => log.catch(err));\n }\n\n protected override async _close(): Promise<void> {\n await this.messenger.close();\n await this.signalManager.close();\n }\n}\n","//\n// Copyright 2022 DXOS.org\n//\n\nimport { type Context } from '@dxos/context';\n\nimport { MemorySignalManager, MemorySignalManagerContext, type SignalManager } from '../signal-manager';\nimport { type Message } from '../signal-methods';\nimport { TestPeer } from './test-peer';\n\nexport type TestBuilderOptions = {\n signalManagerFactory?: (peer: TestPeer) => Promise<SignalManager>;\n messageDisruption?: (msg: Message) => Message[];\n};\n\nexport class TestBuilder {\n private _signalContext = new MemorySignalManagerContext();\n private readonly _peers: TestPeer[] = [];\n\n constructor(public options: TestBuilderOptions) {}\n\n async createSignalManager(peer: TestPeer): Promise<SignalManager> {\n const signalManager =\n (await this.options.signalManagerFactory?.(peer)) ?? new MemorySignalManager(this._signalContext);\n\n if (this.options.messageDisruption) {\n // Imitates signal network disruptions (e. g. message doubling, ).\n const trueSend = signalManager.sendMessage.bind(signalManager);\n signalManager.sendMessage = async (ctx: Context, message: Message) => {\n for (const msg of this.options.messageDisruption!(message)) {\n await trueSend(ctx, msg);\n }\n };\n }\n\n return signalManager;\n }\n\n async createPeer(): Promise<TestPeer> {\n const peer = new TestPeer(this);\n await peer.open();\n this._peers.push(peer);\n return peer;\n }\n\n async createPeers(count: number): Promise<TestPeer[]> {\n return Promise.all(Array.from({ length: count }, () => this.createPeer()));\n }\n\n async close(): Promise<void> {\n await Promise.all(this._peers.map((peer) => peer.close()));\n }\n}\n","//\n// Copyright 2026 DXOS.org\n//\n\nimport { Event } from '@dxos/async';\nimport { type Context } from '@dxos/context';\nimport { type EdgeConnection, protocol } from '@dxos/edge-client';\nimport { EdgeService } from '@dxos/protocols';\nimport {\n type Message,\n SwarmRequest_Action as SwarmRequestAction,\n SwarmRequestSchema,\n} from '@dxos/protocols/buf/dxos/edge/messenger_pb';\n\n/**\n * In-memory stand-in for the EDGE router + swarm, feature-complete for the messaging paths\n * {@link EdgeSignalManager} exercises: swarm membership (JOIN/LEAVE), tag subscriptions (SUBSCRIBE),\n * point-to-point relay, and tag broadcast fan-out (DX-1125). Multiple {@link TestEdgeConnection}s\n * attach to one mesh, so a broadcast from one client is delivered to the matching subscribers of\n * another — mirroring the real edge without a WebSocket or Durable Object.\n */\nexport class TestEdgeMesh {\n /** peerKey -> connection. */\n private readonly _connections = new Map<string, TestEdgeConnection>();\n /** swarmKey -> (peerKey -> subscription tags). */\n private readonly _subscriptions = new Map<string, Map<string, string[]>>();\n /** swarmKey -> set of member peerKeys. */\n private readonly _members = new Map<string, Set<string>>();\n\n createConnection({ peerKey, identityDid }: { peerKey: string; identityDid: string }): TestEdgeConnection {\n const connection = new TestEdgeConnection({ peerKey, identityDid, mesh: this });\n this._connections.set(peerKey, connection);\n return connection;\n }\n\n removeConnection(peerKey: string): void {\n this._connections.delete(peerKey);\n for (const members of this._members.values()) {\n members.delete(peerKey);\n }\n for (const subs of this._subscriptions.values()) {\n subs.delete(peerKey);\n }\n }\n\n /** Handle a message sent by a client connection. */\n receive(fromPeerKey: string, message: Message): void {\n switch (message.serviceId) {\n case EdgeService.SWARM:\n this._handleSwarmRequest(fromPeerKey, message);\n break;\n case EdgeService.SIGNAL:\n this._handleSignal(fromPeerKey, message);\n break;\n }\n }\n\n private _handleSwarmRequest(fromPeerKey: string, message: Message): void {\n const request = protocol.getPayload(message, SwarmRequestSchema);\n const swarmKeys = request.swarmKeys ?? [];\n switch (request.action) {\n case SwarmRequestAction.JOIN:\n for (const swarmKey of swarmKeys) {\n this._memberSet(swarmKey).add(fromPeerKey);\n }\n break;\n case SwarmRequestAction.LEAVE:\n for (const swarmKey of swarmKeys) {\n this._memberSet(swarmKey).delete(fromPeerKey);\n this._subscriptionMap(swarmKey).delete(fromPeerKey);\n }\n break;\n case SwarmRequestAction.SUBSCRIBE:\n // Set/replace this peer's broadcast subscription on each named swarm (DX-1125).\n for (const swarmKey of swarmKeys) {\n this._subscriptionMap(swarmKey).set(fromPeerKey, request.subscribeTags ?? []);\n }\n break;\n }\n }\n\n private _handleSignal(fromPeerKey: string, message: Message): void {\n const tags = message.tags ?? [];\n const targets = message.target ?? [];\n\n // Broadcast (DX-1125): tags present, no target -> fan out to matching subscribers on the swarm.\n if (tags.length > 0 && targets.length === 0) {\n const swarmKey = message.source?.swarmKey;\n if (!swarmKey) {\n return;\n }\n for (const [peerKey, subscriptionTags] of this._subscriptionMap(swarmKey)) {\n if (peerKey === fromPeerKey) {\n continue; // No self-delivery.\n }\n if (subscriptionTags.some((tag) => tags.includes(tag))) {\n this._connections.get(peerKey)?.deliver(message);\n }\n }\n return;\n }\n\n // Point-to-point relay.\n for (const target of targets) {\n if (target.peerKey) {\n this._connections.get(target.peerKey)?.deliver(message);\n }\n }\n }\n\n private _memberSet(swarmKey: string): Set<string> {\n let set = this._members.get(swarmKey);\n if (!set) {\n set = new Set();\n this._members.set(swarmKey, set);\n }\n return set;\n }\n\n private _subscriptionMap(swarmKey: string): Map<string, string[]> {\n let map = this._subscriptions.get(swarmKey);\n if (!map) {\n map = new Map();\n this._subscriptions.set(swarmKey, map);\n }\n return map;\n }\n}\n\n/**\n * In-memory {@link EdgeConnection} bound to a {@link TestEdgeMesh}. Only the members\n * {@link EdgeSignalManager} uses are functional; the rest are inert stubs.\n */\nexport class TestEdgeConnection implements EdgeConnection {\n public readonly statusChanged: EdgeConnection['statusChanged'] = new Event<any>();\n private readonly _messageListeners = new Set<(message: Message) => void>();\n private readonly _peerKey: string;\n private readonly _identityDid: string;\n private readonly _mesh: TestEdgeMesh;\n\n constructor({ peerKey, identityDid, mesh }: { peerKey: string; identityDid: string; mesh: TestEdgeMesh }) {\n this._peerKey = peerKey;\n this._identityDid = identityDid;\n this._mesh = mesh;\n }\n\n get info(): any {\n return { peerKey: this._peerKey, identityDid: this._identityDid };\n }\n\n get identityDid(): string {\n return this._identityDid;\n }\n\n get peerKey(): string {\n return this._peerKey;\n }\n\n get isOpen(): boolean {\n return true;\n }\n\n get status(): EdgeConnection['status'] {\n return {} as EdgeConnection['status'];\n }\n\n setIdentity(): void {}\n\n async send(_ctx: Context, message: Message): Promise<void> {\n this._mesh.receive(this._peerKey, message);\n }\n\n onMessage(listener: (message: Message) => void): () => void {\n this._messageListeners.add(listener);\n return () => this._messageListeners.delete(listener);\n }\n\n onReconnected(listener: () => void, opts?: { emitCurrentState?: boolean }): () => void {\n if (opts?.emitCurrentState !== false) {\n listener();\n }\n return () => {};\n }\n\n /** Deliver a message from the mesh to this connection's listeners. */\n deliver(message: Message): void {\n for (const listener of this._messageListeners) {\n listener(message);\n }\n }\n\n async open(): Promise<void> {}\n async close(): Promise<void> {\n this._mesh.removeConnection(this._peerKey);\n }\n}\n"],"mappings":"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"}
@@ -1,5 +1,4 @@
1
1
  export * from './messenger';
2
- export * from './signal-client';
3
2
  export * from './signal-manager';
4
3
  export * from './signal-methods';
5
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAIA,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAIA,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"messenger.blueprint-test.d.ts","sourceRoot":"","sources":["../../../src/messenger.blueprint-test.ts"],"names":[],"mappings":"AAYA,OAAO,EAAmC,WAAW,EAAgB,MAAM,WAAW,CAAC;AAEvF,eAAO,MAAM,cAAc,yBAA0B,WAAW,CAAC,qBAAqB,CAAC,SAoUtF,CAAC"}
1
+ {"version":3,"file":"messenger.blueprint-test.d.ts","sourceRoot":"","sources":["../../../src/messenger.blueprint-test.ts"],"names":[],"mappings":"AAUA,OAAO,EAAmC,WAAW,EAAgB,MAAM,WAAW,CAAC;AAEvF,eAAO,MAAM,cAAc,yBAA0B,WAAW,CAAC,qBAAqB,CAAC,SA6StF,CAAC"}
@@ -26,7 +26,7 @@ export declare class Messenger {
26
26
  constructor({ signalManager, retryDelay }: MessengerOptions);
27
27
  open(): void;
28
28
  close(): Promise<void>;
29
- sendMessage(ctx: Context, { author, recipient, payload }: Message): Promise<void>;
29
+ sendMessage(ctx: Context, message: Message): Promise<void>;
30
30
  /**
31
31
  * Subscribes onMessage function to messages that contains payload with payloadType.
32
32
  * @param payloadType if not specified, onMessage will be subscribed to all types of messages.
@@ -1 +1 @@
1
- {"version":3,"file":"messenger.d.ts","sourceRoot":"","sources":["../../../src/messenger.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAUxC,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG/D,MAAM,MAAM,SAAS,GAAG,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAE3D,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,aAAa,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAOD;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA0B;IACnD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;IAE/C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAEzB;IAGF,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAqC;IAEvE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAyD;IAEzF,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA6C;IAE/E;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6C;IAEtE,OAAO,CAAC,IAAI,CAAW;IACvB,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IAErC,YAAY,EAAE,aAAa,EAAE,UAAiB,EAAE,EAAE,gBAAgB,EAKjE;IAED,IAAI,IAAI,IAAI,CA0BX;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAM3B;IAEK,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA2DtF;IAED;;;OAGG;IACG,MAAM,CAAC,EACX,IAAI,EACJ,WAAW,EACX,SAAS,EACV,EAAE;QACD,IAAI,EAAE,QAAQ,CAAC;QACf,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,SAAS,CAAC;KACtB,GAAG,OAAO,CAAC,eAAe,CAAC,CA4B3B;YAEa,cAAc;YAsBd,cAAc;YAad,sBAAsB;YA+BtB,sBAAsB;YAKtB,oBAAoB;YAwBpB,cAAc;IAwB5B,OAAO,CAAC,UAAU;CAgBnB;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAClC"}
1
+ {"version":3,"file":"messenger.d.ts","sourceRoot":"","sources":["../../../src/messenger.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAUxC,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG/D,MAAM,MAAM,SAAS,GAAG,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAE3D,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,aAAa,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAOD;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA0B;IACnD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;IAE/C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAEzB;IAGF,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAqC;IAEvE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAyD;IAEzF,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA6C;IAE/E;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6C;IAEtE,OAAO,CAAC,IAAI,CAAW;IACvB,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IAErC,YAAY,EAAE,aAAa,EAAE,UAAiB,EAAE,EAAE,gBAAgB,EAKjE;IAED,IAAI,IAAI,IAAI,CAoBX;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAU3B;IAEK,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA8D/D;IAED;;;OAGG;IACG,MAAM,CAAC,EACX,IAAI,EACJ,WAAW,EACX,SAAS,EACV,EAAE;QACD,IAAI,EAAE,QAAQ,CAAC;QACf,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,SAAS,CAAC;KACtB,GAAG,OAAO,CAAC,eAAe,CAAC,CA+C3B;YAEa,cAAc;YAsBd,cAAc;YAad,sBAAsB;YAiCtB,sBAAsB;YAKtB,oBAAoB;YAwBpB,cAAc;IA0B5B,OAAO,CAAC,UAAU;CAgBnB;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAClC"}
@@ -3,7 +3,7 @@ import { type Context, Resource } from '@dxos/context';
3
3
  import { type EdgeConnection } from '@dxos/edge-client';
4
4
  import { PublicKey } from '@dxos/keys';
5
5
  import { type SwarmResponse } from '@dxos/protocols/proto/dxos/edge/messenger';
6
- import { type Message, type PeerInfo, type SwarmEvent } from '../signal-methods';
6
+ import { type Message, type PeerInfo, type SubscribeMessagesParams, type SwarmEvent, type UnsubscribeCallback } from '../signal-methods';
7
7
  import { type SignalManager } from './signal-manager';
8
8
  export declare class EdgeSignalManager extends Resource implements SignalManager {
9
9
  /**
@@ -11,11 +11,23 @@ export declare class EdgeSignalManager extends Resource implements SignalManager
11
11
  */
12
12
  swarmEvent: Event<SwarmEvent>;
13
13
  swarmState: Event<SwarmResponse>;
14
- onMessage: Event<Message>;
14
+ /**
15
+ * Active message subscriptions. Routing is encapsulated here (DX-1125): each incoming message is
16
+ * dispatched to every subscription it matches, and each subscription owns its own teardown.
17
+ */
18
+ private readonly _subscriptions;
15
19
  /**
16
20
  * Swarm key -> { peer: <own state payload>, joinedPeers: <state of swarm> }.
17
21
  */
18
22
  private readonly _swarmPeers;
23
+ /**
24
+ * OR-subscription tag refcounts for broadcast messages (DX-1125). One count per distinct tag across
25
+ * all subscribers, so one consumer's unsubscribe releases only its own registration rather than
26
+ * clobbering another consumer's identical subscription. The effective tag set (the keys) is shared
27
+ * across all joined swarms; the edge fans out any broadcast whose tags intersect it. Re-sent on
28
+ * reconnect and whenever a swarm is (re-)joined.
29
+ */
30
+ private readonly _subscribedTags;
19
31
  private readonly _edgeConnection;
20
32
  constructor({ edgeConnection }: {
21
33
  edgeConnection: EdgeConnection;
@@ -36,11 +48,16 @@ export declare class EdgeSignalManager extends Resource implements SignalManager
36
48
  topic: PublicKey;
37
49
  }): Promise<SwarmResponse>;
38
50
  sendMessage(ctx: Context, message: Message): Promise<void>;
39
- subscribeMessages(peerInfo: PeerInfo): Promise<void>;
40
- unsubscribeMessages(peerInfo: PeerInfo): Promise<void>;
51
+ subscribeMessages({ peer, tags, onMessage }: SubscribeMessagesParams): Promise<UnsubscribeCallback>;
52
+ private _sendSubscription;
41
53
  private _onMessage;
42
54
  private _processSwarmResponse;
43
55
  private _processMessage;
56
+ /**
57
+ * Route an incoming message to matching subscriptions (DX-1125): point-to-point by recipient
58
+ * `peerKey`, broadcasts by tag intersection.
59
+ */
60
+ private _deliver;
44
61
  private _matchSelfPeerInfo;
45
62
  private _rejoinAllSwarms;
46
63
  }
@@ -1 +1 @@
1
- {"version":3,"file":"edge-signal-manager.d.ts","sourceRoot":"","sources":["../../../../src/signal-manager/edge-signal-manager.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,KAAK,EAAqB,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,KAAK,OAAO,EAAE,QAAQ,EAAqB,MAAM,eAAe,CAAC;AAC1E,OAAO,EAAE,KAAK,cAAc,EAAsC,MAAM,mBAAmB,CAAC;AAE5F,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAWvC,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAG/E,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAgB,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/F,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD,qBAAa,iBAAkB,SAAQ,QAAS,YAAW,aAAa;IACtE;;OAEG;IACI,UAAU,oBAA2B;IACrC,UAAU,uBAA8B;IACxC,SAAS,iBAAwB;IAExC;;OAEG;IAEH,OAAO,CAAC,QAAQ,CAAC,WAAW,CAGV;IAElB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiB;IAEjD,YAAY,EAAE,cAAc,EAAE,EAAE;QAAE,cAAc,EAAE,cAAc,CAAA;KAAE,EAGjE;IAED,UAAyB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAO9C;IAED;;OAEG;IACG,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAAE,KAAK,EAAE,SAAS,CAAC;QAAC,IAAI,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA0B7F;IAEK,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAAE,KAAK,EAAE,SAAS,CAAC;QAAC,IAAI,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAmB9F;IAEK,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE;QAAE,KAAK,EAAE,SAAS,CAAA;KAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CAmBjF;IAEK,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAkB/D;IAEK,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAEzD;IAEK,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3D;IAED,OAAO,CAAC,UAAU;IAYlB,OAAO,CAAC,qBAAqB;IAsC7B,OAAO,CAAC,eAAe;IAiBvB,OAAO,CAAC,kBAAkB;YAMZ,gBAAgB;CAa/B"}
1
+ {"version":3,"file":"edge-signal-manager.d.ts","sourceRoot":"","sources":["../../../../src/signal-manager/edge-signal-manager.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,KAAK,EAAqB,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,KAAK,OAAO,EAAE,QAAQ,EAAqB,MAAM,eAAe,CAAC;AAC1E,OAAO,EAAE,KAAK,cAAc,EAAsC,MAAM,mBAAmB,CAAC;AAE5F,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAWvC,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAG/E,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,QAAQ,EAEb,KAAK,uBAAuB,EAC5B,KAAK,UAAU,EACf,KAAK,mBAAmB,EACzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAYtD,qBAAa,iBAAkB,SAAQ,QAAS,YAAW,aAAa;IACtE;;OAEG;IACI,UAAU,oBAA2B;IACrC,UAAU,uBAA8B;IAE/C;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAkC;IAEjE;;OAEG;IAEH,OAAO,CAAC,QAAQ,CAAC,WAAW,CAGV;IAElB;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA6B;IAE7D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiB;IAEjD,YAAY,EAAE,cAAc,EAAE,EAAE;QAAE,cAAc,EAAE,cAAc,CAAA;KAAE,EAGjE;IAED,UAAyB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAO9C;IAED;;OAEG;IACG,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAAE,KAAK,EAAE,SAAS,CAAC;QAAC,IAAI,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA+B7F;IAEK,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAAE,KAAK,EAAE,SAAS,CAAC;QAAC,IAAI,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAmB9F;IAEK,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE;QAAE,KAAK,EAAE,SAAS,CAAA;KAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CAmBjF;IAEK,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAyB/D;IAEK,iBAAiB,CAAC,EAAE,IAAI,EAAE,IAAS,EAAE,SAAS,EAAE,EAAE,uBAAuB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAuC7G;YAMa,iBAAiB;IAsB/B,OAAO,CAAC,UAAU;IAYlB,OAAO,CAAC,qBAAqB;IAsC7B,OAAO,CAAC,eAAe;IA4BvB;;;OAGG;IACH,OAAO,CAAC,QAAQ;IAYhB,OAAO,CAAC,kBAAkB;YAMZ,gBAAgB;CAiB/B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=edge-signal-manager.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edge-signal-manager.test.d.ts","sourceRoot":"","sources":["../../../../src/signal-manager/edge-signal-manager.test.ts"],"names":[],"mappings":""}
@@ -1,6 +1,5 @@
1
1
  export * from './memory-signal-manager';
2
- export type * from './signal-manager';
3
- export * from './websocket-signal-manager';
2
+ export * from './signal-manager';
4
3
  export * from './edge-signal-manager';
5
4
  export * from './utils';
6
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/signal-manager/index.ts"],"names":[],"mappings":"AAIA,cAAc,yBAAyB,CAAC;AACxC,mBAAmB,kBAAkB,CAAC;AACtC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC;AACtC,cAAc,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/signal-manager/index.ts"],"names":[],"mappings":"AAIA,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,SAAS,CAAC"}
@@ -1,11 +1,10 @@
1
1
  import { Event } from '@dxos/async';
2
- import { type Any } from '@dxos/codec-protobuf';
3
2
  import { Context } from '@dxos/context';
4
3
  import { PublicKey } from '@dxos/keys';
5
4
  import { type SwarmResponse } from '@dxos/protocols/proto/dxos/edge/messenger';
6
5
  import { type QueryRequest } from '@dxos/protocols/proto/dxos/edge/signal';
7
6
  import { ComplexMap, ComplexSet } from '@dxos/util';
8
- import { type Message, type PeerInfo, type SignalStatus, type SwarmEvent } from '../signal-methods';
7
+ import { type Message, type PeerInfo, type SignalStatus, type SubscribeMessagesParams, type SwarmEvent, type UnsubscribeCallback } from '../signal-methods';
9
8
  import { type SignalManager } from './signal-manager';
10
9
  /**
11
10
  * Common signaling context that connects multiple MemorySignalManager instances.
@@ -22,7 +21,11 @@ export declare class MemorySignalManager implements SignalManager {
22
21
  private readonly _context;
23
22
  readonly statusChanged: Event<SignalStatus[]>;
24
23
  readonly swarmEvent: Event<SwarmEvent>;
25
- readonly onMessage: Event<Message>;
24
+ /**
25
+ * Active message subscriptions on this manager. Routing is encapsulated here (DX-1125): a delivered
26
+ * message is dispatched to every subscription it matches.
27
+ */
28
+ private readonly _subscriptions;
26
29
  /** Will be used to emit SwarmEvents on .open() and .close() */
27
30
  private _joinedSwarms;
28
31
  private _ctx;
@@ -40,14 +43,13 @@ export declare class MemorySignalManager implements SignalManager {
40
43
  peer: PeerInfo;
41
44
  }): Promise<void>;
42
45
  query(_ctx: Context, request: QueryRequest): Promise<SwarmResponse>;
43
- sendMessage(_ctx: Context, { author, recipient, payload }: {
44
- author: PeerInfo;
45
- recipient: PeerInfo;
46
- payload: Any;
47
- }): Promise<void>;
48
- subscribeMessages(peerInfo: PeerInfo): Promise<void>;
49
- unsubscribeMessages(peerInfo: PeerInfo): Promise<void>;
46
+ sendMessage(_ctx: Context, message: Message): Promise<void>;
47
+ subscribeMessages({ peer, tags, onMessage }: SubscribeMessagesParams): Promise<UnsubscribeCallback>;
50
48
  freeze(): void;
51
49
  unfreeze(): void;
50
+ /**
51
+ * Route a delivered message to this manager's matching subscriptions once it is unfrozen and open.
52
+ */
53
+ private _deliver;
52
54
  }
53
55
  //# sourceMappingURL=memory-signal-manager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"memory-signal-manager.d.ts","sourceRoot":"","sources":["../../../../src/signal-manager/memory-signal-manager.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,EAAW,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvC,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAC/E,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,wCAAwC,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEpD,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAgB,KAAK,YAAY,EAAE,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAClH,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD;;GAEG;AACH,qBAAa,0BAA0B;IAErC,QAAQ,CAAC,UAAU,oBAA2B;IAG9C,QAAQ,CAAC,MAAM,8FAAmE;IAGlF,QAAQ,CAAC,WAAW,4FAA+D;CACpF;AAED;;GAEG;AACH,qBAAa,mBAAoB,YAAW,aAAa;IAgB3C,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAfrC,QAAQ,CAAC,aAAa,wBAA+B;IACrD,QAAQ,CAAC,UAAU,oBAA2B;IAE9C,QAAQ,CAAC,SAAS,iBAAwB;IAE1C,gEAAgE;IAChE,OAAO,CAAC,aAAa,CAEnB;IAEF,OAAO,CAAC,IAAI,CAAW;IAGvB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAwB;IAEvD,YAA6B,QAAQ,EAAE,0BAA0B,EAIhE;IAEK,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAQ1B;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAgB3B;IAED,SAAS,IAAI,YAAY,EAAE,CAE1B;IAEK,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAAE,KAAK,EAAE,SAAS,CAAC;QAAC,IAAI,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA8B9F;IAEK,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAAE,KAAK,EAAE,SAAS,CAAC;QAAC,IAAI,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAmB/F;IAEK,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,CAExE;IAEK,WAAW,CACf,IAAI,EAAE,OAAO,EACb,EACE,MAAM,EACN,SAAS,EACT,OAAO,EACR,EAAE;QACD,MAAM,EAAE,QAAQ,CAAC;QACjB,SAAS,EAAE,QAAQ,CAAC;QACpB,OAAO,EAAE,GAAG,CAAC;KACd,GACA,OAAO,CAAC,IAAI,CAAC,CAkCf;IAEK,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAGzD;IAEK,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAG3D;IAED,MAAM,IAAI,IAAI,CAEb;IAED,QAAQ,IAAI,IAAI,CAEf;CACF"}
1
+ {"version":3,"file":"memory-signal-manager.d.ts","sourceRoot":"","sources":["../../../../src/signal-manager/memory-signal-manager.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,EAAW,MAAM,aAAa,CAAC;AAE7C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvC,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAC/E,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,wCAAwC,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEpD,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,QAAQ,EAEb,KAAK,YAAY,EACjB,KAAK,uBAAuB,EAC5B,KAAK,UAAU,EACf,KAAK,mBAAmB,EACzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAYtD;;GAEG;AACH,qBAAa,0BAA0B;IAErC,QAAQ,CAAC,UAAU,oBAA2B;IAG9C,QAAQ,CAAC,MAAM,8FAAmE;IAGlF,QAAQ,CAAC,WAAW,4FAA+D;CACpF;AAED;;GAEG;AACH,qBAAa,mBAAoB,YAAW,aAAa;IAoB3C,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAnBrC,QAAQ,CAAC,aAAa,wBAA+B;IACrD,QAAQ,CAAC,UAAU,oBAA2B;IAE9C;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAkC;IAEjE,gEAAgE;IAChE,OAAO,CAAC,aAAa,CAEnB;IAEF,OAAO,CAAC,IAAI,CAAW;IAGvB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAwB;IAEvD,YAA6B,QAAQ,EAAE,0BAA0B,EAIhE;IAEK,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAQ1B;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAgB3B;IAED,SAAS,IAAI,YAAY,EAAE,CAE1B;IAEK,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAAE,KAAK,EAAE,SAAS,CAAC;QAAC,IAAI,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA8B9F;IAEK,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAAE,KAAK,EAAE,SAAS,CAAC;QAAC,IAAI,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAmB/F;IAEK,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,CAExE;IAEK,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBhE;IAEK,iBAAiB,CAAC,EAAE,IAAI,EAAE,IAAS,EAAE,SAAS,EAAE,EAAE,uBAAuB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAe7G;IAED,MAAM,IAAI,IAAI,CAEb;IAED,QAAQ,IAAI,IAAI,CAEf;IAED;;OAEG;IACH,OAAO,CAAC,QAAQ;CA6BjB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=memory-signal-manager.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-signal-manager.test.d.ts","sourceRoot":"","sources":["../../../../src/signal-manager/memory-signal-manager.test.ts"],"names":[],"mappings":""}
@@ -1,3 +1,4 @@
1
+ import * as Context from 'effect/Context';
1
2
  import { type Event } from '@dxos/async';
2
3
  import { type Lifecycle } from '@dxos/context';
3
4
  import { type SignalMethods, type SignalStatus } from '../signal-methods';
@@ -8,4 +9,8 @@ export interface SignalManager extends SignalMethods, Required<Lifecycle> {
8
9
  statusChanged?: Event<SignalStatus[]>;
9
10
  getStatus?: () => SignalStatus[];
10
11
  }
12
+ declare const SignalManagerService_base: Context.TagClass<SignalManagerService, "@dxos/messaging/SignalManager", SignalManager>;
13
+ export declare class SignalManagerService extends SignalManagerService_base {
14
+ }
15
+ export {};
11
16
  //# sourceMappingURL=signal-manager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"signal-manager.d.ts","sourceRoot":"","sources":["../../../../src/signal-manager/signal-manager.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AAE/C,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAE1E;;GAEG;AACH,MAAM,WAAW,aAAc,SAAQ,aAAa,EAAE,QAAQ,CAAC,SAAS,CAAC;IACvE,aAAa,CAAC,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;IACtC,SAAS,CAAC,EAAE,MAAM,YAAY,EAAE,CAAC;CAClC"}
1
+ {"version":3,"file":"signal-manager.d.ts","sourceRoot":"","sources":["../../../../src/signal-manager/signal-manager.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAE1C,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AAE/C,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAE1E;;GAEG;AACH,MAAM,WAAW,aAAc,SAAQ,aAAa,EAAE,QAAQ,CAAC,SAAS,CAAC;IACvE,aAAa,CAAC,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;IACtC,SAAS,CAAC,EAAE,MAAM,YAAY,EAAE,CAAC;CAClC;;AAED,qBAAa,oBAAqB,SAAQ,yBAGvC;CAAG"}
@@ -1,7 +1,9 @@
1
- import { type DevicesService, type IdentityService } from '@dxos/protocols/proto/dxos/client/services';
2
- export declare const setIdentityTags: ({ identityService, devicesService, setTag, }: {
3
- identityService: IdentityService;
4
- devicesService: DevicesService;
1
+ import * as Runtime from 'effect/Runtime';
2
+ import { type DevicesService, type IdentityService } from '@dxos/protocols/rpc';
3
+ export declare const setIdentityTags: ({ identityService, devicesService, runtime, setTag, }: {
4
+ identityService: IdentityService.Client;
5
+ devicesService: DevicesService.Client;
6
+ runtime?: Runtime.Runtime<never>;
5
7
  setTag: (k: string, v: string) => void;
6
8
  }) => void;
7
9
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/signal-manager/utils.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,eAAe,EAAE,MAAM,4CAA4C,CAAC;AAGvG,eAAO,MAAM,eAAe,iDAIzB;IACD,eAAe,EAAE,eAAe,CAAC;IACjC,cAAc,EAAE,cAAc,CAAC;IAC/B,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC,SAwBA,CAAC"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/signal-manager/utils.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAM1C,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEhF,eAAO,MAAM,eAAe,0DAKzB;IACD,eAAe,EAAE,eAAe,CAAC,MAAM,CAAC;IACxC,cAAc,EAAE,cAAc,CAAC,MAAM,CAAC;IACtC,OAAO,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACjC,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC,SA4BA,CAAC"}