@dxos/messaging 0.8.3 → 0.8.4-main.1068cf700f
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/neutral/chunk-5MOQVHHI.mjs +694 -0
- package/dist/lib/neutral/chunk-5MOQVHHI.mjs.map +7 -0
- package/dist/lib/{browser/chunk-ISA3S2ZX.mjs → neutral/index.mjs} +412 -1018
- package/dist/lib/neutral/index.mjs.map +7 -0
- package/dist/lib/neutral/meta.json +1 -0
- package/dist/lib/{browser → neutral}/testing/index.mjs +18 -12
- package/dist/lib/neutral/testing/index.mjs.map +7 -0
- package/dist/types/src/messenger.blueprint-test.d.ts.map +1 -1
- package/dist/types/src/messenger.d.ts +1 -1
- package/dist/types/src/messenger.d.ts.map +1 -1
- package/dist/types/src/signal-client/signal-client.d.ts +2 -2
- package/dist/types/src/signal-client/signal-client.d.ts.map +1 -1
- package/dist/types/src/signal-client/signal-local-state.d.ts +1 -1
- package/dist/types/src/signal-client/signal-local-state.d.ts.map +1 -1
- package/dist/types/src/signal-client/signal-rpc-client.d.ts +2 -2
- package/dist/types/src/signal-client/signal-rpc-client.d.ts.map +1 -1
- package/dist/types/src/signal-manager/edge-signal-manager.d.ts +1 -1
- package/dist/types/src/signal-manager/edge-signal-manager.d.ts.map +1 -1
- package/dist/types/src/signal-manager/index.d.ts +1 -1
- package/dist/types/src/signal-manager/index.d.ts.map +1 -1
- package/dist/types/src/signal-manager/memory-signal-manager.d.ts +1 -1
- package/dist/types/src/signal-manager/memory-signal-manager.d.ts.map +1 -1
- package/dist/types/src/signal-manager/signal-manager.d.ts +1 -1
- package/dist/types/src/signal-manager/signal-manager.d.ts.map +1 -1
- package/dist/types/src/signal-manager/websocket-signal-manager.d.ts +1 -1
- package/dist/types/src/signal-manager/websocket-signal-manager.d.ts.map +1 -1
- package/dist/types/src/signal-methods.d.ts +2 -2
- package/dist/types/src/signal-methods.d.ts.map +1 -1
- package/dist/types/src/testing/test-builder.d.ts +1 -1
- package/dist/types/src/testing/test-builder.d.ts.map +1 -1
- package/dist/types/src/testing/test-peer.d.ts +1 -1
- package/dist/types/src/testing/test-peer.d.ts.map +1 -1
- package/dist/types/src/testing/utils.d.ts +1 -1
- package/dist/types/src/testing/utils.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +25 -21
- package/src/messenger.blueprint-test.ts +2 -2
- package/src/messenger.node.test.ts +7 -38
- package/src/messenger.ts +5 -5
- package/src/signal-client/signal-client.node.test.ts +4 -3
- package/src/signal-client/signal-client.ts +7 -6
- package/src/signal-client/signal-local-state.ts +4 -3
- package/src/signal-client/signal-rpc-client.node.test.ts +1 -1
- package/src/signal-client/signal-rpc-client.ts +6 -6
- package/src/signal-manager/edge-signal-manager.ts +23 -13
- package/src/signal-manager/index.ts +1 -1
- package/src/signal-manager/memory-signal-manager.ts +2 -1
- package/src/signal-manager/signal-manager.ts +1 -1
- package/src/signal-manager/websocket-signal-manager.node.test.ts +3 -2
- package/src/signal-manager/websocket-signal-manager.ts +4 -3
- package/src/signal-methods.ts +3 -3
- package/src/testing/test-builder.ts +3 -2
- package/src/testing/test-peer.ts +3 -2
- package/src/testing/utils.ts +3 -2
- package/dist/lib/browser/chunk-ISA3S2ZX.mjs.map +0 -7
- package/dist/lib/browser/index.mjs +0 -22
- package/dist/lib/browser/index.mjs.map +0 -7
- package/dist/lib/browser/meta.json +0 -1
- package/dist/lib/browser/testing/index.mjs.map +0 -7
- package/dist/lib/node/chunk-GMND65DN.cjs +0 -2291
- package/dist/lib/node/chunk-GMND65DN.cjs.map +0 -7
- package/dist/lib/node/index.cjs +0 -43
- package/dist/lib/node/index.cjs.map +0 -7
- package/dist/lib/node/meta.json +0 -1
- package/dist/lib/node/testing/index.cjs +0 -159
- package/dist/lib/node/testing/index.cjs.map +0 -7
- package/dist/lib/node-esm/chunk-SO4RY3ON.mjs +0 -2309
- package/dist/lib/node-esm/chunk-SO4RY3ON.mjs.map +0 -7
- package/dist/lib/node-esm/index.mjs +0 -22
- package/dist/lib/node-esm/index.mjs.map +0 -7
- package/dist/lib/node-esm/meta.json +0 -1
- package/dist/lib/node-esm/testing/index.mjs +0 -143
- package/dist/lib/node-esm/testing/index.mjs.map +0 -7
|
@@ -1,443 +1,38 @@
|
|
|
1
1
|
import "@dxos/node-std/globals";
|
|
2
|
+
import {
|
|
3
|
+
MemorySignalManager,
|
|
4
|
+
MemorySignalManagerContext,
|
|
5
|
+
Messenger,
|
|
6
|
+
PeerInfoHash
|
|
7
|
+
} from "./chunk-5MOQVHHI.mjs";
|
|
2
8
|
|
|
3
|
-
//
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import { invariant } from "@dxos/invariant";
|
|
7
|
-
import { PublicKey } from "@dxos/keys";
|
|
8
|
-
import { log } from "@dxos/log";
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import { ComplexMap, ComplexSet } from "@dxos/util";
|
|
9
|
+
// src/signal-client/signal-client.ts
|
|
10
|
+
import { DeferredTask, Event as Event2, Trigger as Trigger2, scheduleTask, scheduleTaskInterval as scheduleTaskInterval2, sleep } from "@dxos/async";
|
|
11
|
+
import { Resource, cancelWithContext as cancelWithContext2 } from "@dxos/context";
|
|
12
|
+
import { invariant as invariant2 } from "@dxos/invariant";
|
|
13
|
+
import { PublicKey as PublicKey3 } from "@dxos/keys";
|
|
14
|
+
import { log as log3 } from "@dxos/log";
|
|
15
|
+
import { trace as trace4 } from "@dxos/protocols";
|
|
16
|
+
import { SignalState } from "@dxos/protocols/proto/dxos/mesh/signal";
|
|
12
17
|
|
|
13
|
-
//
|
|
18
|
+
// src/signal-client/signal-client-monitor.ts
|
|
14
19
|
import { trace } from "@dxos/tracing";
|
|
15
|
-
var
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
attempts: params.sendAttempts
|
|
24
|
-
}
|
|
25
|
-
});
|
|
26
|
-
}
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
// packages/core/mesh/messaging/src/timeouts.ts
|
|
30
|
-
var MESSAGE_TIMEOUT = 1e4;
|
|
31
|
-
|
|
32
|
-
// packages/core/mesh/messaging/src/messenger.ts
|
|
33
|
-
var __dxlog_file = "/home/runner/work/dxos/dxos/packages/core/mesh/messaging/src/messenger.ts";
|
|
34
|
-
var ReliablePayload = schema.getCodecForType("dxos.mesh.messaging.ReliablePayload");
|
|
35
|
-
var Acknowledgement = schema.getCodecForType("dxos.mesh.messaging.Acknowledgement");
|
|
36
|
-
var RECEIVED_MESSAGES_GC_INTERVAL = 12e4;
|
|
37
|
-
var Messenger = class {
|
|
38
|
-
constructor({ signalManager, retryDelay = 1e3 }) {
|
|
39
|
-
this._monitor = new MessengerMonitor();
|
|
40
|
-
// { peerId, payloadType } => listeners set
|
|
41
|
-
this._listeners = new ComplexMap(({ peerId, payloadType }) => peerId + payloadType);
|
|
42
|
-
// peerId => listeners set
|
|
43
|
-
this._defaultListeners = /* @__PURE__ */ new Map();
|
|
44
|
-
this._onAckCallbacks = new ComplexMap(PublicKey.hash);
|
|
45
|
-
this._receivedMessages = new ComplexSet(PublicKey.hash);
|
|
46
|
-
/**
|
|
47
|
-
* Keys scheduled to be cleared from _receivedMessages on the next iteration.
|
|
48
|
-
*/
|
|
49
|
-
this._toClear = new ComplexSet(PublicKey.hash);
|
|
50
|
-
this._closed = true;
|
|
51
|
-
this._signalManager = signalManager;
|
|
52
|
-
this._retryDelay = retryDelay;
|
|
53
|
-
this.open();
|
|
54
|
-
}
|
|
55
|
-
open() {
|
|
56
|
-
if (!this._closed) {
|
|
57
|
-
return;
|
|
58
|
-
}
|
|
59
|
-
const traceId = PublicKey.random().toHex();
|
|
60
|
-
log.trace("dxos.mesh.messenger.open", trace2.begin({
|
|
61
|
-
id: traceId
|
|
62
|
-
}), {
|
|
63
|
-
F: __dxlog_file,
|
|
64
|
-
L: 72,
|
|
65
|
-
S: this,
|
|
66
|
-
C: (f, a) => f(...a)
|
|
67
|
-
});
|
|
68
|
-
this._ctx = new Context({
|
|
69
|
-
onError: (err) => log.catch(err, void 0, {
|
|
70
|
-
F: __dxlog_file,
|
|
71
|
-
L: 74,
|
|
72
|
-
S: this,
|
|
73
|
-
C: (f, a) => f(...a)
|
|
74
|
-
})
|
|
75
|
-
}, {
|
|
76
|
-
F: __dxlog_file,
|
|
77
|
-
L: 73
|
|
78
|
-
});
|
|
79
|
-
this._ctx.onDispose(this._signalManager.onMessage.on(async (message) => {
|
|
80
|
-
log("received message", {
|
|
81
|
-
from: message.author
|
|
82
|
-
}, {
|
|
83
|
-
F: __dxlog_file,
|
|
84
|
-
L: 78,
|
|
85
|
-
S: this,
|
|
86
|
-
C: (f, a) => f(...a)
|
|
87
|
-
});
|
|
88
|
-
await this._handleMessage(message);
|
|
89
|
-
}));
|
|
90
|
-
scheduleTaskInterval(this._ctx, async () => {
|
|
91
|
-
this._performGc();
|
|
92
|
-
}, RECEIVED_MESSAGES_GC_INTERVAL);
|
|
93
|
-
this._closed = false;
|
|
94
|
-
log.trace("dxos.mesh.messenger.open", trace2.end({
|
|
95
|
-
id: traceId
|
|
96
|
-
}), {
|
|
97
|
-
F: __dxlog_file,
|
|
98
|
-
L: 93,
|
|
99
|
-
S: this,
|
|
100
|
-
C: (f, a) => f(...a)
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
async close() {
|
|
104
|
-
if (this._closed) {
|
|
105
|
-
return;
|
|
106
|
-
}
|
|
107
|
-
this._closed = true;
|
|
108
|
-
await this._ctx.dispose();
|
|
109
|
-
}
|
|
110
|
-
async sendMessage({ author, recipient, payload }) {
|
|
111
|
-
invariant(!this._closed, "Closed", {
|
|
112
|
-
F: __dxlog_file,
|
|
113
|
-
L: 105,
|
|
114
|
-
S: this,
|
|
115
|
-
A: [
|
|
116
|
-
"!this._closed",
|
|
117
|
-
"'Closed'"
|
|
118
|
-
]
|
|
119
|
-
});
|
|
120
|
-
const messageContext = this._ctx.derive();
|
|
121
|
-
const reliablePayload = {
|
|
122
|
-
messageId: PublicKey.random(),
|
|
123
|
-
payload
|
|
124
|
-
};
|
|
125
|
-
invariant(!this._onAckCallbacks.has(reliablePayload.messageId), void 0, {
|
|
126
|
-
F: __dxlog_file,
|
|
127
|
-
L: 112,
|
|
128
|
-
S: this,
|
|
129
|
-
A: [
|
|
130
|
-
"!this._onAckCallbacks.has(reliablePayload.messageId!)",
|
|
131
|
-
""
|
|
132
|
-
]
|
|
133
|
-
});
|
|
134
|
-
log("send message", {
|
|
135
|
-
messageId: reliablePayload.messageId,
|
|
136
|
-
author,
|
|
137
|
-
recipient
|
|
138
|
-
}, {
|
|
139
|
-
F: __dxlog_file,
|
|
140
|
-
L: 113,
|
|
141
|
-
S: this,
|
|
142
|
-
C: (f, a) => f(...a)
|
|
143
|
-
});
|
|
144
|
-
let messageReceived;
|
|
145
|
-
let timeoutHit;
|
|
146
|
-
let sendAttempts = 0;
|
|
147
|
-
const promise = new Promise((resolve, reject) => {
|
|
148
|
-
messageReceived = resolve;
|
|
149
|
-
timeoutHit = reject;
|
|
150
|
-
});
|
|
151
|
-
scheduleExponentialBackoffTaskInterval(messageContext, async () => {
|
|
152
|
-
log("retrying message", {
|
|
153
|
-
messageId: reliablePayload.messageId
|
|
154
|
-
}, {
|
|
155
|
-
F: __dxlog_file,
|
|
156
|
-
L: 128,
|
|
157
|
-
S: this,
|
|
158
|
-
C: (f, a) => f(...a)
|
|
159
|
-
});
|
|
160
|
-
sendAttempts++;
|
|
161
|
-
await this._encodeAndSend({
|
|
162
|
-
author,
|
|
163
|
-
recipient,
|
|
164
|
-
reliablePayload
|
|
165
|
-
}).catch((err) => log("failed to send message", {
|
|
166
|
-
err
|
|
167
|
-
}, {
|
|
168
|
-
F: __dxlog_file,
|
|
169
|
-
L: 131,
|
|
170
|
-
S: this,
|
|
171
|
-
C: (f, a) => f(...a)
|
|
172
|
-
}));
|
|
173
|
-
}, this._retryDelay);
|
|
174
|
-
scheduleTask(messageContext, () => {
|
|
175
|
-
log("message not delivered", {
|
|
176
|
-
messageId: reliablePayload.messageId
|
|
177
|
-
}, {
|
|
178
|
-
F: __dxlog_file,
|
|
179
|
-
L: 140,
|
|
180
|
-
S: this,
|
|
181
|
-
C: (f, a) => f(...a)
|
|
182
|
-
});
|
|
183
|
-
this._onAckCallbacks.delete(reliablePayload.messageId);
|
|
184
|
-
timeoutHit(new ProtocolTimeoutError("signaling message not delivered", new TimeoutError(MESSAGE_TIMEOUT, "Message not delivered")));
|
|
185
|
-
void messageContext.dispose();
|
|
186
|
-
this._monitor.recordReliableMessage({
|
|
187
|
-
sendAttempts,
|
|
188
|
-
sent: false
|
|
189
|
-
});
|
|
190
|
-
}, MESSAGE_TIMEOUT);
|
|
191
|
-
this._onAckCallbacks.set(reliablePayload.messageId, () => {
|
|
192
|
-
messageReceived();
|
|
193
|
-
this._onAckCallbacks.delete(reliablePayload.messageId);
|
|
194
|
-
void messageContext.dispose();
|
|
195
|
-
this._monitor.recordReliableMessage({
|
|
196
|
-
sendAttempts,
|
|
197
|
-
sent: true
|
|
198
|
-
});
|
|
199
|
-
});
|
|
200
|
-
await this._encodeAndSend({
|
|
201
|
-
author,
|
|
202
|
-
recipient,
|
|
203
|
-
reliablePayload
|
|
204
|
-
});
|
|
205
|
-
return promise;
|
|
206
|
-
}
|
|
20
|
+
var SignalClientMonitor = class {
|
|
21
|
+
_performance = {
|
|
22
|
+
sentMessages: 0,
|
|
23
|
+
receivedMessages: 0,
|
|
24
|
+
reconnectCounter: 0,
|
|
25
|
+
joinCounter: 0,
|
|
26
|
+
leaveCounter: 0
|
|
27
|
+
};
|
|
207
28
|
/**
|
|
208
|
-
*
|
|
209
|
-
* @param payloadType if not specified, onMessage will be subscribed to all types of messages.
|
|
29
|
+
* Timestamp of when the connection attempt was began.
|
|
210
30
|
*/
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
A: [
|
|
217
|
-
"!this._closed",
|
|
218
|
-
"'Closed'"
|
|
219
|
-
]
|
|
220
|
-
});
|
|
221
|
-
await this._signalManager.subscribeMessages(peer);
|
|
222
|
-
let listeners;
|
|
223
|
-
invariant(peer.peerKey, "Peer key is required", {
|
|
224
|
-
F: __dxlog_file,
|
|
225
|
-
L: 182,
|
|
226
|
-
S: this,
|
|
227
|
-
A: [
|
|
228
|
-
"peer.peerKey",
|
|
229
|
-
"'Peer key is required'"
|
|
230
|
-
]
|
|
231
|
-
});
|
|
232
|
-
if (!payloadType) {
|
|
233
|
-
listeners = this._defaultListeners.get(peer.peerKey);
|
|
234
|
-
if (!listeners) {
|
|
235
|
-
listeners = /* @__PURE__ */ new Set();
|
|
236
|
-
this._defaultListeners.set(peer.peerKey, listeners);
|
|
237
|
-
}
|
|
238
|
-
} else {
|
|
239
|
-
listeners = this._listeners.get({
|
|
240
|
-
peerId: peer.peerKey,
|
|
241
|
-
payloadType
|
|
242
|
-
});
|
|
243
|
-
if (!listeners) {
|
|
244
|
-
listeners = /* @__PURE__ */ new Set();
|
|
245
|
-
this._listeners.set({
|
|
246
|
-
peerId: peer.peerKey,
|
|
247
|
-
payloadType
|
|
248
|
-
}, listeners);
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
listeners.add(onMessage);
|
|
252
|
-
return {
|
|
253
|
-
unsubscribe: async () => {
|
|
254
|
-
listeners.delete(onMessage);
|
|
255
|
-
}
|
|
256
|
-
};
|
|
257
|
-
}
|
|
258
|
-
async _encodeAndSend({ author, recipient, reliablePayload }) {
|
|
259
|
-
await this._signalManager.sendMessage({
|
|
260
|
-
author,
|
|
261
|
-
recipient,
|
|
262
|
-
payload: {
|
|
263
|
-
type_url: "dxos.mesh.messaging.ReliablePayload",
|
|
264
|
-
value: ReliablePayload.encode(reliablePayload, {
|
|
265
|
-
preserveAny: true
|
|
266
|
-
})
|
|
267
|
-
}
|
|
268
|
-
});
|
|
269
|
-
}
|
|
270
|
-
async _handleMessage(message) {
|
|
271
|
-
switch (message.payload.type_url) {
|
|
272
|
-
case "dxos.mesh.messaging.ReliablePayload": {
|
|
273
|
-
await this._handleReliablePayload(message);
|
|
274
|
-
break;
|
|
275
|
-
}
|
|
276
|
-
case "dxos.mesh.messaging.Acknowledgement": {
|
|
277
|
-
await this._handleAcknowledgement({
|
|
278
|
-
payload: message.payload
|
|
279
|
-
});
|
|
280
|
-
break;
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
async _handleReliablePayload({ author, recipient, payload }) {
|
|
285
|
-
invariant(payload.type_url === "dxos.mesh.messaging.ReliablePayload", void 0, {
|
|
286
|
-
F: __dxlog_file,
|
|
287
|
-
L: 240,
|
|
288
|
-
S: this,
|
|
289
|
-
A: [
|
|
290
|
-
"payload.type_url === 'dxos.mesh.messaging.ReliablePayload'",
|
|
291
|
-
""
|
|
292
|
-
]
|
|
293
|
-
});
|
|
294
|
-
const reliablePayload = ReliablePayload.decode(payload.value, {
|
|
295
|
-
preserveAny: true
|
|
296
|
-
});
|
|
297
|
-
log("handling message", {
|
|
298
|
-
messageId: reliablePayload.messageId
|
|
299
|
-
}, {
|
|
300
|
-
F: __dxlog_file,
|
|
301
|
-
L: 243,
|
|
302
|
-
S: this,
|
|
303
|
-
C: (f, a) => f(...a)
|
|
304
|
-
});
|
|
305
|
-
try {
|
|
306
|
-
await this._sendAcknowledgement({
|
|
307
|
-
author,
|
|
308
|
-
recipient,
|
|
309
|
-
messageId: reliablePayload.messageId
|
|
310
|
-
});
|
|
311
|
-
} catch (err) {
|
|
312
|
-
this._monitor.recordMessageAckFailed();
|
|
313
|
-
throw err;
|
|
314
|
-
}
|
|
315
|
-
if (this._receivedMessages.has(reliablePayload.messageId)) {
|
|
316
|
-
return;
|
|
317
|
-
}
|
|
318
|
-
this._receivedMessages.add(reliablePayload.messageId);
|
|
319
|
-
await this._callListeners({
|
|
320
|
-
author,
|
|
321
|
-
recipient,
|
|
322
|
-
payload: reliablePayload.payload
|
|
323
|
-
});
|
|
324
|
-
}
|
|
325
|
-
async _handleAcknowledgement({ payload }) {
|
|
326
|
-
invariant(payload.type_url === "dxos.mesh.messaging.Acknowledgement", void 0, {
|
|
327
|
-
F: __dxlog_file,
|
|
328
|
-
L: 271,
|
|
329
|
-
S: this,
|
|
330
|
-
A: [
|
|
331
|
-
"payload.type_url === 'dxos.mesh.messaging.Acknowledgement'",
|
|
332
|
-
""
|
|
333
|
-
]
|
|
334
|
-
});
|
|
335
|
-
this._onAckCallbacks.get(Acknowledgement.decode(payload.value).messageId)?.();
|
|
336
|
-
}
|
|
337
|
-
async _sendAcknowledgement({ author, recipient, messageId }) {
|
|
338
|
-
log("sending ACK", {
|
|
339
|
-
messageId,
|
|
340
|
-
from: recipient,
|
|
341
|
-
to: author
|
|
342
|
-
}, {
|
|
343
|
-
F: __dxlog_file,
|
|
344
|
-
L: 284,
|
|
345
|
-
S: this,
|
|
346
|
-
C: (f, a) => f(...a)
|
|
347
|
-
});
|
|
348
|
-
await this._signalManager.sendMessage({
|
|
349
|
-
author: recipient,
|
|
350
|
-
recipient: author,
|
|
351
|
-
payload: {
|
|
352
|
-
type_url: "dxos.mesh.messaging.Acknowledgement",
|
|
353
|
-
value: Acknowledgement.encode({
|
|
354
|
-
messageId
|
|
355
|
-
})
|
|
356
|
-
}
|
|
357
|
-
});
|
|
358
|
-
}
|
|
359
|
-
async _callListeners(message) {
|
|
360
|
-
{
|
|
361
|
-
invariant(message.recipient.peerKey, "Peer key is required", {
|
|
362
|
-
F: __dxlog_file,
|
|
363
|
-
L: 298,
|
|
364
|
-
S: this,
|
|
365
|
-
A: [
|
|
366
|
-
"message.recipient.peerKey",
|
|
367
|
-
"'Peer key is required'"
|
|
368
|
-
]
|
|
369
|
-
});
|
|
370
|
-
const defaultListenerMap = this._defaultListeners.get(message.recipient.peerKey);
|
|
371
|
-
if (defaultListenerMap) {
|
|
372
|
-
for (const listener of defaultListenerMap) {
|
|
373
|
-
await listener(message);
|
|
374
|
-
}
|
|
375
|
-
}
|
|
376
|
-
}
|
|
377
|
-
{
|
|
378
|
-
const listenerMap = this._listeners.get({
|
|
379
|
-
peerId: message.recipient.peerKey,
|
|
380
|
-
payloadType: message.payload.type_url
|
|
381
|
-
});
|
|
382
|
-
if (listenerMap) {
|
|
383
|
-
for (const listener of listenerMap) {
|
|
384
|
-
await listener(message);
|
|
385
|
-
}
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
_performGc() {
|
|
390
|
-
const start = performance.now();
|
|
391
|
-
for (const key of this._toClear.keys()) {
|
|
392
|
-
this._receivedMessages.delete(key);
|
|
393
|
-
}
|
|
394
|
-
this._toClear.clear();
|
|
395
|
-
for (const key of this._receivedMessages.keys()) {
|
|
396
|
-
this._toClear.add(key);
|
|
397
|
-
}
|
|
398
|
-
const elapsed = performance.now() - start;
|
|
399
|
-
if (elapsed > 100) {
|
|
400
|
-
log.warn("GC took too long", {
|
|
401
|
-
elapsed
|
|
402
|
-
}, {
|
|
403
|
-
F: __dxlog_file,
|
|
404
|
-
L: 333,
|
|
405
|
-
S: this,
|
|
406
|
-
C: (f, a) => f(...a)
|
|
407
|
-
});
|
|
408
|
-
}
|
|
409
|
-
}
|
|
410
|
-
};
|
|
411
|
-
|
|
412
|
-
// packages/core/mesh/messaging/src/signal-client/signal-client.ts
|
|
413
|
-
import { DeferredTask, Event as Event2, Trigger as Trigger2, scheduleTask as scheduleTask2, scheduleTaskInterval as scheduleTaskInterval3, sleep } from "@dxos/async";
|
|
414
|
-
import { cancelWithContext as cancelWithContext2, Resource } from "@dxos/context";
|
|
415
|
-
import { invariant as invariant3 } from "@dxos/invariant";
|
|
416
|
-
import { PublicKey as PublicKey4 } from "@dxos/keys";
|
|
417
|
-
import { log as log4 } from "@dxos/log";
|
|
418
|
-
import { trace as trace6 } from "@dxos/protocols";
|
|
419
|
-
import { SignalState } from "@dxos/protocols/proto/dxos/mesh/signal";
|
|
420
|
-
|
|
421
|
-
// packages/core/mesh/messaging/src/signal-client/signal-client-monitor.ts
|
|
422
|
-
import { trace as trace3 } from "@dxos/tracing";
|
|
423
|
-
var SignalClientMonitor = class {
|
|
424
|
-
constructor() {
|
|
425
|
-
this._performance = {
|
|
426
|
-
sentMessages: 0,
|
|
427
|
-
receivedMessages: 0,
|
|
428
|
-
reconnectCounter: 0,
|
|
429
|
-
joinCounter: 0,
|
|
430
|
-
leaveCounter: 0
|
|
431
|
-
};
|
|
432
|
-
/**
|
|
433
|
-
* Timestamp of when the connection attempt was began.
|
|
434
|
-
*/
|
|
435
|
-
this._connectionStarted = /* @__PURE__ */ new Date();
|
|
436
|
-
/**
|
|
437
|
-
* Timestamp of last state change.
|
|
438
|
-
*/
|
|
439
|
-
this._lastStateChange = /* @__PURE__ */ new Date();
|
|
440
|
-
}
|
|
31
|
+
_connectionStarted = /* @__PURE__ */ new Date();
|
|
32
|
+
/**
|
|
33
|
+
* Timestamp of last state change.
|
|
34
|
+
*/
|
|
35
|
+
_lastStateChange = /* @__PURE__ */ new Date();
|
|
441
36
|
getRecordedTimestamps() {
|
|
442
37
|
return {
|
|
443
38
|
connectionStarted: this._connectionStarted,
|
|
@@ -452,7 +47,7 @@ var SignalClientMonitor = class {
|
|
|
452
47
|
}
|
|
453
48
|
recordReconnect(params) {
|
|
454
49
|
this._performance.reconnectCounter++;
|
|
455
|
-
|
|
50
|
+
trace.metrics.increment("dxos.mesh.signal.signal-client.reconnect", 1, {
|
|
456
51
|
tags: {
|
|
457
52
|
success: params.success
|
|
458
53
|
}
|
|
@@ -466,10 +61,10 @@ var SignalClientMonitor = class {
|
|
|
466
61
|
}
|
|
467
62
|
recordMessageReceived(message) {
|
|
468
63
|
this._performance.receivedMessages++;
|
|
469
|
-
|
|
64
|
+
trace.metrics.increment("dxos.mesh.signal.signal-client.received-total", 1, {
|
|
470
65
|
tags: createIdentityTags(message)
|
|
471
66
|
});
|
|
472
|
-
|
|
67
|
+
trace.metrics.distribution("dxos.mesh.signal.signal-client.bytes-in", getByteCount(message), {
|
|
473
68
|
tags: createIdentityTags(message)
|
|
474
69
|
});
|
|
475
70
|
}
|
|
@@ -481,16 +76,16 @@ var SignalClientMonitor = class {
|
|
|
481
76
|
const reqStart = Date.now();
|
|
482
77
|
await sendMessage();
|
|
483
78
|
const reqDuration = Date.now() - reqStart;
|
|
484
|
-
|
|
79
|
+
trace.metrics.distribution("dxos.mesh.signal.signal-client.send-duration", reqDuration, {
|
|
485
80
|
tags
|
|
486
81
|
});
|
|
487
|
-
|
|
82
|
+
trace.metrics.distribution("dxos.mesh.signal.signal-client.bytes-out", getByteCount(message), {
|
|
488
83
|
tags
|
|
489
84
|
});
|
|
490
85
|
} catch (err) {
|
|
491
86
|
success = false;
|
|
492
87
|
}
|
|
493
|
-
|
|
88
|
+
trace.metrics.increment("dxos.mesh.signal.signal-client.sent-total", 1, {
|
|
494
89
|
tags: {
|
|
495
90
|
...tags,
|
|
496
91
|
success
|
|
@@ -498,10 +93,10 @@ var SignalClientMonitor = class {
|
|
|
498
93
|
});
|
|
499
94
|
}
|
|
500
95
|
recordStreamCloseErrors(count) {
|
|
501
|
-
|
|
96
|
+
trace.metrics.increment("dxos.mesh.signal.signal-client.stream-close-errors", count);
|
|
502
97
|
}
|
|
503
98
|
recordReconciliation(params) {
|
|
504
|
-
|
|
99
|
+
trace.metrics.increment("dxos.mesh.signal.signal-client.reconciliation", 1, {
|
|
505
100
|
tags: {
|
|
506
101
|
success: params.success
|
|
507
102
|
}
|
|
@@ -517,22 +112,41 @@ var createIdentityTags = (message) => {
|
|
|
517
112
|
};
|
|
518
113
|
};
|
|
519
114
|
|
|
520
|
-
//
|
|
521
|
-
import {
|
|
115
|
+
// src/signal-client/signal-local-state.ts
|
|
116
|
+
import { Event, asyncTimeout } from "@dxos/async";
|
|
522
117
|
import { cancelWithContext } from "@dxos/context";
|
|
523
|
-
import { PublicKey
|
|
524
|
-
import { log
|
|
525
|
-
import { ComplexMap
|
|
526
|
-
var
|
|
118
|
+
import { PublicKey } from "@dxos/keys";
|
|
119
|
+
import { log } from "@dxos/log";
|
|
120
|
+
import { ComplexMap, ComplexSet, safeAwaitAll } from "@dxos/util";
|
|
121
|
+
var __dxlog_file = "/__w/dxos/dxos/packages/core/mesh/messaging/src/signal-client/signal-local-state.ts";
|
|
527
122
|
var SignalLocalState = class {
|
|
123
|
+
_onMessage;
|
|
124
|
+
_onSwarmEvent;
|
|
125
|
+
/**
|
|
126
|
+
* Swarm events streams. Keys represent actually joined topic and peerId.
|
|
127
|
+
*/
|
|
128
|
+
_swarmStreams = new ComplexMap(({ topic, peerId }) => topic.toHex() + peerId.toHex());
|
|
129
|
+
/**
|
|
130
|
+
* Represent desired joined topic and peerId.
|
|
131
|
+
*/
|
|
132
|
+
_joinedTopics = new ComplexSet(({ topic, peerId }) => topic.toHex() + peerId.toHex());
|
|
133
|
+
/**
|
|
134
|
+
* Represent desired message subscriptions.
|
|
135
|
+
*/
|
|
136
|
+
_subscribedMessages = new ComplexSet(({ peerId }) => peerId.toHex());
|
|
137
|
+
/**
|
|
138
|
+
* Message streams. Keys represents actually subscribed peers.
|
|
139
|
+
* @internal
|
|
140
|
+
*/
|
|
141
|
+
messageStreams = new ComplexMap((key) => key.toHex());
|
|
142
|
+
/**
|
|
143
|
+
* Event to use in tests to wait till subscription is successfully established.
|
|
144
|
+
* @internal
|
|
145
|
+
*/
|
|
146
|
+
reconciled = new Event();
|
|
528
147
|
constructor(_onMessage, _onSwarmEvent) {
|
|
529
148
|
this._onMessage = _onMessage;
|
|
530
149
|
this._onSwarmEvent = _onSwarmEvent;
|
|
531
|
-
this._swarmStreams = new ComplexMap2(({ topic, peerId }) => topic.toHex() + peerId.toHex());
|
|
532
|
-
this._joinedTopics = new ComplexSet2(({ topic, peerId }) => topic.toHex() + peerId.toHex());
|
|
533
|
-
this._subscribedMessages = new ComplexSet2(({ peerId }) => peerId.toHex());
|
|
534
|
-
this.messageStreams = new ComplexMap2((key) => key.toHex());
|
|
535
|
-
this.reconciled = new Event();
|
|
536
150
|
}
|
|
537
151
|
async safeCloseStreams() {
|
|
538
152
|
const streams = [
|
|
@@ -573,11 +187,11 @@ var SignalLocalState = class {
|
|
|
573
187
|
});
|
|
574
188
|
}
|
|
575
189
|
unsubscribeMessages(peerId) {
|
|
576
|
-
|
|
190
|
+
log("unsubscribing from messages", {
|
|
577
191
|
peerId
|
|
578
192
|
}, {
|
|
579
|
-
F:
|
|
580
|
-
L:
|
|
193
|
+
F: __dxlog_file,
|
|
194
|
+
L: 80,
|
|
581
195
|
S: this,
|
|
582
196
|
C: (f, a) => f(...a)
|
|
583
197
|
});
|
|
@@ -625,11 +239,11 @@ var SignalLocalState = class {
|
|
|
625
239
|
topic,
|
|
626
240
|
peerId
|
|
627
241
|
})) {
|
|
628
|
-
|
|
242
|
+
log("swarm event", {
|
|
629
243
|
swarmEvent
|
|
630
244
|
}, {
|
|
631
|
-
F:
|
|
632
|
-
L:
|
|
245
|
+
F: __dxlog_file,
|
|
246
|
+
L: 116,
|
|
633
247
|
S: this,
|
|
634
248
|
C: (f, a) => f(...a)
|
|
635
249
|
});
|
|
@@ -638,7 +252,7 @@ var SignalLocalState = class {
|
|
|
638
252
|
peerAvailable: {
|
|
639
253
|
...swarmEvent.peerAvailable,
|
|
640
254
|
peer: {
|
|
641
|
-
peerKey:
|
|
255
|
+
peerKey: PublicKey.from(swarmEvent.peerAvailable.peer).toHex()
|
|
642
256
|
}
|
|
643
257
|
}
|
|
644
258
|
} : {
|
|
@@ -646,7 +260,7 @@ var SignalLocalState = class {
|
|
|
646
260
|
peerLeft: {
|
|
647
261
|
...swarmEvent.peerLeft,
|
|
648
262
|
peer: {
|
|
649
|
-
peerKey:
|
|
263
|
+
peerKey: PublicKey.from(swarmEvent.peerLeft.peer).toHex()
|
|
650
264
|
}
|
|
651
265
|
}
|
|
652
266
|
};
|
|
@@ -680,10 +294,10 @@ var SignalLocalState = class {
|
|
|
680
294
|
})) {
|
|
681
295
|
const message = {
|
|
682
296
|
author: {
|
|
683
|
-
peerKey:
|
|
297
|
+
peerKey: PublicKey.from(signalMessage.author).toHex()
|
|
684
298
|
},
|
|
685
299
|
recipient: {
|
|
686
|
-
peerKey:
|
|
300
|
+
peerKey: PublicKey.from(signalMessage.recipient).toHex()
|
|
687
301
|
},
|
|
688
302
|
payload: signalMessage.payload
|
|
689
303
|
};
|
|
@@ -695,22 +309,22 @@ var SignalLocalState = class {
|
|
|
695
309
|
}
|
|
696
310
|
};
|
|
697
311
|
|
|
698
|
-
//
|
|
312
|
+
// src/signal-client/signal-rpc-client.ts
|
|
699
313
|
import WebSocket from "isomorphic-ws";
|
|
700
|
-
import {
|
|
701
|
-
import { Context
|
|
702
|
-
import { invariant
|
|
703
|
-
import { PublicKey as
|
|
704
|
-
import { log as
|
|
705
|
-
import { trace as
|
|
706
|
-
import { schema
|
|
314
|
+
import { TimeoutError, Trigger, scheduleTaskInterval } from "@dxos/async";
|
|
315
|
+
import { Context } from "@dxos/context";
|
|
316
|
+
import { invariant } from "@dxos/invariant";
|
|
317
|
+
import { PublicKey as PublicKey2 } from "@dxos/keys";
|
|
318
|
+
import { log as log2 } from "@dxos/log";
|
|
319
|
+
import { trace as trace3 } from "@dxos/protocols";
|
|
320
|
+
import { schema } from "@dxos/protocols/proto";
|
|
707
321
|
import { createProtoRpcPeer } from "@dxos/rpc";
|
|
708
322
|
|
|
709
|
-
//
|
|
710
|
-
import { trace as
|
|
323
|
+
// src/signal-client/signal-rpc-client-monitor.ts
|
|
324
|
+
import { trace as trace2 } from "@dxos/tracing";
|
|
711
325
|
var SignalRpcClientMonitor = class {
|
|
712
326
|
recordClientCloseFailure(params) {
|
|
713
|
-
|
|
327
|
+
trace2.metrics.increment("dxos.mesh.signal.signal-rpc-client.close-failure", 1, {
|
|
714
328
|
tags: {
|
|
715
329
|
reason: params.failureReason
|
|
716
330
|
}
|
|
@@ -718,20 +332,25 @@ var SignalRpcClientMonitor = class {
|
|
|
718
332
|
}
|
|
719
333
|
};
|
|
720
334
|
|
|
721
|
-
//
|
|
722
|
-
var
|
|
335
|
+
// src/signal-client/signal-rpc-client.ts
|
|
336
|
+
var __dxlog_file2 = "/__w/dxos/dxos/packages/core/mesh/messaging/src/signal-client/signal-rpc-client.ts";
|
|
723
337
|
var SIGNAL_KEEPALIVE_INTERVAL = 1e4;
|
|
724
338
|
var SignalRPCClient = class {
|
|
339
|
+
_socket;
|
|
340
|
+
_rpc;
|
|
341
|
+
_connectTrigger = new Trigger();
|
|
342
|
+
_keepaliveCtx;
|
|
343
|
+
_closed = false;
|
|
344
|
+
_url;
|
|
345
|
+
_callbacks;
|
|
346
|
+
_closeComplete = new Trigger();
|
|
347
|
+
_monitor = new SignalRpcClientMonitor();
|
|
725
348
|
constructor({ url, callbacks = {} }) {
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
this._closeComplete = new Trigger();
|
|
729
|
-
this._monitor = new SignalRpcClientMonitor();
|
|
730
|
-
const traceId = PublicKey3.random().toHex();
|
|
731
|
-
log3.trace("dxos.mesh.signal-rpc-client.constructor", trace5.begin({
|
|
349
|
+
const traceId = PublicKey2.random().toHex();
|
|
350
|
+
log2.trace("dxos.mesh.signal-rpc-client.constructor", trace3.begin({
|
|
732
351
|
id: traceId
|
|
733
352
|
}), {
|
|
734
|
-
F:
|
|
353
|
+
F: __dxlog_file2,
|
|
735
354
|
L: 66,
|
|
736
355
|
S: this,
|
|
737
356
|
C: (f, a) => f(...a)
|
|
@@ -741,7 +360,7 @@ var SignalRPCClient = class {
|
|
|
741
360
|
this._socket = new WebSocket(this._url);
|
|
742
361
|
this._rpc = createProtoRpcPeer({
|
|
743
362
|
requested: {
|
|
744
|
-
Signal:
|
|
363
|
+
Signal: schema.getService("dxos.mesh.signal.Signal")
|
|
745
364
|
},
|
|
746
365
|
noHandshake: true,
|
|
747
366
|
port: {
|
|
@@ -752,8 +371,8 @@ var SignalRPCClient = class {
|
|
|
752
371
|
try {
|
|
753
372
|
this._socket.send(msg);
|
|
754
373
|
} catch (err) {
|
|
755
|
-
|
|
756
|
-
F:
|
|
374
|
+
log2.warn("send error", err, {
|
|
375
|
+
F: __dxlog_file2,
|
|
757
376
|
L: 85,
|
|
758
377
|
S: this,
|
|
759
378
|
C: (f, a) => f(...a)
|
|
@@ -781,19 +400,19 @@ var SignalRPCClient = class {
|
|
|
781
400
|
await this._safeCloseRpc();
|
|
782
401
|
return;
|
|
783
402
|
}
|
|
784
|
-
|
|
785
|
-
F:
|
|
403
|
+
log2(`RPC open ${this._url}`, void 0, {
|
|
404
|
+
F: __dxlog_file2,
|
|
786
405
|
L: 110,
|
|
787
406
|
S: this,
|
|
788
407
|
C: (f, a) => f(...a)
|
|
789
408
|
});
|
|
790
409
|
this._callbacks.onConnected?.();
|
|
791
410
|
this._connectTrigger.wake();
|
|
792
|
-
this._keepaliveCtx = new
|
|
793
|
-
F:
|
|
411
|
+
this._keepaliveCtx = new Context(void 0, {
|
|
412
|
+
F: __dxlog_file2,
|
|
794
413
|
L: 113
|
|
795
414
|
});
|
|
796
|
-
|
|
415
|
+
scheduleTaskInterval(this._keepaliveCtx, async () => {
|
|
797
416
|
this._socket?.send("__ping__");
|
|
798
417
|
}, SIGNAL_KEEPALIVE_INTERVAL);
|
|
799
418
|
} catch (err) {
|
|
@@ -803,8 +422,8 @@ var SignalRPCClient = class {
|
|
|
803
422
|
}
|
|
804
423
|
};
|
|
805
424
|
this._socket.onclose = async () => {
|
|
806
|
-
|
|
807
|
-
F:
|
|
425
|
+
log2(`Disconnected ${this._url}`, void 0, {
|
|
426
|
+
F: __dxlog_file2,
|
|
808
427
|
L: 133,
|
|
809
428
|
S: this,
|
|
810
429
|
C: (f, a) => f(...a)
|
|
@@ -821,20 +440,20 @@ var SignalRPCClient = class {
|
|
|
821
440
|
this._closed = true;
|
|
822
441
|
this._callbacks.onError?.(event.error ?? new Error(event.message));
|
|
823
442
|
await this._safeCloseRpc();
|
|
824
|
-
|
|
443
|
+
log2.warn(`Socket ${event.type ?? "unknown"} error`, {
|
|
825
444
|
message: event.message,
|
|
826
445
|
url: this._url
|
|
827
446
|
}, {
|
|
828
|
-
F:
|
|
447
|
+
F: __dxlog_file2,
|
|
829
448
|
L: 149,
|
|
830
449
|
S: this,
|
|
831
450
|
C: (f, a) => f(...a)
|
|
832
451
|
});
|
|
833
452
|
};
|
|
834
|
-
|
|
453
|
+
log2.trace("dxos.mesh.signal-rpc-client.constructor", trace3.end({
|
|
835
454
|
id: traceId
|
|
836
455
|
}), {
|
|
837
|
-
F:
|
|
456
|
+
F: __dxlog_file2,
|
|
838
457
|
L: 152,
|
|
839
458
|
S: this,
|
|
840
459
|
C: (f, a) => f(...a)
|
|
@@ -855,25 +474,25 @@ var SignalRPCClient = class {
|
|
|
855
474
|
timeout: 1e3
|
|
856
475
|
});
|
|
857
476
|
} catch (err) {
|
|
858
|
-
const failureReason = err instanceof
|
|
477
|
+
const failureReason = err instanceof TimeoutError ? "timeout" : err?.constructor?.name ?? "unknown";
|
|
859
478
|
this._monitor.recordClientCloseFailure({
|
|
860
479
|
failureReason
|
|
861
480
|
});
|
|
862
481
|
}
|
|
863
482
|
}
|
|
864
483
|
async join({ topic, peerId }) {
|
|
865
|
-
|
|
484
|
+
log2("join", {
|
|
866
485
|
topic,
|
|
867
486
|
peerId,
|
|
868
487
|
metadata: this._callbacks?.getMetadata?.()
|
|
869
488
|
}, {
|
|
870
|
-
F:
|
|
489
|
+
F: __dxlog_file2,
|
|
871
490
|
L: 178,
|
|
872
491
|
S: this,
|
|
873
492
|
C: (f, a) => f(...a)
|
|
874
493
|
});
|
|
875
|
-
|
|
876
|
-
F:
|
|
494
|
+
invariant(!this._closed, "SignalRPCClient is closed", {
|
|
495
|
+
F: __dxlog_file2,
|
|
877
496
|
L: 179,
|
|
878
497
|
S: this,
|
|
879
498
|
A: [
|
|
@@ -891,16 +510,16 @@ var SignalRPCClient = class {
|
|
|
891
510
|
return swarmStream;
|
|
892
511
|
}
|
|
893
512
|
async receiveMessages(peerId) {
|
|
894
|
-
|
|
513
|
+
log2("receiveMessages", {
|
|
895
514
|
peerId
|
|
896
515
|
}, {
|
|
897
|
-
F:
|
|
516
|
+
F: __dxlog_file2,
|
|
898
517
|
L: 191,
|
|
899
518
|
S: this,
|
|
900
519
|
C: (f, a) => f(...a)
|
|
901
520
|
});
|
|
902
|
-
|
|
903
|
-
F:
|
|
521
|
+
invariant(!this._closed, "SignalRPCClient is closed", {
|
|
522
|
+
F: __dxlog_file2,
|
|
904
523
|
L: 192,
|
|
905
524
|
S: this,
|
|
906
525
|
A: [
|
|
@@ -916,19 +535,19 @@ var SignalRPCClient = class {
|
|
|
916
535
|
return messageStream;
|
|
917
536
|
}
|
|
918
537
|
async sendMessage({ author, recipient, payload }) {
|
|
919
|
-
|
|
538
|
+
log2("sendMessage", {
|
|
920
539
|
author,
|
|
921
540
|
recipient,
|
|
922
541
|
payload,
|
|
923
542
|
metadata: this._callbacks?.getMetadata?.()
|
|
924
543
|
}, {
|
|
925
|
-
F:
|
|
544
|
+
F: __dxlog_file2,
|
|
926
545
|
L: 210,
|
|
927
546
|
S: this,
|
|
928
547
|
C: (f, a) => f(...a)
|
|
929
548
|
});
|
|
930
|
-
|
|
931
|
-
F:
|
|
549
|
+
invariant(!this._closed, "SignalRPCClient is closed", {
|
|
550
|
+
F: __dxlog_file2,
|
|
932
551
|
L: 211,
|
|
933
552
|
S: this,
|
|
934
553
|
A: [
|
|
@@ -949,8 +568,8 @@ var SignalRPCClient = class {
|
|
|
949
568
|
this._connectTrigger.reset();
|
|
950
569
|
await this._rpc.close();
|
|
951
570
|
} catch (err) {
|
|
952
|
-
|
|
953
|
-
F:
|
|
571
|
+
log2.catch(err, void 0, {
|
|
572
|
+
F: __dxlog_file2,
|
|
954
573
|
L: 226,
|
|
955
574
|
S: this,
|
|
956
575
|
C: (f, a) => f(...a)
|
|
@@ -959,13 +578,36 @@ var SignalRPCClient = class {
|
|
|
959
578
|
}
|
|
960
579
|
};
|
|
961
580
|
|
|
962
|
-
//
|
|
963
|
-
var
|
|
581
|
+
// src/signal-client/signal-client.ts
|
|
582
|
+
var __dxlog_file3 = "/__w/dxos/dxos/packages/core/mesh/messaging/src/signal-client/signal-client.ts";
|
|
964
583
|
var DEFAULT_RECONNECT_TIMEOUT = 100;
|
|
965
584
|
var MAX_RECONNECT_TIMEOUT = 5e3;
|
|
966
585
|
var ERROR_RECONCILE_DELAY = 1e3;
|
|
967
586
|
var RECONCILE_INTERVAL = 5e3;
|
|
968
587
|
var SignalClient = class extends Resource {
|
|
588
|
+
_host;
|
|
589
|
+
_getMetadata;
|
|
590
|
+
_monitor = new SignalClientMonitor();
|
|
591
|
+
_state = SignalState.CLOSED;
|
|
592
|
+
_lastError;
|
|
593
|
+
_lastReconciliationFailed = false;
|
|
594
|
+
_clientReady = new Trigger2();
|
|
595
|
+
_connectionCtx;
|
|
596
|
+
_client;
|
|
597
|
+
_reconcileTask;
|
|
598
|
+
_reconnectTask;
|
|
599
|
+
/**
|
|
600
|
+
* Number of milliseconds after which the connection will be attempted again in case of error.
|
|
601
|
+
*/
|
|
602
|
+
_reconnectAfter = DEFAULT_RECONNECT_TIMEOUT;
|
|
603
|
+
_instanceId = PublicKey3.random().toHex();
|
|
604
|
+
/**
|
|
605
|
+
* @internal
|
|
606
|
+
*/
|
|
607
|
+
localState;
|
|
608
|
+
statusChanged = new Event2();
|
|
609
|
+
onMessage = new Event2();
|
|
610
|
+
swarmEvent = new Event2();
|
|
969
611
|
/**
|
|
970
612
|
* @param _host Signal server websocket URL.
|
|
971
613
|
* @param onMessage called when a new message is received.
|
|
@@ -973,7 +615,7 @@ var SignalClient = class extends Resource {
|
|
|
973
615
|
* @param _getMetadata signal-message metadata provider, called for every message.
|
|
974
616
|
*/
|
|
975
617
|
constructor(_host, _getMetadata) {
|
|
976
|
-
super(), this._host = _host, this._getMetadata = _getMetadata
|
|
618
|
+
super(), this._host = _host, this._getMetadata = _getMetadata;
|
|
977
619
|
if (!this._host.startsWith("wss://") && !this._host.startsWith("ws://")) {
|
|
978
620
|
throw new Error(`Signal server requires a websocket URL. Provided: ${this._host}`);
|
|
979
621
|
}
|
|
@@ -983,11 +625,11 @@ var SignalClient = class extends Resource {
|
|
|
983
625
|
}, async (event) => this.swarmEvent.emit(event));
|
|
984
626
|
}
|
|
985
627
|
async _open() {
|
|
986
|
-
|
|
628
|
+
log3.trace("dxos.mesh.signal-client.open", trace4.begin({
|
|
987
629
|
id: this._instanceId
|
|
988
630
|
}), {
|
|
989
|
-
F:
|
|
990
|
-
L:
|
|
631
|
+
F: __dxlog_file3,
|
|
632
|
+
L: 97,
|
|
991
633
|
S: this,
|
|
992
634
|
C: (f, a) => f(...a)
|
|
993
635
|
});
|
|
@@ -1003,9 +645,9 @@ var SignalClient = class extends Resource {
|
|
|
1003
645
|
await cancelWithContext2(this._connectionCtx, this._clientReady.wait({
|
|
1004
646
|
timeout: 5e3
|
|
1005
647
|
}));
|
|
1006
|
-
|
|
1007
|
-
F:
|
|
1008
|
-
L:
|
|
648
|
+
invariant2(this._state === SignalState.CONNECTED, "Not connected to Signal Server", {
|
|
649
|
+
F: __dxlog_file3,
|
|
650
|
+
L: 107,
|
|
1009
651
|
S: this,
|
|
1010
652
|
A: [
|
|
1011
653
|
"this._state === SignalState.CONNECTED",
|
|
@@ -1025,7 +667,7 @@ var SignalClient = class extends Resource {
|
|
|
1025
667
|
throw err;
|
|
1026
668
|
}
|
|
1027
669
|
});
|
|
1028
|
-
|
|
670
|
+
scheduleTaskInterval2(this._ctx, async () => {
|
|
1029
671
|
if (this._state === SignalState.CONNECTED) {
|
|
1030
672
|
this._reconcileTask.schedule();
|
|
1031
673
|
}
|
|
@@ -1044,11 +686,11 @@ var SignalClient = class extends Resource {
|
|
|
1044
686
|
}
|
|
1045
687
|
});
|
|
1046
688
|
this._createClient();
|
|
1047
|
-
|
|
689
|
+
log3.trace("dxos.mesh.signal-client.open", trace4.end({
|
|
1048
690
|
id: this._instanceId
|
|
1049
691
|
}), {
|
|
1050
|
-
F:
|
|
1051
|
-
L:
|
|
692
|
+
F: __dxlog_file3,
|
|
693
|
+
L: 140,
|
|
1052
694
|
S: this,
|
|
1053
695
|
C: (f, a) => f(...a)
|
|
1054
696
|
});
|
|
@@ -1058,9 +700,9 @@ var SignalClient = class extends Resource {
|
|
|
1058
700
|
return;
|
|
1059
701
|
}
|
|
1060
702
|
if (this._state === SignalState.CONNECTED && !this._lastReconciliationFailed) {
|
|
1061
|
-
|
|
1062
|
-
F:
|
|
1063
|
-
L:
|
|
703
|
+
log3.warn("SignalClient error:", err, {
|
|
704
|
+
F: __dxlog_file3,
|
|
705
|
+
L: 149,
|
|
1064
706
|
S: this,
|
|
1065
707
|
C: (f, a) => f(...a)
|
|
1066
708
|
});
|
|
@@ -1068,9 +710,9 @@ var SignalClient = class extends Resource {
|
|
|
1068
710
|
this._scheduleReconcileAfterError();
|
|
1069
711
|
}
|
|
1070
712
|
async _close() {
|
|
1071
|
-
|
|
1072
|
-
F:
|
|
1073
|
-
L:
|
|
713
|
+
log3("closing...", void 0, {
|
|
714
|
+
F: __dxlog_file3,
|
|
715
|
+
L: 155,
|
|
1074
716
|
S: this,
|
|
1075
717
|
C: (f, a) => f(...a)
|
|
1076
718
|
});
|
|
@@ -1081,9 +723,9 @@ var SignalClient = class extends Resource {
|
|
|
1081
723
|
}
|
|
1082
724
|
this._setState(SignalState.CLOSED);
|
|
1083
725
|
await this._safeResetClient();
|
|
1084
|
-
|
|
1085
|
-
F:
|
|
1086
|
-
L:
|
|
726
|
+
log3("closed", void 0, {
|
|
727
|
+
F: __dxlog_file3,
|
|
728
|
+
L: 163,
|
|
1087
729
|
S: this,
|
|
1088
730
|
C: (f, a) => f(...a)
|
|
1089
731
|
});
|
|
@@ -1098,36 +740,36 @@ var SignalClient = class extends Resource {
|
|
|
1098
740
|
};
|
|
1099
741
|
}
|
|
1100
742
|
async join(args) {
|
|
1101
|
-
|
|
743
|
+
log3("joining", {
|
|
1102
744
|
topic: args.topic,
|
|
1103
745
|
peerId: args.peer.peerKey
|
|
1104
746
|
}, {
|
|
1105
|
-
F:
|
|
1106
|
-
L:
|
|
747
|
+
F: __dxlog_file3,
|
|
748
|
+
L: 177,
|
|
1107
749
|
S: this,
|
|
1108
750
|
C: (f, a) => f(...a)
|
|
1109
751
|
});
|
|
1110
752
|
this._monitor.recordJoin();
|
|
1111
753
|
this.localState.join({
|
|
1112
754
|
topic: args.topic,
|
|
1113
|
-
peerId:
|
|
755
|
+
peerId: PublicKey3.from(args.peer.peerKey)
|
|
1114
756
|
});
|
|
1115
757
|
this._reconcileTask?.schedule();
|
|
1116
758
|
}
|
|
1117
759
|
async leave(args) {
|
|
1118
|
-
|
|
760
|
+
log3("leaving", {
|
|
1119
761
|
topic: args.topic,
|
|
1120
762
|
peerId: args.peer.peerKey
|
|
1121
763
|
}, {
|
|
1122
|
-
F:
|
|
1123
|
-
L:
|
|
764
|
+
F: __dxlog_file3,
|
|
765
|
+
L: 184,
|
|
1124
766
|
S: this,
|
|
1125
767
|
C: (f, a) => f(...a)
|
|
1126
768
|
});
|
|
1127
769
|
this._monitor.recordLeave();
|
|
1128
770
|
this.localState.leave({
|
|
1129
771
|
topic: args.topic,
|
|
1130
|
-
peerId:
|
|
772
|
+
peerId: PublicKey3.from(args.peer.peerKey)
|
|
1131
773
|
});
|
|
1132
774
|
}
|
|
1133
775
|
async query(params) {
|
|
@@ -1136,27 +778,27 @@ var SignalClient = class extends Resource {
|
|
|
1136
778
|
async sendMessage(msg) {
|
|
1137
779
|
return this._monitor.recordMessageSending(msg, async () => {
|
|
1138
780
|
await this._clientReady.wait();
|
|
1139
|
-
|
|
1140
|
-
F:
|
|
1141
|
-
L:
|
|
781
|
+
invariant2(this._state === SignalState.CONNECTED, "Not connected to Signal Server", {
|
|
782
|
+
F: __dxlog_file3,
|
|
783
|
+
L: 196,
|
|
1142
784
|
S: this,
|
|
1143
785
|
A: [
|
|
1144
786
|
"this._state === SignalState.CONNECTED",
|
|
1145
787
|
"'Not connected to Signal Server'"
|
|
1146
788
|
]
|
|
1147
789
|
});
|
|
1148
|
-
|
|
1149
|
-
F:
|
|
1150
|
-
L:
|
|
790
|
+
invariant2(msg.author.peerKey, "Author key required", {
|
|
791
|
+
F: __dxlog_file3,
|
|
792
|
+
L: 197,
|
|
1151
793
|
S: this,
|
|
1152
794
|
A: [
|
|
1153
795
|
"msg.author.peerKey",
|
|
1154
796
|
"'Author key required'"
|
|
1155
797
|
]
|
|
1156
798
|
});
|
|
1157
|
-
|
|
1158
|
-
F:
|
|
1159
|
-
L:
|
|
799
|
+
invariant2(msg.recipient.peerKey, "Recipient key required", {
|
|
800
|
+
F: __dxlog_file3,
|
|
801
|
+
L: 198,
|
|
1160
802
|
S: this,
|
|
1161
803
|
A: [
|
|
1162
804
|
"msg.recipient.peerKey",
|
|
@@ -1164,69 +806,69 @@ var SignalClient = class extends Resource {
|
|
|
1164
806
|
]
|
|
1165
807
|
});
|
|
1166
808
|
await this._client.sendMessage({
|
|
1167
|
-
author:
|
|
1168
|
-
recipient:
|
|
809
|
+
author: PublicKey3.from(msg.author.peerKey),
|
|
810
|
+
recipient: PublicKey3.from(msg.recipient.peerKey),
|
|
1169
811
|
payload: msg.payload
|
|
1170
812
|
});
|
|
1171
813
|
});
|
|
1172
814
|
}
|
|
1173
815
|
async subscribeMessages(peer) {
|
|
1174
|
-
|
|
1175
|
-
F:
|
|
1176
|
-
L:
|
|
816
|
+
invariant2(peer.peerKey, "Peer key required", {
|
|
817
|
+
F: __dxlog_file3,
|
|
818
|
+
L: 208,
|
|
1177
819
|
S: this,
|
|
1178
820
|
A: [
|
|
1179
821
|
"peer.peerKey",
|
|
1180
822
|
"'Peer key required'"
|
|
1181
823
|
]
|
|
1182
824
|
});
|
|
1183
|
-
|
|
825
|
+
log3("subscribing to messages", {
|
|
1184
826
|
peer
|
|
1185
827
|
}, {
|
|
1186
|
-
F:
|
|
1187
|
-
L:
|
|
828
|
+
F: __dxlog_file3,
|
|
829
|
+
L: 209,
|
|
1188
830
|
S: this,
|
|
1189
831
|
C: (f, a) => f(...a)
|
|
1190
832
|
});
|
|
1191
|
-
this.localState.subscribeMessages(
|
|
833
|
+
this.localState.subscribeMessages(PublicKey3.from(peer.peerKey));
|
|
1192
834
|
this._reconcileTask?.schedule();
|
|
1193
835
|
}
|
|
1194
836
|
async unsubscribeMessages(peer) {
|
|
1195
|
-
|
|
1196
|
-
F:
|
|
1197
|
-
L:
|
|
837
|
+
invariant2(peer.peerKey, "Peer key required", {
|
|
838
|
+
F: __dxlog_file3,
|
|
839
|
+
L: 215,
|
|
1198
840
|
S: this,
|
|
1199
841
|
A: [
|
|
1200
842
|
"peer.peerKey",
|
|
1201
843
|
"'Peer key required'"
|
|
1202
844
|
]
|
|
1203
845
|
});
|
|
1204
|
-
|
|
846
|
+
log3("unsubscribing from messages", {
|
|
1205
847
|
peer
|
|
1206
848
|
}, {
|
|
1207
|
-
F:
|
|
1208
|
-
L:
|
|
849
|
+
F: __dxlog_file3,
|
|
850
|
+
L: 216,
|
|
1209
851
|
S: this,
|
|
1210
852
|
C: (f, a) => f(...a)
|
|
1211
853
|
});
|
|
1212
|
-
this.localState.unsubscribeMessages(
|
|
854
|
+
this.localState.unsubscribeMessages(PublicKey3.from(peer.peerKey));
|
|
1213
855
|
}
|
|
1214
856
|
_scheduleReconcileAfterError() {
|
|
1215
|
-
|
|
857
|
+
scheduleTask(this._ctx, () => this._reconcileTask.schedule(), ERROR_RECONCILE_DELAY);
|
|
1216
858
|
}
|
|
1217
859
|
_createClient() {
|
|
1218
|
-
|
|
860
|
+
log3("creating client", {
|
|
1219
861
|
host: this._host,
|
|
1220
862
|
state: this._state
|
|
1221
863
|
}, {
|
|
1222
|
-
F:
|
|
1223
|
-
L:
|
|
864
|
+
F: __dxlog_file3,
|
|
865
|
+
L: 225,
|
|
1224
866
|
S: this,
|
|
1225
867
|
C: (f, a) => f(...a)
|
|
1226
868
|
});
|
|
1227
|
-
|
|
1228
|
-
F:
|
|
1229
|
-
L:
|
|
869
|
+
invariant2(!this._client, "Client already created", {
|
|
870
|
+
F: __dxlog_file3,
|
|
871
|
+
L: 226,
|
|
1230
872
|
S: this,
|
|
1231
873
|
A: [
|
|
1232
874
|
"!this._client",
|
|
@@ -1236,9 +878,9 @@ var SignalClient = class extends Resource {
|
|
|
1236
878
|
this._monitor.recordConnectionStartTime();
|
|
1237
879
|
this._connectionCtx = this._ctx.derive();
|
|
1238
880
|
this._connectionCtx.onDispose(async () => {
|
|
1239
|
-
|
|
1240
|
-
F:
|
|
1241
|
-
L:
|
|
881
|
+
log3("connection context disposed", void 0, {
|
|
882
|
+
F: __dxlog_file3,
|
|
883
|
+
L: 233,
|
|
1242
884
|
S: this,
|
|
1243
885
|
C: (f, a) => f(...a)
|
|
1244
886
|
});
|
|
@@ -1251,9 +893,9 @@ var SignalClient = class extends Resource {
|
|
|
1251
893
|
callbacks: {
|
|
1252
894
|
onConnected: () => {
|
|
1253
895
|
if (client === this._client) {
|
|
1254
|
-
|
|
1255
|
-
F:
|
|
1256
|
-
L:
|
|
896
|
+
log3("socket connected", void 0, {
|
|
897
|
+
F: __dxlog_file3,
|
|
898
|
+
L: 244,
|
|
1257
899
|
S: this,
|
|
1258
900
|
C: (f, a) => f(...a)
|
|
1259
901
|
});
|
|
@@ -1264,11 +906,11 @@ var SignalClient = class extends Resource {
|
|
|
1264
906
|
if (client !== this._client) {
|
|
1265
907
|
return;
|
|
1266
908
|
}
|
|
1267
|
-
|
|
909
|
+
log3("socket disconnected", {
|
|
1268
910
|
state: this._state
|
|
1269
911
|
}, {
|
|
1270
|
-
F:
|
|
1271
|
-
L:
|
|
912
|
+
F: __dxlog_file3,
|
|
913
|
+
L: 253,
|
|
1272
914
|
S: this,
|
|
1273
915
|
C: (f, a) => f(...a)
|
|
1274
916
|
});
|
|
@@ -1280,12 +922,12 @@ var SignalClient = class extends Resource {
|
|
|
1280
922
|
},
|
|
1281
923
|
onError: (error) => {
|
|
1282
924
|
if (client === this._client) {
|
|
1283
|
-
|
|
925
|
+
log3("socket error", {
|
|
1284
926
|
error,
|
|
1285
927
|
state: this._state
|
|
1286
928
|
}, {
|
|
1287
|
-
F:
|
|
1288
|
-
L:
|
|
929
|
+
F: __dxlog_file3,
|
|
930
|
+
L: 265,
|
|
1289
931
|
S: this,
|
|
1290
932
|
C: (f, a) => f(...a)
|
|
1291
933
|
});
|
|
@@ -1306,18 +948,18 @@ var SignalClient = class extends Resource {
|
|
|
1306
948
|
}
|
|
1307
949
|
}
|
|
1308
950
|
async _reconnect() {
|
|
1309
|
-
|
|
951
|
+
log3(`reconnecting in ${this._reconnectAfter}ms`, {
|
|
1310
952
|
state: this._state
|
|
1311
953
|
}, {
|
|
1312
|
-
F:
|
|
1313
|
-
L:
|
|
954
|
+
F: __dxlog_file3,
|
|
955
|
+
L: 280,
|
|
1314
956
|
S: this,
|
|
1315
957
|
C: (f, a) => f(...a)
|
|
1316
958
|
});
|
|
1317
959
|
if (this._state === SignalState.RECONNECTING) {
|
|
1318
|
-
|
|
1319
|
-
F:
|
|
1320
|
-
L:
|
|
960
|
+
log3.info("Signal api already reconnecting.", void 0, {
|
|
961
|
+
F: __dxlog_file3,
|
|
962
|
+
L: 283,
|
|
1321
963
|
S: this,
|
|
1322
964
|
C: (f, a) => f(...a)
|
|
1323
965
|
});
|
|
@@ -1355,11 +997,11 @@ var SignalClient = class extends Resource {
|
|
|
1355
997
|
_setState(newState) {
|
|
1356
998
|
this._state = newState;
|
|
1357
999
|
this._monitor.recordStateChangeTime();
|
|
1358
|
-
|
|
1000
|
+
log3("signal state changed", {
|
|
1359
1001
|
status: this.getStatus()
|
|
1360
1002
|
}, {
|
|
1361
|
-
F:
|
|
1362
|
-
L:
|
|
1003
|
+
F: __dxlog_file3,
|
|
1004
|
+
L: 324,
|
|
1363
1005
|
S: this,
|
|
1364
1006
|
C: (f, a) => f(...a)
|
|
1365
1007
|
});
|
|
@@ -1381,291 +1023,23 @@ var SignalClient = class extends Resource {
|
|
|
1381
1023
|
}
|
|
1382
1024
|
};
|
|
1383
1025
|
|
|
1384
|
-
//
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
// packages/core/mesh/messaging/src/signal-manager/memory-signal-manager.ts
|
|
1388
|
-
import { Event as Event3, Trigger as Trigger3 } from "@dxos/async";
|
|
1389
|
-
import { Context as Context3 } from "@dxos/context";
|
|
1390
|
-
import { invariant as invariant4 } from "@dxos/invariant";
|
|
1391
|
-
import { PublicKey as PublicKey5 } from "@dxos/keys";
|
|
1392
|
-
import { log as log5 } from "@dxos/log";
|
|
1393
|
-
import { schema as schema3 } from "@dxos/protocols/proto";
|
|
1394
|
-
import { ComplexMap as ComplexMap3, ComplexSet as ComplexSet3 } from "@dxos/util";
|
|
1395
|
-
var __dxlog_file5 = "/home/runner/work/dxos/dxos/packages/core/mesh/messaging/src/signal-manager/memory-signal-manager.ts";
|
|
1396
|
-
var MemorySignalManagerContext = class {
|
|
1397
|
-
constructor() {
|
|
1398
|
-
// Swarm messages.
|
|
1399
|
-
this.swarmEvent = new Event3();
|
|
1400
|
-
// Mapping from topic to set of peers.
|
|
1401
|
-
this.swarms = new ComplexMap3(PublicKey5.hash);
|
|
1402
|
-
// Map of connections for each peer for signaling.
|
|
1403
|
-
this.connections = new ComplexMap3(PeerInfoHash);
|
|
1404
|
-
}
|
|
1405
|
-
};
|
|
1406
|
-
var MemorySignalManager = class {
|
|
1407
|
-
constructor(_context) {
|
|
1408
|
-
this._context = _context;
|
|
1409
|
-
this.statusChanged = new Event3();
|
|
1410
|
-
this.swarmEvent = new Event3();
|
|
1411
|
-
this.onMessage = new Event3();
|
|
1412
|
-
this._joinedSwarms = new ComplexSet3(({ topic, peer }) => topic.toHex() + peer.peerKey);
|
|
1413
|
-
this._freezeTrigger = new Trigger3().wake();
|
|
1414
|
-
this._ctx = new Context3(void 0, {
|
|
1415
|
-
F: __dxlog_file5,
|
|
1416
|
-
L: 53
|
|
1417
|
-
});
|
|
1418
|
-
this._ctx.onDispose(this._context.swarmEvent.on((data) => this.swarmEvent.emit(data)));
|
|
1419
|
-
}
|
|
1420
|
-
async open() {
|
|
1421
|
-
if (!this._ctx.disposed) {
|
|
1422
|
-
return;
|
|
1423
|
-
}
|
|
1424
|
-
this._ctx = new Context3(void 0, {
|
|
1425
|
-
F: __dxlog_file5,
|
|
1426
|
-
L: 62
|
|
1427
|
-
});
|
|
1428
|
-
this._ctx.onDispose(this._context.swarmEvent.on((data) => this.swarmEvent.emit(data)));
|
|
1429
|
-
await Promise.all([
|
|
1430
|
-
...this._joinedSwarms.values()
|
|
1431
|
-
].map((value) => this.join(value)));
|
|
1432
|
-
}
|
|
1433
|
-
async close() {
|
|
1434
|
-
if (this._ctx.disposed) {
|
|
1435
|
-
return;
|
|
1436
|
-
}
|
|
1437
|
-
const joinedSwarmsCopy = new ComplexSet3(({ topic, peer }) => topic.toHex() + peer.peerKey, [
|
|
1438
|
-
...this._joinedSwarms.values()
|
|
1439
|
-
]);
|
|
1440
|
-
await Promise.all([
|
|
1441
|
-
...this._joinedSwarms.values()
|
|
1442
|
-
].map((value) => this.leave(value)));
|
|
1443
|
-
this._joinedSwarms = joinedSwarmsCopy;
|
|
1444
|
-
await this._ctx.dispose();
|
|
1445
|
-
}
|
|
1446
|
-
getStatus() {
|
|
1447
|
-
return [];
|
|
1448
|
-
}
|
|
1449
|
-
async join({ topic, peer }) {
|
|
1450
|
-
invariant4(!this._ctx.disposed, "Closed", {
|
|
1451
|
-
F: __dxlog_file5,
|
|
1452
|
-
L: 91,
|
|
1453
|
-
S: this,
|
|
1454
|
-
A: [
|
|
1455
|
-
"!this._ctx.disposed",
|
|
1456
|
-
"'Closed'"
|
|
1457
|
-
]
|
|
1458
|
-
});
|
|
1459
|
-
this._joinedSwarms.add({
|
|
1460
|
-
topic,
|
|
1461
|
-
peer
|
|
1462
|
-
});
|
|
1463
|
-
if (!this._context.swarms.has(topic)) {
|
|
1464
|
-
this._context.swarms.set(topic, new ComplexSet3(PeerInfoHash));
|
|
1465
|
-
}
|
|
1466
|
-
this._context.swarms.get(topic).add(peer);
|
|
1467
|
-
this._context.swarmEvent.emit({
|
|
1468
|
-
topic,
|
|
1469
|
-
peerAvailable: {
|
|
1470
|
-
peer,
|
|
1471
|
-
since: /* @__PURE__ */ new Date()
|
|
1472
|
-
}
|
|
1473
|
-
});
|
|
1474
|
-
for (const [topic2, peers] of this._context.swarms) {
|
|
1475
|
-
Array.from(peers).forEach((peer2) => {
|
|
1476
|
-
this.swarmEvent.emit({
|
|
1477
|
-
topic: topic2,
|
|
1478
|
-
peerAvailable: {
|
|
1479
|
-
peer: peer2,
|
|
1480
|
-
since: /* @__PURE__ */ new Date()
|
|
1481
|
-
}
|
|
1482
|
-
});
|
|
1483
|
-
});
|
|
1484
|
-
}
|
|
1485
|
-
}
|
|
1486
|
-
async leave({ topic, peer }) {
|
|
1487
|
-
invariant4(!this._ctx.disposed, "Closed", {
|
|
1488
|
-
F: __dxlog_file5,
|
|
1489
|
-
L: 123,
|
|
1490
|
-
S: this,
|
|
1491
|
-
A: [
|
|
1492
|
-
"!this._ctx.disposed",
|
|
1493
|
-
"'Closed'"
|
|
1494
|
-
]
|
|
1495
|
-
});
|
|
1496
|
-
this._joinedSwarms.delete({
|
|
1497
|
-
topic,
|
|
1498
|
-
peer
|
|
1499
|
-
});
|
|
1500
|
-
if (!this._context.swarms.has(topic)) {
|
|
1501
|
-
this._context.swarms.set(topic, new ComplexSet3(PeerInfoHash));
|
|
1502
|
-
}
|
|
1503
|
-
this._context.swarms.get(topic).delete(peer);
|
|
1504
|
-
const swarmEvent = {
|
|
1505
|
-
topic,
|
|
1506
|
-
peerLeft: {
|
|
1507
|
-
peer
|
|
1508
|
-
}
|
|
1509
|
-
};
|
|
1510
|
-
this._context.swarmEvent.emit(swarmEvent);
|
|
1511
|
-
}
|
|
1512
|
-
async query(request) {
|
|
1513
|
-
throw new Error("Not implemented");
|
|
1514
|
-
}
|
|
1515
|
-
async sendMessage({ author, recipient, payload }) {
|
|
1516
|
-
log5("send message", {
|
|
1517
|
-
author,
|
|
1518
|
-
recipient,
|
|
1519
|
-
...dec(payload)
|
|
1520
|
-
}, {
|
|
1521
|
-
F: __dxlog_file5,
|
|
1522
|
-
L: 156,
|
|
1523
|
-
S: this,
|
|
1524
|
-
C: (f, a) => f(...a)
|
|
1525
|
-
});
|
|
1526
|
-
invariant4(recipient, void 0, {
|
|
1527
|
-
F: __dxlog_file5,
|
|
1528
|
-
L: 158,
|
|
1529
|
-
S: this,
|
|
1530
|
-
A: [
|
|
1531
|
-
"recipient",
|
|
1532
|
-
""
|
|
1533
|
-
]
|
|
1534
|
-
});
|
|
1535
|
-
invariant4(!this._ctx.disposed, "Closed", {
|
|
1536
|
-
F: __dxlog_file5,
|
|
1537
|
-
L: 159,
|
|
1538
|
-
S: this,
|
|
1539
|
-
A: [
|
|
1540
|
-
"!this._ctx.disposed",
|
|
1541
|
-
"'Closed'"
|
|
1542
|
-
]
|
|
1543
|
-
});
|
|
1544
|
-
await this._freezeTrigger.wait();
|
|
1545
|
-
const remote = this._context.connections.get(recipient);
|
|
1546
|
-
if (!remote) {
|
|
1547
|
-
log5.warn("recipient is not subscribed for messages", {
|
|
1548
|
-
author,
|
|
1549
|
-
recipient
|
|
1550
|
-
}, {
|
|
1551
|
-
F: __dxlog_file5,
|
|
1552
|
-
L: 165,
|
|
1553
|
-
S: this,
|
|
1554
|
-
C: (f, a) => f(...a)
|
|
1555
|
-
});
|
|
1556
|
-
return;
|
|
1557
|
-
}
|
|
1558
|
-
if (remote._ctx.disposed) {
|
|
1559
|
-
log5.warn("recipient is disposed", {
|
|
1560
|
-
author,
|
|
1561
|
-
recipient
|
|
1562
|
-
}, {
|
|
1563
|
-
F: __dxlog_file5,
|
|
1564
|
-
L: 170,
|
|
1565
|
-
S: this,
|
|
1566
|
-
C: (f, a) => f(...a)
|
|
1567
|
-
});
|
|
1568
|
-
return;
|
|
1569
|
-
}
|
|
1570
|
-
remote._freezeTrigger.wait().then(() => {
|
|
1571
|
-
if (remote._ctx.disposed) {
|
|
1572
|
-
log5.warn("recipient is disposed", {
|
|
1573
|
-
author,
|
|
1574
|
-
recipient
|
|
1575
|
-
}, {
|
|
1576
|
-
F: __dxlog_file5,
|
|
1577
|
-
L: 178,
|
|
1578
|
-
S: this,
|
|
1579
|
-
C: (f, a) => f(...a)
|
|
1580
|
-
});
|
|
1581
|
-
return;
|
|
1582
|
-
}
|
|
1583
|
-
log5("receive message", {
|
|
1584
|
-
author,
|
|
1585
|
-
recipient,
|
|
1586
|
-
...dec(payload)
|
|
1587
|
-
}, {
|
|
1588
|
-
F: __dxlog_file5,
|
|
1589
|
-
L: 182,
|
|
1590
|
-
S: this,
|
|
1591
|
-
C: (f, a) => f(...a)
|
|
1592
|
-
});
|
|
1593
|
-
remote.onMessage.emit({
|
|
1594
|
-
author,
|
|
1595
|
-
recipient,
|
|
1596
|
-
payload
|
|
1597
|
-
});
|
|
1598
|
-
}).catch((err) => {
|
|
1599
|
-
log5.error("error while waiting for freeze", {
|
|
1600
|
-
err
|
|
1601
|
-
}, {
|
|
1602
|
-
F: __dxlog_file5,
|
|
1603
|
-
L: 187,
|
|
1604
|
-
S: this,
|
|
1605
|
-
C: (f, a) => f(...a)
|
|
1606
|
-
});
|
|
1607
|
-
});
|
|
1608
|
-
}
|
|
1609
|
-
async subscribeMessages(peerInfo) {
|
|
1610
|
-
log5("subscribing", {
|
|
1611
|
-
peerInfo
|
|
1612
|
-
}, {
|
|
1613
|
-
F: __dxlog_file5,
|
|
1614
|
-
L: 192,
|
|
1615
|
-
S: this,
|
|
1616
|
-
C: (f, a) => f(...a)
|
|
1617
|
-
});
|
|
1618
|
-
this._context.connections.set(peerInfo, this);
|
|
1619
|
-
}
|
|
1620
|
-
async unsubscribeMessages(peerInfo) {
|
|
1621
|
-
log5("unsubscribing", {
|
|
1622
|
-
peerInfo
|
|
1623
|
-
}, {
|
|
1624
|
-
F: __dxlog_file5,
|
|
1625
|
-
L: 197,
|
|
1626
|
-
S: this,
|
|
1627
|
-
C: (f, a) => f(...a)
|
|
1628
|
-
});
|
|
1629
|
-
this._context.connections.delete(peerInfo);
|
|
1630
|
-
}
|
|
1631
|
-
freeze() {
|
|
1632
|
-
this._freezeTrigger.reset();
|
|
1633
|
-
}
|
|
1634
|
-
unfreeze() {
|
|
1635
|
-
this._freezeTrigger.wake();
|
|
1636
|
-
}
|
|
1637
|
-
};
|
|
1638
|
-
var dec = (payload) => {
|
|
1639
|
-
if (!payload.type_url.endsWith("ReliablePayload")) {
|
|
1640
|
-
return {};
|
|
1641
|
-
}
|
|
1642
|
-
const relPayload = schema3.getCodecForType("dxos.mesh.messaging.ReliablePayload").decode(payload.value);
|
|
1643
|
-
if (typeof relPayload?.payload?.data === "object") {
|
|
1644
|
-
return {
|
|
1645
|
-
payload: Object.keys(relPayload?.payload?.data)[0],
|
|
1646
|
-
sessionId: relPayload?.payload?.sessionId
|
|
1647
|
-
};
|
|
1648
|
-
}
|
|
1649
|
-
return {};
|
|
1650
|
-
};
|
|
1651
|
-
|
|
1652
|
-
// packages/core/mesh/messaging/src/signal-manager/websocket-signal-manager.ts
|
|
1653
|
-
import { Event as Event4, sleep as sleep2, synchronized } from "@dxos/async";
|
|
1026
|
+
// src/signal-manager/websocket-signal-manager.ts
|
|
1027
|
+
import { Event as Event3, sleep as sleep2, synchronized } from "@dxos/async";
|
|
1654
1028
|
import { LifecycleState, Resource as Resource2 } from "@dxos/context";
|
|
1655
|
-
import { invariant as
|
|
1656
|
-
import { PublicKey as
|
|
1657
|
-
import { log as
|
|
1658
|
-
import { RateLimitExceededError, TimeoutError as
|
|
1029
|
+
import { invariant as invariant3 } from "@dxos/invariant";
|
|
1030
|
+
import { PublicKey as PublicKey4 } from "@dxos/keys";
|
|
1031
|
+
import { log as log4 } from "@dxos/log";
|
|
1032
|
+
import { RateLimitExceededError, TimeoutError as TimeoutError2, trace as trace6 } from "@dxos/protocols";
|
|
1659
1033
|
import { BitField, safeAwaitAll as safeAwaitAll2 } from "@dxos/util";
|
|
1660
1034
|
|
|
1661
|
-
//
|
|
1662
|
-
import { trace as
|
|
1035
|
+
// src/signal-manager/websocket-signal-manager-monitor.ts
|
|
1036
|
+
import { trace as trace5 } from "@dxos/tracing";
|
|
1663
1037
|
var WebsocketSignalManagerMonitor = class {
|
|
1664
1038
|
recordRateLimitExceeded() {
|
|
1665
|
-
|
|
1039
|
+
trace5.metrics.increment("dxos.mesh.signal.signal-manager.rate-limit-hit", 1);
|
|
1666
1040
|
}
|
|
1667
1041
|
recordServerFailure(params) {
|
|
1668
|
-
|
|
1042
|
+
trace5.metrics.increment("dxos.mesh.signal.signal-manager.server-failure", 1, {
|
|
1669
1043
|
tags: {
|
|
1670
1044
|
server: params.serverName,
|
|
1671
1045
|
restarted: params.willRestart
|
|
@@ -1674,24 +1048,37 @@ var WebsocketSignalManagerMonitor = class {
|
|
|
1674
1048
|
}
|
|
1675
1049
|
};
|
|
1676
1050
|
|
|
1677
|
-
//
|
|
1051
|
+
// src/signal-manager/websocket-signal-manager.ts
|
|
1678
1052
|
function _ts_decorate(decorators, target, key, desc) {
|
|
1679
1053
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
1680
1054
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
1681
1055
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
1682
1056
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
1683
1057
|
}
|
|
1684
|
-
var
|
|
1058
|
+
var __dxlog_file4 = "/__w/dxos/dxos/packages/core/mesh/messaging/src/signal-manager/websocket-signal-manager.ts";
|
|
1685
1059
|
var MAX_SERVER_FAILURES = 5;
|
|
1686
1060
|
var WSS_SIGNAL_SERVER_REBOOT_DELAY = 3e3;
|
|
1687
1061
|
var WebsocketSignalManager = class extends Resource2 {
|
|
1062
|
+
_hosts;
|
|
1063
|
+
_getMetadata;
|
|
1064
|
+
_servers = /* @__PURE__ */ new Map();
|
|
1065
|
+
_monitor = new WebsocketSignalManagerMonitor();
|
|
1066
|
+
/**
|
|
1067
|
+
* Used to avoid logging failed server restarts more than once until the server actually recovers.
|
|
1068
|
+
*/
|
|
1069
|
+
_failedServersBitfield;
|
|
1070
|
+
failureCount = /* @__PURE__ */ new Map();
|
|
1071
|
+
statusChanged = new Event3();
|
|
1072
|
+
swarmEvent = new Event3();
|
|
1073
|
+
onMessage = new Event3();
|
|
1074
|
+
_instanceId = PublicKey4.random().toHex();
|
|
1688
1075
|
constructor(_hosts, _getMetadata) {
|
|
1689
|
-
super(), this._hosts = _hosts, this._getMetadata = _getMetadata
|
|
1690
|
-
|
|
1076
|
+
super(), this._hosts = _hosts, this._getMetadata = _getMetadata;
|
|
1077
|
+
log4("Created WebsocketSignalManager", {
|
|
1691
1078
|
hosts: this._hosts
|
|
1692
1079
|
}, {
|
|
1693
|
-
F:
|
|
1694
|
-
L:
|
|
1080
|
+
F: __dxlog_file4,
|
|
1081
|
+
L: 59,
|
|
1695
1082
|
S: this,
|
|
1696
1083
|
C: (f, a) => f(...a)
|
|
1697
1084
|
});
|
|
@@ -1709,28 +1096,28 @@ var WebsocketSignalManager = class extends Resource2 {
|
|
|
1709
1096
|
this._failedServersBitfield = BitField.zeros(this._hosts.length);
|
|
1710
1097
|
}
|
|
1711
1098
|
async _open() {
|
|
1712
|
-
|
|
1099
|
+
log4("open signal manager", {
|
|
1713
1100
|
hosts: this._hosts
|
|
1714
1101
|
}, {
|
|
1715
|
-
F:
|
|
1716
|
-
L:
|
|
1102
|
+
F: __dxlog_file4,
|
|
1103
|
+
L: 79,
|
|
1717
1104
|
S: this,
|
|
1718
1105
|
C: (f, a) => f(...a)
|
|
1719
1106
|
});
|
|
1720
|
-
|
|
1107
|
+
log4.trace("dxos.mesh.websocket-signal-manager.open", trace6.begin({
|
|
1721
1108
|
id: this._instanceId
|
|
1722
1109
|
}), {
|
|
1723
|
-
F:
|
|
1724
|
-
L:
|
|
1110
|
+
F: __dxlog_file4,
|
|
1111
|
+
L: 80,
|
|
1725
1112
|
S: this,
|
|
1726
1113
|
C: (f, a) => f(...a)
|
|
1727
1114
|
});
|
|
1728
1115
|
await safeAwaitAll2(this._servers.values(), (server) => server.open());
|
|
1729
|
-
|
|
1116
|
+
log4.trace("dxos.mesh.websocket-signal-manager.open", trace6.end({
|
|
1730
1117
|
id: this._instanceId
|
|
1731
1118
|
}), {
|
|
1732
|
-
F:
|
|
1733
|
-
L:
|
|
1119
|
+
F: __dxlog_file4,
|
|
1120
|
+
L: 84,
|
|
1734
1121
|
S: this,
|
|
1735
1122
|
C: (f, a) => f(...a)
|
|
1736
1123
|
});
|
|
@@ -1739,17 +1126,17 @@ var WebsocketSignalManager = class extends Resource2 {
|
|
|
1739
1126
|
await safeAwaitAll2(this._servers.values(), (server) => server.close());
|
|
1740
1127
|
}
|
|
1741
1128
|
async restartServer(serverName) {
|
|
1742
|
-
|
|
1129
|
+
log4("restarting server", {
|
|
1743
1130
|
serverName
|
|
1744
1131
|
}, {
|
|
1745
|
-
F:
|
|
1746
|
-
L:
|
|
1132
|
+
F: __dxlog_file4,
|
|
1133
|
+
L: 92,
|
|
1747
1134
|
S: this,
|
|
1748
1135
|
C: (f, a) => f(...a)
|
|
1749
1136
|
});
|
|
1750
|
-
|
|
1751
|
-
F:
|
|
1752
|
-
L:
|
|
1137
|
+
invariant3(this._lifecycleState === LifecycleState.OPEN, void 0, {
|
|
1138
|
+
F: __dxlog_file4,
|
|
1139
|
+
L: 93,
|
|
1753
1140
|
S: this,
|
|
1754
1141
|
A: [
|
|
1755
1142
|
"this._lifecycleState === LifecycleState.OPEN",
|
|
@@ -1757,9 +1144,9 @@ var WebsocketSignalManager = class extends Resource2 {
|
|
|
1757
1144
|
]
|
|
1758
1145
|
});
|
|
1759
1146
|
const server = this._servers.get(serverName);
|
|
1760
|
-
|
|
1761
|
-
F:
|
|
1762
|
-
L:
|
|
1147
|
+
invariant3(server, "server not found", {
|
|
1148
|
+
F: __dxlog_file4,
|
|
1149
|
+
L: 96,
|
|
1763
1150
|
S: this,
|
|
1764
1151
|
A: [
|
|
1765
1152
|
"server",
|
|
@@ -1774,18 +1161,18 @@ var WebsocketSignalManager = class extends Resource2 {
|
|
|
1774
1161
|
return Array.from(this._servers.values()).map((server) => server.getStatus());
|
|
1775
1162
|
}
|
|
1776
1163
|
async join({ topic, peer }) {
|
|
1777
|
-
|
|
1164
|
+
log4("join", {
|
|
1778
1165
|
topic,
|
|
1779
1166
|
peer
|
|
1780
1167
|
}, {
|
|
1781
|
-
F:
|
|
1782
|
-
L:
|
|
1168
|
+
F: __dxlog_file4,
|
|
1169
|
+
L: 109,
|
|
1783
1170
|
S: this,
|
|
1784
1171
|
C: (f, a) => f(...a)
|
|
1785
1172
|
});
|
|
1786
|
-
|
|
1787
|
-
F:
|
|
1788
|
-
L:
|
|
1173
|
+
invariant3(this._lifecycleState === LifecycleState.OPEN, void 0, {
|
|
1174
|
+
F: __dxlog_file4,
|
|
1175
|
+
L: 110,
|
|
1789
1176
|
S: this,
|
|
1790
1177
|
A: [
|
|
1791
1178
|
"this._lifecycleState === LifecycleState.OPEN",
|
|
@@ -1798,18 +1185,18 @@ var WebsocketSignalManager = class extends Resource2 {
|
|
|
1798
1185
|
}));
|
|
1799
1186
|
}
|
|
1800
1187
|
async leave({ topic, peer }) {
|
|
1801
|
-
|
|
1188
|
+
log4("leaving", {
|
|
1802
1189
|
topic,
|
|
1803
1190
|
peer
|
|
1804
1191
|
}, {
|
|
1805
|
-
F:
|
|
1806
|
-
L:
|
|
1192
|
+
F: __dxlog_file4,
|
|
1193
|
+
L: 116,
|
|
1807
1194
|
S: this,
|
|
1808
1195
|
C: (f, a) => f(...a)
|
|
1809
1196
|
});
|
|
1810
|
-
|
|
1811
|
-
F:
|
|
1812
|
-
L:
|
|
1197
|
+
invariant3(this._lifecycleState === LifecycleState.OPEN, void 0, {
|
|
1198
|
+
F: __dxlog_file4,
|
|
1199
|
+
L: 117,
|
|
1813
1200
|
S: this,
|
|
1814
1201
|
A: [
|
|
1815
1202
|
"this._lifecycleState === LifecycleState.OPEN",
|
|
@@ -1825,17 +1212,17 @@ var WebsocketSignalManager = class extends Resource2 {
|
|
|
1825
1212
|
throw new Error("Not implemented");
|
|
1826
1213
|
}
|
|
1827
1214
|
async sendMessage({ author, recipient, payload }) {
|
|
1828
|
-
|
|
1215
|
+
log4("signal", {
|
|
1829
1216
|
recipient
|
|
1830
1217
|
}, {
|
|
1831
|
-
F:
|
|
1832
|
-
L:
|
|
1218
|
+
F: __dxlog_file4,
|
|
1219
|
+
L: 126,
|
|
1833
1220
|
S: this,
|
|
1834
1221
|
C: (f, a) => f(...a)
|
|
1835
1222
|
});
|
|
1836
|
-
|
|
1837
|
-
F:
|
|
1838
|
-
L:
|
|
1223
|
+
invariant3(this._lifecycleState === LifecycleState.OPEN, void 0, {
|
|
1224
|
+
F: __dxlog_file4,
|
|
1225
|
+
L: 127,
|
|
1839
1226
|
S: this,
|
|
1840
1227
|
A: [
|
|
1841
1228
|
"this._lifecycleState === LifecycleState.OPEN",
|
|
@@ -1849,31 +1236,31 @@ var WebsocketSignalManager = class extends Resource2 {
|
|
|
1849
1236
|
payload
|
|
1850
1237
|
}).then(() => this._clearServerFailedFlag(serverName, index)).catch((err) => {
|
|
1851
1238
|
if (err instanceof RateLimitExceededError) {
|
|
1852
|
-
|
|
1239
|
+
log4.info("WSS rate limit exceeded", {
|
|
1853
1240
|
err
|
|
1854
1241
|
}, {
|
|
1855
|
-
F:
|
|
1856
|
-
L:
|
|
1242
|
+
F: __dxlog_file4,
|
|
1243
|
+
L: 135,
|
|
1857
1244
|
S: this,
|
|
1858
1245
|
C: (f, a) => f(...a)
|
|
1859
1246
|
});
|
|
1860
1247
|
this._monitor.recordRateLimitExceeded();
|
|
1861
|
-
} else if (err instanceof
|
|
1862
|
-
|
|
1248
|
+
} else if (err instanceof TimeoutError2 || err.constructor.name === "TimeoutError") {
|
|
1249
|
+
log4.info("WSS sendMessage timeout", {
|
|
1863
1250
|
err
|
|
1864
1251
|
}, {
|
|
1865
|
-
F:
|
|
1866
|
-
L:
|
|
1252
|
+
F: __dxlog_file4,
|
|
1253
|
+
L: 138,
|
|
1867
1254
|
S: this,
|
|
1868
1255
|
C: (f, a) => f(...a)
|
|
1869
1256
|
});
|
|
1870
1257
|
void this.checkServerFailure(serverName, index);
|
|
1871
1258
|
} else {
|
|
1872
|
-
|
|
1259
|
+
log4.warn(`error sending to ${serverName}`, {
|
|
1873
1260
|
err
|
|
1874
1261
|
}, {
|
|
1875
|
-
F:
|
|
1876
|
-
L:
|
|
1262
|
+
F: __dxlog_file4,
|
|
1263
|
+
L: 141,
|
|
1877
1264
|
S: this,
|
|
1878
1265
|
C: (f, a) => f(...a)
|
|
1879
1266
|
});
|
|
@@ -1891,12 +1278,12 @@ var WebsocketSignalManager = class extends Resource2 {
|
|
|
1891
1278
|
});
|
|
1892
1279
|
if (isRestartRequired) {
|
|
1893
1280
|
if (!BitField.get(this._failedServersBitfield, index)) {
|
|
1894
|
-
|
|
1281
|
+
log4.warn("too many failures for ws-server, restarting", {
|
|
1895
1282
|
serverName,
|
|
1896
1283
|
failureCount
|
|
1897
1284
|
}, {
|
|
1898
|
-
F:
|
|
1899
|
-
L:
|
|
1285
|
+
F: __dxlog_file4,
|
|
1286
|
+
L: 155,
|
|
1900
1287
|
S: this,
|
|
1901
1288
|
C: (f, a) => f(...a)
|
|
1902
1289
|
});
|
|
@@ -1910,11 +1297,11 @@ var WebsocketSignalManager = class extends Resource2 {
|
|
|
1910
1297
|
}
|
|
1911
1298
|
_clearServerFailedFlag(serverName, index) {
|
|
1912
1299
|
if (BitField.get(this._failedServersBitfield, index)) {
|
|
1913
|
-
|
|
1300
|
+
log4.info("server connection restored", {
|
|
1914
1301
|
serverName
|
|
1915
1302
|
}, {
|
|
1916
|
-
F:
|
|
1917
|
-
L:
|
|
1303
|
+
F: __dxlog_file4,
|
|
1304
|
+
L: 168,
|
|
1918
1305
|
S: this,
|
|
1919
1306
|
C: (f, a) => f(...a)
|
|
1920
1307
|
});
|
|
@@ -1923,17 +1310,17 @@ var WebsocketSignalManager = class extends Resource2 {
|
|
|
1923
1310
|
}
|
|
1924
1311
|
}
|
|
1925
1312
|
async subscribeMessages(peer) {
|
|
1926
|
-
|
|
1313
|
+
log4("subscribed for message stream", {
|
|
1927
1314
|
peer
|
|
1928
1315
|
}, {
|
|
1929
|
-
F:
|
|
1930
|
-
L:
|
|
1316
|
+
F: __dxlog_file4,
|
|
1317
|
+
L: 175,
|
|
1931
1318
|
S: this,
|
|
1932
1319
|
C: (f, a) => f(...a)
|
|
1933
1320
|
});
|
|
1934
|
-
|
|
1935
|
-
F:
|
|
1936
|
-
L:
|
|
1321
|
+
invariant3(this._lifecycleState === LifecycleState.OPEN, void 0, {
|
|
1322
|
+
F: __dxlog_file4,
|
|
1323
|
+
L: 176,
|
|
1937
1324
|
S: this,
|
|
1938
1325
|
A: [
|
|
1939
1326
|
"this._lifecycleState === LifecycleState.OPEN",
|
|
@@ -1943,17 +1330,17 @@ var WebsocketSignalManager = class extends Resource2 {
|
|
|
1943
1330
|
await this._forEachServer(async (server) => server.subscribeMessages(peer));
|
|
1944
1331
|
}
|
|
1945
1332
|
async unsubscribeMessages(peer) {
|
|
1946
|
-
|
|
1333
|
+
log4("subscribed for message stream", {
|
|
1947
1334
|
peer
|
|
1948
1335
|
}, {
|
|
1949
|
-
F:
|
|
1950
|
-
L:
|
|
1336
|
+
F: __dxlog_file4,
|
|
1337
|
+
L: 182,
|
|
1951
1338
|
S: this,
|
|
1952
1339
|
C: (f, a) => f(...a)
|
|
1953
1340
|
});
|
|
1954
|
-
|
|
1955
|
-
F:
|
|
1956
|
-
L:
|
|
1341
|
+
invariant3(this._lifecycleState === LifecycleState.OPEN, void 0, {
|
|
1342
|
+
F: __dxlog_file4,
|
|
1343
|
+
L: 183,
|
|
1957
1344
|
S: this,
|
|
1958
1345
|
A: [
|
|
1959
1346
|
"this._lifecycleState === LifecycleState.OPEN",
|
|
@@ -1976,32 +1363,33 @@ _ts_decorate([
|
|
|
1976
1363
|
synchronized
|
|
1977
1364
|
], WebsocketSignalManager.prototype, "checkServerFailure", null);
|
|
1978
1365
|
|
|
1979
|
-
//
|
|
1980
|
-
import { Event as
|
|
1981
|
-
import {
|
|
1982
|
-
import { protocol } from "@dxos/edge-client";
|
|
1983
|
-
import { invariant as
|
|
1984
|
-
import { PublicKey as
|
|
1985
|
-
import { log as
|
|
1366
|
+
// src/signal-manager/edge-signal-manager.ts
|
|
1367
|
+
import { Event as Event4, scheduleMicroTask } from "@dxos/async";
|
|
1368
|
+
import { Resource as Resource3, cancelWithContext as cancelWithContext3 } from "@dxos/context";
|
|
1369
|
+
import { EdgeIdentityChangedError, protocol } from "@dxos/edge-client";
|
|
1370
|
+
import { invariant as invariant4 } from "@dxos/invariant";
|
|
1371
|
+
import { PublicKey as PublicKey5 } from "@dxos/keys";
|
|
1372
|
+
import { log as log5 } from "@dxos/log";
|
|
1986
1373
|
import { EdgeService } from "@dxos/protocols";
|
|
1987
1374
|
import { bufWkt } from "@dxos/protocols/buf";
|
|
1988
|
-
import {
|
|
1989
|
-
import { ComplexMap as
|
|
1990
|
-
var
|
|
1375
|
+
import { SwarmRequest_Action as SwarmRequestAction, SwarmRequestSchema, SwarmResponseSchema } from "@dxos/protocols/buf/dxos/edge/messenger_pb";
|
|
1376
|
+
import { ComplexMap as ComplexMap2, ComplexSet as ComplexSet2 } from "@dxos/util";
|
|
1377
|
+
var __dxlog_file5 = "/__w/dxos/dxos/packages/core/mesh/messaging/src/signal-manager/edge-signal-manager.ts";
|
|
1991
1378
|
var EdgeSignalManager = class extends Resource3 {
|
|
1379
|
+
/**
|
|
1380
|
+
* @deprecated
|
|
1381
|
+
*/
|
|
1382
|
+
swarmEvent = new Event4();
|
|
1383
|
+
swarmState = new Event4();
|
|
1384
|
+
onMessage = new Event4();
|
|
1385
|
+
/**
|
|
1386
|
+
* Swarm key -> { peer: <own state payload>, joinedPeers: <state of swarm> }.
|
|
1387
|
+
*/
|
|
1388
|
+
// TODO(mykola): This class should not contain swarm state joinedPeers. Temporary before network-manager API changes to accept list of peers.
|
|
1389
|
+
_swarmPeers = new ComplexMap2(PublicKey5.hash);
|
|
1390
|
+
_edgeConnection;
|
|
1992
1391
|
constructor({ edgeConnection }) {
|
|
1993
1392
|
super();
|
|
1994
|
-
/**
|
|
1995
|
-
* @deprecated
|
|
1996
|
-
*/
|
|
1997
|
-
this.swarmEvent = new Event5();
|
|
1998
|
-
this.swarmState = new Event5();
|
|
1999
|
-
this.onMessage = new Event5();
|
|
2000
|
-
/**
|
|
2001
|
-
* Swarm key -> { peer: <own state payload>, joinedPeers: <state of swarm> }.
|
|
2002
|
-
*/
|
|
2003
|
-
// TODO(mykola): This class should not contain swarm state joinedPeers. Temporary before network-manager API changes to accept list of peers.
|
|
2004
|
-
this._swarmPeers = new ComplexMap4(PublicKey7.hash);
|
|
2005
1393
|
this._edgeConnection = edgeConnection;
|
|
2006
1394
|
}
|
|
2007
1395
|
async _open() {
|
|
@@ -2015,15 +1403,15 @@ var EdgeSignalManager = class extends Resource3 {
|
|
|
2015
1403
|
*/
|
|
2016
1404
|
async join({ topic, peer }) {
|
|
2017
1405
|
if (!this._matchSelfPeerInfo(peer)) {
|
|
2018
|
-
|
|
1406
|
+
log5.warn("ignoring peer info on join request", {
|
|
2019
1407
|
peer,
|
|
2020
1408
|
expected: {
|
|
2021
1409
|
peerKey: this._edgeConnection.peerKey,
|
|
2022
1410
|
identityKey: this._edgeConnection.identityKey
|
|
2023
1411
|
}
|
|
2024
1412
|
}, {
|
|
2025
|
-
F:
|
|
2026
|
-
L:
|
|
1413
|
+
F: __dxlog_file5,
|
|
1414
|
+
L: 66,
|
|
2027
1415
|
S: this,
|
|
2028
1416
|
C: (f, a) => f(...a)
|
|
2029
1417
|
});
|
|
@@ -2032,7 +1420,7 @@ var EdgeSignalManager = class extends Resource3 {
|
|
|
2032
1420
|
}
|
|
2033
1421
|
this._swarmPeers.set(topic, {
|
|
2034
1422
|
lastState: peer.state,
|
|
2035
|
-
joinedPeers: new
|
|
1423
|
+
joinedPeers: new ComplexSet2(PeerInfoHash)
|
|
2036
1424
|
});
|
|
2037
1425
|
await this._edgeConnection.send(protocol.createMessage(SwarmRequestSchema, {
|
|
2038
1426
|
serviceId: EdgeService.SWARM,
|
|
@@ -2047,16 +1435,23 @@ var EdgeSignalManager = class extends Resource3 {
|
|
|
2047
1435
|
}
|
|
2048
1436
|
async leave({ topic, peer }) {
|
|
2049
1437
|
this._swarmPeers.delete(topic);
|
|
2050
|
-
|
|
2051
|
-
|
|
2052
|
-
|
|
2053
|
-
|
|
2054
|
-
|
|
2055
|
-
|
|
2056
|
-
|
|
2057
|
-
|
|
1438
|
+
try {
|
|
1439
|
+
await this._edgeConnection.send(protocol.createMessage(SwarmRequestSchema, {
|
|
1440
|
+
serviceId: EdgeService.SWARM,
|
|
1441
|
+
source: createMessageSource(topic, peer),
|
|
1442
|
+
payload: {
|
|
1443
|
+
action: SwarmRequestAction.LEAVE,
|
|
1444
|
+
swarmKeys: [
|
|
1445
|
+
topic.toHex()
|
|
1446
|
+
]
|
|
1447
|
+
}
|
|
1448
|
+
}));
|
|
1449
|
+
} catch (err) {
|
|
1450
|
+
if (err instanceof EdgeIdentityChangedError) {
|
|
1451
|
+
return;
|
|
2058
1452
|
}
|
|
2059
|
-
|
|
1453
|
+
throw err;
|
|
1454
|
+
}
|
|
2060
1455
|
}
|
|
2061
1456
|
async query({ topic }) {
|
|
2062
1457
|
const response = cancelWithContext3(this._ctx, this.swarmState.waitFor((state) => state.swarmKey === topic.toHex()));
|
|
@@ -2077,15 +1472,15 @@ var EdgeSignalManager = class extends Resource3 {
|
|
|
2077
1472
|
}
|
|
2078
1473
|
async sendMessage(message) {
|
|
2079
1474
|
if (!this._matchSelfPeerInfo(message.author)) {
|
|
2080
|
-
|
|
1475
|
+
log5.warn("ignoring author on send request", {
|
|
2081
1476
|
author: message.author,
|
|
2082
1477
|
expected: {
|
|
2083
1478
|
peerKey: this._edgeConnection.peerKey,
|
|
2084
1479
|
identityKey: this._edgeConnection.identityKey
|
|
2085
1480
|
}
|
|
2086
1481
|
}, {
|
|
2087
|
-
F:
|
|
2088
|
-
L:
|
|
1482
|
+
F: __dxlog_file5,
|
|
1483
|
+
L: 131,
|
|
2089
1484
|
S: this,
|
|
2090
1485
|
C: (f, a) => f(...a)
|
|
2091
1486
|
});
|
|
@@ -2118,9 +1513,9 @@ var EdgeSignalManager = class extends Resource3 {
|
|
|
2118
1513
|
}
|
|
2119
1514
|
}
|
|
2120
1515
|
_processSwarmResponse(message) {
|
|
2121
|
-
|
|
2122
|
-
F:
|
|
2123
|
-
L:
|
|
1516
|
+
invariant4(protocol.getPayloadType(message) === SwarmResponseSchema.typeName, "Wrong payload type", {
|
|
1517
|
+
F: __dxlog_file5,
|
|
1518
|
+
L: 168,
|
|
2124
1519
|
S: this,
|
|
2125
1520
|
A: [
|
|
2126
1521
|
"protocol.getPayloadType(message) === SwarmResponseSchema.typeName",
|
|
@@ -2129,13 +1524,13 @@ var EdgeSignalManager = class extends Resource3 {
|
|
|
2129
1524
|
});
|
|
2130
1525
|
const payload = protocol.getPayload(message, SwarmResponseSchema);
|
|
2131
1526
|
this.swarmState.emit(payload);
|
|
2132
|
-
const topic =
|
|
1527
|
+
const topic = PublicKey5.from(payload.swarmKey);
|
|
2133
1528
|
if (!this._swarmPeers.has(topic)) {
|
|
2134
1529
|
return;
|
|
2135
1530
|
}
|
|
2136
1531
|
const { joinedPeers: oldPeers } = this._swarmPeers.get(topic);
|
|
2137
1532
|
const timestamp = message.timestamp ? new Date(Date.parse(message.timestamp)) : /* @__PURE__ */ new Date();
|
|
2138
|
-
const newPeers = new
|
|
1533
|
+
const newPeers = new ComplexSet2(PeerInfoHash, payload.peers);
|
|
2139
1534
|
for (const peer of newPeers) {
|
|
2140
1535
|
if (oldPeers.has(peer)) {
|
|
2141
1536
|
continue;
|
|
@@ -2162,9 +1557,9 @@ var EdgeSignalManager = class extends Resource3 {
|
|
|
2162
1557
|
this._swarmPeers.get(topic).joinedPeers = newPeers;
|
|
2163
1558
|
}
|
|
2164
1559
|
_processMessage(message) {
|
|
2165
|
-
|
|
2166
|
-
F:
|
|
2167
|
-
L:
|
|
1560
|
+
invariant4(protocol.getPayloadType(message) === bufWkt.AnySchema.typeName, "Wrong payload type", {
|
|
1561
|
+
F: __dxlog_file5,
|
|
1562
|
+
L: 206,
|
|
2168
1563
|
S: this,
|
|
2169
1564
|
A: [
|
|
2170
1565
|
"protocol.getPayloadType(message) === bufWkt.AnySchema.typeName",
|
|
@@ -2172,27 +1567,27 @@ var EdgeSignalManager = class extends Resource3 {
|
|
|
2172
1567
|
]
|
|
2173
1568
|
});
|
|
2174
1569
|
const payload = protocol.getPayload(message, bufWkt.AnySchema);
|
|
2175
|
-
|
|
2176
|
-
F:
|
|
2177
|
-
L:
|
|
1570
|
+
invariant4(message.source, "source is missing", {
|
|
1571
|
+
F: __dxlog_file5,
|
|
1572
|
+
L: 208,
|
|
2178
1573
|
S: this,
|
|
2179
1574
|
A: [
|
|
2180
1575
|
"message.source",
|
|
2181
1576
|
"'source is missing'"
|
|
2182
1577
|
]
|
|
2183
1578
|
});
|
|
2184
|
-
|
|
2185
|
-
F:
|
|
2186
|
-
L:
|
|
1579
|
+
invariant4(message.target, "target is missing", {
|
|
1580
|
+
F: __dxlog_file5,
|
|
1581
|
+
L: 209,
|
|
2187
1582
|
S: this,
|
|
2188
1583
|
A: [
|
|
2189
1584
|
"message.target",
|
|
2190
1585
|
"'target is missing'"
|
|
2191
1586
|
]
|
|
2192
1587
|
});
|
|
2193
|
-
|
|
2194
|
-
F:
|
|
2195
|
-
L:
|
|
1588
|
+
invariant4(message.target.length === 1, "target should have exactly one item", {
|
|
1589
|
+
F: __dxlog_file5,
|
|
1590
|
+
L: 210,
|
|
2196
1591
|
S: this,
|
|
2197
1592
|
A: [
|
|
2198
1593
|
"message.target.length === 1",
|
|
@@ -2212,11 +1607,11 @@ var EdgeSignalManager = class extends Resource3 {
|
|
|
2212
1607
|
return peer && (peer.peerKey === this._edgeConnection.peerKey || peer.identityKey === this._edgeConnection.identityKey);
|
|
2213
1608
|
}
|
|
2214
1609
|
async _rejoinAllSwarms() {
|
|
2215
|
-
|
|
1610
|
+
log5("rejoin swarms", {
|
|
2216
1611
|
swarms: Array.from(this._swarmPeers.keys())
|
|
2217
1612
|
}, {
|
|
2218
|
-
F:
|
|
2219
|
-
L:
|
|
1613
|
+
F: __dxlog_file5,
|
|
1614
|
+
L: 229,
|
|
2220
1615
|
S: this,
|
|
2221
1616
|
C: (f, a) => f(...a)
|
|
2222
1617
|
});
|
|
@@ -2239,18 +1634,18 @@ var createMessageSource = (topic, peerInfo) => {
|
|
|
2239
1634
|
};
|
|
2240
1635
|
};
|
|
2241
1636
|
|
|
2242
|
-
//
|
|
2243
|
-
import { invariant as
|
|
2244
|
-
import { log as
|
|
1637
|
+
// src/signal-manager/utils.ts
|
|
1638
|
+
import { invariant as invariant5 } from "@dxos/invariant";
|
|
1639
|
+
import { log as log6 } from "@dxos/log";
|
|
2245
1640
|
import { DeviceKind } from "@dxos/protocols/proto/dxos/client/services";
|
|
2246
|
-
var
|
|
1641
|
+
var __dxlog_file6 = "/__w/dxos/dxos/packages/core/mesh/messaging/src/signal-manager/utils.ts";
|
|
2247
1642
|
var setIdentityTags = ({ identityService, devicesService, setTag }) => {
|
|
2248
1643
|
identityService.queryIdentity().subscribe((idqr) => {
|
|
2249
1644
|
if (!idqr?.identity?.identityKey) {
|
|
2250
|
-
|
|
1645
|
+
log6("empty response from identity service", {
|
|
2251
1646
|
idqr
|
|
2252
1647
|
}, {
|
|
2253
|
-
F:
|
|
1648
|
+
F: __dxlog_file6,
|
|
2254
1649
|
L: 21,
|
|
2255
1650
|
S: void 0,
|
|
2256
1651
|
C: (f, a) => f(...a)
|
|
@@ -2261,18 +1656,18 @@ var setIdentityTags = ({ identityService, devicesService, setTag }) => {
|
|
|
2261
1656
|
});
|
|
2262
1657
|
devicesService.queryDevices().subscribe((dqr) => {
|
|
2263
1658
|
if (!dqr || !dqr.devices || dqr.devices.length === 0) {
|
|
2264
|
-
|
|
1659
|
+
log6("empty response from device service", {
|
|
2265
1660
|
device: dqr
|
|
2266
1661
|
}, {
|
|
2267
|
-
F:
|
|
1662
|
+
F: __dxlog_file6,
|
|
2268
1663
|
L: 30,
|
|
2269
1664
|
S: void 0,
|
|
2270
1665
|
C: (f, a) => f(...a)
|
|
2271
1666
|
});
|
|
2272
1667
|
return;
|
|
2273
1668
|
}
|
|
2274
|
-
|
|
2275
|
-
F:
|
|
1669
|
+
invariant5(dqr, "empty response from device service", {
|
|
1670
|
+
F: __dxlog_file6,
|
|
2276
1671
|
L: 33,
|
|
2277
1672
|
S: void 0,
|
|
2278
1673
|
A: [
|
|
@@ -2282,10 +1677,10 @@ var setIdentityTags = ({ identityService, devicesService, setTag }) => {
|
|
|
2282
1677
|
});
|
|
2283
1678
|
const thisDevice = dqr.devices.find((device) => device.kind === DeviceKind.CURRENT);
|
|
2284
1679
|
if (!thisDevice) {
|
|
2285
|
-
|
|
1680
|
+
log6("no current device", {
|
|
2286
1681
|
device: dqr
|
|
2287
1682
|
}, {
|
|
2288
|
-
F:
|
|
1683
|
+
F: __dxlog_file6,
|
|
2289
1684
|
L: 37,
|
|
2290
1685
|
S: void 0,
|
|
2291
1686
|
C: (f, a) => f(...a)
|
|
@@ -2295,15 +1690,14 @@ var setIdentityTags = ({ identityService, devicesService, setTag }) => {
|
|
|
2295
1690
|
setTag("deviceKey", thisDevice.deviceKey.truncate());
|
|
2296
1691
|
});
|
|
2297
1692
|
};
|
|
2298
|
-
|
|
2299
1693
|
export {
|
|
1694
|
+
EdgeSignalManager,
|
|
1695
|
+
MemorySignalManager,
|
|
1696
|
+
MemorySignalManagerContext,
|
|
2300
1697
|
Messenger,
|
|
2301
|
-
SignalClient,
|
|
2302
1698
|
PeerInfoHash,
|
|
2303
|
-
|
|
2304
|
-
MemorySignalManager,
|
|
1699
|
+
SignalClient,
|
|
2305
1700
|
WebsocketSignalManager,
|
|
2306
|
-
EdgeSignalManager,
|
|
2307
1701
|
setIdentityTags
|
|
2308
1702
|
};
|
|
2309
|
-
//# sourceMappingURL=
|
|
1703
|
+
//# sourceMappingURL=index.mjs.map
|