@dxos/messaging 0.6.8-main.3be982f → 0.6.8-staging.77f93a3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/browser/index.mjs +466 -199
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node/index.cjs +456 -197
- package/dist/lib/node/index.cjs.map +4 -4
- package/dist/lib/node/meta.json +1 -1
- package/dist/types/src/messenger.blueprint-test.d.ts +4 -0
- package/dist/types/src/messenger.blueprint-test.d.ts.map +1 -0
- package/dist/types/src/messenger.d.ts +4 -10
- package/dist/types/src/messenger.d.ts.map +1 -1
- package/dist/types/src/signal-client/signal-client.d.ts +6 -10
- package/dist/types/src/signal-client/signal-client.d.ts.map +1 -1
- package/dist/types/src/signal-client/signal-local-state.d.ts +2 -10
- package/dist/types/src/signal-client/signal-local-state.d.ts.map +1 -1
- package/dist/types/src/signal-manager/edge-signal-manager.d.ts +18 -19
- package/dist/types/src/signal-manager/edge-signal-manager.d.ts.map +1 -1
- package/dist/types/src/signal-manager/index.d.ts +1 -0
- package/dist/types/src/signal-manager/index.d.ts.map +1 -1
- package/dist/types/src/signal-manager/memory-signal-manager.d.ts +14 -25
- package/dist/types/src/signal-manager/memory-signal-manager.d.ts.map +1 -1
- package/dist/types/src/signal-manager/signal-manager.d.ts +5 -6
- package/dist/types/src/signal-manager/signal-manager.d.ts.map +1 -1
- package/dist/types/src/signal-manager/websocket-signal-manager.d.ts +14 -29
- package/dist/types/src/signal-manager/websocket-signal-manager.d.ts.map +1 -1
- package/dist/types/src/signal-methods.d.ts +29 -14
- package/dist/types/src/signal-methods.d.ts.map +1 -1
- package/dist/types/src/testing/index.d.ts +5 -0
- package/dist/types/src/testing/index.d.ts.map +1 -0
- package/dist/types/src/testing/test-builder.d.ts +19 -0
- package/dist/types/src/testing/test-builder.d.ts.map +1 -0
- package/dist/types/src/testing/test-messages.d.ts +6 -0
- package/dist/types/src/testing/test-messages.d.ts.map +1 -0
- package/dist/types/src/testing/test-peer.d.ts +23 -0
- package/dist/types/src/testing/test-peer.d.ts.map +1 -0
- package/dist/types/src/testing/utils.d.ts +10 -0
- package/dist/types/src/testing/utils.d.ts.map +1 -0
- package/package.json +15 -14
- package/src/messenger.blueprint-test.ts +346 -0
- package/src/messenger.test.ts +26 -362
- package/src/messenger.ts +20 -18
- package/src/signal-client/signal-client-monitor.ts +3 -3
- package/src/signal-client/signal-client.test.ts +56 -52
- package/src/signal-client/signal-client.ts +30 -16
- package/src/signal-client/signal-local-state.ts +28 -10
- package/src/signal-manager/edge-signal-manager.test.ts +31 -35
- package/src/signal-manager/edge-signal-manager.ts +88 -36
- package/src/signal-manager/index.ts +1 -0
- package/src/signal-manager/memory-signal-manager.ts +36 -50
- package/src/signal-manager/signal-manager.ts +5 -7
- package/src/signal-manager/websocket-signal-manager.test.ts +27 -31
- package/src/signal-manager/websocket-signal-manager.ts +34 -65
- package/src/signal-methods.ts +33 -11
- package/src/testing/index.ts +8 -0
- package/src/testing/test-builder.ts +54 -0
- package/src/testing/test-messages.ts +24 -0
- package/src/testing/test-peer.ts +66 -0
- package/src/testing/utils.ts +50 -0
- package/dist/types/src/testing.d.ts +0 -40
- package/dist/types/src/testing.d.ts.map +0 -1
- package/src/testing.ts +0 -120
package/src/messenger.test.ts
CHANGED
|
@@ -2,40 +2,18 @@
|
|
|
2
2
|
// Copyright 2022 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
import {
|
|
8
|
-
import { type TaggedType } from '@dxos/codec-protobuf';
|
|
9
|
-
import { PublicKey } from '@dxos/keys';
|
|
10
|
-
import { type TYPES } from '@dxos/protocols';
|
|
5
|
+
import { asyncTimeout } from '@dxos/async';
|
|
6
|
+
import { EdgeClient } from '@dxos/edge-client';
|
|
7
|
+
import { type PublicKey } from '@dxos/keys';
|
|
11
8
|
import { runTestSignalServer, type SignalServerRunner } from '@dxos/signal';
|
|
12
|
-
import { afterAll, beforeAll,
|
|
13
|
-
import { range } from '@dxos/util';
|
|
9
|
+
import { afterAll, afterTest, beforeAll, openAndClose, test, describe } from '@dxos/test';
|
|
14
10
|
|
|
15
|
-
import {
|
|
16
|
-
import { WebsocketSignalManager } from './signal-manager';
|
|
11
|
+
import { messengerTests } from './messenger.blueprint-test';
|
|
12
|
+
import { EdgeSignalManager, WebsocketSignalManager } from './signal-manager';
|
|
17
13
|
import { type Message } from './signal-methods';
|
|
18
|
-
import { TestBuilder } from './testing';
|
|
19
|
-
|
|
20
|
-
const PAYLOAD_1: TaggedType<TYPES, 'google.protobuf.Any'> = {
|
|
21
|
-
'@type': 'google.protobuf.Any',
|
|
22
|
-
type_url: 'dxos.Example1',
|
|
23
|
-
value: Buffer.from('1'),
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
const PAYLOAD_2: TaggedType<TYPES, 'google.protobuf.Any'> = {
|
|
27
|
-
'@type': 'google.protobuf.Any',
|
|
28
|
-
type_url: 'dxos.Example2',
|
|
29
|
-
value: Buffer.from('2'),
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
const PAYLOAD_3: TaggedType<TYPES, 'google.protobuf.Any'> = {
|
|
33
|
-
'@type': 'google.protobuf.Any',
|
|
34
|
-
type_url: 'dxos.Example3',
|
|
35
|
-
value: Buffer.from('3'),
|
|
36
|
-
};
|
|
14
|
+
import { PAYLOAD_1, TestBuilder } from './testing';
|
|
37
15
|
|
|
38
|
-
describe('Messenger', () => {
|
|
16
|
+
describe('Messenger with WebsocketSignalManager', () => {
|
|
39
17
|
let broker: SignalServerRunner;
|
|
40
18
|
|
|
41
19
|
beforeAll(async () => {
|
|
@@ -46,240 +24,20 @@ describe('Messenger', () => {
|
|
|
46
24
|
void broker.stop();
|
|
47
25
|
});
|
|
48
26
|
|
|
49
|
-
|
|
50
|
-
const builder = new TestBuilder({ signalHosts: [{ server: broker.url() }] });
|
|
51
|
-
afterTest(() => builder.close());
|
|
52
|
-
const peer1 = builder.createPeer();
|
|
53
|
-
await peer1.open();
|
|
54
|
-
const peer2 = builder.createPeer();
|
|
55
|
-
await peer2.open();
|
|
56
|
-
|
|
57
|
-
const message: Message = {
|
|
58
|
-
author: peer1.peerId,
|
|
59
|
-
recipient: peer2.peerId,
|
|
60
|
-
payload: PAYLOAD_1,
|
|
61
|
-
};
|
|
62
|
-
|
|
63
|
-
const promise = peer2.waitTillReceive(message);
|
|
64
|
-
|
|
65
|
-
await peer1.messenger.sendMessage(message);
|
|
66
|
-
|
|
67
|
-
await asyncTimeout(promise, 1_000);
|
|
68
|
-
}).timeout(1_000);
|
|
69
|
-
|
|
70
|
-
test('Message 3 peers', async () => {
|
|
71
|
-
const builder = new TestBuilder({ signalHosts: [{ server: broker.url() }] });
|
|
72
|
-
afterTest(() => builder.close());
|
|
73
|
-
const peer1 = builder.createPeer();
|
|
74
|
-
await peer1.open();
|
|
75
|
-
const peer2 = builder.createPeer();
|
|
76
|
-
await peer2.open();
|
|
77
|
-
const peer3 = builder.createPeer();
|
|
78
|
-
await peer3.open();
|
|
79
|
-
|
|
80
|
-
{
|
|
81
|
-
const message: Message = {
|
|
82
|
-
author: peer1.peerId,
|
|
83
|
-
recipient: peer2.peerId,
|
|
84
|
-
payload: PAYLOAD_1,
|
|
85
|
-
};
|
|
86
|
-
|
|
87
|
-
const promise = peer2.waitTillReceive(message);
|
|
88
|
-
await peer1.messenger.sendMessage(message);
|
|
89
|
-
await asyncTimeout(promise, 1_000);
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
{
|
|
93
|
-
const message: Message = {
|
|
94
|
-
author: peer1.peerId,
|
|
95
|
-
recipient: peer3.peerId,
|
|
96
|
-
payload: PAYLOAD_2,
|
|
97
|
-
};
|
|
98
|
-
|
|
99
|
-
const promise = peer3.waitTillReceive(message);
|
|
100
|
-
await peer1.messenger.sendMessage(message);
|
|
101
|
-
await asyncTimeout(promise, 1_000);
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
{
|
|
105
|
-
const message: Message = {
|
|
106
|
-
author: peer2.peerId,
|
|
107
|
-
recipient: peer1.peerId,
|
|
108
|
-
payload: PAYLOAD_3,
|
|
109
|
-
};
|
|
110
|
-
|
|
111
|
-
const promise = peer1.waitTillReceive(message);
|
|
112
|
-
await peer2.messenger.sendMessage(message);
|
|
113
|
-
await asyncTimeout(promise, 1_000);
|
|
114
|
-
}
|
|
115
|
-
}).timeout(1_000);
|
|
116
|
-
|
|
117
|
-
test('Message routing', async () => {
|
|
118
|
-
const builder = new TestBuilder({ signalHosts: [{ server: broker.url() }] });
|
|
119
|
-
afterTest(() => builder.close());
|
|
120
|
-
const peer1 = builder.createPeer();
|
|
121
|
-
await peer1.open();
|
|
122
|
-
const peer2 = builder.createPeer();
|
|
123
|
-
await peer2.open();
|
|
124
|
-
|
|
125
|
-
// Subscribe first listener for second messenger.
|
|
126
|
-
const onMessage1 = mockFn<(message: Message) => Promise<void>>().resolvesTo();
|
|
127
|
-
await peer2.messenger.listen({
|
|
128
|
-
peerId: peer2.peerId,
|
|
129
|
-
payloadType: PAYLOAD_1.type_url,
|
|
130
|
-
onMessage: onMessage1,
|
|
131
|
-
});
|
|
132
|
-
|
|
133
|
-
// Subscribe first listener for second messenger.
|
|
134
|
-
const onMessage2 = mockFn<(message: Message) => Promise<void>>().resolvesTo();
|
|
135
|
-
await peer2.messenger.listen({
|
|
136
|
-
peerId: peer2.peerId,
|
|
137
|
-
payloadType: PAYLOAD_1.type_url,
|
|
138
|
-
onMessage: onMessage2,
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
// Subscribe third listener for second messenger.
|
|
142
|
-
const onMessage3 = mockFn<(message: Message) => Promise<void>>().resolvesTo();
|
|
143
|
-
await peer2.messenger.listen({
|
|
144
|
-
peerId: peer2.peerId,
|
|
145
|
-
payloadType: PAYLOAD_2.type_url,
|
|
146
|
-
onMessage: onMessage3,
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
// Message from the 1st peer to the 2nd peer with payload type "1".
|
|
150
|
-
{
|
|
151
|
-
const message: Message = {
|
|
152
|
-
author: peer1.peerId,
|
|
153
|
-
recipient: peer2.peerId,
|
|
154
|
-
payload: PAYLOAD_1,
|
|
155
|
-
};
|
|
156
|
-
const promise = peer2.waitTillReceive(message);
|
|
157
|
-
await peer1.messenger.sendMessage(message);
|
|
158
|
-
|
|
159
|
-
// 3 listeners (default one that was returned by setupPeer() and 2 that listen for type "1") should receive message.
|
|
160
|
-
await asyncTimeout(promise, 1_000);
|
|
161
|
-
expect(onMessage1).toHaveBeenCalledWith([message]);
|
|
162
|
-
expect(onMessage2).toHaveBeenCalledWith([message]);
|
|
163
|
-
expect(onMessage3).not.toHaveBeenCalledWith([message]);
|
|
164
|
-
}
|
|
165
|
-
}).timeout(1_000);
|
|
166
|
-
|
|
167
|
-
test('Unsubscribe listener', async () => {
|
|
168
|
-
const builder = new TestBuilder({ signalHosts: [{ server: broker.url() }] });
|
|
169
|
-
afterTest(() => builder.close());
|
|
170
|
-
const peer1 = builder.createPeer();
|
|
171
|
-
await peer1.open();
|
|
172
|
-
const peer2 = builder.createPeer();
|
|
173
|
-
await peer2.open();
|
|
174
|
-
|
|
175
|
-
// Subscribe first listener for second messenger.
|
|
176
|
-
const messages1: Message[] = [];
|
|
177
|
-
await peer2.messenger.listen({
|
|
178
|
-
peerId: peer2.peerId,
|
|
179
|
-
payloadType: PAYLOAD_1.type_url,
|
|
180
|
-
onMessage: async (message) => {
|
|
181
|
-
messages1.push(message);
|
|
182
|
-
},
|
|
183
|
-
});
|
|
184
|
-
|
|
185
|
-
// Subscribe first listener for second messenger.
|
|
186
|
-
const messages2: Message[] = [];
|
|
187
|
-
const listenerHandle2 = await peer2.messenger.listen({
|
|
188
|
-
peerId: peer2.peerId,
|
|
189
|
-
payloadType: PAYLOAD_1.type_url,
|
|
190
|
-
onMessage: async (message) => {
|
|
191
|
-
messages2.push(message);
|
|
192
|
-
},
|
|
193
|
-
});
|
|
194
|
-
|
|
195
|
-
// Message from the 1st peer to the 2nd peer with payload type "1".
|
|
196
|
-
{
|
|
197
|
-
const message: Message = {
|
|
198
|
-
author: peer1.peerId,
|
|
199
|
-
recipient: peer2.peerId,
|
|
200
|
-
payload: PAYLOAD_1,
|
|
201
|
-
};
|
|
202
|
-
|
|
203
|
-
const receivePromise = peer2.waitTillReceive(message);
|
|
204
|
-
await peer1.messenger.sendMessage(message);
|
|
205
|
-
|
|
206
|
-
// 2 subscribed listeners should receive message.
|
|
207
|
-
await asyncTimeout(receivePromise, 1_000);
|
|
208
|
-
expect(messages1[0]).toEqual(message);
|
|
209
|
-
expect(messages2[0]).toEqual(message);
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
// Unsubscribe second listener.
|
|
213
|
-
await listenerHandle2.unsubscribe();
|
|
214
|
-
|
|
215
|
-
// Message from the 1st peer to the 2nd peer with payload type "1".
|
|
216
|
-
{
|
|
217
|
-
const message: Message = {
|
|
218
|
-
author: peer1.peerId,
|
|
219
|
-
recipient: peer2.peerId,
|
|
220
|
-
payload: PAYLOAD_1,
|
|
221
|
-
};
|
|
222
|
-
|
|
223
|
-
const receivePromise = peer2.waitTillReceive(message);
|
|
224
|
-
await peer1.messenger.sendMessage(message);
|
|
225
|
-
|
|
226
|
-
// 1 listener that was not unsubscribed should receive message.
|
|
227
|
-
await asyncTimeout(receivePromise, 1_000);
|
|
228
|
-
expect(messages1[1]).toEqual(message);
|
|
229
|
-
expect(messages1.length).toEqual(2);
|
|
230
|
-
expect(messages2.length).toEqual(1);
|
|
231
|
-
}
|
|
232
|
-
})
|
|
233
|
-
.tag('flaky')
|
|
234
|
-
.timeout(1_000);
|
|
235
|
-
|
|
236
|
-
test('re-entrant message', async () => {
|
|
237
|
-
const builder = new TestBuilder({ signalHosts: [{ server: broker.url() }] });
|
|
238
|
-
afterTest(() => builder.close());
|
|
239
|
-
const peer1 = builder.createPeer();
|
|
240
|
-
await peer1.open();
|
|
241
|
-
const peer2 = builder.createPeer();
|
|
242
|
-
await peer2.open();
|
|
243
|
-
|
|
244
|
-
const message: Message = {
|
|
245
|
-
author: peer1.peerId,
|
|
246
|
-
recipient: peer2.peerId,
|
|
247
|
-
payload: PAYLOAD_1,
|
|
248
|
-
};
|
|
249
|
-
|
|
250
|
-
{
|
|
251
|
-
const receivePromise = peer2.waitTillReceive(message);
|
|
252
|
-
await peer1.messenger.sendMessage(message);
|
|
253
|
-
await asyncTimeout(receivePromise, 1_000);
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
{
|
|
257
|
-
//
|
|
258
|
-
// Close and reopen peer1
|
|
259
|
-
//
|
|
260
|
-
|
|
261
|
-
await peer2.close();
|
|
262
|
-
await peer2.open();
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
{
|
|
266
|
-
const receivePromise = peer2.waitTillReceive(message);
|
|
267
|
-
await peer1.messenger.sendMessage(message);
|
|
268
|
-
await asyncTimeout(receivePromise, 1_000);
|
|
269
|
-
}
|
|
270
|
-
}).timeout(1_000);
|
|
27
|
+
messengerTests(async () => new WebsocketSignalManager([{ server: broker.url() }]));
|
|
271
28
|
|
|
272
29
|
test('Message with broken signal server', async () => {
|
|
273
|
-
const builder = new TestBuilder({
|
|
30
|
+
const builder = new TestBuilder({
|
|
31
|
+
signalManagerFactory: async () =>
|
|
32
|
+
new WebsocketSignalManager([{ server: 'ws://broken.kube.' }, { server: broker.url() }]),
|
|
33
|
+
});
|
|
274
34
|
afterTest(() => builder.close());
|
|
275
|
-
const peer1 = builder.createPeer();
|
|
276
|
-
await
|
|
277
|
-
const peer2 = builder.createPeer();
|
|
278
|
-
await peer2.open();
|
|
35
|
+
const peer1 = await builder.createPeer();
|
|
36
|
+
const peer2 = await builder.createPeer();
|
|
279
37
|
|
|
280
38
|
const message: Message = {
|
|
281
|
-
author: peer1.
|
|
282
|
-
recipient: peer2.
|
|
39
|
+
author: peer1.peerInfo,
|
|
40
|
+
recipient: peer2.peerInfo,
|
|
283
41
|
payload: PAYLOAD_1,
|
|
284
42
|
};
|
|
285
43
|
|
|
@@ -289,110 +47,16 @@ describe('Messenger', () => {
|
|
|
289
47
|
await asyncTimeout(receivePromise, 1_000);
|
|
290
48
|
}
|
|
291
49
|
}).timeout(1_000);
|
|
50
|
+
});
|
|
292
51
|
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
const unreliableConnection = (data: Message): Message[] => {
|
|
299
|
-
i++;
|
|
300
|
-
if (i % 3 !== 0) {
|
|
301
|
-
return [data];
|
|
302
|
-
}
|
|
303
|
-
return [];
|
|
304
|
-
};
|
|
305
|
-
|
|
306
|
-
const builder = new TestBuilder({
|
|
307
|
-
signalHosts: [{ server: broker.url() }],
|
|
308
|
-
messageDisruption: unreliableConnection,
|
|
309
|
-
});
|
|
310
|
-
afterTest(() => builder.close());
|
|
311
|
-
const peer1 = builder.createPeer();
|
|
312
|
-
await peer1.open();
|
|
313
|
-
const peer2 = builder.createPeer();
|
|
314
|
-
await peer2.open();
|
|
315
|
-
|
|
316
|
-
const message = {
|
|
317
|
-
author: peer2.peerId,
|
|
318
|
-
recipient: peer1.peerId,
|
|
319
|
-
payload: PAYLOAD_1,
|
|
320
|
-
};
|
|
321
|
-
|
|
322
|
-
const receivePromise = peer1.defaultReceived.waitForCount(3);
|
|
323
|
-
// Sending 3 messages.
|
|
324
|
-
Array(3)
|
|
325
|
-
.fill(0)
|
|
326
|
-
.forEach(async () => {
|
|
327
|
-
await peer2.messenger.sendMessage(message);
|
|
328
|
-
});
|
|
329
|
-
|
|
330
|
-
// expect to receive 3 messages.
|
|
331
|
-
await receivePromise;
|
|
332
|
-
}).timeout(5_000);
|
|
333
|
-
|
|
334
|
-
test('ignoring doubled messages', async () => {
|
|
335
|
-
// Message got doubled going through signal network.
|
|
336
|
-
const doublingMessage = (data: Message) => [data, data];
|
|
337
|
-
|
|
338
|
-
const builder = new TestBuilder({ signalHosts: [{ server: broker.url() }], messageDisruption: doublingMessage });
|
|
339
|
-
afterTest(() => builder.close());
|
|
340
|
-
const peer1 = builder.createPeer();
|
|
341
|
-
await peer1.open();
|
|
342
|
-
const peer2 = builder.createPeer();
|
|
343
|
-
await peer2.open();
|
|
344
|
-
|
|
345
|
-
const [promise, inc] = latch({ count: 1 });
|
|
346
|
-
let count = 0;
|
|
347
|
-
peer1.defaultReceived.on((msg) => {
|
|
348
|
-
count = inc();
|
|
349
|
-
});
|
|
350
|
-
// sending message.
|
|
351
|
-
await peer2.messenger.sendMessage({
|
|
352
|
-
author: peer2.peerId,
|
|
353
|
-
recipient: peer1.peerId,
|
|
354
|
-
payload: PAYLOAD_1,
|
|
355
|
-
});
|
|
356
|
-
// expect to receive 1 message.
|
|
357
|
-
await asyncTimeout(promise(), 1000);
|
|
358
|
-
expect(count).toEqual(1);
|
|
359
|
-
});
|
|
360
|
-
}).timeout(5_000);
|
|
361
|
-
|
|
362
|
-
describe('load', () => {
|
|
363
|
-
test('many connections to KUBE', async () => {
|
|
364
|
-
// let numReceived = 0;
|
|
365
|
-
void range(100).map(async () => {
|
|
366
|
-
const peerId = PublicKey.random();
|
|
367
|
-
const newLocal = new WebsocketSignalManager([{ server: 'wss://dev.kube.dxos.org/.well-known/dx/signal' }]);
|
|
368
|
-
await newLocal.open();
|
|
369
|
-
const messenger = new Messenger({ signalManager: newLocal });
|
|
370
|
-
|
|
371
|
-
// newLocal.join({
|
|
372
|
-
// topic: peerId,
|
|
373
|
-
// peerId: peerId,
|
|
374
|
-
// })
|
|
375
|
-
|
|
376
|
-
await messenger.listen({
|
|
377
|
-
peerId,
|
|
378
|
-
onMessage: async (msg) => {
|
|
379
|
-
// console.log(++numReceived);
|
|
380
|
-
},
|
|
381
|
-
});
|
|
52
|
+
// TODO(mykola): Expects wrangler dev in edge repo to run. Skip to pass CI.
|
|
53
|
+
describe.skip('Messenger with EdgeSignalManager', () => {
|
|
54
|
+
const edgeSignalFactory = async (identityKey: PublicKey, deviceKey: PublicKey) => {
|
|
55
|
+
const client = new EdgeClient(identityKey, deviceKey, { socketEndpoint: 'ws://localhost:8787' });
|
|
56
|
+
await openAndClose(client);
|
|
382
57
|
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
recipient: peerId,
|
|
386
|
-
payload: {
|
|
387
|
-
type_url: 'dxos.test',
|
|
388
|
-
value: Buffer.from('TEST'),
|
|
389
|
-
},
|
|
390
|
-
});
|
|
391
|
-
});
|
|
58
|
+
return new EdgeSignalManager({ edgeConnection: client });
|
|
59
|
+
};
|
|
392
60
|
|
|
393
|
-
|
|
394
|
-
})
|
|
395
|
-
.tag('stress')
|
|
396
|
-
.timeout(5_000);
|
|
397
|
-
});
|
|
61
|
+
messengerTests(edgeSignalFactory);
|
|
398
62
|
});
|
package/src/messenger.ts
CHANGED
|
@@ -14,10 +14,10 @@ import { ComplexMap, ComplexSet } from '@dxos/util';
|
|
|
14
14
|
|
|
15
15
|
import { MessengerMonitor } from './messenger-monitor';
|
|
16
16
|
import { type SignalManager } from './signal-manager';
|
|
17
|
-
import { type Message } from './signal-methods';
|
|
17
|
+
import { type PeerInfo, type Message } from './signal-methods';
|
|
18
18
|
import { MESSAGE_TIMEOUT } from './timeouts';
|
|
19
19
|
|
|
20
|
-
export type OnMessage = (params:
|
|
20
|
+
export type OnMessage = (params: Message) => Promise<void>;
|
|
21
21
|
|
|
22
22
|
export interface MessengerOptions {
|
|
23
23
|
signalManager: SignalManager;
|
|
@@ -36,12 +36,12 @@ export class Messenger {
|
|
|
36
36
|
private readonly _monitor = new MessengerMonitor();
|
|
37
37
|
private readonly _signalManager: SignalManager;
|
|
38
38
|
// { peerId, payloadType } => listeners set
|
|
39
|
-
private readonly _listeners = new ComplexMap<{ peerId:
|
|
40
|
-
({ peerId, payloadType }) => peerId
|
|
39
|
+
private readonly _listeners = new ComplexMap<{ peerId: string; payloadType: string }, Set<OnMessage>>(
|
|
40
|
+
({ peerId, payloadType }) => peerId + payloadType,
|
|
41
41
|
);
|
|
42
42
|
|
|
43
43
|
// peerId => listeners set
|
|
44
|
-
private readonly _defaultListeners = new
|
|
44
|
+
private readonly _defaultListeners = new Map<string, Set<OnMessage>>();
|
|
45
45
|
|
|
46
46
|
private readonly _onAckCallbacks = new ComplexMap<PublicKey, () => void>(PublicKey.hash);
|
|
47
47
|
|
|
@@ -166,30 +166,31 @@ export class Messenger {
|
|
|
166
166
|
* @param payloadType if not specified, onMessage will be subscribed to all types of messages.
|
|
167
167
|
*/
|
|
168
168
|
async listen({
|
|
169
|
-
|
|
169
|
+
peer,
|
|
170
170
|
payloadType,
|
|
171
171
|
onMessage,
|
|
172
172
|
}: {
|
|
173
|
-
|
|
173
|
+
peer: PeerInfo;
|
|
174
174
|
payloadType?: string;
|
|
175
175
|
onMessage: OnMessage;
|
|
176
176
|
}): Promise<ListeningHandle> {
|
|
177
177
|
invariant(!this._closed, 'Closed');
|
|
178
178
|
|
|
179
|
-
await this._signalManager.subscribeMessages(
|
|
179
|
+
await this._signalManager.subscribeMessages(peer);
|
|
180
180
|
let listeners: Set<OnMessage> | undefined;
|
|
181
|
+
invariant(peer.peerKey, 'Peer key is required');
|
|
181
182
|
|
|
182
183
|
if (!payloadType) {
|
|
183
|
-
listeners = this._defaultListeners.get(
|
|
184
|
+
listeners = this._defaultListeners.get(peer.peerKey);
|
|
184
185
|
if (!listeners) {
|
|
185
186
|
listeners = new Set();
|
|
186
|
-
this._defaultListeners.set(
|
|
187
|
+
this._defaultListeners.set(peer.peerKey, listeners);
|
|
187
188
|
}
|
|
188
189
|
} else {
|
|
189
|
-
listeners = this._listeners.get({ peerId, payloadType });
|
|
190
|
+
listeners = this._listeners.get({ peerId: peer.peerKey, payloadType });
|
|
190
191
|
if (!listeners) {
|
|
191
192
|
listeners = new Set();
|
|
192
|
-
this._listeners.set({ peerId, payloadType }, listeners);
|
|
193
|
+
this._listeners.set({ peerId: peer.peerKey, payloadType }, listeners);
|
|
193
194
|
}
|
|
194
195
|
}
|
|
195
196
|
|
|
@@ -207,8 +208,8 @@ export class Messenger {
|
|
|
207
208
|
recipient,
|
|
208
209
|
reliablePayload,
|
|
209
210
|
}: {
|
|
210
|
-
author:
|
|
211
|
-
recipient:
|
|
211
|
+
author: PeerInfo;
|
|
212
|
+
recipient: PeerInfo;
|
|
212
213
|
reliablePayload: ReliablePayload;
|
|
213
214
|
}): Promise<void> {
|
|
214
215
|
await this._signalManager.sendMessage({
|
|
@@ -275,8 +276,8 @@ export class Messenger {
|
|
|
275
276
|
recipient,
|
|
276
277
|
messageId,
|
|
277
278
|
}: {
|
|
278
|
-
author:
|
|
279
|
-
recipient:
|
|
279
|
+
author: PeerInfo;
|
|
280
|
+
recipient: PeerInfo;
|
|
280
281
|
messageId: PublicKey;
|
|
281
282
|
}): Promise<void> {
|
|
282
283
|
log('sending ACK', { messageId, from: recipient, to: author });
|
|
@@ -293,7 +294,8 @@ export class Messenger {
|
|
|
293
294
|
|
|
294
295
|
private async _callListeners(message: Message): Promise<void> {
|
|
295
296
|
{
|
|
296
|
-
|
|
297
|
+
invariant(message.recipient.peerKey, 'Peer key is required');
|
|
298
|
+
const defaultListenerMap = this._defaultListeners.get(message.recipient.peerKey);
|
|
297
299
|
if (defaultListenerMap) {
|
|
298
300
|
for (const listener of defaultListenerMap) {
|
|
299
301
|
await listener(message);
|
|
@@ -303,7 +305,7 @@ export class Messenger {
|
|
|
303
305
|
|
|
304
306
|
{
|
|
305
307
|
const listenerMap = this._listeners.get({
|
|
306
|
-
peerId: message.recipient,
|
|
308
|
+
peerId: message.recipient.peerKey,
|
|
307
309
|
payloadType: message.payload.type_url,
|
|
308
310
|
});
|
|
309
311
|
if (listenerMap) {
|
|
@@ -99,13 +99,13 @@ export class SignalClientMonitor {
|
|
|
99
99
|
|
|
100
100
|
const getByteCount = (message: Message): number => {
|
|
101
101
|
return (
|
|
102
|
-
message.author.
|
|
103
|
-
message.recipient.
|
|
102
|
+
message.author.peerKey.length +
|
|
103
|
+
message.recipient.peerKey.length +
|
|
104
104
|
message.payload.type_url.length +
|
|
105
105
|
message.payload.value.length
|
|
106
106
|
);
|
|
107
107
|
};
|
|
108
108
|
|
|
109
109
|
const createIdentityTags = (message: Message) => {
|
|
110
|
-
return { peer: message.author.
|
|
110
|
+
return { peer: message.author.peerKey };
|
|
111
111
|
};
|