@dxos/network-manager 2.33.5-dev.b9f5bea6 → 2.33.5-dev.c6e30fbc
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 +413 -279
- package/dist/src/index.js +5 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/network-manager.blueprint-test.js +5 -1
- package/dist/src/network-manager.blueprint-test.js.map +1 -1
- package/dist/src/network-manager.d.ts +1 -1
- package/dist/src/network-manager.d.ts.map +1 -1
- package/dist/src/network-manager.js +19 -17
- package/dist/src/network-manager.js.map +1 -1
- package/dist/src/signal/in-memory-signal-manager.d.ts +2 -2
- package/dist/src/signal/in-memory-signal-manager.d.ts.map +1 -1
- package/dist/src/signal/in-memory-signal-manager.js +2 -1
- package/dist/src/signal/in-memory-signal-manager.js.map +1 -1
- package/dist/src/signal/index.d.ts +2 -1
- package/dist/src/signal/index.d.ts.map +1 -1
- package/dist/src/signal/index.js +7 -2
- package/dist/src/signal/index.js.map +1 -1
- package/dist/src/signal/signal-api.d.ts +8 -66
- package/dist/src/signal/signal-api.d.ts.map +1 -1
- package/dist/src/signal/signal-api.js +2 -190
- package/dist/src/signal/signal-api.js.map +1 -1
- package/dist/src/signal/signal-client.d.ts +54 -0
- package/dist/src/signal/signal-client.d.ts.map +1 -0
- package/dist/src/signal/signal-client.js +198 -0
- package/dist/src/signal/signal-client.js.map +1 -0
- package/dist/src/signal/signal-client.test.d.ts +2 -0
- package/dist/src/signal/signal-client.test.d.ts.map +1 -0
- package/dist/src/signal/{signal-api.test.js → signal-client.test.js} +27 -27
- package/dist/src/signal/signal-client.test.js.map +1 -0
- package/dist/src/signal/{interface.d.ts → signal-manager.d.ts} +16 -5
- package/dist/src/signal/signal-manager.d.ts.map +1 -0
- package/dist/src/signal/{interface.js → signal-manager.js} +1 -1
- package/dist/src/signal/signal-manager.js.map +1 -0
- package/dist/src/signal/websocket-rpc.d.ts.map +1 -1
- package/dist/src/signal/websocket-rpc.js.map +1 -1
- package/dist/src/signal/websocket-signal-manager.d.ts +4 -4
- package/dist/src/signal/websocket-signal-manager.d.ts.map +1 -1
- package/dist/src/signal/websocket-signal-manager.js +4 -6
- package/dist/src/signal/websocket-signal-manager.js.map +1 -1
- package/dist/src/swarm/connection.d.ts +4 -1
- package/dist/src/swarm/connection.d.ts.map +1 -1
- package/dist/src/swarm/connection.js +6 -3
- package/dist/src/swarm/connection.js.map +1 -1
- package/dist/src/swarm/index.js +5 -1
- package/dist/src/swarm/index.js.map +1 -1
- package/dist/src/swarm/swarm.d.ts +4 -6
- package/dist/src/swarm/swarm.d.ts.map +1 -1
- package/dist/src/swarm/swarm.js +11 -12
- package/dist/src/swarm/swarm.js.map +1 -1
- package/dist/src/swarm/swarm.test.js +17 -14
- package/dist/src/swarm/swarm.test.js.map +1 -1
- package/dist/src/testing/test-protocol.d.ts +1 -0
- package/dist/src/testing/test-protocol.d.ts.map +1 -1
- package/dist/src/topology/index.js +5 -1
- package/dist/src/topology/index.js.map +1 -1
- package/dist/src/transport/in-memory-transport.d.ts +1 -1
- package/dist/src/transport/in-memory-transport.d.ts.map +1 -1
- package/dist/src/transport/in-memory-transport.js +2 -2
- package/dist/src/transport/in-memory-transport.js.map +1 -1
- package/dist/src/transport/index.js +5 -1
- package/dist/src/transport/index.js.map +1 -1
- package/dist/src/transport/transport.d.ts +1 -1
- package/dist/src/transport/transport.d.ts.map +1 -1
- package/dist/src/transport/webrtc-transport.d.ts +4 -4
- package/dist/src/transport/webrtc-transport.d.ts.map +1 -1
- package/dist/src/transport/webrtc-transport.js +8 -7
- package/dist/src/transport/webrtc-transport.js.map +1 -1
- package/dist/src/transport/webrtc-transport.test.js +4 -4
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +10 -10
- package/src/network-manager.ts +23 -23
- package/src/signal/in-memory-signal-manager.ts +6 -5
- package/src/signal/index.ts +2 -1
- package/src/signal/signal-api.ts +13 -246
- package/src/signal/{signal-api.test.ts → signal-client.test.ts} +27 -26
- package/src/signal/signal-client.ts +235 -0
- package/src/signal/signal-manager.ts +39 -0
- package/src/signal/websocket-rpc.ts +3 -6
- package/src/signal/websocket-signal-manager.ts +11 -15
- package/src/swarm/connection.ts +7 -6
- package/src/swarm/swarm.test.ts +32 -25
- package/src/swarm/swarm.ts +16 -15
- package/src/transport/in-memory-transport.ts +2 -2
- package/src/transport/transport.ts +13 -17
- package/src/transport/webrtc-transport.test.ts +5 -5
- package/src/transport/webrtc-transport.ts +6 -5
- package/dist/src/signal/interface.d.ts.map +0 -1
- package/dist/src/signal/interface.js.map +0 -1
- package/dist/src/signal/signal-api.test.d.ts +0 -2
- package/dist/src/signal/signal-api.test.d.ts.map +0 -1
- package/dist/src/signal/signal-api.test.js.map +0 -1
- package/src/signal/interface.ts +0 -32
|
@@ -2,198 +2,10 @@
|
|
|
2
2
|
//
|
|
3
3
|
// Copyright 2020 DXOS.org
|
|
4
4
|
//
|
|
5
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
|
-
};
|
|
8
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
6
|
exports.SignalApi = void 0;
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
const crypto_1 = require("@dxos/crypto");
|
|
13
|
-
const websocket_rpc_1 = require("./websocket-rpc");
|
|
14
|
-
const log = (0, debug_1.default)('dxos:network-manager:signal-api');
|
|
15
|
-
const DEFAULT_RECONNECT_TIMEOUT = 1000;
|
|
16
|
-
/**
|
|
17
|
-
* Establishes a websocket connection to signal server and provides RPC methods.
|
|
18
|
-
*/
|
|
19
|
-
class SignalApi {
|
|
20
|
-
/**
|
|
21
|
-
* @param _host Signal server websocket URL.
|
|
22
|
-
* @param _onOffer See `SignalApi.offer`.
|
|
23
|
-
* @param _onSignal See `SignalApi.signal`.
|
|
24
|
-
*/
|
|
25
|
-
constructor(_host, _onOffer, _onSignal) {
|
|
26
|
-
this._host = _host;
|
|
27
|
-
this._onOffer = _onOffer;
|
|
28
|
-
this._onSignal = _onSignal;
|
|
29
|
-
this._state = SignalApi.State.CONNECTING;
|
|
30
|
-
/**
|
|
31
|
-
* Number of milliseconds after which the connection will be attempted again in case of error.
|
|
32
|
-
*/
|
|
33
|
-
this._reconnectAfter = DEFAULT_RECONNECT_TIMEOUT;
|
|
34
|
-
/**
|
|
35
|
-
* Timestamp of when the connection attempt was began.
|
|
36
|
-
*/
|
|
37
|
-
this._connectionStarted = Date.now();
|
|
38
|
-
/**
|
|
39
|
-
* Timestamp of last state change.
|
|
40
|
-
*/
|
|
41
|
-
this._lastStateChange = Date.now();
|
|
42
|
-
this._clientCleanup = [];
|
|
43
|
-
this.statusChanged = new async_1.Event();
|
|
44
|
-
this.commandTrace = new async_1.Event();
|
|
45
|
-
this._setState(SignalApi.State.CONNECTING);
|
|
46
|
-
this._createClient();
|
|
47
|
-
}
|
|
48
|
-
_setState(newState) {
|
|
49
|
-
this._state = newState;
|
|
50
|
-
this._lastStateChange = Date.now();
|
|
51
|
-
log(`Signal state changed ${JSON.stringify(this.getStatus())}`);
|
|
52
|
-
this.statusChanged.emit(this.getStatus());
|
|
53
|
-
}
|
|
54
|
-
_createClient() {
|
|
55
|
-
this._connectionStarted = Date.now();
|
|
56
|
-
try {
|
|
57
|
-
this._client = new websocket_rpc_1.WebsocketRpc(this._host);
|
|
58
|
-
}
|
|
59
|
-
catch (error) {
|
|
60
|
-
if (this._state === SignalApi.State.RE_CONNECTING) {
|
|
61
|
-
this._reconnectAfter *= 2;
|
|
62
|
-
}
|
|
63
|
-
this._lastError = error;
|
|
64
|
-
this._setState(SignalApi.State.DISCONNECTED);
|
|
65
|
-
this._reconnect();
|
|
66
|
-
}
|
|
67
|
-
this._client.addHandler('offer', (message) => this._onOffer({
|
|
68
|
-
id: crypto_1.PublicKey.from(message.id),
|
|
69
|
-
remoteId: crypto_1.PublicKey.from(message.remoteId),
|
|
70
|
-
topic: crypto_1.PublicKey.from(message.topic),
|
|
71
|
-
sessionId: crypto_1.PublicKey.from(message.sessionId),
|
|
72
|
-
data: message.data
|
|
73
|
-
}));
|
|
74
|
-
this._client.subscribe('signal', (msg) => this._onSignal({
|
|
75
|
-
id: crypto_1.PublicKey.from(msg.id),
|
|
76
|
-
remoteId: crypto_1.PublicKey.from(msg.remoteId),
|
|
77
|
-
topic: crypto_1.PublicKey.from(msg.topic),
|
|
78
|
-
sessionId: crypto_1.PublicKey.from(msg.sessionId),
|
|
79
|
-
data: msg.data
|
|
80
|
-
}));
|
|
81
|
-
this._clientCleanup.push(this._client.connected.on(() => {
|
|
82
|
-
log('Socket connected');
|
|
83
|
-
this._lastError = undefined;
|
|
84
|
-
this._reconnectAfter = DEFAULT_RECONNECT_TIMEOUT;
|
|
85
|
-
this._setState(SignalApi.State.CONNECTED);
|
|
86
|
-
}));
|
|
87
|
-
this._clientCleanup.push(this._client.error.on(error => {
|
|
88
|
-
log(`Socket error: ${error.message}`);
|
|
89
|
-
if (this._state === SignalApi.State.CLOSED) {
|
|
90
|
-
return;
|
|
91
|
-
}
|
|
92
|
-
if (this._state === SignalApi.State.RE_CONNECTING) {
|
|
93
|
-
this._reconnectAfter *= 2;
|
|
94
|
-
}
|
|
95
|
-
this._lastError = error;
|
|
96
|
-
this._setState(SignalApi.State.DISCONNECTED);
|
|
97
|
-
this._reconnect();
|
|
98
|
-
}));
|
|
99
|
-
this._clientCleanup.push(this._client.disconnected.on(() => {
|
|
100
|
-
log('Socket disconnected');
|
|
101
|
-
// This is also called in case of error, but we already have disconnected the socket on error, so no need to do anything here.
|
|
102
|
-
if (this._state !== SignalApi.State.CONNECTING && this._state !== SignalApi.State.RE_CONNECTING) {
|
|
103
|
-
return;
|
|
104
|
-
}
|
|
105
|
-
if (this._state === SignalApi.State.RE_CONNECTING) {
|
|
106
|
-
this._reconnectAfter *= 2;
|
|
107
|
-
}
|
|
108
|
-
this._setState(SignalApi.State.DISCONNECTED);
|
|
109
|
-
this._reconnect();
|
|
110
|
-
}));
|
|
111
|
-
this._clientCleanup.push(this._client.commandTrace.on(trace => this.commandTrace.emit(trace)));
|
|
112
|
-
}
|
|
113
|
-
_reconnect() {
|
|
114
|
-
if (this._reconnectIntervalId !== undefined) {
|
|
115
|
-
console.error('Signal api already reconnecting.');
|
|
116
|
-
return;
|
|
117
|
-
}
|
|
118
|
-
if (this._state === SignalApi.State.CLOSED) {
|
|
119
|
-
return;
|
|
120
|
-
}
|
|
121
|
-
this._reconnectIntervalId = setTimeout(() => {
|
|
122
|
-
this._reconnectIntervalId = undefined;
|
|
123
|
-
this._clientCleanup.forEach(cb => cb());
|
|
124
|
-
this._clientCleanup = [];
|
|
125
|
-
// Close client if it wasn't already closed.
|
|
126
|
-
this._client.close().catch(() => { });
|
|
127
|
-
this._setState(SignalApi.State.RE_CONNECTING);
|
|
128
|
-
this._createClient();
|
|
129
|
-
}, this._reconnectAfter);
|
|
130
|
-
}
|
|
131
|
-
async close() {
|
|
132
|
-
this._clientCleanup.forEach(cb => cb());
|
|
133
|
-
this._clientCleanup = [];
|
|
134
|
-
if (this._reconnectIntervalId !== undefined) {
|
|
135
|
-
clearTimeout(this._reconnectIntervalId);
|
|
136
|
-
}
|
|
137
|
-
await this._client.close();
|
|
138
|
-
this._setState(SignalApi.State.CLOSED);
|
|
139
|
-
}
|
|
140
|
-
getStatus() {
|
|
141
|
-
var _a;
|
|
142
|
-
return {
|
|
143
|
-
host: this._host,
|
|
144
|
-
state: this._state,
|
|
145
|
-
error: (_a = this._lastError) === null || _a === void 0 ? void 0 : _a.message,
|
|
146
|
-
reconnectIn: this._reconnectAfter,
|
|
147
|
-
connectionStarted: this._connectionStarted,
|
|
148
|
-
lastStateChange: this._lastStateChange
|
|
149
|
-
};
|
|
150
|
-
}
|
|
151
|
-
async join(topic, peerId) {
|
|
152
|
-
const peers = await this._client.call('join', {
|
|
153
|
-
id: peerId.asBuffer(),
|
|
154
|
-
topic: topic.asBuffer()
|
|
155
|
-
});
|
|
156
|
-
return peers.map(id => crypto_1.PublicKey.from(id));
|
|
157
|
-
}
|
|
158
|
-
async leave(topic, peerId) {
|
|
159
|
-
await this._client.call('leave', {
|
|
160
|
-
id: peerId.asBuffer(),
|
|
161
|
-
topic: topic.asBuffer()
|
|
162
|
-
});
|
|
163
|
-
}
|
|
164
|
-
async lookup(topic) {
|
|
165
|
-
const peers = await this._client.call('lookup', {
|
|
166
|
-
topic: topic.asBuffer()
|
|
167
|
-
});
|
|
168
|
-
return peers.map(id => crypto_1.PublicKey.from(id));
|
|
169
|
-
}
|
|
170
|
-
/**
|
|
171
|
-
* Routes an offer to the other peer's _onOffer callback.
|
|
172
|
-
* @returns Other peer's _onOffer callback return value.
|
|
173
|
-
*/
|
|
174
|
-
async offer(payload) {
|
|
175
|
-
return this._client.call('offer', {
|
|
176
|
-
id: payload.id.asBuffer(),
|
|
177
|
-
remoteId: payload.remoteId.asBuffer(),
|
|
178
|
-
topic: payload.topic.asBuffer(),
|
|
179
|
-
sessionId: payload.sessionId.asBuffer(),
|
|
180
|
-
data: payload.data
|
|
181
|
-
});
|
|
182
|
-
}
|
|
183
|
-
/**
|
|
184
|
-
* Routes an offer to the other peer's _onSignal callback.
|
|
185
|
-
*/
|
|
186
|
-
async signal(payload) {
|
|
187
|
-
return this._client.emit('signal', {
|
|
188
|
-
id: payload.id.asBuffer(),
|
|
189
|
-
remoteId: payload.remoteId.asBuffer(),
|
|
190
|
-
topic: payload.topic.asBuffer(),
|
|
191
|
-
sessionId: payload.sessionId.asBuffer(),
|
|
192
|
-
data: payload.data
|
|
193
|
-
});
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
exports.SignalApi = SignalApi;
|
|
7
|
+
// TODO(burdon): Define message types as protobuf.
|
|
8
|
+
var SignalApi;
|
|
197
9
|
(function (SignalApi) {
|
|
198
10
|
let State;
|
|
199
11
|
(function (State) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signal-api.js","sourceRoot":"","sources":["../../../src/signal/signal-api.ts"],"names":[],"mappings":";AAAA,EAAE;AACF,0BAA0B;AAC1B,EAAE
|
|
1
|
+
{"version":3,"file":"signal-api.js","sourceRoot":"","sources":["../../../src/signal/signal-api.ts"],"names":[],"mappings":";AAAA,EAAE;AACF,0BAA0B;AAC1B,EAAE;;;AAMF,kDAAkD;AAElD,IAAiB,SAAS,CAiDzB;AAjDD,WAAiB,SAAS;IACxB,IAAY,KAeX;IAfD,WAAY,KAAK;QACf,uCAAuC;QACvC,kCAAyB,CAAA;QAEzB,0CAA0C;QAC1C,wCAA+B,CAAA;QAE/B,iBAAiB;QACjB,gCAAuB,CAAA;QAEvB,oEAAoE;QACpE,sCAA6B,CAAA;QAE7B,yBAAyB;QACzB,0BAAiB,CAAA;IACnB,CAAC,EAfW,KAAK,GAAL,eAAK,KAAL,eAAK,QAehB;AAiCH,CAAC,EAjDgB,SAAS,GAAT,iBAAS,KAAT,iBAAS,QAiDzB"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { Event } from '@dxos/async';
|
|
2
|
+
import { PublicKey } from '@dxos/crypto';
|
|
3
|
+
import { SignalApi } from './signal-api';
|
|
4
|
+
/**
|
|
5
|
+
* Establishes a websocket connection to signal server and provides RPC methods.
|
|
6
|
+
*/
|
|
7
|
+
export declare class SignalClient {
|
|
8
|
+
private readonly _host;
|
|
9
|
+
private readonly _onOffer;
|
|
10
|
+
private readonly _onSignal;
|
|
11
|
+
private _state;
|
|
12
|
+
private _lastError?;
|
|
13
|
+
/**
|
|
14
|
+
* Number of milliseconds after which the connection will be attempted again in case of error.
|
|
15
|
+
*/
|
|
16
|
+
private _reconnectAfter;
|
|
17
|
+
/**
|
|
18
|
+
* Timestamp of when the connection attempt was began.
|
|
19
|
+
*/
|
|
20
|
+
private _connectionStarted;
|
|
21
|
+
/**
|
|
22
|
+
* Timestamp of last state change.
|
|
23
|
+
*/
|
|
24
|
+
private _lastStateChange;
|
|
25
|
+
private _reconnectIntervalId?;
|
|
26
|
+
private _client;
|
|
27
|
+
private _clientCleanup;
|
|
28
|
+
readonly statusChanged: Event<SignalApi.Status>;
|
|
29
|
+
readonly commandTrace: Event<SignalApi.CommandTrace>;
|
|
30
|
+
/**
|
|
31
|
+
* @param _host Signal server websocket URL.
|
|
32
|
+
* @param _onOffer See `SignalApi.offer`.
|
|
33
|
+
* @param _onSignal See `SignalApi.signal`.
|
|
34
|
+
*/
|
|
35
|
+
constructor(_host: string, _onOffer: (message: SignalApi.SignalMessage) => Promise<SignalApi.Answer>, _onSignal: (message: SignalApi.SignalMessage) => Promise<void>);
|
|
36
|
+
private _setState;
|
|
37
|
+
private _createClient;
|
|
38
|
+
private _reconnect;
|
|
39
|
+
close(): Promise<void>;
|
|
40
|
+
getStatus(): SignalApi.Status;
|
|
41
|
+
join(topic: PublicKey, peerId: PublicKey): Promise<PublicKey[]>;
|
|
42
|
+
leave(topic: PublicKey, peerId: PublicKey): Promise<void>;
|
|
43
|
+
lookup(topic: PublicKey): Promise<PublicKey[]>;
|
|
44
|
+
/**
|
|
45
|
+
* Routes an offer to the other peer's _onOffer callback.
|
|
46
|
+
* @returns Other peer's _onOffer callback return value.
|
|
47
|
+
*/
|
|
48
|
+
offer(payload: SignalApi.SignalMessage): Promise<SignalApi.Answer>;
|
|
49
|
+
/**
|
|
50
|
+
* Routes an offer to the other peer's _onSignal callback.
|
|
51
|
+
*/
|
|
52
|
+
signal(payload: SignalApi.SignalMessage): Promise<void>;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=signal-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal-client.d.ts","sourceRoot":"","sources":["../../../src/signal/signal-client.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAOzC;;GAEG;AACH,qBAAa,YAAY;IAmCrB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IApC5B,OAAO,CAAC,MAAM,CAA8B;IAE5C,OAAO,CAAC,UAAU,CAAC,CAAQ;IAE3B;;OAEG;IACH,OAAO,CAAC,eAAe,CAA6B;IAEpD;;OAEG;IACH,OAAO,CAAC,kBAAkB,CAAc;IAExC;;OAEG;IACH,OAAO,CAAC,gBAAgB,CAAc;IAEtC,OAAO,CAAC,oBAAoB,CAAC,CAAiB;IAE9C,OAAO,CAAC,OAAO,CAAgB;IAE/B,OAAO,CAAC,cAAc,CAAsB;IAE5C,QAAQ,CAAC,aAAa,0BAAiC;IACvD,QAAQ,CAAC,YAAY,gCAAuC;IAE5D;;;;OAIG;gBAEgB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,aAAa,KAAK,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,EACzE,SAAS,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC;IAMjF,OAAO,CAAC,SAAS;IAOjB,OAAO,CAAC,aAAa;IAuErB,OAAO,CAAC,UAAU;IAuBZ,KAAK;IAYX,SAAS,IAAK,SAAS,CAAC,MAAM;IAWxB,IAAI,CAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAQhE,KAAK,CAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAO1D,MAAM,CAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAOrD;;;OAGG;IACG,KAAK,CAAE,OAAO,EAAE,SAAS,CAAC,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC;IAUzE;;OAEG;IACG,MAAM,CAAE,OAAO,EAAE,SAAS,CAAC,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;CAS/D"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
//
|
|
3
|
+
// Copyright 2020 DXOS.org
|
|
4
|
+
//
|
|
5
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.SignalClient = void 0;
|
|
10
|
+
const debug_1 = __importDefault(require("debug"));
|
|
11
|
+
const async_1 = require("@dxos/async");
|
|
12
|
+
const crypto_1 = require("@dxos/crypto");
|
|
13
|
+
const signal_api_1 = require("./signal-api");
|
|
14
|
+
const websocket_rpc_1 = require("./websocket-rpc");
|
|
15
|
+
const log = (0, debug_1.default)('dxos:network-manager:signal-client');
|
|
16
|
+
const DEFAULT_RECONNECT_TIMEOUT = 1000;
|
|
17
|
+
/**
|
|
18
|
+
* Establishes a websocket connection to signal server and provides RPC methods.
|
|
19
|
+
*/
|
|
20
|
+
class SignalClient {
|
|
21
|
+
/**
|
|
22
|
+
* @param _host Signal server websocket URL.
|
|
23
|
+
* @param _onOffer See `SignalApi.offer`.
|
|
24
|
+
* @param _onSignal See `SignalApi.signal`.
|
|
25
|
+
*/
|
|
26
|
+
constructor(_host, _onOffer, _onSignal) {
|
|
27
|
+
this._host = _host;
|
|
28
|
+
this._onOffer = _onOffer;
|
|
29
|
+
this._onSignal = _onSignal;
|
|
30
|
+
this._state = signal_api_1.SignalApi.State.CONNECTING;
|
|
31
|
+
/**
|
|
32
|
+
* Number of milliseconds after which the connection will be attempted again in case of error.
|
|
33
|
+
*/
|
|
34
|
+
this._reconnectAfter = DEFAULT_RECONNECT_TIMEOUT;
|
|
35
|
+
/**
|
|
36
|
+
* Timestamp of when the connection attempt was began.
|
|
37
|
+
*/
|
|
38
|
+
this._connectionStarted = Date.now();
|
|
39
|
+
/**
|
|
40
|
+
* Timestamp of last state change.
|
|
41
|
+
*/
|
|
42
|
+
this._lastStateChange = Date.now();
|
|
43
|
+
this._clientCleanup = [];
|
|
44
|
+
this.statusChanged = new async_1.Event();
|
|
45
|
+
this.commandTrace = new async_1.Event();
|
|
46
|
+
this._setState(signal_api_1.SignalApi.State.CONNECTING);
|
|
47
|
+
this._createClient();
|
|
48
|
+
}
|
|
49
|
+
_setState(newState) {
|
|
50
|
+
this._state = newState;
|
|
51
|
+
this._lastStateChange = Date.now();
|
|
52
|
+
log(`Signal state changed ${JSON.stringify(this.getStatus())}`);
|
|
53
|
+
this.statusChanged.emit(this.getStatus());
|
|
54
|
+
}
|
|
55
|
+
_createClient() {
|
|
56
|
+
this._connectionStarted = Date.now();
|
|
57
|
+
try {
|
|
58
|
+
this._client = new websocket_rpc_1.WebsocketRpc(this._host);
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
if (this._state === signal_api_1.SignalApi.State.RE_CONNECTING) {
|
|
62
|
+
this._reconnectAfter *= 2;
|
|
63
|
+
}
|
|
64
|
+
this._lastError = error;
|
|
65
|
+
this._setState(signal_api_1.SignalApi.State.DISCONNECTED);
|
|
66
|
+
this._reconnect();
|
|
67
|
+
}
|
|
68
|
+
this._client.addHandler('offer', (message) => this._onOffer({
|
|
69
|
+
id: crypto_1.PublicKey.from(message.id),
|
|
70
|
+
remoteId: crypto_1.PublicKey.from(message.remoteId),
|
|
71
|
+
topic: crypto_1.PublicKey.from(message.topic),
|
|
72
|
+
sessionId: crypto_1.PublicKey.from(message.sessionId),
|
|
73
|
+
data: message.data
|
|
74
|
+
}));
|
|
75
|
+
this._client.subscribe('signal', (msg) => this._onSignal({
|
|
76
|
+
id: crypto_1.PublicKey.from(msg.id),
|
|
77
|
+
remoteId: crypto_1.PublicKey.from(msg.remoteId),
|
|
78
|
+
topic: crypto_1.PublicKey.from(msg.topic),
|
|
79
|
+
sessionId: crypto_1.PublicKey.from(msg.sessionId),
|
|
80
|
+
data: msg.data
|
|
81
|
+
}));
|
|
82
|
+
this._clientCleanup.push(this._client.connected.on(() => {
|
|
83
|
+
log('Socket connected');
|
|
84
|
+
this._lastError = undefined;
|
|
85
|
+
this._reconnectAfter = DEFAULT_RECONNECT_TIMEOUT;
|
|
86
|
+
this._setState(signal_api_1.SignalApi.State.CONNECTED);
|
|
87
|
+
}));
|
|
88
|
+
this._clientCleanup.push(this._client.error.on(error => {
|
|
89
|
+
log(`Socket error: ${error.message}`);
|
|
90
|
+
if (this._state === signal_api_1.SignalApi.State.CLOSED) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
if (this._state === signal_api_1.SignalApi.State.RE_CONNECTING) {
|
|
94
|
+
this._reconnectAfter *= 2;
|
|
95
|
+
}
|
|
96
|
+
this._lastError = error;
|
|
97
|
+
this._setState(signal_api_1.SignalApi.State.DISCONNECTED);
|
|
98
|
+
this._reconnect();
|
|
99
|
+
}));
|
|
100
|
+
this._clientCleanup.push(this._client.disconnected.on(() => {
|
|
101
|
+
log('Socket disconnected');
|
|
102
|
+
// This is also called in case of error, but we already have disconnected the socket on error, so no need to do anything here.
|
|
103
|
+
if (this._state !== signal_api_1.SignalApi.State.CONNECTING && this._state !== signal_api_1.SignalApi.State.RE_CONNECTING) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
if (this._state === signal_api_1.SignalApi.State.RE_CONNECTING) {
|
|
107
|
+
this._reconnectAfter *= 2;
|
|
108
|
+
}
|
|
109
|
+
this._setState(signal_api_1.SignalApi.State.DISCONNECTED);
|
|
110
|
+
this._reconnect();
|
|
111
|
+
}));
|
|
112
|
+
this._clientCleanup.push(this._client.commandTrace.on(trace => this.commandTrace.emit(trace)));
|
|
113
|
+
}
|
|
114
|
+
_reconnect() {
|
|
115
|
+
if (this._reconnectIntervalId !== undefined) {
|
|
116
|
+
console.error('Signal api already reconnecting.');
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
if (this._state === signal_api_1.SignalApi.State.CLOSED) {
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
this._reconnectIntervalId = setTimeout(() => {
|
|
123
|
+
this._reconnectIntervalId = undefined;
|
|
124
|
+
this._clientCleanup.forEach(cb => cb());
|
|
125
|
+
this._clientCleanup = [];
|
|
126
|
+
// Close client if it wasn't already closed.
|
|
127
|
+
this._client.close().catch(() => { });
|
|
128
|
+
this._setState(signal_api_1.SignalApi.State.RE_CONNECTING);
|
|
129
|
+
this._createClient();
|
|
130
|
+
}, this._reconnectAfter);
|
|
131
|
+
}
|
|
132
|
+
async close() {
|
|
133
|
+
this._clientCleanup.forEach(cb => cb());
|
|
134
|
+
this._clientCleanup = [];
|
|
135
|
+
if (this._reconnectIntervalId !== undefined) {
|
|
136
|
+
clearTimeout(this._reconnectIntervalId);
|
|
137
|
+
}
|
|
138
|
+
await this._client.close();
|
|
139
|
+
this._setState(signal_api_1.SignalApi.State.CLOSED);
|
|
140
|
+
}
|
|
141
|
+
getStatus() {
|
|
142
|
+
var _a;
|
|
143
|
+
return {
|
|
144
|
+
host: this._host,
|
|
145
|
+
state: this._state,
|
|
146
|
+
error: (_a = this._lastError) === null || _a === void 0 ? void 0 : _a.message,
|
|
147
|
+
reconnectIn: this._reconnectAfter,
|
|
148
|
+
connectionStarted: this._connectionStarted,
|
|
149
|
+
lastStateChange: this._lastStateChange
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
async join(topic, peerId) {
|
|
153
|
+
const peers = await this._client.call('join', {
|
|
154
|
+
id: peerId.asBuffer(),
|
|
155
|
+
topic: topic.asBuffer()
|
|
156
|
+
});
|
|
157
|
+
return peers.map(id => crypto_1.PublicKey.from(id));
|
|
158
|
+
}
|
|
159
|
+
async leave(topic, peerId) {
|
|
160
|
+
await this._client.call('leave', {
|
|
161
|
+
id: peerId.asBuffer(),
|
|
162
|
+
topic: topic.asBuffer()
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
async lookup(topic) {
|
|
166
|
+
const peers = await this._client.call('lookup', {
|
|
167
|
+
topic: topic.asBuffer()
|
|
168
|
+
});
|
|
169
|
+
return peers.map(id => crypto_1.PublicKey.from(id));
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Routes an offer to the other peer's _onOffer callback.
|
|
173
|
+
* @returns Other peer's _onOffer callback return value.
|
|
174
|
+
*/
|
|
175
|
+
async offer(payload) {
|
|
176
|
+
return this._client.call('offer', {
|
|
177
|
+
id: payload.id.asBuffer(),
|
|
178
|
+
remoteId: payload.remoteId.asBuffer(),
|
|
179
|
+
topic: payload.topic.asBuffer(),
|
|
180
|
+
sessionId: payload.sessionId.asBuffer(),
|
|
181
|
+
data: payload.data
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Routes an offer to the other peer's _onSignal callback.
|
|
186
|
+
*/
|
|
187
|
+
async signal(payload) {
|
|
188
|
+
return this._client.emit('signal', {
|
|
189
|
+
id: payload.id.asBuffer(),
|
|
190
|
+
remoteId: payload.remoteId.asBuffer(),
|
|
191
|
+
topic: payload.topic.asBuffer(),
|
|
192
|
+
sessionId: payload.sessionId.asBuffer(),
|
|
193
|
+
data: payload.data
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
exports.SignalClient = SignalClient;
|
|
198
|
+
//# sourceMappingURL=signal-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal-client.js","sourceRoot":"","sources":["../../../src/signal/signal-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal-client.test.d.ts","sourceRoot":"","sources":["../../../src/signal/signal-client.test.ts"],"names":[],"mappings":""}
|
|
@@ -13,22 +13,22 @@ const async_1 = require("@dxos/async");
|
|
|
13
13
|
const crypto_1 = require("@dxos/crypto");
|
|
14
14
|
const signal_1 = require("@dxos/signal");
|
|
15
15
|
const util_1 = require("@dxos/util");
|
|
16
|
-
const
|
|
16
|
+
const signal_client_1 = require("./signal-client");
|
|
17
17
|
(0, mocha_1.describe)('SignalApi', () => {
|
|
18
18
|
let topic;
|
|
19
19
|
let peer1;
|
|
20
20
|
let peer2;
|
|
21
|
-
let
|
|
21
|
+
let api1;
|
|
22
22
|
let api2;
|
|
23
|
-
let
|
|
24
|
-
const
|
|
25
|
-
const
|
|
23
|
+
let broker1;
|
|
24
|
+
const signalApiPort1 = (0, util_1.randomInt)(10000, 50000);
|
|
25
|
+
const signalApiUrl1 = 'http://0.0.0.0:' + signalApiPort1;
|
|
26
26
|
// code let broker2: ReturnType<typeof createBroker>;
|
|
27
27
|
const signalApiPort2 = (0, util_1.randomInt)(10000, 50000);
|
|
28
28
|
const signalApiUrl2 = 'http://0.0.0.0:' + signalApiPort2;
|
|
29
29
|
before(async () => {
|
|
30
|
-
|
|
31
|
-
//
|
|
30
|
+
broker1 = await (0, signal_1.createTestBroker)(signalApiPort1);
|
|
31
|
+
// broker2 = await createTestBroker(signalApiPort2);
|
|
32
32
|
});
|
|
33
33
|
beforeEach(() => {
|
|
34
34
|
topic = crypto_1.PublicKey.random();
|
|
@@ -37,22 +37,22 @@ const signal_api_1 = require("./signal-api");
|
|
|
37
37
|
});
|
|
38
38
|
after(async function () {
|
|
39
39
|
this.timeout(0);
|
|
40
|
-
await
|
|
41
|
-
await
|
|
40
|
+
await api1.close();
|
|
41
|
+
await broker1.stop();
|
|
42
42
|
// code await broker2.stop();
|
|
43
43
|
});
|
|
44
44
|
(0, mocha_1.it)('join', async () => {
|
|
45
|
-
|
|
46
|
-
const join = await
|
|
45
|
+
api1 = new signal_client_1.SignalClient(signalApiUrl1, (async () => { }), async () => { });
|
|
46
|
+
const join = await api1.join(topic, peer1);
|
|
47
47
|
(0, earljs_1.expect)(join).toEqual([peer1]);
|
|
48
|
-
const join2 = await
|
|
48
|
+
const join2 = await api1.join(topic, peer2);
|
|
49
49
|
(0, earljs_1.expect)(join2).toEqual([peer1, peer2]);
|
|
50
50
|
}).timeout(1000);
|
|
51
51
|
(0, mocha_1.it)('offer', async () => {
|
|
52
52
|
const offerMock = (0, earljs_1.mockFn)()
|
|
53
53
|
.resolvesTo({ accept: true });
|
|
54
|
-
|
|
55
|
-
await
|
|
54
|
+
api1 = new signal_client_1.SignalClient(signalApiUrl1, offerMock, async () => { });
|
|
55
|
+
await api1.join(topic, peer1);
|
|
56
56
|
const offer = {
|
|
57
57
|
data: { foo: 'bar' },
|
|
58
58
|
id: peer2,
|
|
@@ -60,15 +60,15 @@ const signal_api_1 = require("./signal-api");
|
|
|
60
60
|
sessionId: crypto_1.PublicKey.random(),
|
|
61
61
|
topic
|
|
62
62
|
};
|
|
63
|
-
const offerResult = await
|
|
63
|
+
const offerResult = await api1.offer(offer);
|
|
64
64
|
(0, earljs_1.expect)(offerResult).toEqual({ accept: true });
|
|
65
65
|
(0, earljs_1.expect)(offerMock).toHaveBeenCalledWith([offer]);
|
|
66
66
|
}).timeout(5000);
|
|
67
67
|
(0, mocha_1.it)('signal', async () => {
|
|
68
68
|
const signalMock = (0, earljs_1.mockFn)()
|
|
69
69
|
.resolvesTo();
|
|
70
|
-
|
|
71
|
-
await
|
|
70
|
+
api1 = new signal_client_1.SignalClient(signalApiUrl1, (async () => { }), signalMock);
|
|
71
|
+
await api1.join(topic, peer1);
|
|
72
72
|
const msg = {
|
|
73
73
|
id: peer2,
|
|
74
74
|
remoteId: peer1,
|
|
@@ -76,23 +76,23 @@ const signal_api_1 = require("./signal-api");
|
|
|
76
76
|
topic,
|
|
77
77
|
data: { foo: 'bar' }
|
|
78
78
|
};
|
|
79
|
-
await
|
|
79
|
+
await api1.signal(msg);
|
|
80
80
|
await (0, wait_for_expect_1.default)(() => {
|
|
81
81
|
(0, earljs_1.expect)(signalMock).toHaveBeenCalledWith([msg]);
|
|
82
82
|
}, 4000);
|
|
83
83
|
}).timeout(5000);
|
|
84
84
|
mocha_1.it.skip('join across multiple signal servers', async () => {
|
|
85
85
|
// This feature is not implemented yet.
|
|
86
|
-
|
|
87
|
-
api2 = new
|
|
88
|
-
await
|
|
86
|
+
api1 = new signal_client_1.SignalClient(signalApiUrl1, (async () => { }), async () => { });
|
|
87
|
+
api2 = new signal_client_1.SignalClient(signalApiUrl2, (async () => { }), async () => { });
|
|
88
|
+
await api1.join(topic, peer1);
|
|
89
89
|
await api2.join(topic, peer2);
|
|
90
90
|
await (0, wait_for_expect_1.default)(async () => {
|
|
91
91
|
const peers = await api2.lookup(topic);
|
|
92
92
|
(0, earljs_1.expect)(peers.length).toEqual(2);
|
|
93
93
|
}, 4000);
|
|
94
94
|
await (0, wait_for_expect_1.default)(async () => {
|
|
95
|
-
const peers = await
|
|
95
|
+
const peers = await api1.lookup(topic);
|
|
96
96
|
(0, earljs_1.expect)(peers.length).toEqual(2);
|
|
97
97
|
}, 4000);
|
|
98
98
|
}).timeout(5000);
|
|
@@ -102,9 +102,9 @@ const signal_api_1 = require("./signal-api");
|
|
|
102
102
|
.resolvesTo({ accept: true });
|
|
103
103
|
const signalMock = (0, earljs_1.mockFn)()
|
|
104
104
|
.resolvesTo();
|
|
105
|
-
|
|
106
|
-
api2 = new
|
|
107
|
-
await
|
|
105
|
+
api1 = new signal_client_1.SignalClient(signalApiUrl1, offerMock, async () => { });
|
|
106
|
+
api2 = new signal_client_1.SignalClient(signalApiUrl2, (async () => { }), signalMock);
|
|
107
|
+
await api1.join(topic, peer1);
|
|
108
108
|
await (0, async_1.sleep)(3000);
|
|
109
109
|
await api2.join(topic, peer2);
|
|
110
110
|
const sessionId = crypto_1.PublicKey.random();
|
|
@@ -123,10 +123,10 @@ const signal_api_1 = require("./signal-api");
|
|
|
123
123
|
topic,
|
|
124
124
|
data: { foo: 'bar' }
|
|
125
125
|
};
|
|
126
|
-
await
|
|
126
|
+
await api1.signal(msg);
|
|
127
127
|
await (0, wait_for_expect_1.default)(() => {
|
|
128
128
|
(0, earljs_1.expect)(signalMock).toHaveBeenCalledWith([msg]);
|
|
129
129
|
}, 4000);
|
|
130
130
|
}).timeout(5000);
|
|
131
131
|
}).timeout(10000);
|
|
132
|
-
//# sourceMappingURL=signal-
|
|
132
|
+
//# sourceMappingURL=signal-client.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal-client.test.js","sourceRoot":"","sources":["../../../src/signal/signal-client.test.ts"],"names":[],"mappings":";AAAA,EAAE;AACF,0BAA0B;AAC1B,EAAE;;;;;AAEF,mCAAwC;AACxC,iCAA6C;AAC7C,sEAA4C;AAE5C,uCAA6C;AAC7C,yCAAyC;AACzC,yCAAgD;AAChD,qCAAuC;AAGvC,mDAA+C;AAE/C,IAAA,gBAAQ,EAAC,WAAW,EAAE,GAAG,EAAE;IACzB,IAAI,KAAgB,CAAC;IACrB,IAAI,KAAgB,CAAC;IACrB,IAAI,KAAgB,CAAC;IACrB,IAAI,IAAkB,CAAC;IACvB,IAAI,IAAkB,CAAC;IAEvB,IAAI,OAAqD,CAAC;IAC1D,MAAM,cAAc,GAAG,IAAA,gBAAS,EAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC/C,MAAM,aAAa,GAAG,iBAAiB,GAAG,cAAc,CAAC;IAEzD,qDAAqD;IACrD,MAAM,cAAc,GAAG,IAAA,gBAAS,EAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC/C,MAAM,aAAa,GAAG,iBAAiB,GAAG,cAAc,CAAC;IAEzD,MAAM,CAAC,KAAK,IAAI,EAAE;QAChB,OAAO,GAAG,MAAM,IAAA,yBAAgB,EAAC,cAAc,CAAC,CAAC;QACjD,oDAAoD;IACtD,CAAC,CAAC,CAAC;IAEH,UAAU,CAAC,GAAG,EAAE;QACd,KAAK,GAAG,kBAAS,CAAC,MAAM,EAAE,CAAC;QAC3B,KAAK,GAAG,kBAAS,CAAC,MAAM,EAAE,CAAC;QAC3B,KAAK,GAAG,kBAAS,CAAC,MAAM,EAAE,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAChB,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACnB,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;QACrB,6BAA6B;IAC/B,CAAC,CAAC,CAAC;IAEH,IAAA,UAAI,EAAC,MAAM,EAAE,KAAK,IAAI,EAAE;QACtB,IAAI,GAAG,IAAI,4BAAY,CAAC,aAAa,EAAE,CAAC,KAAK,IAAI,EAAE,GAAE,CAAC,CAAQ,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC,CAAC;QAEhF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC3C,IAAA,eAAM,EAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QAE9B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC5C,IAAA,eAAM,EAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAK,CAAC,CAAC;IAElB,IAAA,UAAI,EAAC,OAAO,EAAE,KAAK,IAAI,EAAE;QACvB,MAAM,SAAS,GAAG,IAAA,eAAM,GAA+D;aACpF,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAChC,IAAI,GAAG,IAAI,4BAAY,CAAC,aAAa,EAAE,SAAS,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC,CAAC;QAElE,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAE9B,MAAM,KAAK,GAA4B;YACrC,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAS;YAC3B,EAAE,EAAE,KAAK;YACT,QAAQ,EAAE,KAAK;YACf,SAAS,EAAE,kBAAS,CAAC,MAAM,EAAE;YAC7B,KAAK;SACN,CAAC;QACF,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5C,IAAA,eAAM,EAAC,WAAW,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,IAAA,eAAM,EAAC,SAAS,CAAC,CAAC,oBAAoB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC,OAAO,CAAC,IAAK,CAAC,CAAC;IAElB,IAAA,UAAI,EAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QACxB,MAAM,UAAU,GAAG,IAAA,eAAM,GAAmD;aACzE,UAAU,EAAE,CAAC;QAChB,IAAI,GAAG,IAAI,4BAAY,CAAC,aAAa,EAAE,CAAC,KAAK,IAAI,EAAE,GAAE,CAAC,CAAQ,EAAE,UAAU,CAAC,CAAC;QAE5E,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAE9B,MAAM,GAAG,GAA4B;YACnC,EAAE,EAAE,KAAK;YACT,QAAQ,EAAE,KAAK;YACf,SAAS,EAAE,kBAAS,CAAC,MAAM,EAAE;YAC7B,KAAK;YACL,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAS;SAC5B,CAAC;QACF,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAEvB,MAAM,IAAA,yBAAa,EAAC,GAAG,EAAE;YACvB,IAAA,eAAM,EAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACjD,CAAC,EAAE,IAAK,CAAC,CAAC;IACZ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAK,CAAC,CAAC;IAElB,UAAI,CAAC,IAAI,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QAC1D,uCAAuC;QACvC,IAAI,GAAG,IAAI,4BAAY,CAAC,aAAa,EAAE,CAAC,KAAK,IAAI,EAAE,GAAE,CAAC,CAAQ,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC,CAAC;QAChF,IAAI,GAAG,IAAI,4BAAY,CAAC,aAAa,EAAE,CAAC,KAAK,IAAI,EAAE,GAAE,CAAC,CAAQ,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC,CAAC;QAEhF,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC9B,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAE9B,MAAM,IAAA,yBAAa,EAAC,KAAK,IAAI,EAAE;YAC7B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvC,IAAA,eAAM,EAAC,KAAK,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC,EAAE,IAAK,CAAC,CAAC;QAEV,MAAM,IAAA,yBAAa,EAAC,KAAK,IAAI,EAAE;YAC7B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvC,IAAA,eAAM,EAAC,KAAK,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC,EAAE,IAAK,CAAC,CAAC;IACZ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAK,CAAC,CAAC;IAElB,4EAA4E;IAC5E,UAAI,CAAC,IAAI,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QACtF,MAAM,SAAS,GAAG,IAAA,eAAM,GAA+D;aACpF,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAChC,MAAM,UAAU,GAAG,IAAA,eAAM,GAAmD;aACzE,UAAU,EAAE,CAAC;QAEhB,IAAI,GAAG,IAAI,4BAAY,CAAC,aAAa,EAAE,SAAS,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC,CAAC;QAClE,IAAI,GAAG,IAAI,4BAAY,CAAC,aAAa,EAAE,CAAC,KAAK,IAAI,EAAE,GAAE,CAAC,CAAQ,EAAE,UAAU,CAAC,CAAC;QAE5E,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC9B,MAAM,IAAA,aAAK,EAAC,IAAI,CAAC,CAAC;QAClB,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAE9B,MAAM,SAAS,GAAG,kBAAS,CAAC,MAAM,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC;YAC9B,QAAQ,EAAE,KAAK;YACf,EAAE,EAAE,KAAK;YACT,KAAK;YACL,SAAS;YACT,IAAI,EAAE,EAAE;SACT,CAAC,CAAC;QACH,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAEzC,MAAM,GAAG,GAA4B;YACnC,EAAE,EAAE,KAAK;YACT,QAAQ,EAAE,KAAK;YACf,SAAS;YACT,KAAK;YACL,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAS;SAC5B,CAAC;QACF,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAEvB,MAAM,IAAA,yBAAa,EAAC,GAAG,EAAE;YACvB,IAAA,eAAM,EAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACjD,CAAC,EAAE,IAAK,CAAC,CAAC;IACZ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAK,CAAC,CAAC;AACpB,CAAC,CAAC,CAAC,OAAO,CAAC,KAAM,CAAC,CAAC"}
|