@dxos/messaging 0.8.4-main.b97322e → 0.8.4-main.bcb3aa67d6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/neutral/chunk-KKCQXNW4.mjs +694 -0
- package/dist/lib/neutral/chunk-KKCQXNW4.mjs.map +7 -0
- package/dist/lib/{browser/chunk-QLQS7TUS.mjs → neutral/index.mjs} +420 -1026
- package/dist/lib/neutral/index.mjs.map +7 -0
- package/dist/lib/{browser → neutral}/meta.json +1 -1
- package/dist/lib/{browser → neutral}/testing/index.mjs +13 -7
- package/dist/lib/neutral/testing/index.mjs.map +7 -0
- package/dist/types/src/messenger.blueprint-test.d.ts.map +1 -1
- package/dist/types/src/messenger.d.ts +3 -2
- package/dist/types/src/messenger.d.ts.map +1 -1
- package/dist/types/src/signal-client/signal-client.d.ts +7 -7
- package/dist/types/src/signal-client/signal-client.d.ts.map +1 -1
- package/dist/types/src/signal-client/signal-local-state.d.ts +1 -1
- package/dist/types/src/signal-client/signal-local-state.d.ts.map +1 -1
- package/dist/types/src/signal-client/signal-rpc-client.d.ts +2 -2
- package/dist/types/src/signal-client/signal-rpc-client.d.ts.map +1 -1
- package/dist/types/src/signal-manager/edge-signal-manager.d.ts +6 -6
- package/dist/types/src/signal-manager/edge-signal-manager.d.ts.map +1 -1
- package/dist/types/src/signal-manager/memory-signal-manager.d.ts +6 -5
- package/dist/types/src/signal-manager/memory-signal-manager.d.ts.map +1 -1
- package/dist/types/src/signal-manager/signal-manager.d.ts +1 -1
- package/dist/types/src/signal-manager/signal-manager.d.ts.map +1 -1
- package/dist/types/src/signal-manager/websocket-signal-manager.d.ts +6 -6
- package/dist/types/src/signal-manager/websocket-signal-manager.d.ts.map +1 -1
- package/dist/types/src/signal-methods.d.ts +7 -7
- package/dist/types/src/signal-methods.d.ts.map +1 -1
- package/dist/types/src/testing/test-builder.d.ts +1 -1
- package/dist/types/src/testing/test-builder.d.ts.map +1 -1
- package/dist/types/src/testing/test-peer.d.ts +1 -1
- package/dist/types/src/testing/test-peer.d.ts.map +1 -1
- package/dist/types/src/testing/utils.d.ts +1 -1
- package/dist/types/src/testing/utils.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +26 -22
- package/src/messenger.blueprint-test.ts +15 -14
- package/src/messenger.node.test.ts +7 -38
- package/src/messenger.ts +35 -29
- package/src/signal-client/signal-client.node.test.ts +13 -11
- package/src/signal-client/signal-client.ts +11 -10
- package/src/signal-client/signal-local-state.ts +4 -3
- package/src/signal-client/signal-rpc-client.node.test.ts +1 -1
- package/src/signal-client/signal-rpc-client.ts +5 -5
- package/src/signal-manager/edge-signal-manager.ts +32 -18
- package/src/signal-manager/memory-signal-manager.ts +19 -15
- package/src/signal-manager/signal-manager.ts +1 -1
- package/src/signal-manager/websocket-signal-manager.node.test.ts +16 -14
- package/src/signal-manager/websocket-signal-manager.ts +12 -11
- package/src/signal-methods.ts +8 -8
- package/src/testing/test-builder.ts +7 -4
- package/src/testing/test-peer.ts +3 -2
- package/src/testing/utils.ts +3 -2
- package/dist/lib/browser/chunk-QLQS7TUS.mjs.map +0 -7
- package/dist/lib/browser/index.mjs +0 -22
- package/dist/lib/browser/index.mjs.map +0 -7
- package/dist/lib/browser/testing/index.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-GIM3VIFP.mjs +0 -2309
- package/dist/lib/node-esm/chunk-GIM3VIFP.mjs.map +0 -7
- package/dist/lib/node-esm/index.mjs +0 -22
- package/dist/lib/node-esm/index.mjs.map +0 -7
- package/dist/lib/node-esm/meta.json +0 -1
- package/dist/lib/node-esm/testing/index.mjs +0 -143
- package/dist/lib/node-esm/testing/index.mjs.map +0 -7
package/package.json
CHANGED
|
@@ -1,23 +1,27 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dxos/messaging",
|
|
3
|
-
"version": "0.8.4-main.
|
|
3
|
+
"version": "0.8.4-main.bcb3aa67d6",
|
|
4
4
|
"description": "Messaging",
|
|
5
5
|
"homepage": "https://dxos.org",
|
|
6
6
|
"bugs": "https://github.com/dxos/dxos/issues",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/dxos/dxos"
|
|
10
|
+
},
|
|
7
11
|
"license": "MIT",
|
|
8
12
|
"author": "DXOS.org",
|
|
9
|
-
"sideEffects":
|
|
13
|
+
"sideEffects": false,
|
|
10
14
|
"type": "module",
|
|
11
15
|
"exports": {
|
|
12
16
|
".": {
|
|
17
|
+
"source": "./src/index.ts",
|
|
13
18
|
"types": "./dist/types/src/index.d.ts",
|
|
14
|
-
"
|
|
15
|
-
"node": "./dist/lib/node-esm/index.mjs"
|
|
19
|
+
"default": "./dist/lib/neutral/index.mjs"
|
|
16
20
|
},
|
|
17
21
|
"./testing": {
|
|
22
|
+
"source": "./src/testing/index.ts",
|
|
18
23
|
"types": "./dist/types/src/testing/index.d.ts",
|
|
19
|
-
"
|
|
20
|
-
"node": "./dist/lib/node-esm/testing/index.mjs"
|
|
24
|
+
"default": "./dist/lib/neutral/testing/index.mjs"
|
|
21
25
|
}
|
|
22
26
|
},
|
|
23
27
|
"types": "dist/types/src/index.d.ts",
|
|
@@ -35,24 +39,24 @@
|
|
|
35
39
|
],
|
|
36
40
|
"dependencies": {
|
|
37
41
|
"isomorphic-ws": "^5.0.0",
|
|
38
|
-
"ws": "^8.
|
|
39
|
-
"@dxos/
|
|
40
|
-
"@dxos/
|
|
41
|
-
"@dxos/context": "0.8.4-main.
|
|
42
|
-
"@dxos/edge-client": "0.8.4-main.
|
|
43
|
-
"@dxos/
|
|
44
|
-
"@dxos/
|
|
45
|
-
"@dxos/
|
|
46
|
-
"@dxos/
|
|
47
|
-
"@dxos/protocols": "0.8.4-main.
|
|
48
|
-
"@dxos/tracing": "0.8.4-main.
|
|
49
|
-
"@dxos/util": "0.8.4-main.
|
|
50
|
-
"@dxos/rpc": "0.8.4-main.
|
|
42
|
+
"ws": "^8.17.1",
|
|
43
|
+
"@dxos/codec-protobuf": "0.8.4-main.bcb3aa67d6",
|
|
44
|
+
"@dxos/async": "0.8.4-main.bcb3aa67d6",
|
|
45
|
+
"@dxos/context": "0.8.4-main.bcb3aa67d6",
|
|
46
|
+
"@dxos/edge-client": "0.8.4-main.bcb3aa67d6",
|
|
47
|
+
"@dxos/keys": "0.8.4-main.bcb3aa67d6",
|
|
48
|
+
"@dxos/node-std": "0.8.4-main.bcb3aa67d6",
|
|
49
|
+
"@dxos/invariant": "0.8.4-main.bcb3aa67d6",
|
|
50
|
+
"@dxos/log": "0.8.4-main.bcb3aa67d6",
|
|
51
|
+
"@dxos/protocols": "0.8.4-main.bcb3aa67d6",
|
|
52
|
+
"@dxos/tracing": "0.8.4-main.bcb3aa67d6",
|
|
53
|
+
"@dxos/util": "0.8.4-main.bcb3aa67d6",
|
|
54
|
+
"@dxos/rpc": "0.8.4-main.bcb3aa67d6"
|
|
51
55
|
},
|
|
52
56
|
"devDependencies": {
|
|
53
|
-
"@dxos/keyring": "0.8.4-main.
|
|
54
|
-
"@dxos/signal": "0.8.4-main.
|
|
55
|
-
"@dxos/test-utils": "0.8.4-main.
|
|
57
|
+
"@dxos/keyring": "0.8.4-main.bcb3aa67d6",
|
|
58
|
+
"@dxos/signal": "0.8.4-main.bcb3aa67d6",
|
|
59
|
+
"@dxos/test-utils": "0.8.4-main.bcb3aa67d6"
|
|
56
60
|
},
|
|
57
61
|
"publishConfig": {
|
|
58
62
|
"access": "public"
|
|
@@ -2,14 +2,15 @@
|
|
|
2
2
|
// Copyright 2024 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import { describe, expect,
|
|
5
|
+
import { describe, expect, onTestFinished, test } from 'vitest';
|
|
6
6
|
|
|
7
7
|
import { asyncTimeout, latch, sleep } from '@dxos/async';
|
|
8
|
+
import { Context } from '@dxos/context';
|
|
8
9
|
import { range } from '@dxos/util';
|
|
9
10
|
|
|
10
11
|
import { WebsocketSignalManager } from './signal-manager';
|
|
11
12
|
import { type Message } from './signal-methods';
|
|
12
|
-
import {
|
|
13
|
+
import { PAYLOAD_1, PAYLOAD_2, PAYLOAD_3, TestBuilder, messageEqual } from './testing';
|
|
13
14
|
|
|
14
15
|
export const messengerTests = (signalManagerFactory: TestBuilder['createSignalManager']) => {
|
|
15
16
|
test('Message between peers', async () => {
|
|
@@ -30,7 +31,7 @@ export const messengerTests = (signalManagerFactory: TestBuilder['createSignalMa
|
|
|
30
31
|
|
|
31
32
|
const promise = peer2.waitTillReceive(message);
|
|
32
33
|
|
|
33
|
-
await peer1.messenger.sendMessage(message);
|
|
34
|
+
await peer1.messenger.sendMessage(Context.default(), message);
|
|
34
35
|
|
|
35
36
|
await promise;
|
|
36
37
|
});
|
|
@@ -52,7 +53,7 @@ export const messengerTests = (signalManagerFactory: TestBuilder['createSignalMa
|
|
|
52
53
|
};
|
|
53
54
|
|
|
54
55
|
const promise = peer2.waitTillReceive(message);
|
|
55
|
-
await peer1.messenger.sendMessage(message);
|
|
56
|
+
await peer1.messenger.sendMessage(Context.default(), message);
|
|
56
57
|
await asyncTimeout(promise, 1_000);
|
|
57
58
|
}
|
|
58
59
|
|
|
@@ -64,7 +65,7 @@ export const messengerTests = (signalManagerFactory: TestBuilder['createSignalMa
|
|
|
64
65
|
};
|
|
65
66
|
|
|
66
67
|
const promise = peer3.waitTillReceive(message);
|
|
67
|
-
await peer1.messenger.sendMessage(message);
|
|
68
|
+
await peer1.messenger.sendMessage(Context.default(), message);
|
|
68
69
|
await asyncTimeout(promise, 1_000);
|
|
69
70
|
}
|
|
70
71
|
|
|
@@ -76,7 +77,7 @@ export const messengerTests = (signalManagerFactory: TestBuilder['createSignalMa
|
|
|
76
77
|
};
|
|
77
78
|
|
|
78
79
|
const promise = peer1.waitTillReceive(message);
|
|
79
|
-
await peer2.messenger.sendMessage(message);
|
|
80
|
+
await peer2.messenger.sendMessage(Context.default(), message);
|
|
80
81
|
await asyncTimeout(promise, 1_000);
|
|
81
82
|
}
|
|
82
83
|
});
|
|
@@ -128,7 +129,7 @@ export const messengerTests = (signalManagerFactory: TestBuilder['createSignalMa
|
|
|
128
129
|
};
|
|
129
130
|
const promise = peer2.waitTillReceive(message);
|
|
130
131
|
|
|
131
|
-
await peer1.messenger.sendMessage(message);
|
|
132
|
+
await peer1.messenger.sendMessage(Context.default(), message);
|
|
132
133
|
|
|
133
134
|
// 3 listeners (default one that was returned by setupPeer() and 2 that listen for type "1") should receive message.
|
|
134
135
|
await asyncTimeout(promise, 1_000);
|
|
@@ -175,7 +176,7 @@ export const messengerTests = (signalManagerFactory: TestBuilder['createSignalMa
|
|
|
175
176
|
};
|
|
176
177
|
|
|
177
178
|
const receivePromise = peer2.waitTillReceive(message);
|
|
178
|
-
await peer1.messenger.sendMessage(message);
|
|
179
|
+
await peer1.messenger.sendMessage(Context.default(), message);
|
|
179
180
|
|
|
180
181
|
// 2 subscribed listeners should receive message.
|
|
181
182
|
await asyncTimeout(receivePromise, 1_000);
|
|
@@ -195,7 +196,7 @@ export const messengerTests = (signalManagerFactory: TestBuilder['createSignalMa
|
|
|
195
196
|
};
|
|
196
197
|
|
|
197
198
|
const receivePromise = peer2.waitTillReceive(message);
|
|
198
|
-
await peer1.messenger.sendMessage(message);
|
|
199
|
+
await peer1.messenger.sendMessage(Context.default(), message);
|
|
199
200
|
|
|
200
201
|
// 1 listener that was not unsubscribed should receive message.
|
|
201
202
|
await asyncTimeout(receivePromise, 1_000);
|
|
@@ -221,7 +222,7 @@ export const messengerTests = (signalManagerFactory: TestBuilder['createSignalMa
|
|
|
221
222
|
|
|
222
223
|
{
|
|
223
224
|
const receivePromise = peer2.waitTillReceive(message);
|
|
224
|
-
await peer1.messenger.sendMessage(message);
|
|
225
|
+
await peer1.messenger.sendMessage(Context.default(), message);
|
|
225
226
|
await asyncTimeout(receivePromise, 1_000);
|
|
226
227
|
}
|
|
227
228
|
|
|
@@ -236,7 +237,7 @@ export const messengerTests = (signalManagerFactory: TestBuilder['createSignalMa
|
|
|
236
237
|
|
|
237
238
|
{
|
|
238
239
|
const receivePromise = peer2.waitTillReceive(message);
|
|
239
|
-
await peer1.messenger.sendMessage(message);
|
|
240
|
+
await peer1.messenger.sendMessage(Context.default(), message);
|
|
240
241
|
await asyncTimeout(receivePromise, 1_000);
|
|
241
242
|
}
|
|
242
243
|
});
|
|
@@ -275,7 +276,7 @@ export const messengerTests = (signalManagerFactory: TestBuilder['createSignalMa
|
|
|
275
276
|
Array(3)
|
|
276
277
|
.fill(0)
|
|
277
278
|
.forEach(async () => {
|
|
278
|
-
await peer2.messenger.sendMessage(message);
|
|
279
|
+
await peer2.messenger.sendMessage(Context.default(), message);
|
|
279
280
|
});
|
|
280
281
|
|
|
281
282
|
// expect to receive 3 messages.
|
|
@@ -302,7 +303,7 @@ export const messengerTests = (signalManagerFactory: TestBuilder['createSignalMa
|
|
|
302
303
|
count = inc();
|
|
303
304
|
});
|
|
304
305
|
// sending message.
|
|
305
|
-
await peer2.messenger.sendMessage({
|
|
306
|
+
await peer2.messenger.sendMessage(Context.default(), {
|
|
306
307
|
author: peer2.peerInfo,
|
|
307
308
|
recipient: peer1.peerInfo,
|
|
308
309
|
payload: PAYLOAD_1,
|
|
@@ -322,7 +323,7 @@ export const messengerTests = (signalManagerFactory: TestBuilder['createSignalMa
|
|
|
322
323
|
void range(100).map(async () => {
|
|
323
324
|
const peer = await builder.createPeer();
|
|
324
325
|
|
|
325
|
-
void peer.messenger.sendMessage({
|
|
326
|
+
void peer.messenger.sendMessage(Context.default(), {
|
|
326
327
|
author: peer.peerInfo,
|
|
327
328
|
recipient: peer.peerInfo,
|
|
328
329
|
payload: {
|
|
@@ -2,48 +2,17 @@
|
|
|
2
2
|
// Copyright 2022 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
import { asyncTimeout } from '@dxos/async';
|
|
8
|
-
import { runTestSignalServer, type SignalServerRunner } from '@dxos/signal';
|
|
5
|
+
import { beforeEach, describe } from 'vitest';
|
|
9
6
|
|
|
10
7
|
import { messengerTests } from './messenger.blueprint-test';
|
|
11
|
-
import {
|
|
12
|
-
import { type Message } from './signal-methods';
|
|
13
|
-
import { PAYLOAD_1, TestBuilder } from './testing';
|
|
8
|
+
import { MemorySignalManager, MemorySignalManagerContext } from './signal-manager';
|
|
14
9
|
|
|
10
|
+
// TODO(mykola): Use EDGE signal server.
|
|
15
11
|
describe('Messenger with WebsocketSignalManager', () => {
|
|
16
|
-
let
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
broker = await runTestSignalServer();
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
afterAll(() => {
|
|
23
|
-
void broker.stop();
|
|
12
|
+
let context: MemorySignalManagerContext;
|
|
13
|
+
beforeEach(async () => {
|
|
14
|
+
context = new MemorySignalManagerContext();
|
|
24
15
|
});
|
|
25
16
|
|
|
26
|
-
messengerTests(async () => new
|
|
27
|
-
|
|
28
|
-
test('Message with broken signal server', { timeout: 1000 }, async () => {
|
|
29
|
-
const builder = new TestBuilder({
|
|
30
|
-
signalManagerFactory: async () =>
|
|
31
|
-
new WebsocketSignalManager([{ server: 'ws://broken.kube.' }, { server: broker.url() }]),
|
|
32
|
-
});
|
|
33
|
-
onTestFinished(() => builder.close());
|
|
34
|
-
const peer1 = await builder.createPeer();
|
|
35
|
-
const peer2 = await builder.createPeer();
|
|
36
|
-
|
|
37
|
-
const message: Message = {
|
|
38
|
-
author: peer1.peerInfo,
|
|
39
|
-
recipient: peer2.peerInfo,
|
|
40
|
-
payload: PAYLOAD_1,
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
{
|
|
44
|
-
const receivePromise = peer2.waitTillReceive(message);
|
|
45
|
-
await peer1.messenger.sendMessage(message);
|
|
46
|
-
await asyncTimeout(receivePromise, 1_000);
|
|
47
|
-
}
|
|
48
|
-
});
|
|
17
|
+
messengerTests(async () => new MemorySignalManager(context));
|
|
49
18
|
});
|
package/src/messenger.ts
CHANGED
|
@@ -15,7 +15,7 @@ import { ComplexMap, ComplexSet } from '@dxos/util';
|
|
|
15
15
|
|
|
16
16
|
import { MessengerMonitor } from './messenger-monitor';
|
|
17
17
|
import { type SignalManager } from './signal-manager';
|
|
18
|
-
import { type
|
|
18
|
+
import { type Message, type PeerInfo } from './signal-methods';
|
|
19
19
|
import { MESSAGE_TIMEOUT } from './timeouts';
|
|
20
20
|
|
|
21
21
|
export type OnMessage = (params: Message) => Promise<void>;
|
|
@@ -101,7 +101,7 @@ export class Messenger {
|
|
|
101
101
|
await this._ctx.dispose();
|
|
102
102
|
}
|
|
103
103
|
|
|
104
|
-
async sendMessage({ author, recipient, payload }: Message): Promise<void> {
|
|
104
|
+
async sendMessage(ctx: Context, { author, recipient, payload }: Message): Promise<void> {
|
|
105
105
|
invariant(!this._closed, 'Closed');
|
|
106
106
|
const messageContext = this._ctx.derive();
|
|
107
107
|
|
|
@@ -127,7 +127,7 @@ export class Messenger {
|
|
|
127
127
|
async () => {
|
|
128
128
|
log('retrying message', { messageId: reliablePayload.messageId });
|
|
129
129
|
sendAttempts++;
|
|
130
|
-
await this._encodeAndSend({ author, recipient, reliablePayload }).catch((err) =>
|
|
130
|
+
await this._encodeAndSend(ctx, { author, recipient, reliablePayload }).catch((err) =>
|
|
131
131
|
log('failed to send message', { err }),
|
|
132
132
|
);
|
|
133
133
|
},
|
|
@@ -140,10 +140,10 @@ export class Messenger {
|
|
|
140
140
|
log('message not delivered', { messageId: reliablePayload.messageId });
|
|
141
141
|
this._onAckCallbacks.delete(reliablePayload.messageId!);
|
|
142
142
|
timeoutHit(
|
|
143
|
-
new ProtocolTimeoutError(
|
|
144
|
-
'signaling message not delivered',
|
|
145
|
-
new TimeoutError(MESSAGE_TIMEOUT, 'Message not delivered'),
|
|
146
|
-
),
|
|
143
|
+
new ProtocolTimeoutError({
|
|
144
|
+
message: 'signaling message not delivered',
|
|
145
|
+
cause: new TimeoutError(MESSAGE_TIMEOUT, 'Message not delivered'),
|
|
146
|
+
}),
|
|
147
147
|
);
|
|
148
148
|
void messageContext.dispose();
|
|
149
149
|
this._monitor.recordReliableMessage({ sendAttempts, sent: false });
|
|
@@ -158,7 +158,7 @@ export class Messenger {
|
|
|
158
158
|
this._monitor.recordReliableMessage({ sendAttempts, sent: true });
|
|
159
159
|
});
|
|
160
160
|
|
|
161
|
-
await this._encodeAndSend({ author, recipient, reliablePayload });
|
|
161
|
+
await this._encodeAndSend(ctx, { author, recipient, reliablePayload });
|
|
162
162
|
return promise;
|
|
163
163
|
}
|
|
164
164
|
|
|
@@ -204,16 +204,19 @@ export class Messenger {
|
|
|
204
204
|
};
|
|
205
205
|
}
|
|
206
206
|
|
|
207
|
-
private async _encodeAndSend(
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
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
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
278
|
+
private async _sendAcknowledgement(
|
|
279
|
+
ctx: Context,
|
|
280
|
+
{
|
|
281
|
+
author,
|
|
282
|
+
recipient,
|
|
283
|
+
messageId,
|
|
284
|
+
}: {
|
|
285
|
+
author: PeerInfo;
|
|
286
|
+
recipient: PeerInfo;
|
|
287
|
+
messageId: PublicKey;
|
|
288
|
+
},
|
|
289
|
+
): Promise<void> {
|
|
284
290
|
log('sending ACK', { messageId, from: recipient, to: author });
|
|
285
291
|
|
|
286
|
-
await this._signalManager.sendMessage({
|
|
292
|
+
await this._signalManager.sendMessage(ctx, {
|
|
287
293
|
author: recipient,
|
|
288
294
|
recipient: author,
|
|
289
295
|
payload: {
|
|
@@ -2,19 +2,21 @@
|
|
|
2
2
|
// Copyright 2020 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import { afterAll, beforeAll, describe, expect,
|
|
5
|
+
import { afterAll, beforeAll, describe, expect, onTestFinished, test } from 'vitest';
|
|
6
6
|
|
|
7
7
|
import { asyncTimeout, waitForCondition } from '@dxos/async';
|
|
8
8
|
import { type Any, type TaggedType } from '@dxos/codec-protobuf';
|
|
9
|
+
import { Context } from '@dxos/context';
|
|
9
10
|
import { PublicKey } from '@dxos/keys';
|
|
10
11
|
import { log } from '@dxos/log';
|
|
11
12
|
import { type TYPES } from '@dxos/protocols/proto';
|
|
12
|
-
import {
|
|
13
|
+
import { type SignalServerRunner, runTestSignalServer } from '@dxos/signal';
|
|
13
14
|
import { ComplexSet, range } from '@dxos/util';
|
|
14
15
|
|
|
15
|
-
import { SignalClient } from './signal-client';
|
|
16
16
|
import { type Message, type PeerInfo } from '../signal-methods';
|
|
17
17
|
|
|
18
|
+
import { SignalClient } from './signal-client';
|
|
19
|
+
|
|
18
20
|
const PAYLOAD: TaggedType<TYPES, 'google.protobuf.Any'> = {
|
|
19
21
|
'@type': 'google.protobuf.Any',
|
|
20
22
|
type_url: 'google.protobuf.Any',
|
|
@@ -42,7 +44,7 @@ describe('SignalClient', () => {
|
|
|
42
44
|
|
|
43
45
|
const message = createMessage(peer2, peer1);
|
|
44
46
|
const receivedMessage = peer1.waitForNextMessage();
|
|
45
|
-
await peer2.client.sendMessage(message);
|
|
47
|
+
await peer2.client.sendMessage(Context.default(), message);
|
|
46
48
|
expect(await receivedMessage).toEqual(message);
|
|
47
49
|
});
|
|
48
50
|
|
|
@@ -50,8 +52,8 @@ describe('SignalClient', () => {
|
|
|
50
52
|
const topic = PublicKey.random();
|
|
51
53
|
const [peer1, peer2] = setupPeers({ peerCount: 2 });
|
|
52
54
|
|
|
53
|
-
await peer1.client.join({ topic, peer: peer1.peerInfo });
|
|
54
|
-
await peer2.client.join({ topic, peer: peer2.peerInfo });
|
|
55
|
+
await peer1.client.join(Context.default(), { topic, peer: peer1.peerInfo });
|
|
56
|
+
await peer2.client.join(Context.default(), { topic, peer: peer2.peerInfo });
|
|
55
57
|
|
|
56
58
|
await peer1.waitForPeer(peer2.peerKey);
|
|
57
59
|
await peer2.waitForPeer(peer1.peerKey);
|
|
@@ -66,7 +68,7 @@ describe('SignalClient', () => {
|
|
|
66
68
|
const message = createMessage(peer2, peer1);
|
|
67
69
|
const receivedMessage = peer1.waitForNextMessage();
|
|
68
70
|
|
|
69
|
-
await peer1.client.sendMessage(message);
|
|
71
|
+
await peer1.client.sendMessage(Context.default(), message);
|
|
70
72
|
expect(await receivedMessage).toEqual(message);
|
|
71
73
|
});
|
|
72
74
|
|
|
@@ -81,7 +83,7 @@ describe('SignalClient', () => {
|
|
|
81
83
|
|
|
82
84
|
{
|
|
83
85
|
const receivedMessage = peer1.waitForNextMessage({ timeout: 1_000 });
|
|
84
|
-
await peer2.client.sendMessage(message);
|
|
86
|
+
await peer2.client.sendMessage(Context.default(), message);
|
|
85
87
|
expect(await receivedMessage).toEqual(message);
|
|
86
88
|
}
|
|
87
89
|
|
|
@@ -90,7 +92,7 @@ describe('SignalClient', () => {
|
|
|
90
92
|
|
|
91
93
|
{
|
|
92
94
|
const receivedMessage = peer1.waitForNextMessage({ timeout: 200 });
|
|
93
|
-
await peer2.client.sendMessage(message);
|
|
95
|
+
await peer2.client.sendMessage(Context.default(), message);
|
|
94
96
|
await expect(receivedMessage).rejects.toBeDefined();
|
|
95
97
|
}
|
|
96
98
|
});
|
|
@@ -105,7 +107,7 @@ describe('SignalClient', () => {
|
|
|
105
107
|
|
|
106
108
|
{
|
|
107
109
|
const waitMessage = peer1.waitForNextMessage();
|
|
108
|
-
await peer2.client.sendMessage(message);
|
|
110
|
+
await peer2.client.sendMessage(Context.default(), message);
|
|
109
111
|
expect(await waitMessage).toEqual(message);
|
|
110
112
|
}
|
|
111
113
|
|
|
@@ -119,7 +121,7 @@ describe('SignalClient', () => {
|
|
|
119
121
|
|
|
120
122
|
{
|
|
121
123
|
const waitMessage = peer1.waitForNextMessage();
|
|
122
|
-
await peer2.client.sendMessage(message);
|
|
124
|
+
await peer2.client.sendMessage(Context.default(), message);
|
|
123
125
|
expect(await waitMessage).toEqual(message);
|
|
124
126
|
}
|
|
125
127
|
});
|
|
@@ -3,26 +3,27 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
import { DeferredTask, Event, Trigger, scheduleTask, scheduleTaskInterval, sleep } from '@dxos/async';
|
|
6
|
-
import { type Context,
|
|
6
|
+
import { type Context, Resource, cancelWithContext } from '@dxos/context';
|
|
7
7
|
import { invariant } from '@dxos/invariant';
|
|
8
8
|
import { PublicKey } from '@dxos/keys';
|
|
9
9
|
import { log } from '@dxos/log';
|
|
10
10
|
import { trace } from '@dxos/protocols';
|
|
11
11
|
import { type SwarmResponse } from '@dxos/protocols/proto/dxos/edge/messenger';
|
|
12
|
-
import { type
|
|
12
|
+
import { type JoinRequest, type LeaveRequest, type QueryRequest } from '@dxos/protocols/proto/dxos/edge/signal';
|
|
13
13
|
import { SignalState } from '@dxos/protocols/proto/dxos/mesh/signal';
|
|
14
14
|
|
|
15
|
-
import { SignalClientMonitor } from './signal-client-monitor';
|
|
16
|
-
import { SignalLocalState } from './signal-local-state';
|
|
17
|
-
import { SignalRPCClient } from './signal-rpc-client';
|
|
18
15
|
import {
|
|
19
|
-
type PeerInfo,
|
|
20
16
|
type Message,
|
|
17
|
+
type PeerInfo,
|
|
21
18
|
type SignalClientMethods,
|
|
22
19
|
type SignalStatus,
|
|
23
20
|
type SwarmEvent,
|
|
24
21
|
} from '../signal-methods';
|
|
25
22
|
|
|
23
|
+
import { SignalClientMonitor } from './signal-client-monitor';
|
|
24
|
+
import { SignalLocalState } from './signal-local-state';
|
|
25
|
+
import { SignalRPCClient } from './signal-rpc-client';
|
|
26
|
+
|
|
26
27
|
const DEFAULT_RECONNECT_TIMEOUT = 100;
|
|
27
28
|
const MAX_RECONNECT_TIMEOUT = 5_000;
|
|
28
29
|
const ERROR_RECONCILE_DELAY = 1_000;
|
|
@@ -172,24 +173,24 @@ export class SignalClient extends Resource implements SignalClientMethods {
|
|
|
172
173
|
};
|
|
173
174
|
}
|
|
174
175
|
|
|
175
|
-
async join(args: JoinRequest): Promise<void> {
|
|
176
|
+
async join(_ctx: Context, args: JoinRequest): Promise<void> {
|
|
176
177
|
log('joining', { topic: args.topic, peerId: args.peer.peerKey });
|
|
177
178
|
this._monitor.recordJoin();
|
|
178
179
|
this.localState.join({ topic: args.topic, peerId: PublicKey.from(args.peer.peerKey) });
|
|
179
180
|
this._reconcileTask?.schedule();
|
|
180
181
|
}
|
|
181
182
|
|
|
182
|
-
async leave(args: LeaveRequest): Promise<void> {
|
|
183
|
+
async leave(_ctx: Context, args: LeaveRequest): Promise<void> {
|
|
183
184
|
log('leaving', { topic: args.topic, peerId: args.peer.peerKey });
|
|
184
185
|
this._monitor.recordLeave();
|
|
185
186
|
this.localState.leave({ topic: args.topic, peerId: PublicKey.from(args.peer.peerKey) });
|
|
186
187
|
}
|
|
187
188
|
|
|
188
|
-
async query(params: QueryRequest): Promise<SwarmResponse> {
|
|
189
|
+
async query(_ctx: Context, params: QueryRequest): Promise<SwarmResponse> {
|
|
189
190
|
throw new Error('Not implemented');
|
|
190
191
|
}
|
|
191
192
|
|
|
192
|
-
async sendMessage(msg: Message): Promise<void> {
|
|
193
|
+
async sendMessage(_ctx: Context, msg: Message): Promise<void> {
|
|
193
194
|
return this._monitor.recordMessageSending(msg, async () => {
|
|
194
195
|
await this._clientReady.wait();
|
|
195
196
|
invariant(this._state === SignalState.CONNECTED, 'Not connected to Signal Server');
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
// Copyright 2024 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import {
|
|
5
|
+
import { Event, asyncTimeout } from '@dxos/async';
|
|
6
6
|
import type { Stream } from '@dxos/codec-protobuf/stream';
|
|
7
|
-
import {
|
|
7
|
+
import { type Context, cancelWithContext } from '@dxos/context';
|
|
8
8
|
import { PublicKey } from '@dxos/keys';
|
|
9
9
|
import { log } from '@dxos/log';
|
|
10
10
|
import {
|
|
@@ -13,9 +13,10 @@ import {
|
|
|
13
13
|
} from '@dxos/protocols/proto/dxos/mesh/signal';
|
|
14
14
|
import { ComplexMap, ComplexSet, safeAwaitAll } from '@dxos/util';
|
|
15
15
|
|
|
16
|
-
import { type SignalRPCClient } from './signal-rpc-client';
|
|
17
16
|
import type { Message, SwarmEvent } from '../signal-methods';
|
|
18
17
|
|
|
18
|
+
import { type SignalRPCClient } from './signal-rpc-client';
|
|
19
|
+
|
|
19
20
|
export class SignalLocalState {
|
|
20
21
|
/**
|
|
21
22
|
* Swarm events streams. Keys represent actually joined topic and peerId.
|
|
@@ -9,7 +9,7 @@ import { PublicKey } from '@dxos/keys';
|
|
|
9
9
|
import { log } from '@dxos/log';
|
|
10
10
|
import { schema } from '@dxos/protocols/proto';
|
|
11
11
|
import { type Message as SignalMessage, type SwarmEvent } from '@dxos/protocols/proto/dxos/mesh/signal';
|
|
12
|
-
import {
|
|
12
|
+
import { type SignalServerRunner, runTestSignalServer } from '@dxos/signal';
|
|
13
13
|
|
|
14
14
|
import { SignalRPCClient } from './signal-rpc-client';
|
|
15
15
|
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
import WebSocket from 'isomorphic-ws';
|
|
6
6
|
|
|
7
|
-
import {
|
|
7
|
+
import { TimeoutError, Trigger, scheduleTaskInterval } from '@dxos/async';
|
|
8
8
|
import { type Any, type Stream } from '@dxos/codec-protobuf';
|
|
9
9
|
import { Context } from '@dxos/context';
|
|
10
10
|
import { invariant } from '@dxos/invariant';
|
|
@@ -12,8 +12,8 @@ import { PublicKey } from '@dxos/keys';
|
|
|
12
12
|
import { log } from '@dxos/log';
|
|
13
13
|
import { trace } from '@dxos/protocols';
|
|
14
14
|
import { schema } from '@dxos/protocols/proto';
|
|
15
|
-
import { type Message as SignalMessage
|
|
16
|
-
import {
|
|
15
|
+
import { type Signal, type Message as SignalMessage } from '@dxos/protocols/proto/dxos/mesh/signal';
|
|
16
|
+
import { type ProtoRpcPeer, createProtoRpcPeer } from '@dxos/rpc';
|
|
17
17
|
|
|
18
18
|
import { SignalRpcClientMonitor } from './signal-rpc-client-monitor';
|
|
19
19
|
|
|
@@ -36,7 +36,7 @@ export type SignalCallbacks = {
|
|
|
36
36
|
getMetadata?: () => any;
|
|
37
37
|
};
|
|
38
38
|
|
|
39
|
-
export type
|
|
39
|
+
export type SignalRPCClientProps = {
|
|
40
40
|
url: string;
|
|
41
41
|
callbacks?: SignalCallbacks;
|
|
42
42
|
};
|
|
@@ -61,7 +61,7 @@ export class SignalRPCClient {
|
|
|
61
61
|
|
|
62
62
|
private readonly _monitor = new SignalRpcClientMonitor();
|
|
63
63
|
|
|
64
|
-
constructor({ url, callbacks = {} }:
|
|
64
|
+
constructor({ url, callbacks = {} }: SignalRPCClientProps) {
|
|
65
65
|
const traceId = PublicKey.random().toHex();
|
|
66
66
|
log.trace('dxos.mesh.signal-rpc-client.constructor', trace.begin({ id: traceId }));
|
|
67
67
|
this._url = url;
|