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