@dxos/network-manager 2.33.9-dev.43c233c0 → 2.33.9-dev.46220a19
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/browser-mocha/bundle.js +119121 -0
- package/dist/browser-mocha/main.js +27 -0
- package/dist/src/network-manager.blueprint-test.d.ts +3 -1
- package/dist/src/network-manager.blueprint-test.d.ts.map +1 -1
- package/dist/src/network-manager.blueprint-test.js +46 -17
- package/dist/src/network-manager.blueprint-test.js.map +1 -1
- package/dist/src/network-manager.browser-test.js +1 -1
- package/dist/src/network-manager.browser-test.js.map +1 -1
- package/dist/src/network-manager.d.ts.map +1 -1
- package/dist/src/network-manager.js +6 -6
- package/dist/src/network-manager.js.map +1 -1
- package/dist/src/network-manager.test.js +5 -4
- package/dist/src/network-manager.test.js.map +1 -1
- package/dist/src/proto/gen/dxos/credentials.d.ts +39 -0
- package/dist/src/proto/gen/dxos/credentials.d.ts.map +1 -1
- package/dist/src/proto/gen/dxos/halo/keys.d.ts +44 -2
- package/dist/src/proto/gen/dxos/halo/keys.d.ts.map +1 -1
- package/dist/src/proto/gen/dxos/halo/keys.js +4 -0
- package/dist/src/proto/gen/dxos/halo/keys.js.map +1 -1
- package/dist/src/proto/gen/dxos/mesh/signal.d.ts +74 -37
- package/dist/src/proto/gen/dxos/mesh/signal.d.ts.map +1 -1
- package/dist/src/proto/gen/dxos/mesh/signalMessage.d.ts +79 -0
- package/dist/src/proto/gen/dxos/mesh/signalMessage.d.ts.map +1 -0
- package/dist/src/proto/gen/dxos/mesh/signalMessage.js +3 -0
- package/dist/src/proto/gen/dxos/mesh/signalMessage.js.map +1 -0
- package/dist/src/proto/gen/google/protobuf.d.ts +8 -2
- package/dist/src/proto/gen/google/protobuf.d.ts.map +1 -1
- package/dist/src/proto/gen/index.d.ts +17 -5
- package/dist/src/proto/gen/index.d.ts.map +1 -1
- package/dist/src/proto/gen/index.js +1 -1
- package/dist/src/proto/gen/index.js.map +1 -1
- package/dist/src/proto/substitutions.d.ts +4 -0
- package/dist/src/proto/substitutions.d.ts.map +1 -1
- package/dist/src/proto/substitutions.js +3 -1
- package/dist/src/proto/substitutions.js.map +1 -1
- package/dist/src/signal/in-memory-signal-manager.d.ts +7 -7
- package/dist/src/signal/in-memory-signal-manager.d.ts.map +1 -1
- package/dist/src/signal/in-memory-signal-manager.js +29 -8
- package/dist/src/signal/in-memory-signal-manager.js.map +1 -1
- package/dist/src/signal/index.d.ts +1 -2
- package/dist/src/signal/index.d.ts.map +1 -1
- package/dist/src/signal/index.js +1 -2
- package/dist/src/signal/index.js.map +1 -1
- package/dist/src/signal/integration.test.d.ts +2 -0
- package/dist/src/signal/integration.test.d.ts.map +1 -0
- package/dist/src/signal/integration.test.js +102 -0
- package/dist/src/signal/integration.test.js.map +1 -0
- package/dist/src/signal/message-router.d.ts +7 -7
- package/dist/src/signal/message-router.d.ts.map +1 -1
- package/dist/src/signal/message-router.js +6 -1
- package/dist/src/signal/message-router.js.map +1 -1
- package/dist/src/signal/message-router.test.js +15 -19
- package/dist/src/signal/message-router.test.js.map +1 -1
- package/dist/src/signal/signal-client.d.ts +33 -18
- package/dist/src/signal/signal-client.d.ts.map +1 -1
- package/dist/src/signal/signal-client.js +102 -92
- package/dist/src/signal/signal-client.js.map +1 -1
- package/dist/src/signal/signal-client.test.js +60 -77
- package/dist/src/signal/signal-client.test.js.map +1 -1
- package/dist/src/signal/{websocket-signal-manager.d.ts → signal-manager-impl.d.ts} +13 -11
- package/dist/src/signal/signal-manager-impl.d.ts.map +1 -0
- package/dist/src/signal/signal-manager-impl.js +151 -0
- package/dist/src/signal/signal-manager-impl.js.map +1 -0
- package/dist/src/signal/signal-manager.d.ts +12 -11
- package/dist/src/signal/signal-manager.d.ts.map +1 -1
- package/dist/src/signal/signal-rpc-client.d.ts +19 -0
- package/dist/src/signal/signal-rpc-client.d.ts.map +1 -0
- package/dist/src/signal/signal-rpc-client.js +108 -0
- package/dist/src/signal/signal-rpc-client.js.map +1 -0
- package/dist/src/signal/signal-rpc-client.test.d.ts +2 -0
- package/dist/src/signal/signal-rpc-client.test.d.ts.map +1 -0
- package/dist/src/signal/signal-rpc-client.test.js +74 -0
- package/dist/src/signal/signal-rpc-client.test.js.map +1 -0
- package/dist/src/swarm/connection.d.ts +3 -3
- package/dist/src/swarm/connection.d.ts.map +1 -1
- package/dist/src/swarm/connection.js +1 -4
- package/dist/src/swarm/connection.js.map +1 -1
- package/dist/src/swarm/swarm.d.ts +6 -7
- package/dist/src/swarm/swarm.d.ts.map +1 -1
- package/dist/src/swarm/swarm.js +21 -17
- package/dist/src/swarm/swarm.js.map +1 -1
- package/dist/src/swarm/swarm.test.js +156 -117
- package/dist/src/swarm/swarm.test.js.map +1 -1
- package/dist/src/topology/fully-connected-topology.d.ts +0 -1
- package/dist/src/topology/fully-connected-topology.d.ts.map +1 -1
- package/dist/src/topology/fully-connected-topology.js +1 -6
- package/dist/src/topology/fully-connected-topology.js.map +1 -1
- package/dist/src/topology/mmst-topology.d.ts +0 -1
- package/dist/src/topology/mmst-topology.d.ts.map +1 -1
- package/dist/src/topology/mmst-topology.js +1 -6
- package/dist/src/topology/mmst-topology.js.map +1 -1
- package/dist/src/topology/star-topology.d.ts +0 -1
- package/dist/src/topology/star-topology.d.ts.map +1 -1
- package/dist/src/topology/star-topology.js +1 -6
- package/dist/src/topology/star-topology.js.map +1 -1
- package/dist/src/topology/topology.d.ts +0 -6
- package/dist/src/topology/topology.d.ts.map +1 -1
- package/dist/src/transport/in-memory-transport.d.ts +2 -2
- package/dist/src/transport/in-memory-transport.d.ts.map +1 -1
- package/dist/src/transport/in-memory-transport.js.map +1 -1
- package/dist/src/transport/transport.d.ts +3 -3
- package/dist/src/transport/transport.d.ts.map +1 -1
- package/dist/src/transport/webrtc-transport.d.ts +3 -3
- package/dist/src/transport/webrtc-transport.d.ts.map +1 -1
- package/dist/src/transport/webrtc-transport.js.map +1 -1
- package/dist/tests-setup.js +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +14 -12
- package/src/network-manager.blueprint-test.ts +57 -22
- package/src/network-manager.browser-test.ts +1 -1
- package/src/network-manager.test.ts +8 -7
- package/src/network-manager.ts +8 -9
- package/src/proto/defs/dxos/mesh/signal.proto +53 -35
- package/src/proto/defs/dxos/mesh/signalMessage.proto +51 -0
- package/src/proto/gen/dxos/credentials.ts +40 -0
- package/src/proto/gen/dxos/halo/keys.ts +45 -2
- package/src/proto/gen/dxos/mesh/signal.ts +73 -37
- package/src/proto/gen/dxos/mesh/signalMessage.ts +83 -0
- package/src/proto/gen/google/protobuf.ts +9 -2
- package/src/proto/gen/index.ts +18 -6
- package/src/proto/substitutions.ts +3 -1
- package/src/signal/in-memory-signal-manager.ts +37 -12
- package/src/signal/index.ts +1 -2
- package/src/signal/integration.test.ts +117 -0
- package/src/signal/message-router.test.ts +36 -41
- package/src/signal/message-router.ts +22 -18
- package/src/signal/signal-client.test.ts +70 -92
- package/src/signal/signal-client.ts +119 -113
- package/src/signal/signal-manager-impl.ts +166 -0
- package/src/signal/signal-manager.ts +12 -12
- package/src/signal/signal-rpc-client.test.ts +86 -0
- package/src/signal/signal-rpc-client.ts +121 -0
- package/src/swarm/connection.ts +5 -8
- package/src/swarm/swarm.test.ts +208 -169
- package/src/swarm/swarm.ts +24 -20
- package/src/topology/fully-connected-topology.ts +1 -9
- package/src/topology/mmst-topology.ts +1 -9
- package/src/topology/star-topology.ts +1 -7
- package/src/topology/topology.ts +0 -7
- package/src/transport/in-memory-transport.ts +2 -2
- package/src/transport/transport.ts +3 -3
- package/src/transport/webrtc-transport.ts +3 -3
- package/dist/src/signal/websocket-rpc.d.ts +0 -30
- package/dist/src/signal/websocket-rpc.d.ts.map +0 -1
- package/dist/src/signal/websocket-rpc.js +0 -203
- package/dist/src/signal/websocket-rpc.js.map +0 -1
- package/dist/src/signal/websocket-signal-manager.d.ts.map +0 -1
- package/dist/src/signal/websocket-signal-manager.js +0 -134
- package/dist/src/signal/websocket-signal-manager.js.map +0 -1
- package/src/signal/websocket-rpc.ts +0 -208
- package/src/signal/websocket-signal-manager.ts +0 -158
|
@@ -1,208 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Copyright 2020 DXOS.org
|
|
3
|
-
//
|
|
4
|
-
|
|
5
|
-
import debug from 'debug';
|
|
6
|
-
import WebSocket from 'isomorphic-ws';
|
|
7
|
-
import nanomessagerpc from 'nanomessage-rpc';
|
|
8
|
-
import assert from 'node:assert';
|
|
9
|
-
import { promisify } from 'util';
|
|
10
|
-
|
|
11
|
-
import { Event, Trigger, sleep } from '@dxos/async';
|
|
12
|
-
|
|
13
|
-
import { SignalApi } from './signal-api';
|
|
14
|
-
|
|
15
|
-
const log = debug('dxos:network-manager:websocket-rpc');
|
|
16
|
-
|
|
17
|
-
const RPC_TIMEOUT = 3_000;
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* A websocket connection paired with nanomessage-rpc endpoint.
|
|
21
|
-
*
|
|
22
|
-
* Provides lifecycle events and command trace.
|
|
23
|
-
*
|
|
24
|
-
* Does not automatically reconnect, if the connection is dropped client must recreate the class instance.
|
|
25
|
-
*/
|
|
26
|
-
export class WebsocketRpc {
|
|
27
|
-
private readonly _connectTrigger = new Trigger();
|
|
28
|
-
private readonly _socket: WebSocket;
|
|
29
|
-
private readonly _rpc: any;
|
|
30
|
-
private _messageId = Date.now();
|
|
31
|
-
|
|
32
|
-
readonly commandTrace = new Event<SignalApi.CommandTrace>();
|
|
33
|
-
readonly connected = new Event();
|
|
34
|
-
readonly disconnected = new Event();
|
|
35
|
-
readonly error = new Event<Error>();
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* @param _host Signal server websocket URL.
|
|
39
|
-
*/
|
|
40
|
-
constructor (
|
|
41
|
-
private readonly _host: string
|
|
42
|
-
) {
|
|
43
|
-
this._socket = new WebSocket(this._host);
|
|
44
|
-
this._socket.onopen = async () => {
|
|
45
|
-
log(`Websocket connected ${this._host}`);
|
|
46
|
-
this._connectTrigger.wake();
|
|
47
|
-
try {
|
|
48
|
-
await this._rpc.open();
|
|
49
|
-
log(`RPC open ${this._host}`);
|
|
50
|
-
this.connected.emit();
|
|
51
|
-
} catch (err: any) {
|
|
52
|
-
this.error.emit(err);
|
|
53
|
-
}
|
|
54
|
-
};
|
|
55
|
-
|
|
56
|
-
this._socket.onclose = async () => {
|
|
57
|
-
log(`Disconnected ${this._host}`);
|
|
58
|
-
this.disconnected.emit();
|
|
59
|
-
try {
|
|
60
|
-
await this._rpc.close();
|
|
61
|
-
} catch (err: any) {
|
|
62
|
-
this.error.emit(err);
|
|
63
|
-
}
|
|
64
|
-
};
|
|
65
|
-
|
|
66
|
-
this._socket.onerror = e => {
|
|
67
|
-
log(`Signal socket error ${this._host} ${e.message}`);
|
|
68
|
-
this.error.emit(e.error ?? new Error(e.message));
|
|
69
|
-
};
|
|
70
|
-
|
|
71
|
-
this._rpc = nanomessagerpc({
|
|
72
|
-
send: async (data: Uint8Array) => {
|
|
73
|
-
await this._connectTrigger.wait();
|
|
74
|
-
assert(this._socket, 'No socket');
|
|
75
|
-
await promisify(this._socket.send.bind(this._socket) as any)(data);
|
|
76
|
-
},
|
|
77
|
-
subscribe: (next: (data: any) => void) => {
|
|
78
|
-
void this._connectTrigger.wait().then(() => {
|
|
79
|
-
assert(this._socket, 'No socket');
|
|
80
|
-
this._socket.onmessage = async e => {
|
|
81
|
-
try {
|
|
82
|
-
// `e.data` is Buffer in node, and Blob in chrome.
|
|
83
|
-
let data: Buffer;
|
|
84
|
-
if (Object.getPrototypeOf(e.data).constructor.name === 'Blob') {
|
|
85
|
-
data = Buffer.from(await (e.data as any).arrayBuffer());
|
|
86
|
-
} else {
|
|
87
|
-
data = e.data as any;
|
|
88
|
-
}
|
|
89
|
-
next(data);
|
|
90
|
-
} catch (err: any) {
|
|
91
|
-
this.error.emit(err);
|
|
92
|
-
}
|
|
93
|
-
};
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
return () => {
|
|
97
|
-
if (this._socket) {
|
|
98
|
-
this._socket.onmessage = () => {};
|
|
99
|
-
}
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
});
|
|
103
|
-
this._rpc.on('error', (error: Error) => this.error.emit(error));
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
async close () {
|
|
107
|
-
try {
|
|
108
|
-
await this._rpc.close();
|
|
109
|
-
} finally {
|
|
110
|
-
this._socket.close();
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
async call (method: string, payload: any): Promise<any> {
|
|
115
|
-
const start = Date.now();
|
|
116
|
-
try {
|
|
117
|
-
const response = await Promise.race([
|
|
118
|
-
(async () => {
|
|
119
|
-
await this._rpc.open();
|
|
120
|
-
await this._connectTrigger.wait();
|
|
121
|
-
return this._rpc.call(method, payload);
|
|
122
|
-
})(),
|
|
123
|
-
sleep(RPC_TIMEOUT).then(() => Promise.reject(new Error(`Signal RPC call timed out in ${RPC_TIMEOUT} ms`)))
|
|
124
|
-
]);
|
|
125
|
-
this.commandTrace.emit({
|
|
126
|
-
messageId: `${this._host}-${this._messageId++}`,
|
|
127
|
-
host: this._host,
|
|
128
|
-
incoming: false,
|
|
129
|
-
time: Date.now() - start,
|
|
130
|
-
method,
|
|
131
|
-
payload,
|
|
132
|
-
response
|
|
133
|
-
});
|
|
134
|
-
log(`Signal RPC ${this._host}: ${method} ${JSON.stringify(payload)} ${JSON.stringify(response)}`);
|
|
135
|
-
return response;
|
|
136
|
-
} catch (err: any) {
|
|
137
|
-
log(`Signal RPC error ${this._host}: ${method} ${JSON.stringify(payload)} ${err.message}`);
|
|
138
|
-
this.commandTrace.emit({
|
|
139
|
-
messageId: `${this._host}-${this._messageId++}`,
|
|
140
|
-
host: this._host,
|
|
141
|
-
incoming: false,
|
|
142
|
-
time: Date.now() - start,
|
|
143
|
-
method,
|
|
144
|
-
payload,
|
|
145
|
-
error: err.message
|
|
146
|
-
});
|
|
147
|
-
throw err;
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
async emit (method: string, data: any) {
|
|
152
|
-
this.commandTrace.emit({
|
|
153
|
-
messageId: `${this._host}-${this._messageId++}`,
|
|
154
|
-
host: this._host,
|
|
155
|
-
incoming: false,
|
|
156
|
-
time: 0,
|
|
157
|
-
method,
|
|
158
|
-
payload: data
|
|
159
|
-
});
|
|
160
|
-
return this._rpc.emit('signal', data);
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
addHandler (method: string, handler: (data: any) => Promise<any>) {
|
|
164
|
-
this._rpc.actions({
|
|
165
|
-
[method]: async (data: any) => {
|
|
166
|
-
const begin = Date.now();
|
|
167
|
-
try {
|
|
168
|
-
const response = await handler(data);
|
|
169
|
-
this.commandTrace.emit({
|
|
170
|
-
messageId: `${this._host}-${this._messageId++}`,
|
|
171
|
-
host: this._host,
|
|
172
|
-
incoming: true,
|
|
173
|
-
time: Date.now() - begin,
|
|
174
|
-
method,
|
|
175
|
-
payload: data,
|
|
176
|
-
response
|
|
177
|
-
});
|
|
178
|
-
return response;
|
|
179
|
-
} catch (error: any) {
|
|
180
|
-
this.commandTrace.emit({
|
|
181
|
-
messageId: `${this._host}-${this._messageId++}`,
|
|
182
|
-
host: this._host,
|
|
183
|
-
incoming: true,
|
|
184
|
-
time: Date.now() - begin,
|
|
185
|
-
method,
|
|
186
|
-
payload: data,
|
|
187
|
-
error: error.message
|
|
188
|
-
});
|
|
189
|
-
throw error;
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
});
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
subscribe (method: string, handler: (data: any) => void) {
|
|
196
|
-
this._rpc.on(method, (data: any) => {
|
|
197
|
-
this.commandTrace.emit({
|
|
198
|
-
messageId: `${this._host}-${this._messageId++}`,
|
|
199
|
-
host: this._host,
|
|
200
|
-
incoming: true,
|
|
201
|
-
time: 0,
|
|
202
|
-
method,
|
|
203
|
-
payload: data
|
|
204
|
-
});
|
|
205
|
-
handler(data);
|
|
206
|
-
});
|
|
207
|
-
}
|
|
208
|
-
}
|
|
@@ -1,158 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Copyright 2020 DXOS.org
|
|
3
|
-
//
|
|
4
|
-
|
|
5
|
-
import debug from 'debug';
|
|
6
|
-
import assert from 'node:assert';
|
|
7
|
-
|
|
8
|
-
import { Event, synchronized } from '@dxos/async';
|
|
9
|
-
import { PublicKey } from '@dxos/protocols';
|
|
10
|
-
import { ComplexMap } from '@dxos/util';
|
|
11
|
-
|
|
12
|
-
import { Answer, Message } from '../proto/gen/dxos/mesh/signal';
|
|
13
|
-
import { SignalApi } from './signal-api';
|
|
14
|
-
import { SignalClient } from './signal-client';
|
|
15
|
-
import { SignalManager } from './signal-manager';
|
|
16
|
-
|
|
17
|
-
const log = debug('dxos:network-manager:websocket-signal-manager');
|
|
18
|
-
|
|
19
|
-
export class WebsocketSignalManager implements SignalManager {
|
|
20
|
-
private readonly _servers = new Map<string, SignalClient>();
|
|
21
|
-
|
|
22
|
-
/** Topics joined: topic => peerId */
|
|
23
|
-
private readonly _topicsJoined = new ComplexMap<PublicKey, PublicKey>(topic => topic.toHex());
|
|
24
|
-
private readonly _topicsJoinedPerSignal = new Map<string, ComplexMap<PublicKey, PublicKey>>();
|
|
25
|
-
|
|
26
|
-
private _reconcileTimeoutId?: NodeJS.Timeout;
|
|
27
|
-
|
|
28
|
-
readonly statusChanged = new Event<SignalApi.Status[]>();
|
|
29
|
-
readonly commandTrace = new Event<SignalApi.CommandTrace>();
|
|
30
|
-
readonly peerCandidatesChanged = new Event<[topic: PublicKey, candidates: PublicKey[]]>()
|
|
31
|
-
readonly onSignal = new Event<Message>();
|
|
32
|
-
|
|
33
|
-
constructor (
|
|
34
|
-
private readonly _hosts: string[],
|
|
35
|
-
private readonly _onOffer: (message: Message) => Promise<Answer>
|
|
36
|
-
) {
|
|
37
|
-
log(`Created WebsocketSignalManager with signal servers: ${_hosts}`);
|
|
38
|
-
assert(_hosts.length === 1, 'Only a single signaling server connection is supported');
|
|
39
|
-
for (const host of this._hosts) {
|
|
40
|
-
const server = new SignalClient(
|
|
41
|
-
host,
|
|
42
|
-
async msg => this._onOffer(msg),
|
|
43
|
-
async msg => this.onSignal.emit(msg)
|
|
44
|
-
);
|
|
45
|
-
|
|
46
|
-
this._servers.set(host, server);
|
|
47
|
-
server.statusChanged.on(() => this.statusChanged.emit(this.getStatus()));
|
|
48
|
-
server.commandTrace.on(trace => this.commandTrace.emit(trace));
|
|
49
|
-
this._topicsJoinedPerSignal.set(host, new ComplexMap(x => x.toHex()));
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
getStatus (): SignalApi.Status[] {
|
|
54
|
-
return Array.from(this._servers.values()).map(server => server.getStatus());
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
join (topic: PublicKey, peerId: PublicKey) {
|
|
58
|
-
log(`Join ${topic} ${peerId}`);
|
|
59
|
-
this._topicsJoined.set(topic, peerId);
|
|
60
|
-
void this._reconcileJoinedTopics();
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
leave (topic: PublicKey, peerId: PublicKey) {
|
|
64
|
-
log(`Leave ${topic} ${peerId}`);
|
|
65
|
-
this._topicsJoined.delete(topic);
|
|
66
|
-
void this._reconcileJoinedTopics();
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
@synchronized
|
|
70
|
-
private async _reconcileJoinedTopics () {
|
|
71
|
-
log('Reconciling joined topics');
|
|
72
|
-
const promises: Promise<void>[] = [];
|
|
73
|
-
for (const [host, server] of this._servers.entries()) {
|
|
74
|
-
for (const [topic, peerId] of this._topicsJoined.entries()) {
|
|
75
|
-
if (!this._topicsJoinedPerSignal.get(host)!.has(topic)) {
|
|
76
|
-
log(`Join ${topic} as ${peerId} on ${host}`);
|
|
77
|
-
promises.push(server.join(topic, peerId).then(
|
|
78
|
-
peers => {
|
|
79
|
-
log(`Joined successfully ${host}`);
|
|
80
|
-
this._topicsJoinedPerSignal.get(host)!.set(topic, peerId);
|
|
81
|
-
|
|
82
|
-
log(`Peer candidates changed ${topic} ${peers}`);
|
|
83
|
-
// TODO(marik-d): Deduplicate peers.
|
|
84
|
-
this.peerCandidatesChanged.emit([topic, peers]);
|
|
85
|
-
},
|
|
86
|
-
err => {
|
|
87
|
-
log(`Join error ${host} ${err.message}`);
|
|
88
|
-
this._topicsJoinedPerSignal.get(host)!.delete(topic);
|
|
89
|
-
this._reconcile();
|
|
90
|
-
}
|
|
91
|
-
));
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
for (const [topic, peerId] of this._topicsJoinedPerSignal.get(host)!.entries()) {
|
|
95
|
-
if (!this._topicsJoined.has(topic)) {
|
|
96
|
-
log(`Leave ${topic} as ${peerId} on ${host}`);
|
|
97
|
-
promises.push(server.leave(topic, peerId).then(
|
|
98
|
-
() => {
|
|
99
|
-
log(`Left successfully ${host}`);
|
|
100
|
-
this._topicsJoinedPerSignal.get(host)!.delete(topic);
|
|
101
|
-
},
|
|
102
|
-
err => {
|
|
103
|
-
log(`Leave error ${host} ${err.message}`);
|
|
104
|
-
this._reconcile();
|
|
105
|
-
}
|
|
106
|
-
));
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
await Promise.all(promises);
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
private _reconcile () {
|
|
115
|
-
if (this._reconcileTimeoutId !== undefined) {
|
|
116
|
-
return;
|
|
117
|
-
}
|
|
118
|
-
log('Will reconcile in 3 seconds');
|
|
119
|
-
this._reconcileTimeoutId = setTimeout(async () => {
|
|
120
|
-
this._reconcileTimeoutId = undefined;
|
|
121
|
-
await this._reconcileJoinedTopics();
|
|
122
|
-
}, 3_000);
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
lookup (topic: PublicKey) {
|
|
126
|
-
log(`Lookup ${topic}`);
|
|
127
|
-
for (const server of this._servers.values()) {
|
|
128
|
-
server.lookup(topic).then(
|
|
129
|
-
peers => {
|
|
130
|
-
log(`Peer candidates changed ${topic} ${peers}`);
|
|
131
|
-
// TODO(marik-d): Deduplicate peers.
|
|
132
|
-
this.peerCandidatesChanged.emit([topic, peers]);
|
|
133
|
-
},
|
|
134
|
-
() => {
|
|
135
|
-
// Error will already be reported in devtools. No need to do anything here.
|
|
136
|
-
}
|
|
137
|
-
);
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
offer (msg: Message) {
|
|
142
|
-
log(`Offer ${msg.remoteId}`);
|
|
143
|
-
// TODO(marik-d): Broadcast to all signal servers.
|
|
144
|
-
return Array.from(this._servers.values())[0].offer(msg);
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
async signal (msg: Message) {
|
|
148
|
-
log(`Signal ${msg.remoteId}`);
|
|
149
|
-
for (const server of this._servers.values()) {
|
|
150
|
-
void server.signal(msg);
|
|
151
|
-
// TODO(marik-d): Error handling.
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
async destroy () {
|
|
156
|
-
await Promise.all(Array.from(this._servers.values()).map(server => server.close()));
|
|
157
|
-
}
|
|
158
|
-
}
|