@dxos/network-manager 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.
- package/dist/lib/chunk-wire-protocol.mjs +3554 -0
- package/dist/lib/chunk-wire-protocol.mjs.map +1 -0
- package/dist/lib/index.mjs +294 -0
- package/dist/lib/index.mjs.map +1 -0
- package/dist/lib/testing.mjs +237 -0
- package/dist/lib/testing.mjs.map +1 -0
- package/dist/lib/transport/tcp/tcp-transport.browser.mjs +34 -0
- package/dist/lib/transport/tcp/tcp-transport.browser.mjs.map +1 -0
- package/dist/lib/transport/tcp/tcp-transport.mjs +140 -0
- package/dist/lib/transport/tcp/tcp-transport.mjs.map +1 -0
- package/dist/lib/transport/tcp.mjs +1 -0
- package/dist/types/src/network-manager.d.ts +9 -0
- package/dist/types/src/network-manager.d.ts.map +1 -1
- package/dist/types/src/signal/swarm-messenger.d.ts +2 -7
- package/dist/types/src/signal/swarm-messenger.d.ts.map +1 -1
- package/dist/types/src/testing/test-builder.d.ts +2 -6
- package/dist/types/src/testing/test-builder.d.ts.map +1 -1
- package/dist/types/src/transport/webrtc/rtc-peer-connection.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +28 -31
- package/src/network-manager.ts +17 -4
- package/src/signal/integration.node.test.ts +7 -11
- package/src/signal/swarm-messenger.node.test.ts +7 -29
- package/src/signal/swarm-messenger.ts +3 -13
- package/src/swarm/swarm.test.ts +2 -2
- package/src/testing/test-builder.ts +48 -75
- package/src/tests/webrtc-transport.test.ts +4 -15
- package/src/transport/webrtc/rtc-peer-connection.ts +0 -3
- package/src/transport/webrtc/rtc-transport-proxy.test.ts +2 -1
- package/src/transport/webrtc/rtc-transport.test.ts +2 -1
- package/dist/lib/browser/chunk-ERB3AQAF.mjs +0 -3095
- package/dist/lib/browser/chunk-ERB3AQAF.mjs.map +0 -7
- package/dist/lib/browser/index.mjs +0 -244
- package/dist/lib/browser/index.mjs.map +0 -7
- package/dist/lib/browser/meta.json +0 -1
- package/dist/lib/browser/testing/index.mjs +0 -280
- package/dist/lib/browser/testing/index.mjs.map +0 -7
- package/dist/lib/browser/transport/tcp/index.mjs +0 -5
- package/dist/lib/browser/transport/tcp/index.mjs.map +0 -7
- package/dist/lib/browser/transport/tcp/tcp-transport.browser.mjs +0 -36
- package/dist/lib/browser/transport/tcp/tcp-transport.browser.mjs.map +0 -7
- package/dist/lib/browser/transport/tcp/tcp-transport.mjs +0 -125
- package/dist/lib/browser/transport/tcp/tcp-transport.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-KYLPLEZQ.mjs +0 -3095
- package/dist/lib/node-esm/chunk-KYLPLEZQ.mjs.map +0 -7
- package/dist/lib/node-esm/index.mjs +0 -244
- 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 -280
- package/dist/lib/node-esm/testing/index.mjs.map +0 -7
- package/dist/lib/node-esm/transport/tcp/index.mjs +0 -5
- package/dist/lib/node-esm/transport/tcp/index.mjs.map +0 -7
- package/dist/lib/node-esm/transport/tcp/tcp-transport.browser.mjs +0 -36
- package/dist/lib/node-esm/transport/tcp/tcp-transport.browser.mjs.map +0 -7
- package/dist/lib/node-esm/transport/tcp/tcp-transport.mjs +0 -125
- package/dist/lib/node-esm/transport/tcp/tcp-transport.mjs.map +0 -7
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dxos/network-manager",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.1",
|
|
4
4
|
"description": "Network Manager",
|
|
5
5
|
"homepage": "https://dxos.org",
|
|
6
6
|
"bugs": "https://github.com/dxos/dxos/issues",
|
|
@@ -26,10 +26,10 @@
|
|
|
26
26
|
"#tcp-transport": {
|
|
27
27
|
"source": "./src/transport/tcp/index.ts",
|
|
28
28
|
"types": "./dist/types/src/transport/tcp/index.d.ts",
|
|
29
|
-
"browser": "./dist/lib/
|
|
30
|
-
"node": "./dist/lib/
|
|
31
|
-
"import": "./dist/lib/
|
|
32
|
-
"require": "./dist/lib/
|
|
29
|
+
"browser": "./dist/lib/transport/tcp.mjs",
|
|
30
|
+
"node": "./dist/lib/transport/tcp.mjs",
|
|
31
|
+
"import": "./dist/lib/transport/tcp.mjs",
|
|
32
|
+
"require": "./dist/lib/transport/tcp.mjs"
|
|
33
33
|
},
|
|
34
34
|
"#tcp-transport-impl": {
|
|
35
35
|
"source": {
|
|
@@ -37,28 +37,25 @@
|
|
|
37
37
|
"default": "./src/transport/tcp/tcp-transport.ts"
|
|
38
38
|
},
|
|
39
39
|
"types": "./dist/types/src/transport/tcp/tcp-transport.d.ts",
|
|
40
|
-
"browser": "./dist/lib/
|
|
41
|
-
"default": "./dist/lib/
|
|
40
|
+
"browser": "./dist/lib/transport/tcp/tcp-transport.browser.mjs",
|
|
41
|
+
"default": "./dist/lib/transport/tcp/tcp-transport.mjs"
|
|
42
42
|
}
|
|
43
43
|
},
|
|
44
44
|
"exports": {
|
|
45
45
|
".": {
|
|
46
46
|
"source": "./src/index.ts",
|
|
47
47
|
"types": "./dist/types/src/index.d.ts",
|
|
48
|
-
"
|
|
49
|
-
"node": "./dist/lib/node-esm/index.mjs"
|
|
48
|
+
"import": "./dist/lib/index.mjs"
|
|
50
49
|
},
|
|
51
50
|
"./testing": {
|
|
52
51
|
"source": "./src/testing/index.ts",
|
|
53
52
|
"types": "./dist/types/src/testing/index.d.ts",
|
|
54
|
-
"
|
|
55
|
-
"node": "./dist/lib/node-esm/testing/index.mjs"
|
|
53
|
+
"import": "./dist/lib/testing.mjs"
|
|
56
54
|
},
|
|
57
55
|
"./transport/tcp": {
|
|
58
56
|
"source": "./src/transport/tcp/index.ts",
|
|
59
57
|
"types": "./dist/types/src/transport/tcp/index.d.ts",
|
|
60
|
-
"
|
|
61
|
-
"node": "./dist/lib/node-esm/transport/tcp/index.mjs"
|
|
58
|
+
"import": "./dist/lib/transport/tcp.mjs"
|
|
62
59
|
}
|
|
63
60
|
},
|
|
64
61
|
"types": "dist/types/src/index.d.ts",
|
|
@@ -70,27 +67,27 @@
|
|
|
70
67
|
"src"
|
|
71
68
|
],
|
|
72
69
|
"dependencies": {
|
|
73
|
-
"
|
|
74
|
-
"
|
|
75
|
-
"@dxos/async": "0.
|
|
76
|
-
"@dxos/
|
|
77
|
-
"@dxos/context": "0.
|
|
78
|
-
"@dxos/
|
|
79
|
-
"@dxos/
|
|
80
|
-
"@dxos/keys": "0.
|
|
81
|
-
"@dxos/
|
|
82
|
-
"@dxos/
|
|
83
|
-
"@dxos/
|
|
84
|
-
"@dxos/
|
|
85
|
-
"@dxos/
|
|
86
|
-
"@dxos/tracing": "0.
|
|
87
|
-
"@dxos/
|
|
70
|
+
"effect": "3.21.4",
|
|
71
|
+
"node-datachannel": "^0.32.3",
|
|
72
|
+
"@dxos/async": "0.11.1",
|
|
73
|
+
"@dxos/debug": "0.11.1",
|
|
74
|
+
"@dxos/context": "0.11.1",
|
|
75
|
+
"@dxos/codec-protobuf": "0.11.1",
|
|
76
|
+
"@dxos/invariant": "0.11.1",
|
|
77
|
+
"@dxos/keys": "0.11.1",
|
|
78
|
+
"@dxos/log": "0.11.1",
|
|
79
|
+
"@dxos/messaging": "0.11.1",
|
|
80
|
+
"@dxos/protocols": "0.11.1",
|
|
81
|
+
"@dxos/node-std": "0.11.1",
|
|
82
|
+
"@dxos/rpc": "0.11.1",
|
|
83
|
+
"@dxos/tracing": "0.11.1",
|
|
84
|
+
"@dxos/teleport": "0.11.1",
|
|
85
|
+
"@dxos/util": "0.11.1"
|
|
88
86
|
},
|
|
89
87
|
"devDependencies": {
|
|
90
88
|
"fetch-mock": "^11.0.0",
|
|
91
|
-
"@dxos/edge-client": "0.
|
|
92
|
-
"@dxos/
|
|
93
|
-
"@dxos/keyring": "0.10.0"
|
|
89
|
+
"@dxos/edge-client": "0.11.1",
|
|
90
|
+
"@dxos/keyring": "0.11.1"
|
|
94
91
|
},
|
|
95
92
|
"publishConfig": {
|
|
96
93
|
"access": "public"
|
package/src/network-manager.ts
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
// Copyright 2020 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
+
import * as EffectContext from 'effect/Context';
|
|
6
|
+
|
|
5
7
|
import { Event, synchronized } from '@dxos/async';
|
|
6
8
|
import { Context } from '@dxos/context';
|
|
7
9
|
import { assertArgument, invariant } from '@dxos/invariant';
|
|
@@ -60,6 +62,14 @@ export type SwarmNetworkManagerOptions = {
|
|
|
60
62
|
peerInfo?: PeerInfo;
|
|
61
63
|
};
|
|
62
64
|
|
|
65
|
+
/**
|
|
66
|
+
* Effect service tag for {@link SwarmNetworkManager}.
|
|
67
|
+
*/
|
|
68
|
+
export class SwarmNetworkManagerService extends EffectContext.Tag('@dxos/network-manager/SwarmNetworkManager')<
|
|
69
|
+
SwarmNetworkManagerService,
|
|
70
|
+
SwarmNetworkManager
|
|
71
|
+
>() {}
|
|
72
|
+
|
|
63
73
|
/**
|
|
64
74
|
* Manages p2p connection to the swarm.
|
|
65
75
|
*/
|
|
@@ -128,6 +138,10 @@ export class SwarmNetworkManager {
|
|
|
128
138
|
this._peerInfo = peerInfo;
|
|
129
139
|
}
|
|
130
140
|
|
|
141
|
+
getPeerInfo(): PeerInfo | undefined {
|
|
142
|
+
return this._peerInfo;
|
|
143
|
+
}
|
|
144
|
+
|
|
131
145
|
async open(): Promise<void> {
|
|
132
146
|
log('opening network manager');
|
|
133
147
|
await this._messenger.open();
|
|
@@ -235,16 +249,15 @@ export class SwarmNetworkManager {
|
|
|
235
249
|
switch (state) {
|
|
236
250
|
case ConnectionState.OFFLINE: {
|
|
237
251
|
this._connectionState = state;
|
|
238
|
-
//
|
|
252
|
+
// Only signaling toggles across an offline/online cycle. The messenger stays open so its
|
|
253
|
+
// subscriptions survive — the swarm does not re-`listen` on reconnect — and its subscriptions
|
|
254
|
+
// are torn down only on a real `close`.
|
|
239
255
|
await Promise.all([...this._swarms.values()].map((swarm) => swarm.goOffline()));
|
|
240
|
-
await this._messenger.close();
|
|
241
256
|
await this._signalManager.close();
|
|
242
257
|
break;
|
|
243
258
|
}
|
|
244
259
|
case ConnectionState.ONLINE: {
|
|
245
260
|
this._connectionState = state;
|
|
246
|
-
// go online
|
|
247
|
-
this._messenger.open();
|
|
248
261
|
await Promise.all([...this._swarms.values()].map((swarm) => swarm.goOnline()));
|
|
249
262
|
await this._signalManager.open();
|
|
250
263
|
break;
|
|
@@ -2,25 +2,21 @@
|
|
|
2
2
|
// Copyright 2022 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import {
|
|
5
|
+
import { beforeEach, describe, expect, onTestFinished, test } from 'vitest';
|
|
6
6
|
|
|
7
7
|
import { Context } from '@dxos/context';
|
|
8
8
|
import { PublicKey } from '@dxos/keys';
|
|
9
|
-
import { Messenger, type PeerInfo
|
|
10
|
-
import { type SignalServerRunner, runTestSignalServer } from '@dxos/signal';
|
|
9
|
+
import { MemorySignalManager, MemorySignalManagerContext, Messenger, type PeerInfo } from '@dxos/messaging';
|
|
11
10
|
|
|
12
11
|
import { type SignalMessage } from './signal-messenger';
|
|
13
12
|
import { SwarmMessenger } from './swarm-messenger';
|
|
14
13
|
|
|
15
14
|
describe('Signal Integration Test', () => {
|
|
16
|
-
|
|
15
|
+
// In-memory signaling context connecting the peers in each test (replaces the KUBE server).
|
|
16
|
+
let context: MemorySignalManagerContext;
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
afterAll(() => {
|
|
23
|
-
void broker.stop();
|
|
18
|
+
beforeEach(() => {
|
|
19
|
+
context = new MemorySignalManagerContext();
|
|
24
20
|
});
|
|
25
21
|
|
|
26
22
|
const setupPeer = async ({
|
|
@@ -30,7 +26,7 @@ describe('Signal Integration Test', () => {
|
|
|
30
26
|
peer?: PeerInfo;
|
|
31
27
|
topic?: PublicKey;
|
|
32
28
|
}) => {
|
|
33
|
-
const signalManager = new
|
|
29
|
+
const signalManager = new MemorySignalManager(context);
|
|
34
30
|
await signalManager.open();
|
|
35
31
|
onTestFinished(async () => {
|
|
36
32
|
await signalManager.close();
|
|
@@ -2,48 +2,37 @@
|
|
|
2
2
|
// Copyright 2022 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import {
|
|
5
|
+
import { beforeEach, describe, expect, onTestFinished, test } from 'vitest';
|
|
6
6
|
|
|
7
|
-
import { type Awaited } from '@dxos/async';
|
|
8
7
|
import { Context } from '@dxos/context';
|
|
9
8
|
import { PublicKey } from '@dxos/keys';
|
|
10
|
-
import {
|
|
9
|
+
import { MemorySignalManager, MemorySignalManagerContext, Messenger } from '@dxos/messaging';
|
|
11
10
|
import { type Answer } from '@dxos/protocols/proto/dxos/mesh/swarm';
|
|
12
|
-
import { runTestSignalServer } from '@dxos/signal';
|
|
13
11
|
|
|
14
12
|
import { type OfferMessage, type SignalMessage } from './signal-messenger';
|
|
15
13
|
import { SwarmMessenger } from './swarm-messenger';
|
|
16
14
|
|
|
17
15
|
describe('SwarmMessenger', { timeout: 7000 }, () => {
|
|
18
16
|
let topic: PublicKey;
|
|
19
|
-
|
|
20
|
-
let
|
|
21
|
-
|
|
22
|
-
beforeAll(async () => {
|
|
23
|
-
broker1 = await runTestSignalServer();
|
|
24
|
-
});
|
|
17
|
+
// Shared in-memory signaling context connecting the peers in each test (replaces the KUBE server).
|
|
18
|
+
let context: MemorySignalManagerContext;
|
|
25
19
|
|
|
26
20
|
beforeEach(() => {
|
|
27
21
|
topic = PublicKey.random();
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
afterAll(() => {
|
|
31
|
-
void broker1.stop();
|
|
22
|
+
context = new MemorySignalManagerContext();
|
|
32
23
|
});
|
|
33
24
|
|
|
34
25
|
const createSignalClientAndMessageRouter = async ({
|
|
35
|
-
signalApiUrl,
|
|
36
26
|
onSignal = (async () => {}) as any,
|
|
37
27
|
onOffer = async () => ({ accept: true }),
|
|
38
28
|
topic,
|
|
39
29
|
}: {
|
|
40
|
-
signalApiUrl: string;
|
|
41
30
|
onSignal?: (ctx: Context, msg: SignalMessage) => Promise<void>;
|
|
42
31
|
onOffer?: (ctx: Context, msg: OfferMessage) => Promise<Answer>;
|
|
43
32
|
topic: PublicKey;
|
|
44
33
|
}) => {
|
|
45
34
|
const peer = { peerKey: PublicKey.random().toHex() };
|
|
46
|
-
const signalManager = new
|
|
35
|
+
const signalManager = new MemorySignalManager(context);
|
|
47
36
|
await signalManager.open();
|
|
48
37
|
onTestFinished(async () => {
|
|
49
38
|
await signalManager.close();
|
|
@@ -77,7 +66,6 @@ describe('SwarmMessenger', { timeout: 7000 }, () => {
|
|
|
77
66
|
received.push(msg);
|
|
78
67
|
};
|
|
79
68
|
const { signalManager: signalManager1, peer: peer1 } = await createSignalClientAndMessageRouter({
|
|
80
|
-
signalApiUrl: broker1.url(),
|
|
81
69
|
onSignal: signalMock1,
|
|
82
70
|
topic,
|
|
83
71
|
});
|
|
@@ -85,10 +73,7 @@ describe('SwarmMessenger', { timeout: 7000 }, () => {
|
|
|
85
73
|
signalManager: signalManager2,
|
|
86
74
|
router: router2,
|
|
87
75
|
peer: peer2,
|
|
88
|
-
} = await createSignalClientAndMessageRouter({
|
|
89
|
-
signalApiUrl: broker1.url(),
|
|
90
|
-
topic,
|
|
91
|
-
});
|
|
76
|
+
} = await createSignalClientAndMessageRouter({ topic });
|
|
92
77
|
|
|
93
78
|
await signalManager1.join(Context.default(), { topic, peer: peer1 });
|
|
94
79
|
await signalManager2.join(Context.default(), { topic, peer: peer2 });
|
|
@@ -114,13 +99,11 @@ describe('SwarmMessenger', { timeout: 7000 }, () => {
|
|
|
114
99
|
router: router1,
|
|
115
100
|
peer: peer1,
|
|
116
101
|
} = await createSignalClientAndMessageRouter({
|
|
117
|
-
signalApiUrl: broker1.url(),
|
|
118
102
|
onSignal: (async () => {}) as any,
|
|
119
103
|
onOffer: async () => ({ accept: true }),
|
|
120
104
|
topic,
|
|
121
105
|
});
|
|
122
106
|
const { signalManager: signalManager2, peer: peer2 } = await createSignalClientAndMessageRouter({
|
|
123
|
-
signalApiUrl: broker1.url(),
|
|
124
107
|
onSignal: (async () => {}) as any,
|
|
125
108
|
onOffer: async () => ({ accept: true }),
|
|
126
109
|
topic,
|
|
@@ -148,7 +131,6 @@ describe('SwarmMessenger', { timeout: 7000 }, () => {
|
|
|
148
131
|
router: router1,
|
|
149
132
|
peer: peer1,
|
|
150
133
|
} = await createSignalClientAndMessageRouter({
|
|
151
|
-
signalApiUrl: broker1.url(),
|
|
152
134
|
onSignal: signalMock1,
|
|
153
135
|
onOffer: async () => ({ accept: true }),
|
|
154
136
|
topic,
|
|
@@ -162,7 +144,6 @@ describe('SwarmMessenger', { timeout: 7000 }, () => {
|
|
|
162
144
|
router: router2,
|
|
163
145
|
peer: peer2,
|
|
164
146
|
} = await createSignalClientAndMessageRouter({
|
|
165
|
-
signalApiUrl: broker1.url(),
|
|
166
147
|
onSignal: signalMock2,
|
|
167
148
|
onOffer: async () => ({ accept: true }),
|
|
168
149
|
topic,
|
|
@@ -176,7 +157,6 @@ describe('SwarmMessenger', { timeout: 7000 }, () => {
|
|
|
176
157
|
router: router3,
|
|
177
158
|
peer: peer3,
|
|
178
159
|
} = await createSignalClientAndMessageRouter({
|
|
179
|
-
signalApiUrl: broker1.url(),
|
|
180
160
|
onSignal: signalMock3,
|
|
181
161
|
onOffer: async () => ({ accept: true }),
|
|
182
162
|
topic,
|
|
@@ -226,7 +206,6 @@ describe('SwarmMessenger', { timeout: 7000 }, () => {
|
|
|
226
206
|
router: router1,
|
|
227
207
|
peer: peer1,
|
|
228
208
|
} = await createSignalClientAndMessageRouter({
|
|
229
|
-
signalApiUrl: broker1.url(),
|
|
230
209
|
onSignal: (async () => {}) as any,
|
|
231
210
|
onOffer: async () => ({ accept: true }),
|
|
232
211
|
topic,
|
|
@@ -236,7 +215,6 @@ describe('SwarmMessenger', { timeout: 7000 }, () => {
|
|
|
236
215
|
router: router2,
|
|
237
216
|
peer: peer2,
|
|
238
217
|
} = await createSignalClientAndMessageRouter({
|
|
239
|
-
signalApiUrl: broker1.url(),
|
|
240
218
|
onSignal: (async () => {}) as any,
|
|
241
219
|
onOffer: async () => ({ accept: true }),
|
|
242
220
|
topic,
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
// Copyright 2020 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import { type Any } from '@dxos/codec-protobuf';
|
|
6
5
|
import { Context } from '@dxos/context';
|
|
7
6
|
import { invariant } from '@dxos/invariant';
|
|
8
7
|
import { PublicKey } from '@dxos/keys';
|
|
@@ -46,22 +45,13 @@ export class SwarmMessenger implements SignalMessenger {
|
|
|
46
45
|
this._topic = topic;
|
|
47
46
|
}
|
|
48
47
|
|
|
49
|
-
async receiveMessage(
|
|
50
|
-
ctx: Context,
|
|
51
|
-
{
|
|
52
|
-
author,
|
|
53
|
-
recipient,
|
|
54
|
-
payload,
|
|
55
|
-
}: {
|
|
56
|
-
author: PeerInfo;
|
|
57
|
-
recipient: PeerInfo;
|
|
58
|
-
payload: Any;
|
|
59
|
-
},
|
|
60
|
-
): Promise<void> {
|
|
48
|
+
async receiveMessage(ctx: Context, { author, recipient, payload }: Message): Promise<void> {
|
|
61
49
|
if (payload.type_url !== 'dxos.mesh.swarm.SwarmMessage') {
|
|
62
50
|
// Ignore not swarm messages.
|
|
63
51
|
return;
|
|
64
52
|
}
|
|
53
|
+
// Swarm signaling is point-to-point; a broadcast (DX-1125) never carries a SwarmMessage payload.
|
|
54
|
+
invariant(recipient, 'Recipient is required');
|
|
65
55
|
const message: SwarmMessage = SwarmMessage.decode(payload.value);
|
|
66
56
|
|
|
67
57
|
if (!this._topic.equals(message.topic)) {
|
package/src/swarm/swarm.test.ts
CHANGED
|
@@ -155,8 +155,8 @@ describe.skip('Swarm', () => {
|
|
|
155
155
|
|
|
156
156
|
const signalManager = new MemorySignalManager(context);
|
|
157
157
|
const sendOriginal = signalManager.sendMessage.bind(signalManager);
|
|
158
|
-
const messages = new ComplexSet<{ author: PeerInfo; recipient
|
|
159
|
-
({ author, recipient }) => author.peerKey + recipient
|
|
158
|
+
const messages = new ComplexSet<{ author: PeerInfo; recipient?: PeerInfo }>(
|
|
159
|
+
({ author, recipient }) => author.peerKey + recipient?.peerKey,
|
|
160
160
|
);
|
|
161
161
|
signalManager.sendMessage = async (ctx, message) => {
|
|
162
162
|
messages.add({ author: message.author, recipient: message.recipient });
|
|
@@ -4,16 +4,9 @@
|
|
|
4
4
|
|
|
5
5
|
import { Context } from '@dxos/context';
|
|
6
6
|
import { PublicKey } from '@dxos/keys';
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
MemorySignalManager,
|
|
10
|
-
MemorySignalManagerContext,
|
|
11
|
-
type SignalManager,
|
|
12
|
-
WebsocketSignalManager,
|
|
13
|
-
} from '@dxos/messaging';
|
|
7
|
+
import { MemorySignalManager, MemorySignalManagerContext, type SignalManager } from '@dxos/messaging';
|
|
14
8
|
import { schema } from '@dxos/protocols/proto';
|
|
15
9
|
import { ConnectionState } from '@dxos/protocols/proto/dxos/client/services';
|
|
16
|
-
import { type Runtime } from '@dxos/protocols/proto/dxos/config';
|
|
17
10
|
import { type ProtoRpcPeer, createLinkedPorts, createProtoRpcPeer } from '@dxos/rpc';
|
|
18
11
|
import { ComplexMap } from '@dxos/util';
|
|
19
12
|
|
|
@@ -31,15 +24,7 @@ import {
|
|
|
31
24
|
} from '../transport';
|
|
32
25
|
import { type TestTeleportExtensionFactory, TestWireProtocol } from './test-wire-protocol';
|
|
33
26
|
|
|
34
|
-
// Signal server will be started by the setup script.
|
|
35
|
-
const port = process.env.SIGNAL_PORT ?? 4000;
|
|
36
|
-
export const TEST_SIGNAL_HOSTS: Runtime.Services.Signal[] = [
|
|
37
|
-
{ server: `ws://localhost:${port}/.well-known/dx/signal` },
|
|
38
|
-
];
|
|
39
|
-
|
|
40
27
|
export type TestBuilderOptions = {
|
|
41
|
-
signalHosts?: Runtime.Services.Signal[];
|
|
42
|
-
bridge?: boolean;
|
|
43
28
|
transport?: TransportKind;
|
|
44
29
|
};
|
|
45
30
|
|
|
@@ -51,11 +36,9 @@ export class TestBuilder {
|
|
|
51
36
|
|
|
52
37
|
constructor(public readonly options: TestBuilderOptions = {}) {}
|
|
53
38
|
|
|
54
|
-
createSignalManager():
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
}
|
|
58
|
-
|
|
39
|
+
createSignalManager(): MemorySignalManager {
|
|
40
|
+
// KUBE `WebsocketSignalManager` was removed; signaling is always in-memory (the shared context
|
|
41
|
+
// connects peers in-process). The transport is chosen independently via `options.transport`.
|
|
59
42
|
return new MemorySignalManager(this._signalContext);
|
|
60
43
|
}
|
|
61
44
|
|
|
@@ -86,9 +69,7 @@ export class TestPeer {
|
|
|
86
69
|
constructor(
|
|
87
70
|
private readonly testBuilder: TestBuilder,
|
|
88
71
|
public readonly peerId: PublicKey,
|
|
89
|
-
public readonly transport: TransportKind =
|
|
90
|
-
? TransportKind.WEB_RTC
|
|
91
|
-
: TransportKind.MEMORY,
|
|
72
|
+
public readonly transport: TransportKind = TransportKind.MEMORY,
|
|
92
73
|
) {
|
|
93
74
|
this._signalManager = this.testBuilder.createSignalManager();
|
|
94
75
|
this._networkManager = this.createNetworkManager(this.transport);
|
|
@@ -98,57 +79,49 @@ export class TestPeer {
|
|
|
98
79
|
// TODO(burdon): Move to TestBuilder.
|
|
99
80
|
createNetworkManager(transport: TransportKind): SwarmNetworkManager {
|
|
100
81
|
let transportFactory: TransportFactory;
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
throw new Error(`Unsupported transport: ${transport}`);
|
|
145
|
-
}
|
|
146
|
-
} else {
|
|
147
|
-
if (transport !== TransportKind.MEMORY && transport !== TransportKind.TCP) {
|
|
148
|
-
log.warn(`specified transport ${transport} but no signalling configured, using memory transport instead`);
|
|
149
|
-
}
|
|
150
|
-
log.info(`using ${transport} transport without signal server.`);
|
|
151
|
-
transportFactory = MemoryTransportFactory;
|
|
82
|
+
switch (transport) {
|
|
83
|
+
case TransportKind.MEMORY:
|
|
84
|
+
transportFactory = MemoryTransportFactory;
|
|
85
|
+
break;
|
|
86
|
+
case TransportKind.TCP:
|
|
87
|
+
transportFactory = TcpTransportFactory;
|
|
88
|
+
break;
|
|
89
|
+
case TransportKind.WEB_RTC:
|
|
90
|
+
transportFactory = createRtcTransportFactory();
|
|
91
|
+
break;
|
|
92
|
+
case TransportKind.WEB_RTC_PROXY:
|
|
93
|
+
{
|
|
94
|
+
// Simulates bridge to shared worker.
|
|
95
|
+
const [proxyPort, servicePort] = createLinkedPorts();
|
|
96
|
+
|
|
97
|
+
this._proxy = createProtoRpcPeer({
|
|
98
|
+
port: proxyPort,
|
|
99
|
+
requested: {
|
|
100
|
+
BridgeService: schema.getService('dxos.mesh.bridge.BridgeService'),
|
|
101
|
+
},
|
|
102
|
+
noHandshake: true,
|
|
103
|
+
encodingOptions: {
|
|
104
|
+
preserveAny: true,
|
|
105
|
+
},
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
this._service = createProtoRpcPeer({
|
|
109
|
+
port: servicePort,
|
|
110
|
+
exposed: {
|
|
111
|
+
BridgeService: schema.getService('dxos.mesh.bridge.BridgeService'),
|
|
112
|
+
},
|
|
113
|
+
handlers: { BridgeService: new RtcTransportService() },
|
|
114
|
+
noHandshake: true,
|
|
115
|
+
encodingOptions: {
|
|
116
|
+
preserveAny: true,
|
|
117
|
+
},
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
transportFactory = new RtcTransportProxyFactory().setBridgeService(this._proxy.rpc.BridgeService);
|
|
121
|
+
}
|
|
122
|
+
break;
|
|
123
|
+
default:
|
|
124
|
+
throw new Error(`Unsupported transport: ${transport}`);
|
|
152
125
|
}
|
|
153
126
|
|
|
154
127
|
return new SwarmNetworkManager({
|
|
@@ -4,29 +4,18 @@
|
|
|
4
4
|
|
|
5
5
|
import { describe } from 'vitest';
|
|
6
6
|
|
|
7
|
-
import {
|
|
7
|
+
import { TestBuilder } from '../testing';
|
|
8
|
+
import { TransportKind } from '../transport';
|
|
8
9
|
import { basicTestSuite } from './basic-test-suite';
|
|
9
10
|
|
|
10
11
|
// Segfault in node-datachannel.
|
|
11
12
|
describe.skip('WebRTC transport', { timeout: 10_000 }, () => {
|
|
12
|
-
const testBuilder = new TestBuilder();
|
|
13
|
+
const testBuilder = new TestBuilder({ transport: TransportKind.WEB_RTC });
|
|
13
14
|
basicTestSuite(testBuilder);
|
|
14
15
|
});
|
|
15
16
|
|
|
16
17
|
// Segfault in node-datachannel.
|
|
17
18
|
describe.skip('WebRTC transport proxy', { timeout: 10_000 }, () => {
|
|
18
|
-
const testBuilder = new TestBuilder({
|
|
19
|
+
const testBuilder = new TestBuilder({ transport: TransportKind.WEB_RTC_PROXY });
|
|
19
20
|
basicTestSuite(testBuilder);
|
|
20
21
|
});
|
|
21
|
-
|
|
22
|
-
describe.skip('test with signal server', () => {
|
|
23
|
-
describe('WebRTC transport', { timeout: 10_000 }, () => {
|
|
24
|
-
const testBuilder = new TestBuilder({ signalHosts: TEST_SIGNAL_HOSTS });
|
|
25
|
-
basicTestSuite(testBuilder);
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
describe('WebRTC transport proxy', { timeout: 10_000 }, () => {
|
|
29
|
-
const testBuilder = new TestBuilder({ signalHosts: TEST_SIGNAL_HOSTS, bridge: true });
|
|
30
|
-
basicTestSuite(testBuilder);
|
|
31
|
-
});
|
|
32
|
-
});
|
|
@@ -7,7 +7,6 @@ import { invariant } from '@dxos/invariant';
|
|
|
7
7
|
import { log, logInfo } from '@dxos/log';
|
|
8
8
|
import { ConnectivityError } from '@dxos/protocols';
|
|
9
9
|
import { type Signal } from '@dxos/protocols/proto/dxos/mesh/swarm';
|
|
10
|
-
import { trace } from '@dxos/tracing';
|
|
11
10
|
|
|
12
11
|
import type { IceProvider } from '../../signal';
|
|
13
12
|
import { type TransportOptions } from '../transport';
|
|
@@ -38,7 +37,6 @@ export type RtcPeerChannelFactoryOptions = {
|
|
|
38
37
|
* Contains WebRTC connection establishment logic.
|
|
39
38
|
* When the first Transport is opened a connection is established and kept until all the transports are closed.
|
|
40
39
|
*/
|
|
41
|
-
@trace.resource()
|
|
42
40
|
export class RtcPeerConnection {
|
|
43
41
|
// A peer who is not the initiator waits for another party to open a channel.
|
|
44
42
|
private readonly _channelCreatedCallbacks = new Map<string, ChannelCreatedCallback>();
|
|
@@ -427,7 +425,6 @@ export class RtcPeerConnection {
|
|
|
427
425
|
await this._options.sendSignal({ payload: { data } });
|
|
428
426
|
}
|
|
429
427
|
|
|
430
|
-
@trace.info()
|
|
431
428
|
protected get _connectionInfo() {
|
|
432
429
|
const connectionInfo = this._connection && {
|
|
433
430
|
connectionState: this._connection.connectionState,
|
|
@@ -5,7 +5,8 @@
|
|
|
5
5
|
import { Duplex } from 'stream';
|
|
6
6
|
import { describe, expect, onTestFinished, test } from 'vitest';
|
|
7
7
|
|
|
8
|
-
import { Event as AsyncEvent,
|
|
8
|
+
import { Event as AsyncEvent, Trigger, sleep } from '@dxos/async';
|
|
9
|
+
import { TestStream } from '@dxos/async/testing';
|
|
9
10
|
import { ErrorStream } from '@dxos/debug';
|
|
10
11
|
import { PublicKey } from '@dxos/keys';
|
|
11
12
|
import { schema } from '@dxos/protocols/proto';
|
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
import { describe, expect, onTestFinished, test } from 'vitest';
|
|
6
6
|
|
|
7
|
-
import {
|
|
7
|
+
import { sleep } from '@dxos/async';
|
|
8
|
+
import { TestStream } from '@dxos/async/testing';
|
|
8
9
|
import { PublicKey } from '@dxos/keys';
|
|
9
10
|
|
|
10
11
|
import { type TransportOptions } from '../transport';
|