@dxos/network-manager 0.8.4-main.fffef41 → 0.8.4-staging.60fe92afc8
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/LICENSE +102 -5
- package/README.md +1 -1
- package/dist/lib/browser/{chunk-E3P563GT.mjs → chunk-ERB3AQAF.mjs} +424 -1897
- package/dist/lib/browser/chunk-ERB3AQAF.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +198 -4
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +10 -34
- package/dist/lib/browser/testing/index.mjs.map +3 -3
- package/dist/lib/browser/transport/tcp/index.mjs +2 -33
- package/dist/lib/browser/transport/tcp/index.mjs.map +4 -4
- package/dist/lib/browser/transport/tcp/tcp-transport.browser.mjs +36 -0
- package/dist/lib/browser/transport/tcp/tcp-transport.browser.mjs.map +7 -0
- package/dist/lib/browser/transport/tcp/tcp-transport.mjs +125 -0
- package/dist/lib/browser/transport/tcp/tcp-transport.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-PKBROUZV.mjs → chunk-KYLPLEZQ.mjs} +424 -1897
- package/dist/lib/node-esm/chunk-KYLPLEZQ.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +198 -4
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/testing/index.mjs +10 -34
- package/dist/lib/node-esm/testing/index.mjs.map +3 -3
- package/dist/lib/node-esm/transport/tcp/index.mjs +2 -157
- package/dist/lib/node-esm/transport/tcp/index.mjs.map +4 -4
- package/dist/lib/node-esm/transport/tcp/tcp-transport.browser.mjs +36 -0
- package/dist/lib/node-esm/transport/tcp/tcp-transport.browser.mjs.map +7 -0
- package/dist/lib/node-esm/transport/tcp/tcp-transport.mjs +125 -0
- package/dist/lib/node-esm/transport/tcp/tcp-transport.mjs.map +7 -0
- package/dist/types/src/connection-log.d.ts.map +1 -1
- package/dist/types/src/network-manager.d.ts +6 -6
- package/dist/types/src/network-manager.d.ts.map +1 -1
- package/dist/types/src/signal/ice.d.ts.map +1 -1
- package/dist/types/src/signal/signal-connection.d.ts +3 -2
- package/dist/types/src/signal/signal-connection.d.ts.map +1 -1
- package/dist/types/src/signal/signal-messenger.d.ts +3 -2
- package/dist/types/src/signal/signal-messenger.d.ts.map +1 -1
- package/dist/types/src/signal/swarm-messenger.d.ts +7 -7
- package/dist/types/src/signal/swarm-messenger.d.ts.map +1 -1
- package/dist/types/src/swarm/connection-limiter.d.ts.map +1 -1
- package/dist/types/src/swarm/connection.d.ts +2 -2
- package/dist/types/src/swarm/connection.d.ts.map +1 -1
- package/dist/types/src/swarm/peer.d.ts +4 -3
- package/dist/types/src/swarm/peer.d.ts.map +1 -1
- package/dist/types/src/swarm/swarm-mapper.d.ts.map +1 -1
- package/dist/types/src/swarm/swarm.d.ts +3 -5
- package/dist/types/src/swarm/swarm.d.ts.map +1 -1
- package/dist/types/src/testing/test-builder.d.ts.map +1 -1
- package/dist/types/src/testing/test-wire-protocol.d.ts.map +1 -1
- package/dist/types/src/tests/basic-test-suite.d.ts.map +1 -1
- package/dist/types/src/tests/property-test-suite.d.ts.map +1 -1
- package/dist/types/src/tests/utils.d.ts.map +1 -1
- package/dist/types/src/topology/fully-connected-topology.d.ts.map +1 -1
- package/dist/types/src/topology/mmst-topology.d.ts.map +1 -1
- package/dist/types/src/topology/star-topology.d.ts.map +1 -1
- package/dist/types/src/transport/memory-transport.d.ts.map +1 -1
- package/dist/types/src/transport/tcp/index.d.ts +1 -1
- package/dist/types/src/transport/tcp/index.d.ts.map +1 -1
- package/dist/types/src/transport/tcp/tcp-transport.browser.d.ts.map +1 -1
- package/dist/types/src/transport/tcp/tcp-transport.d.ts.map +1 -1
- package/dist/types/src/transport/webrtc/rtc-peer-connection.d.ts +4 -4
- package/dist/types/src/transport/webrtc/rtc-peer-connection.d.ts.map +1 -1
- package/dist/types/src/transport/webrtc/rtc-transport-channel.d.ts.map +1 -1
- package/dist/types/src/transport/webrtc/rtc-transport-factory.d.ts.map +1 -1
- package/dist/types/src/transport/webrtc/rtc-transport-proxy.d.ts.map +1 -1
- package/dist/types/src/transport/webrtc/rtc-transport-service.d.ts.map +1 -1
- package/dist/types/src/transport/webrtc/rtc-transport-stats.d.ts.map +1 -1
- package/dist/types/src/transport/webrtc/test-utils.d.ts.map +1 -1
- package/dist/types/src/transport/webrtc/utils.d.ts.map +1 -1
- package/dist/types/src/wire-protocol.d.ts +5 -5
- package/dist/types/src/wire-protocol.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +33 -33
- package/src/network-manager.ts +24 -22
- package/src/signal/integration.node.test.ts +11 -10
- package/src/signal/signal-connection.ts +3 -2
- package/src/signal/signal-messenger.ts +3 -2
- package/src/signal/swarm-messenger.node.test.ts +25 -24
- package/src/signal/swarm-messenger.ts +65 -55
- package/src/swarm/connection.test.ts +6 -7
- package/src/swarm/connection.ts +15 -22
- package/src/swarm/peer.ts +7 -7
- package/src/swarm/swarm.test.ts +2 -3
- package/src/swarm/swarm.ts +10 -17
- package/src/testing/test-builder.ts +4 -4
- package/src/tests/basic-test-suite.ts +0 -1
- package/src/tests/memory-transport.test.ts +0 -2
- package/src/tests/property-test-suite.ts +4 -3
- package/src/tests/tcp-transport.node.test.ts +0 -2
- package/src/tests/webrtc-transport.test.ts +0 -1
- package/src/transport/tcp/index.ts +1 -1
- package/src/transport/webrtc/rtc-peer-connection.ts +1 -2
- package/src/transport/webrtc/rtc-transport-channel.test.ts +0 -2
- package/src/transport/webrtc/rtc-transport-channel.ts +1 -2
- package/src/transport/webrtc/rtc-transport-factory.ts +0 -1
- package/src/transport/webrtc/rtc-transport-proxy.test.ts +0 -2
- package/src/transport/webrtc/rtc-transport-proxy.ts +6 -4
- package/src/transport/webrtc/rtc-transport-service.ts +0 -1
- package/src/transport/webrtc/rtc-transport.test.ts +0 -1
- package/src/wire-protocol.ts +6 -6
- package/dist/lib/browser/chunk-E3P563GT.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-PKBROUZV.mjs.map +0 -7
package/package.json
CHANGED
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dxos/network-manager",
|
|
3
|
-
"version": "0.8.4-
|
|
3
|
+
"version": "0.8.4-staging.60fe92afc8",
|
|
4
4
|
"description": "Network Manager",
|
|
5
5
|
"homepage": "https://dxos.org",
|
|
6
6
|
"bugs": "https://github.com/dxos/dxos/issues",
|
|
7
|
-
"
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/dxos/dxos"
|
|
10
|
+
},
|
|
11
|
+
"license": "FSL-1.1-Apache-2.0",
|
|
8
12
|
"author": "DXOS.org",
|
|
9
|
-
"sideEffects":
|
|
13
|
+
"sideEffects": false,
|
|
10
14
|
"type": "module",
|
|
11
15
|
"imports": {
|
|
12
16
|
"#node-datachannel": {
|
|
@@ -26,6 +30,15 @@
|
|
|
26
30
|
"node": "./dist/lib/node-esm/transport/tcp/index.mjs",
|
|
27
31
|
"import": "./dist/lib/browser/transport/tcp/index.mjs",
|
|
28
32
|
"require": "./dist/lib/node-esm/transport/tcp/index.mjs"
|
|
33
|
+
},
|
|
34
|
+
"#tcp-transport-impl": {
|
|
35
|
+
"source": {
|
|
36
|
+
"browser": "./src/transport/tcp/tcp-transport.browser.ts",
|
|
37
|
+
"default": "./src/transport/tcp/tcp-transport.ts"
|
|
38
|
+
},
|
|
39
|
+
"types": "./dist/types/src/transport/tcp/tcp-transport.d.ts",
|
|
40
|
+
"browser": "./dist/lib/browser/transport/tcp/tcp-transport.browser.mjs",
|
|
41
|
+
"default": "./dist/lib/node-esm/transport/tcp/tcp-transport.mjs"
|
|
29
42
|
}
|
|
30
43
|
},
|
|
31
44
|
"exports": {
|
|
@@ -48,20 +61,7 @@
|
|
|
48
61
|
"node": "./dist/lib/node-esm/transport/tcp/index.mjs"
|
|
49
62
|
}
|
|
50
63
|
},
|
|
51
|
-
"browser": {
|
|
52
|
-
"./src/transport/tcp/tcp-transport.ts": "./src/transport/tcp/tcp-transport.browser.ts"
|
|
53
|
-
},
|
|
54
64
|
"types": "dist/types/src/index.d.ts",
|
|
55
|
-
"typesVersions": {
|
|
56
|
-
"*": {
|
|
57
|
-
"testing": [
|
|
58
|
-
"dist/types/src/testing/index.d.ts"
|
|
59
|
-
],
|
|
60
|
-
"transport/tcp": [
|
|
61
|
-
"dist/types/src/transport/tcp/index.d.ts"
|
|
62
|
-
]
|
|
63
|
-
}
|
|
64
|
-
},
|
|
65
65
|
"files": [
|
|
66
66
|
"testing.d.ts",
|
|
67
67
|
"testing.js",
|
|
@@ -71,26 +71,26 @@
|
|
|
71
71
|
],
|
|
72
72
|
"dependencies": {
|
|
73
73
|
"node-datachannel": "^0.30.0",
|
|
74
|
-
"@dxos/async": "0.8.4-
|
|
75
|
-
"@dxos/
|
|
76
|
-
"@dxos/
|
|
77
|
-
"@dxos/debug": "0.8.4-
|
|
78
|
-
"@dxos/keys": "0.8.4-
|
|
79
|
-
"@dxos/messaging": "0.8.4-
|
|
80
|
-
"@dxos/
|
|
81
|
-
"@dxos/node-std": "0.8.4-
|
|
82
|
-
"@dxos/
|
|
83
|
-
"@dxos/
|
|
84
|
-
"@dxos/
|
|
85
|
-
"@dxos/tracing": "0.8.4-
|
|
86
|
-
"@dxos/
|
|
87
|
-
"@dxos/
|
|
74
|
+
"@dxos/async": "0.8.4-staging.60fe92afc8",
|
|
75
|
+
"@dxos/codec-protobuf": "0.8.4-staging.60fe92afc8",
|
|
76
|
+
"@dxos/context": "0.8.4-staging.60fe92afc8",
|
|
77
|
+
"@dxos/debug": "0.8.4-staging.60fe92afc8",
|
|
78
|
+
"@dxos/keys": "0.8.4-staging.60fe92afc8",
|
|
79
|
+
"@dxos/messaging": "0.8.4-staging.60fe92afc8",
|
|
80
|
+
"@dxos/invariant": "0.8.4-staging.60fe92afc8",
|
|
81
|
+
"@dxos/node-std": "0.8.4-staging.60fe92afc8",
|
|
82
|
+
"@dxos/protocols": "0.8.4-staging.60fe92afc8",
|
|
83
|
+
"@dxos/teleport": "0.8.4-staging.60fe92afc8",
|
|
84
|
+
"@dxos/rpc": "0.8.4-staging.60fe92afc8",
|
|
85
|
+
"@dxos/tracing": "0.8.4-staging.60fe92afc8",
|
|
86
|
+
"@dxos/util": "0.8.4-staging.60fe92afc8",
|
|
87
|
+
"@dxos/log": "0.8.4-staging.60fe92afc8"
|
|
88
88
|
},
|
|
89
89
|
"devDependencies": {
|
|
90
90
|
"fetch-mock": "^11.0.0",
|
|
91
|
-
"@dxos/edge-client": "0.8.4-
|
|
92
|
-
"@dxos/
|
|
93
|
-
"@dxos/
|
|
91
|
+
"@dxos/edge-client": "0.8.4-staging.60fe92afc8",
|
|
92
|
+
"@dxos/keyring": "0.8.4-staging.60fe92afc8",
|
|
93
|
+
"@dxos/signal": "0.8.4-staging.60fe92afc8"
|
|
94
94
|
},
|
|
95
95
|
"publishConfig": {
|
|
96
96
|
"access": "public"
|
package/src/network-manager.ts
CHANGED
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
import { Event, synchronized } from '@dxos/async';
|
|
6
|
-
import {
|
|
6
|
+
import { Context } from '@dxos/context';
|
|
7
|
+
import { assertArgument, invariant } from '@dxos/invariant';
|
|
7
8
|
import { PublicKey } from '@dxos/keys';
|
|
8
9
|
import { log } from '@dxos/log';
|
|
9
10
|
import { Messenger, type PeerInfo, type SignalManager } from '@dxos/messaging';
|
|
10
|
-
import { trace } from '@dxos/protocols';
|
|
11
11
|
import { ConnectionState } from '@dxos/protocols/proto/dxos/client/services';
|
|
12
12
|
import { ComplexMap } from '@dxos/util';
|
|
13
13
|
|
|
@@ -21,7 +21,7 @@ import { type WireProtocolProvider } from './wire-protocol';
|
|
|
21
21
|
* Represents a single connection to a remote peer.
|
|
22
22
|
*/
|
|
23
23
|
export type SwarmConnection = {
|
|
24
|
-
close(): Promise<void>;
|
|
24
|
+
close(ctx: Context): Promise<void>;
|
|
25
25
|
};
|
|
26
26
|
|
|
27
27
|
// TODO(burdon): Add timeout.
|
|
@@ -76,7 +76,6 @@ export class SwarmNetworkManager {
|
|
|
76
76
|
private readonly _signalConnection: SignalConnection;
|
|
77
77
|
private readonly _connectionLimiter: ConnectionLimiter;
|
|
78
78
|
private readonly _connectionLog?: ConnectionLog;
|
|
79
|
-
private readonly _instanceId = PublicKey.random().toHex();
|
|
80
79
|
private _peerInfo?: PeerInfo = undefined;
|
|
81
80
|
|
|
82
81
|
private _connectionState = ConnectionState.ONLINE;
|
|
@@ -91,8 +90,8 @@ export class SwarmNetworkManager {
|
|
|
91
90
|
this._signalManager.swarmEvent.on((event) => this._swarms.get(event.topic)?.onSwarmEvent(event));
|
|
92
91
|
this._messenger = new Messenger({ signalManager: this._signalManager });
|
|
93
92
|
this._signalConnection = {
|
|
94
|
-
join: (opts) => this._signalManager.join(opts),
|
|
95
|
-
leave: (opts) => this._signalManager.leave(opts),
|
|
93
|
+
join: (ctx, opts) => this._signalManager.join(ctx, opts),
|
|
94
|
+
leave: (ctx, opts) => this._signalManager.leave(ctx, opts),
|
|
96
95
|
};
|
|
97
96
|
this._peerInfo = peerInfo;
|
|
98
97
|
|
|
@@ -130,15 +129,15 @@ export class SwarmNetworkManager {
|
|
|
130
129
|
}
|
|
131
130
|
|
|
132
131
|
async open(): Promise<void> {
|
|
133
|
-
log
|
|
132
|
+
log('opening network manager');
|
|
134
133
|
await this._messenger.open();
|
|
135
134
|
await this._signalManager.open();
|
|
136
|
-
log
|
|
135
|
+
log('opened network manager');
|
|
137
136
|
}
|
|
138
137
|
|
|
139
|
-
async close(): Promise<void> {
|
|
138
|
+
async close(ctx: Context): Promise<void> {
|
|
140
139
|
for (const topic of this._swarms.keys()) {
|
|
141
|
-
await this.leaveSwarm(topic).catch((err) => {
|
|
140
|
+
await this.leaveSwarm(ctx, topic).catch((err) => {
|
|
142
141
|
log(err);
|
|
143
142
|
});
|
|
144
143
|
}
|
|
@@ -151,16 +150,19 @@ export class SwarmNetworkManager {
|
|
|
151
150
|
* Join the swarm.
|
|
152
151
|
*/
|
|
153
152
|
@synchronized
|
|
154
|
-
async joinSwarm(
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
153
|
+
async joinSwarm(
|
|
154
|
+
ctx: Context,
|
|
155
|
+
{
|
|
156
|
+
topic, //
|
|
157
|
+
topology,
|
|
158
|
+
protocolProvider: protocol,
|
|
159
|
+
label,
|
|
160
|
+
}: SwarmOptions,
|
|
161
|
+
): Promise<SwarmConnection> {
|
|
162
|
+
assertArgument(PublicKey.isPublicKey(topic), 'topic');
|
|
161
163
|
invariant(topology);
|
|
162
164
|
invariant(this._peerInfo);
|
|
163
|
-
|
|
165
|
+
assertArgument(typeof protocol === 'function', 'protocolProvider');
|
|
164
166
|
if (this._swarms.has(topic)) {
|
|
165
167
|
throw new Error(`Already connected to swarm: ${PublicKey.from(topic)}`);
|
|
166
168
|
}
|
|
@@ -187,14 +189,14 @@ export class SwarmNetworkManager {
|
|
|
187
189
|
// Open before joining.
|
|
188
190
|
await swarm.open();
|
|
189
191
|
|
|
190
|
-
this._signalConnection.join({ topic, peer: this._peerInfo }).catch((error) => log.catch(error));
|
|
192
|
+
this._signalConnection.join(ctx, { topic, peer: this._peerInfo }).catch((error) => log.catch(error));
|
|
191
193
|
|
|
192
194
|
this.topicsUpdated.emit();
|
|
193
195
|
this._connectionLog?.joinedSwarm(swarm);
|
|
194
196
|
log('joined', { topic: PublicKey.from(topic), count: this._swarms.size });
|
|
195
197
|
|
|
196
198
|
return {
|
|
197
|
-
close: () => this.leaveSwarm(topic),
|
|
199
|
+
close: (ctx: Context) => this.leaveSwarm(ctx, topic),
|
|
198
200
|
};
|
|
199
201
|
}
|
|
200
202
|
|
|
@@ -202,7 +204,7 @@ export class SwarmNetworkManager {
|
|
|
202
204
|
* Close the connection.
|
|
203
205
|
*/
|
|
204
206
|
@synchronized
|
|
205
|
-
async leaveSwarm(topic: PublicKey): Promise<void> {
|
|
207
|
+
async leaveSwarm(ctx: Context, topic: PublicKey): Promise<void> {
|
|
206
208
|
if (!this._swarms.has(topic)) {
|
|
207
209
|
// log.warn('swarm not open', { topic: PublicKey.from(topic).truncate() });
|
|
208
210
|
return;
|
|
@@ -210,7 +212,7 @@ export class SwarmNetworkManager {
|
|
|
210
212
|
|
|
211
213
|
log('leaving', { topic: PublicKey.from(topic) });
|
|
212
214
|
const swarm = this._swarms.get(topic)!;
|
|
213
|
-
await this._signalConnection.leave({ topic, peer: swarm.ownPeer });
|
|
215
|
+
await this._signalConnection.leave(ctx, { topic, peer: swarm.ownPeer });
|
|
214
216
|
|
|
215
217
|
const map = this._mappers.get(topic)!;
|
|
216
218
|
map.destroy();
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
import { afterAll, beforeAll, describe, expect, onTestFinished, test } from 'vitest';
|
|
6
6
|
|
|
7
|
+
import { Context } from '@dxos/context';
|
|
7
8
|
import { PublicKey } from '@dxos/keys';
|
|
8
9
|
import { Messenger, type PeerInfo, WebsocketSignalManager } from '@dxos/messaging';
|
|
9
10
|
import { type SignalServerRunner, runTestSignalServer } from '@dxos/signal';
|
|
@@ -42,17 +43,17 @@ describe('Signal Integration Test', () => {
|
|
|
42
43
|
onTestFinished(() => messenger.close());
|
|
43
44
|
await messenger.listen({
|
|
44
45
|
peer,
|
|
45
|
-
onMessage: async (message) => await messageRouter.receiveMessage(message),
|
|
46
|
+
onMessage: async (message) => await messageRouter.receiveMessage(Context.default(), message),
|
|
46
47
|
});
|
|
47
48
|
|
|
48
49
|
const receivedSignals: SignalMessage[] = [];
|
|
49
|
-
const signalMock = async (msg: SignalMessage) => {
|
|
50
|
+
const signalMock = async (_ctx: Context, msg: SignalMessage) => {
|
|
50
51
|
receivedSignals.push(msg);
|
|
51
52
|
};
|
|
52
53
|
const messageRouter = new SwarmMessenger({
|
|
53
|
-
sendMessage: messenger.sendMessage
|
|
54
|
+
sendMessage: (ctx, message) => messenger.sendMessage(ctx, message),
|
|
54
55
|
onSignal: signalMock,
|
|
55
|
-
onOffer: async () => ({ accept: true }),
|
|
56
|
+
onOffer: async (_ctx) => ({ accept: true }),
|
|
56
57
|
topic,
|
|
57
58
|
});
|
|
58
59
|
|
|
@@ -78,14 +79,14 @@ describe('Signal Integration Test', () => {
|
|
|
78
79
|
({ peerAvailable }) => !!peerAvailable && peerNetworking1.peer.peerKey === peerAvailable.peer.peerKey,
|
|
79
80
|
);
|
|
80
81
|
|
|
81
|
-
await peerNetworking1.signalManager.join({ topic, peer: peerNetworking1.peer });
|
|
82
|
-
await peerNetworking2.signalManager.join({ topic, peer: peerNetworking2.peer });
|
|
82
|
+
await peerNetworking1.signalManager.join(Context.default(), { topic, peer: peerNetworking1.peer });
|
|
83
|
+
await peerNetworking2.signalManager.join(Context.default(), { topic, peer: peerNetworking2.peer });
|
|
83
84
|
|
|
84
85
|
await promise1;
|
|
85
86
|
await promise2;
|
|
86
87
|
|
|
87
88
|
expect(
|
|
88
|
-
await peerNetworking1.messageRouter.offer({
|
|
89
|
+
await peerNetworking1.messageRouter.offer(Context.default(), {
|
|
89
90
|
topic,
|
|
90
91
|
author: peerNetworking1.peer,
|
|
91
92
|
recipient: peerNetworking2.peer,
|
|
@@ -97,7 +98,7 @@ describe('Signal Integration Test', () => {
|
|
|
97
98
|
).toEqual(expect.objectContaining({ accept: true }));
|
|
98
99
|
|
|
99
100
|
expect(
|
|
100
|
-
await peerNetworking2.messageRouter.offer({
|
|
101
|
+
await peerNetworking2.messageRouter.offer(Context.default(), {
|
|
101
102
|
topic,
|
|
102
103
|
author: peerNetworking2.peer,
|
|
103
104
|
recipient: peerNetworking1.peer,
|
|
@@ -119,7 +120,7 @@ describe('Signal Integration Test', () => {
|
|
|
119
120
|
signalBatch: undefined,
|
|
120
121
|
},
|
|
121
122
|
};
|
|
122
|
-
await peerNetworking1.messageRouter.signal(message);
|
|
123
|
+
await peerNetworking1.messageRouter.signal(Context.default(), message);
|
|
123
124
|
|
|
124
125
|
await expect.poll(() => peerNetworking2.receivedSignals[0]).toEqual(expect.objectContaining(message));
|
|
125
126
|
}
|
|
@@ -135,7 +136,7 @@ describe('Signal Integration Test', () => {
|
|
|
135
136
|
signalBatch: undefined,
|
|
136
137
|
},
|
|
137
138
|
};
|
|
138
|
-
await peerNetworking2.messageRouter.signal(message);
|
|
139
|
+
await peerNetworking2.messageRouter.signal(Context.default(), message);
|
|
139
140
|
|
|
140
141
|
await expect.poll(() => peerNetworking1.receivedSignals[0]).toEqual(expect.objectContaining(message));
|
|
141
142
|
}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
// Copyright 2020 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
+
import { type Context } from '@dxos/context';
|
|
5
6
|
import { type PublicKey } from '@dxos/keys';
|
|
6
7
|
import { type PeerInfo } from '@dxos/messaging';
|
|
7
8
|
|
|
@@ -12,10 +13,10 @@ export interface SignalConnection {
|
|
|
12
13
|
/**
|
|
13
14
|
* Join topic on signal network, to be discoverable by other peers.
|
|
14
15
|
*/
|
|
15
|
-
join(params: { topic: PublicKey; peer: PeerInfo }): Promise<void>;
|
|
16
|
+
join(ctx: Context, params: { topic: PublicKey; peer: PeerInfo }): Promise<void>;
|
|
16
17
|
|
|
17
18
|
/**
|
|
18
19
|
* Leave topic on signal network, to stop being discoverable by other peers.
|
|
19
20
|
*/
|
|
20
|
-
leave(params: { topic: PublicKey; peer: PeerInfo }): Promise<void>;
|
|
21
|
+
leave(ctx: Context, params: { topic: PublicKey; peer: PeerInfo }): Promise<void>;
|
|
21
22
|
}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
// Copyright 2022 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
+
import { Context } from '@dxos/context';
|
|
5
6
|
import { type PublicKey } from '@dxos/keys';
|
|
6
7
|
import { type PeerInfo } from '@dxos/messaging';
|
|
7
8
|
import { type Answer, type Offer, type Signal, type SignalBatch } from '@dxos/protocols/proto/dxos/mesh/swarm';
|
|
@@ -29,10 +30,10 @@ export interface SignalMessenger {
|
|
|
29
30
|
/**
|
|
30
31
|
* Offer/answer RPC.
|
|
31
32
|
*/
|
|
32
|
-
offer(msg: OfferMessage): Promise<Answer>;
|
|
33
|
+
offer(ctx: Context, msg: OfferMessage): Promise<Answer>;
|
|
33
34
|
|
|
34
35
|
/**
|
|
35
36
|
* Reliably send a signal to a peer.
|
|
36
37
|
*/
|
|
37
|
-
signal(msg: SignalMessage): Promise<void>;
|
|
38
|
+
signal(ctx: Context, msg: SignalMessage): Promise<void>;
|
|
38
39
|
}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import { afterAll, beforeAll, beforeEach, describe, expect, onTestFinished, test } from 'vitest';
|
|
6
6
|
|
|
7
7
|
import { type Awaited } from '@dxos/async';
|
|
8
|
+
import { Context } from '@dxos/context';
|
|
8
9
|
import { PublicKey } from '@dxos/keys';
|
|
9
10
|
import { Messenger, WebsocketSignalManager } from '@dxos/messaging';
|
|
10
11
|
import { type Answer } from '@dxos/protocols/proto/dxos/mesh/swarm';
|
|
@@ -37,8 +38,8 @@ describe('SwarmMessenger', { timeout: 7000 }, () => {
|
|
|
37
38
|
topic,
|
|
38
39
|
}: {
|
|
39
40
|
signalApiUrl: string;
|
|
40
|
-
onSignal?: (msg: SignalMessage) => Promise<void>;
|
|
41
|
-
onOffer?: (msg: OfferMessage) => Promise<Answer>;
|
|
41
|
+
onSignal?: (ctx: Context, msg: SignalMessage) => Promise<void>;
|
|
42
|
+
onOffer?: (ctx: Context, msg: OfferMessage) => Promise<Answer>;
|
|
42
43
|
topic: PublicKey;
|
|
43
44
|
}) => {
|
|
44
45
|
const peer = { peerKey: PublicKey.random().toHex() };
|
|
@@ -52,12 +53,12 @@ describe('SwarmMessenger', { timeout: 7000 }, () => {
|
|
|
52
53
|
await messenger.listen({
|
|
53
54
|
peer,
|
|
54
55
|
payloadType: 'dxos.mesh.swarm.SwarmMessage',
|
|
55
|
-
onMessage: async (message) => await router.receiveMessage(message),
|
|
56
|
+
onMessage: async (message) => await router.receiveMessage(Context.default(), message),
|
|
56
57
|
});
|
|
57
58
|
|
|
58
59
|
const router: SwarmMessenger = new SwarmMessenger({
|
|
59
60
|
// todo(mykola): added catch to avoid not finished request.
|
|
60
|
-
sendMessage: async (message) => await messenger.sendMessage(message),
|
|
61
|
+
sendMessage: async (ctx, message) => await messenger.sendMessage(ctx, message),
|
|
61
62
|
onSignal,
|
|
62
63
|
onOffer,
|
|
63
64
|
topic,
|
|
@@ -72,7 +73,7 @@ describe('SwarmMessenger', { timeout: 7000 }, () => {
|
|
|
72
73
|
|
|
73
74
|
test('signaling between 2 clients', async () => {
|
|
74
75
|
const received: SignalMessage[] = [];
|
|
75
|
-
const signalMock1 = async (msg: SignalMessage) => {
|
|
76
|
+
const signalMock1 = async (_ctx: Context, msg: SignalMessage) => {
|
|
76
77
|
received.push(msg);
|
|
77
78
|
};
|
|
78
79
|
const { signalManager: signalManager1, peer: peer1 } = await createSignalClientAndMessageRouter({
|
|
@@ -89,8 +90,8 @@ describe('SwarmMessenger', { timeout: 7000 }, () => {
|
|
|
89
90
|
topic,
|
|
90
91
|
});
|
|
91
92
|
|
|
92
|
-
await signalManager1.join({ topic, peer: peer1 });
|
|
93
|
-
await signalManager2.join({ topic, peer: peer2 });
|
|
93
|
+
await signalManager1.join(Context.default(), { topic, peer: peer1 });
|
|
94
|
+
await signalManager2.join(Context.default(), { topic, peer: peer2 });
|
|
94
95
|
|
|
95
96
|
const msg: SignalMessage = {
|
|
96
97
|
author: peer2,
|
|
@@ -102,7 +103,7 @@ describe('SwarmMessenger', { timeout: 7000 }, () => {
|
|
|
102
103
|
signalBatch: undefined,
|
|
103
104
|
},
|
|
104
105
|
};
|
|
105
|
-
await router2.signal(msg);
|
|
106
|
+
await router2.signal(Context.default(), msg);
|
|
106
107
|
|
|
107
108
|
await expect.poll(() => received[0]).toEqual(expect.objectContaining(msg));
|
|
108
109
|
});
|
|
@@ -125,9 +126,9 @@ describe('SwarmMessenger', { timeout: 7000 }, () => {
|
|
|
125
126
|
topic,
|
|
126
127
|
});
|
|
127
128
|
|
|
128
|
-
await signalManager1.join({ topic, peer: peer1 });
|
|
129
|
-
await signalManager2.join({ topic, peer: peer2 });
|
|
130
|
-
const answer = await router1.offer({
|
|
129
|
+
await signalManager1.join(Context.default(), { topic, peer: peer1 });
|
|
130
|
+
await signalManager2.join(Context.default(), { topic, peer: peer2 });
|
|
131
|
+
const answer = await router1.offer(Context.default(), {
|
|
131
132
|
author: peer1,
|
|
132
133
|
recipient: peer2,
|
|
133
134
|
sessionId: PublicKey.random(),
|
|
@@ -139,7 +140,7 @@ describe('SwarmMessenger', { timeout: 7000 }, () => {
|
|
|
139
140
|
|
|
140
141
|
test('signaling between 3 clients', async () => {
|
|
141
142
|
const received1: SignalMessage[] = [];
|
|
142
|
-
const signalMock1 = async (msg: SignalMessage) => {
|
|
143
|
+
const signalMock1 = async (_ctx: Context, msg: SignalMessage) => {
|
|
143
144
|
received1.push(msg);
|
|
144
145
|
};
|
|
145
146
|
const {
|
|
@@ -153,7 +154,7 @@ describe('SwarmMessenger', { timeout: 7000 }, () => {
|
|
|
153
154
|
topic,
|
|
154
155
|
});
|
|
155
156
|
const received2: SignalMessage[] = [];
|
|
156
|
-
const signalMock2 = async (msg: SignalMessage) => {
|
|
157
|
+
const signalMock2 = async (_ctx: Context, msg: SignalMessage) => {
|
|
157
158
|
received2.push(msg);
|
|
158
159
|
};
|
|
159
160
|
const {
|
|
@@ -167,7 +168,7 @@ describe('SwarmMessenger', { timeout: 7000 }, () => {
|
|
|
167
168
|
topic,
|
|
168
169
|
});
|
|
169
170
|
const received3: SignalMessage[] = [];
|
|
170
|
-
const signalMock3 = async (msg: SignalMessage) => {
|
|
171
|
+
const signalMock3 = async (_ctx: Context, msg: SignalMessage) => {
|
|
171
172
|
received3.push(msg);
|
|
172
173
|
};
|
|
173
174
|
const {
|
|
@@ -181,9 +182,9 @@ describe('SwarmMessenger', { timeout: 7000 }, () => {
|
|
|
181
182
|
topic,
|
|
182
183
|
});
|
|
183
184
|
|
|
184
|
-
await signalManager1.join({ topic, peer: peer1 });
|
|
185
|
-
await signalManager2.join({ topic, peer: peer2 });
|
|
186
|
-
await signalManager3.join({ topic, peer: peer3 });
|
|
185
|
+
await signalManager1.join(Context.default(), { topic, peer: peer1 });
|
|
186
|
+
await signalManager2.join(Context.default(), { topic, peer: peer2 });
|
|
187
|
+
await signalManager3.join(Context.default(), { topic, peer: peer3 });
|
|
187
188
|
|
|
188
189
|
// sending signal from peer1 to peer3.
|
|
189
190
|
const msg1to3: SignalMessage = {
|
|
@@ -193,7 +194,7 @@ describe('SwarmMessenger', { timeout: 7000 }, () => {
|
|
|
193
194
|
topic,
|
|
194
195
|
data: { signal: { payload: { msg: '1to3' } }, signalBatch: undefined },
|
|
195
196
|
};
|
|
196
|
-
await router1.signal(msg1to3);
|
|
197
|
+
await router1.signal(Context.default(), msg1to3);
|
|
197
198
|
await expect.poll(() => received3[0]).toEqual(expect.objectContaining(msg1to3));
|
|
198
199
|
|
|
199
200
|
// sending signal from peer2 to peer3.
|
|
@@ -204,7 +205,7 @@ describe('SwarmMessenger', { timeout: 7000 }, () => {
|
|
|
204
205
|
topic,
|
|
205
206
|
data: { signal: { payload: { msg: '2to3' } }, signalBatch: undefined },
|
|
206
207
|
};
|
|
207
|
-
await router2.signal(msg2to3);
|
|
208
|
+
await router2.signal(Context.default(), msg2to3);
|
|
208
209
|
await expect.poll(() => received3[1]).toEqual(expect.objectContaining(msg2to3));
|
|
209
210
|
|
|
210
211
|
// sending signal from peer3 to peer1.
|
|
@@ -215,7 +216,7 @@ describe('SwarmMessenger', { timeout: 7000 }, () => {
|
|
|
215
216
|
topic,
|
|
216
217
|
data: { signal: { payload: { msg: '3to1' } }, signalBatch: undefined },
|
|
217
218
|
};
|
|
218
|
-
await router3.signal(msg3to1);
|
|
219
|
+
await router3.signal(Context.default(), msg3to1);
|
|
219
220
|
await expect.poll(() => received1[0]).toEqual(expect.objectContaining(msg3to1));
|
|
220
221
|
});
|
|
221
222
|
|
|
@@ -241,11 +242,11 @@ describe('SwarmMessenger', { timeout: 7000 }, () => {
|
|
|
241
242
|
topic,
|
|
242
243
|
});
|
|
243
244
|
|
|
244
|
-
await signalManager1.join({ topic, peer: peer1 });
|
|
245
|
-
await signalManager2.join({ topic, peer: peer2 });
|
|
245
|
+
await signalManager1.join(Context.default(), { topic, peer: peer1 });
|
|
246
|
+
await signalManager2.join(Context.default(), { topic, peer: peer2 });
|
|
246
247
|
|
|
247
248
|
// sending offer from peer1 to peer2.
|
|
248
|
-
const answer1 = await router1.offer({
|
|
249
|
+
const answer1 = await router1.offer(Context.default(), {
|
|
249
250
|
author: peer1,
|
|
250
251
|
recipient: peer2,
|
|
251
252
|
sessionId: PublicKey.random(),
|
|
@@ -255,7 +256,7 @@ describe('SwarmMessenger', { timeout: 7000 }, () => {
|
|
|
255
256
|
expect(answer1.accept).toEqual(true);
|
|
256
257
|
|
|
257
258
|
// sending offer from peer2 to peer1.
|
|
258
|
-
const answer2 = await router2.offer({
|
|
259
|
+
const answer2 = await router2.offer(Context.default(), {
|
|
259
260
|
author: peer2,
|
|
260
261
|
recipient: peer1,
|
|
261
262
|
sessionId: PublicKey.random(),
|