@dxos/messaging 0.8.4-main.72ec0f3 → 0.8.4-main.74a063c4e0
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-L7NDSF6K.mjs → neutral/index.mjs} +315 -992
- 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 +4 -4
- 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.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 +10 -7
- 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-L7NDSF6K.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-PVWR5V42.mjs +0 -2380
- package/dist/lib/node-esm/chunk-PVWR5V42.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 -149
- 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,30 +115,30 @@ 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 = new
|
|
128
|
+
_swarmStreams = new ComplexMap(({ topic, peerId }) => topic.toHex() + peerId.toHex());
|
|
535
129
|
/**
|
|
536
130
|
* Represent desired joined topic and peerId.
|
|
537
131
|
*/
|
|
538
|
-
_joinedTopics = new
|
|
132
|
+
_joinedTopics = new ComplexSet(({ topic, peerId }) => topic.toHex() + peerId.toHex());
|
|
539
133
|
/**
|
|
540
134
|
* Represent desired message subscriptions.
|
|
541
135
|
*/
|
|
542
|
-
_subscribedMessages = new
|
|
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 = new
|
|
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
|
|
@@ -593,11 +187,11 @@ var SignalLocalState = class {
|
|
|
593
187
|
});
|
|
594
188
|
}
|
|
595
189
|
unsubscribeMessages(peerId) {
|
|
596
|
-
|
|
190
|
+
log("unsubscribing from messages", {
|
|
597
191
|
peerId
|
|
598
192
|
}, {
|
|
599
|
-
F:
|
|
600
|
-
L:
|
|
193
|
+
F: __dxlog_file,
|
|
194
|
+
L: 79,
|
|
601
195
|
S: this,
|
|
602
196
|
C: (f, a) => f(...a)
|
|
603
197
|
});
|
|
@@ -645,11 +239,11 @@ var SignalLocalState = class {
|
|
|
645
239
|
topic,
|
|
646
240
|
peerId
|
|
647
241
|
})) {
|
|
648
|
-
|
|
242
|
+
log("swarm event", {
|
|
649
243
|
swarmEvent
|
|
650
244
|
}, {
|
|
651
|
-
F:
|
|
652
|
-
L:
|
|
245
|
+
F: __dxlog_file,
|
|
246
|
+
L: 115,
|
|
653
247
|
S: this,
|
|
654
248
|
C: (f, a) => f(...a)
|
|
655
249
|
});
|
|
@@ -658,7 +252,7 @@ var SignalLocalState = class {
|
|
|
658
252
|
peerAvailable: {
|
|
659
253
|
...swarmEvent.peerAvailable,
|
|
660
254
|
peer: {
|
|
661
|
-
peerKey:
|
|
255
|
+
peerKey: PublicKey.from(swarmEvent.peerAvailable.peer).toHex()
|
|
662
256
|
}
|
|
663
257
|
}
|
|
664
258
|
} : {
|
|
@@ -666,7 +260,7 @@ var SignalLocalState = class {
|
|
|
666
260
|
peerLeft: {
|
|
667
261
|
...swarmEvent.peerLeft,
|
|
668
262
|
peer: {
|
|
669
|
-
peerKey:
|
|
263
|
+
peerKey: PublicKey.from(swarmEvent.peerLeft.peer).toHex()
|
|
670
264
|
}
|
|
671
265
|
}
|
|
672
266
|
};
|
|
@@ -700,10 +294,10 @@ var SignalLocalState = class {
|
|
|
700
294
|
})) {
|
|
701
295
|
const message = {
|
|
702
296
|
author: {
|
|
703
|
-
peerKey:
|
|
297
|
+
peerKey: PublicKey.from(signalMessage.author).toHex()
|
|
704
298
|
},
|
|
705
299
|
recipient: {
|
|
706
|
-
peerKey:
|
|
300
|
+
peerKey: PublicKey.from(signalMessage.recipient).toHex()
|
|
707
301
|
},
|
|
708
302
|
payload: signalMessage.payload
|
|
709
303
|
};
|
|
@@ -717,20 +311,20 @@ var SignalLocalState = class {
|
|
|
717
311
|
|
|
718
312
|
// src/signal-client/signal-rpc-client.ts
|
|
719
313
|
import WebSocket from "isomorphic-ws";
|
|
720
|
-
import { TimeoutError
|
|
721
|
-
import { Context
|
|
722
|
-
import { invariant
|
|
723
|
-
import { PublicKey as
|
|
724
|
-
import { log as
|
|
725
|
-
import { trace as
|
|
726
|
-
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";
|
|
727
321
|
import { createProtoRpcPeer } from "@dxos/rpc";
|
|
728
322
|
|
|
729
323
|
// src/signal-client/signal-rpc-client-monitor.ts
|
|
730
|
-
import { trace as
|
|
324
|
+
import { trace as trace2 } from "@dxos/tracing";
|
|
731
325
|
var SignalRpcClientMonitor = class {
|
|
732
326
|
recordClientCloseFailure(params) {
|
|
733
|
-
|
|
327
|
+
trace2.metrics.increment("dxos.mesh.signal.signal-rpc-client.close-failure", 1, {
|
|
734
328
|
tags: {
|
|
735
329
|
reason: params.failureReason
|
|
736
330
|
}
|
|
@@ -739,7 +333,7 @@ var SignalRpcClientMonitor = class {
|
|
|
739
333
|
};
|
|
740
334
|
|
|
741
335
|
// src/signal-client/signal-rpc-client.ts
|
|
742
|
-
var
|
|
336
|
+
var __dxlog_file2 = "/__w/dxos/dxos/packages/core/mesh/messaging/src/signal-client/signal-rpc-client.ts";
|
|
743
337
|
var SIGNAL_KEEPALIVE_INTERVAL = 1e4;
|
|
744
338
|
var SignalRPCClient = class {
|
|
745
339
|
_socket;
|
|
@@ -752,11 +346,11 @@ var SignalRPCClient = class {
|
|
|
752
346
|
_closeComplete = new Trigger();
|
|
753
347
|
_monitor = new SignalRpcClientMonitor();
|
|
754
348
|
constructor({ url, callbacks = {} }) {
|
|
755
|
-
const traceId =
|
|
756
|
-
|
|
349
|
+
const traceId = PublicKey2.random().toHex();
|
|
350
|
+
log2.trace("dxos.mesh.signal-rpc-client.constructor", trace3.begin({
|
|
757
351
|
id: traceId
|
|
758
352
|
}), {
|
|
759
|
-
F:
|
|
353
|
+
F: __dxlog_file2,
|
|
760
354
|
L: 66,
|
|
761
355
|
S: this,
|
|
762
356
|
C: (f, a) => f(...a)
|
|
@@ -766,7 +360,7 @@ var SignalRPCClient = class {
|
|
|
766
360
|
this._socket = new WebSocket(this._url);
|
|
767
361
|
this._rpc = createProtoRpcPeer({
|
|
768
362
|
requested: {
|
|
769
|
-
Signal:
|
|
363
|
+
Signal: schema.getService("dxos.mesh.signal.Signal")
|
|
770
364
|
},
|
|
771
365
|
noHandshake: true,
|
|
772
366
|
port: {
|
|
@@ -777,8 +371,8 @@ var SignalRPCClient = class {
|
|
|
777
371
|
try {
|
|
778
372
|
this._socket.send(msg);
|
|
779
373
|
} catch (err) {
|
|
780
|
-
|
|
781
|
-
F:
|
|
374
|
+
log2.warn("send error", err, {
|
|
375
|
+
F: __dxlog_file2,
|
|
782
376
|
L: 85,
|
|
783
377
|
S: this,
|
|
784
378
|
C: (f, a) => f(...a)
|
|
@@ -806,19 +400,19 @@ var SignalRPCClient = class {
|
|
|
806
400
|
await this._safeCloseRpc();
|
|
807
401
|
return;
|
|
808
402
|
}
|
|
809
|
-
|
|
810
|
-
F:
|
|
403
|
+
log2(`RPC open ${this._url}`, void 0, {
|
|
404
|
+
F: __dxlog_file2,
|
|
811
405
|
L: 110,
|
|
812
406
|
S: this,
|
|
813
407
|
C: (f, a) => f(...a)
|
|
814
408
|
});
|
|
815
409
|
this._callbacks.onConnected?.();
|
|
816
410
|
this._connectTrigger.wake();
|
|
817
|
-
this._keepaliveCtx = new
|
|
818
|
-
F:
|
|
411
|
+
this._keepaliveCtx = new Context(void 0, {
|
|
412
|
+
F: __dxlog_file2,
|
|
819
413
|
L: 113
|
|
820
414
|
});
|
|
821
|
-
|
|
415
|
+
scheduleTaskInterval(this._keepaliveCtx, async () => {
|
|
822
416
|
this._socket?.send("__ping__");
|
|
823
417
|
}, SIGNAL_KEEPALIVE_INTERVAL);
|
|
824
418
|
} catch (err) {
|
|
@@ -828,8 +422,8 @@ var SignalRPCClient = class {
|
|
|
828
422
|
}
|
|
829
423
|
};
|
|
830
424
|
this._socket.onclose = async () => {
|
|
831
|
-
|
|
832
|
-
F:
|
|
425
|
+
log2(`Disconnected ${this._url}`, void 0, {
|
|
426
|
+
F: __dxlog_file2,
|
|
833
427
|
L: 133,
|
|
834
428
|
S: this,
|
|
835
429
|
C: (f, a) => f(...a)
|
|
@@ -846,20 +440,20 @@ var SignalRPCClient = class {
|
|
|
846
440
|
this._closed = true;
|
|
847
441
|
this._callbacks.onError?.(event.error ?? new Error(event.message));
|
|
848
442
|
await this._safeCloseRpc();
|
|
849
|
-
|
|
443
|
+
log2.warn(`Socket ${event.type ?? "unknown"} error`, {
|
|
850
444
|
message: event.message,
|
|
851
445
|
url: this._url
|
|
852
446
|
}, {
|
|
853
|
-
F:
|
|
447
|
+
F: __dxlog_file2,
|
|
854
448
|
L: 149,
|
|
855
449
|
S: this,
|
|
856
450
|
C: (f, a) => f(...a)
|
|
857
451
|
});
|
|
858
452
|
};
|
|
859
|
-
|
|
453
|
+
log2.trace("dxos.mesh.signal-rpc-client.constructor", trace3.end({
|
|
860
454
|
id: traceId
|
|
861
455
|
}), {
|
|
862
|
-
F:
|
|
456
|
+
F: __dxlog_file2,
|
|
863
457
|
L: 152,
|
|
864
458
|
S: this,
|
|
865
459
|
C: (f, a) => f(...a)
|
|
@@ -880,25 +474,25 @@ var SignalRPCClient = class {
|
|
|
880
474
|
timeout: 1e3
|
|
881
475
|
});
|
|
882
476
|
} catch (err) {
|
|
883
|
-
const failureReason = err instanceof
|
|
477
|
+
const failureReason = err instanceof TimeoutError ? "timeout" : err?.constructor?.name ?? "unknown";
|
|
884
478
|
this._monitor.recordClientCloseFailure({
|
|
885
479
|
failureReason
|
|
886
480
|
});
|
|
887
481
|
}
|
|
888
482
|
}
|
|
889
483
|
async join({ topic, peerId }) {
|
|
890
|
-
|
|
484
|
+
log2("join", {
|
|
891
485
|
topic,
|
|
892
486
|
peerId,
|
|
893
487
|
metadata: this._callbacks?.getMetadata?.()
|
|
894
488
|
}, {
|
|
895
|
-
F:
|
|
489
|
+
F: __dxlog_file2,
|
|
896
490
|
L: 178,
|
|
897
491
|
S: this,
|
|
898
492
|
C: (f, a) => f(...a)
|
|
899
493
|
});
|
|
900
|
-
|
|
901
|
-
F:
|
|
494
|
+
invariant(!this._closed, "SignalRPCClient is closed", {
|
|
495
|
+
F: __dxlog_file2,
|
|
902
496
|
L: 179,
|
|
903
497
|
S: this,
|
|
904
498
|
A: [
|
|
@@ -916,16 +510,16 @@ var SignalRPCClient = class {
|
|
|
916
510
|
return swarmStream;
|
|
917
511
|
}
|
|
918
512
|
async receiveMessages(peerId) {
|
|
919
|
-
|
|
513
|
+
log2("receiveMessages", {
|
|
920
514
|
peerId
|
|
921
515
|
}, {
|
|
922
|
-
F:
|
|
516
|
+
F: __dxlog_file2,
|
|
923
517
|
L: 191,
|
|
924
518
|
S: this,
|
|
925
519
|
C: (f, a) => f(...a)
|
|
926
520
|
});
|
|
927
|
-
|
|
928
|
-
F:
|
|
521
|
+
invariant(!this._closed, "SignalRPCClient is closed", {
|
|
522
|
+
F: __dxlog_file2,
|
|
929
523
|
L: 192,
|
|
930
524
|
S: this,
|
|
931
525
|
A: [
|
|
@@ -941,19 +535,19 @@ var SignalRPCClient = class {
|
|
|
941
535
|
return messageStream;
|
|
942
536
|
}
|
|
943
537
|
async sendMessage({ author, recipient, payload }) {
|
|
944
|
-
|
|
538
|
+
log2("sendMessage", {
|
|
945
539
|
author,
|
|
946
540
|
recipient,
|
|
947
541
|
payload,
|
|
948
542
|
metadata: this._callbacks?.getMetadata?.()
|
|
949
543
|
}, {
|
|
950
|
-
F:
|
|
544
|
+
F: __dxlog_file2,
|
|
951
545
|
L: 210,
|
|
952
546
|
S: this,
|
|
953
547
|
C: (f, a) => f(...a)
|
|
954
548
|
});
|
|
955
|
-
|
|
956
|
-
F:
|
|
549
|
+
invariant(!this._closed, "SignalRPCClient is closed", {
|
|
550
|
+
F: __dxlog_file2,
|
|
957
551
|
L: 211,
|
|
958
552
|
S: this,
|
|
959
553
|
A: [
|
|
@@ -974,8 +568,8 @@ var SignalRPCClient = class {
|
|
|
974
568
|
this._connectTrigger.reset();
|
|
975
569
|
await this._rpc.close();
|
|
976
570
|
} catch (err) {
|
|
977
|
-
|
|
978
|
-
F:
|
|
571
|
+
log2.catch(err, void 0, {
|
|
572
|
+
F: __dxlog_file2,
|
|
979
573
|
L: 226,
|
|
980
574
|
S: this,
|
|
981
575
|
C: (f, a) => f(...a)
|
|
@@ -985,7 +579,7 @@ var SignalRPCClient = class {
|
|
|
985
579
|
};
|
|
986
580
|
|
|
987
581
|
// src/signal-client/signal-client.ts
|
|
988
|
-
var
|
|
582
|
+
var __dxlog_file3 = "/__w/dxos/dxos/packages/core/mesh/messaging/src/signal-client/signal-client.ts";
|
|
989
583
|
var DEFAULT_RECONNECT_TIMEOUT = 100;
|
|
990
584
|
var MAX_RECONNECT_TIMEOUT = 5e3;
|
|
991
585
|
var ERROR_RECONCILE_DELAY = 1e3;
|
|
@@ -1006,7 +600,7 @@ var SignalClient = class extends Resource {
|
|
|
1006
600
|
* Number of milliseconds after which the connection will be attempted again in case of error.
|
|
1007
601
|
*/
|
|
1008
602
|
_reconnectAfter = DEFAULT_RECONNECT_TIMEOUT;
|
|
1009
|
-
_instanceId =
|
|
603
|
+
_instanceId = PublicKey3.random().toHex();
|
|
1010
604
|
/**
|
|
1011
605
|
* @internal
|
|
1012
606
|
*/
|
|
@@ -1031,11 +625,11 @@ var SignalClient = class extends Resource {
|
|
|
1031
625
|
}, async (event) => this.swarmEvent.emit(event));
|
|
1032
626
|
}
|
|
1033
627
|
async _open() {
|
|
1034
|
-
|
|
628
|
+
log3.trace("dxos.mesh.signal-client.open", trace4.begin({
|
|
1035
629
|
id: this._instanceId
|
|
1036
630
|
}), {
|
|
1037
|
-
F:
|
|
1038
|
-
L:
|
|
631
|
+
F: __dxlog_file3,
|
|
632
|
+
L: 96,
|
|
1039
633
|
S: this,
|
|
1040
634
|
C: (f, a) => f(...a)
|
|
1041
635
|
});
|
|
@@ -1051,9 +645,9 @@ var SignalClient = class extends Resource {
|
|
|
1051
645
|
await cancelWithContext2(this._connectionCtx, this._clientReady.wait({
|
|
1052
646
|
timeout: 5e3
|
|
1053
647
|
}));
|
|
1054
|
-
|
|
1055
|
-
F:
|
|
1056
|
-
L:
|
|
648
|
+
invariant2(this._state === SignalState.CONNECTED, "Not connected to Signal Server", {
|
|
649
|
+
F: __dxlog_file3,
|
|
650
|
+
L: 106,
|
|
1057
651
|
S: this,
|
|
1058
652
|
A: [
|
|
1059
653
|
"this._state === SignalState.CONNECTED",
|
|
@@ -1073,7 +667,7 @@ var SignalClient = class extends Resource {
|
|
|
1073
667
|
throw err;
|
|
1074
668
|
}
|
|
1075
669
|
});
|
|
1076
|
-
|
|
670
|
+
scheduleTaskInterval2(this._ctx, async () => {
|
|
1077
671
|
if (this._state === SignalState.CONNECTED) {
|
|
1078
672
|
this._reconcileTask.schedule();
|
|
1079
673
|
}
|
|
@@ -1092,11 +686,11 @@ var SignalClient = class extends Resource {
|
|
|
1092
686
|
}
|
|
1093
687
|
});
|
|
1094
688
|
this._createClient();
|
|
1095
|
-
|
|
689
|
+
log3.trace("dxos.mesh.signal-client.open", trace4.end({
|
|
1096
690
|
id: this._instanceId
|
|
1097
691
|
}), {
|
|
1098
|
-
F:
|
|
1099
|
-
L:
|
|
692
|
+
F: __dxlog_file3,
|
|
693
|
+
L: 139,
|
|
1100
694
|
S: this,
|
|
1101
695
|
C: (f, a) => f(...a)
|
|
1102
696
|
});
|
|
@@ -1106,9 +700,9 @@ var SignalClient = class extends Resource {
|
|
|
1106
700
|
return;
|
|
1107
701
|
}
|
|
1108
702
|
if (this._state === SignalState.CONNECTED && !this._lastReconciliationFailed) {
|
|
1109
|
-
|
|
1110
|
-
F:
|
|
1111
|
-
L:
|
|
703
|
+
log3.warn("SignalClient error:", err, {
|
|
704
|
+
F: __dxlog_file3,
|
|
705
|
+
L: 148,
|
|
1112
706
|
S: this,
|
|
1113
707
|
C: (f, a) => f(...a)
|
|
1114
708
|
});
|
|
@@ -1116,9 +710,9 @@ var SignalClient = class extends Resource {
|
|
|
1116
710
|
this._scheduleReconcileAfterError();
|
|
1117
711
|
}
|
|
1118
712
|
async _close() {
|
|
1119
|
-
|
|
1120
|
-
F:
|
|
1121
|
-
L:
|
|
713
|
+
log3("closing...", void 0, {
|
|
714
|
+
F: __dxlog_file3,
|
|
715
|
+
L: 154,
|
|
1122
716
|
S: this,
|
|
1123
717
|
C: (f, a) => f(...a)
|
|
1124
718
|
});
|
|
@@ -1129,9 +723,9 @@ var SignalClient = class extends Resource {
|
|
|
1129
723
|
}
|
|
1130
724
|
this._setState(SignalState.CLOSED);
|
|
1131
725
|
await this._safeResetClient();
|
|
1132
|
-
|
|
1133
|
-
F:
|
|
1134
|
-
L:
|
|
726
|
+
log3("closed", void 0, {
|
|
727
|
+
F: __dxlog_file3,
|
|
728
|
+
L: 162,
|
|
1135
729
|
S: this,
|
|
1136
730
|
C: (f, a) => f(...a)
|
|
1137
731
|
});
|
|
@@ -1145,66 +739,66 @@ var SignalClient = class extends Resource {
|
|
|
1145
739
|
...this._monitor.getRecordedTimestamps()
|
|
1146
740
|
};
|
|
1147
741
|
}
|
|
1148
|
-
async join(args) {
|
|
1149
|
-
|
|
742
|
+
async join(_ctx, args) {
|
|
743
|
+
log3("joining", {
|
|
1150
744
|
topic: args.topic,
|
|
1151
745
|
peerId: args.peer.peerKey
|
|
1152
746
|
}, {
|
|
1153
|
-
F:
|
|
1154
|
-
L:
|
|
747
|
+
F: __dxlog_file3,
|
|
748
|
+
L: 176,
|
|
1155
749
|
S: this,
|
|
1156
750
|
C: (f, a) => f(...a)
|
|
1157
751
|
});
|
|
1158
752
|
this._monitor.recordJoin();
|
|
1159
753
|
this.localState.join({
|
|
1160
754
|
topic: args.topic,
|
|
1161
|
-
peerId:
|
|
755
|
+
peerId: PublicKey3.from(args.peer.peerKey)
|
|
1162
756
|
});
|
|
1163
757
|
this._reconcileTask?.schedule();
|
|
1164
758
|
}
|
|
1165
|
-
async leave(args) {
|
|
1166
|
-
|
|
759
|
+
async leave(_ctx, args) {
|
|
760
|
+
log3("leaving", {
|
|
1167
761
|
topic: args.topic,
|
|
1168
762
|
peerId: args.peer.peerKey
|
|
1169
763
|
}, {
|
|
1170
|
-
F:
|
|
1171
|
-
L:
|
|
764
|
+
F: __dxlog_file3,
|
|
765
|
+
L: 183,
|
|
1172
766
|
S: this,
|
|
1173
767
|
C: (f, a) => f(...a)
|
|
1174
768
|
});
|
|
1175
769
|
this._monitor.recordLeave();
|
|
1176
770
|
this.localState.leave({
|
|
1177
771
|
topic: args.topic,
|
|
1178
|
-
peerId:
|
|
772
|
+
peerId: PublicKey3.from(args.peer.peerKey)
|
|
1179
773
|
});
|
|
1180
774
|
}
|
|
1181
|
-
async query(params) {
|
|
775
|
+
async query(_ctx, params) {
|
|
1182
776
|
throw new Error("Not implemented");
|
|
1183
777
|
}
|
|
1184
|
-
async sendMessage(msg) {
|
|
778
|
+
async sendMessage(_ctx, msg) {
|
|
1185
779
|
return this._monitor.recordMessageSending(msg, async () => {
|
|
1186
780
|
await this._clientReady.wait();
|
|
1187
|
-
|
|
1188
|
-
F:
|
|
1189
|
-
L:
|
|
781
|
+
invariant2(this._state === SignalState.CONNECTED, "Not connected to Signal Server", {
|
|
782
|
+
F: __dxlog_file3,
|
|
783
|
+
L: 195,
|
|
1190
784
|
S: this,
|
|
1191
785
|
A: [
|
|
1192
786
|
"this._state === SignalState.CONNECTED",
|
|
1193
787
|
"'Not connected to Signal Server'"
|
|
1194
788
|
]
|
|
1195
789
|
});
|
|
1196
|
-
|
|
1197
|
-
F:
|
|
1198
|
-
L:
|
|
790
|
+
invariant2(msg.author.peerKey, "Author key required", {
|
|
791
|
+
F: __dxlog_file3,
|
|
792
|
+
L: 196,
|
|
1199
793
|
S: this,
|
|
1200
794
|
A: [
|
|
1201
795
|
"msg.author.peerKey",
|
|
1202
796
|
"'Author key required'"
|
|
1203
797
|
]
|
|
1204
798
|
});
|
|
1205
|
-
|
|
1206
|
-
F:
|
|
1207
|
-
L:
|
|
799
|
+
invariant2(msg.recipient.peerKey, "Recipient key required", {
|
|
800
|
+
F: __dxlog_file3,
|
|
801
|
+
L: 197,
|
|
1208
802
|
S: this,
|
|
1209
803
|
A: [
|
|
1210
804
|
"msg.recipient.peerKey",
|
|
@@ -1212,69 +806,69 @@ var SignalClient = class extends Resource {
|
|
|
1212
806
|
]
|
|
1213
807
|
});
|
|
1214
808
|
await this._client.sendMessage({
|
|
1215
|
-
author:
|
|
1216
|
-
recipient:
|
|
809
|
+
author: PublicKey3.from(msg.author.peerKey),
|
|
810
|
+
recipient: PublicKey3.from(msg.recipient.peerKey),
|
|
1217
811
|
payload: msg.payload
|
|
1218
812
|
});
|
|
1219
813
|
});
|
|
1220
814
|
}
|
|
1221
815
|
async subscribeMessages(peer) {
|
|
1222
|
-
|
|
1223
|
-
F:
|
|
1224
|
-
L:
|
|
816
|
+
invariant2(peer.peerKey, "Peer key required", {
|
|
817
|
+
F: __dxlog_file3,
|
|
818
|
+
L: 207,
|
|
1225
819
|
S: this,
|
|
1226
820
|
A: [
|
|
1227
821
|
"peer.peerKey",
|
|
1228
822
|
"'Peer key required'"
|
|
1229
823
|
]
|
|
1230
824
|
});
|
|
1231
|
-
|
|
825
|
+
log3("subscribing to messages", {
|
|
1232
826
|
peer
|
|
1233
827
|
}, {
|
|
1234
|
-
F:
|
|
1235
|
-
L:
|
|
828
|
+
F: __dxlog_file3,
|
|
829
|
+
L: 208,
|
|
1236
830
|
S: this,
|
|
1237
831
|
C: (f, a) => f(...a)
|
|
1238
832
|
});
|
|
1239
|
-
this.localState.subscribeMessages(
|
|
833
|
+
this.localState.subscribeMessages(PublicKey3.from(peer.peerKey));
|
|
1240
834
|
this._reconcileTask?.schedule();
|
|
1241
835
|
}
|
|
1242
836
|
async unsubscribeMessages(peer) {
|
|
1243
|
-
|
|
1244
|
-
F:
|
|
1245
|
-
L:
|
|
837
|
+
invariant2(peer.peerKey, "Peer key required", {
|
|
838
|
+
F: __dxlog_file3,
|
|
839
|
+
L: 214,
|
|
1246
840
|
S: this,
|
|
1247
841
|
A: [
|
|
1248
842
|
"peer.peerKey",
|
|
1249
843
|
"'Peer key required'"
|
|
1250
844
|
]
|
|
1251
845
|
});
|
|
1252
|
-
|
|
846
|
+
log3("unsubscribing from messages", {
|
|
1253
847
|
peer
|
|
1254
848
|
}, {
|
|
1255
|
-
F:
|
|
1256
|
-
L:
|
|
849
|
+
F: __dxlog_file3,
|
|
850
|
+
L: 215,
|
|
1257
851
|
S: this,
|
|
1258
852
|
C: (f, a) => f(...a)
|
|
1259
853
|
});
|
|
1260
|
-
this.localState.unsubscribeMessages(
|
|
854
|
+
this.localState.unsubscribeMessages(PublicKey3.from(peer.peerKey));
|
|
1261
855
|
}
|
|
1262
856
|
_scheduleReconcileAfterError() {
|
|
1263
|
-
|
|
857
|
+
scheduleTask(this._ctx, () => this._reconcileTask.schedule(), ERROR_RECONCILE_DELAY);
|
|
1264
858
|
}
|
|
1265
859
|
_createClient() {
|
|
1266
|
-
|
|
860
|
+
log3("creating client", {
|
|
1267
861
|
host: this._host,
|
|
1268
862
|
state: this._state
|
|
1269
863
|
}, {
|
|
1270
|
-
F:
|
|
1271
|
-
L:
|
|
864
|
+
F: __dxlog_file3,
|
|
865
|
+
L: 224,
|
|
1272
866
|
S: this,
|
|
1273
867
|
C: (f, a) => f(...a)
|
|
1274
868
|
});
|
|
1275
|
-
|
|
1276
|
-
F:
|
|
1277
|
-
L:
|
|
869
|
+
invariant2(!this._client, "Client already created", {
|
|
870
|
+
F: __dxlog_file3,
|
|
871
|
+
L: 225,
|
|
1278
872
|
S: this,
|
|
1279
873
|
A: [
|
|
1280
874
|
"!this._client",
|
|
@@ -1284,9 +878,9 @@ var SignalClient = class extends Resource {
|
|
|
1284
878
|
this._monitor.recordConnectionStartTime();
|
|
1285
879
|
this._connectionCtx = this._ctx.derive();
|
|
1286
880
|
this._connectionCtx.onDispose(async () => {
|
|
1287
|
-
|
|
1288
|
-
F:
|
|
1289
|
-
L:
|
|
881
|
+
log3("connection context disposed", void 0, {
|
|
882
|
+
F: __dxlog_file3,
|
|
883
|
+
L: 232,
|
|
1290
884
|
S: this,
|
|
1291
885
|
C: (f, a) => f(...a)
|
|
1292
886
|
});
|
|
@@ -1299,9 +893,9 @@ var SignalClient = class extends Resource {
|
|
|
1299
893
|
callbacks: {
|
|
1300
894
|
onConnected: () => {
|
|
1301
895
|
if (client === this._client) {
|
|
1302
|
-
|
|
1303
|
-
F:
|
|
1304
|
-
L:
|
|
896
|
+
log3("socket connected", void 0, {
|
|
897
|
+
F: __dxlog_file3,
|
|
898
|
+
L: 243,
|
|
1305
899
|
S: this,
|
|
1306
900
|
C: (f, a) => f(...a)
|
|
1307
901
|
});
|
|
@@ -1312,11 +906,11 @@ var SignalClient = class extends Resource {
|
|
|
1312
906
|
if (client !== this._client) {
|
|
1313
907
|
return;
|
|
1314
908
|
}
|
|
1315
|
-
|
|
909
|
+
log3("socket disconnected", {
|
|
1316
910
|
state: this._state
|
|
1317
911
|
}, {
|
|
1318
|
-
F:
|
|
1319
|
-
L:
|
|
912
|
+
F: __dxlog_file3,
|
|
913
|
+
L: 252,
|
|
1320
914
|
S: this,
|
|
1321
915
|
C: (f, a) => f(...a)
|
|
1322
916
|
});
|
|
@@ -1328,12 +922,12 @@ var SignalClient = class extends Resource {
|
|
|
1328
922
|
},
|
|
1329
923
|
onError: (error) => {
|
|
1330
924
|
if (client === this._client) {
|
|
1331
|
-
|
|
925
|
+
log3("socket error", {
|
|
1332
926
|
error,
|
|
1333
927
|
state: this._state
|
|
1334
928
|
}, {
|
|
1335
|
-
F:
|
|
1336
|
-
L:
|
|
929
|
+
F: __dxlog_file3,
|
|
930
|
+
L: 264,
|
|
1337
931
|
S: this,
|
|
1338
932
|
C: (f, a) => f(...a)
|
|
1339
933
|
});
|
|
@@ -1354,18 +948,18 @@ var SignalClient = class extends Resource {
|
|
|
1354
948
|
}
|
|
1355
949
|
}
|
|
1356
950
|
async _reconnect() {
|
|
1357
|
-
|
|
951
|
+
log3(`reconnecting in ${this._reconnectAfter}ms`, {
|
|
1358
952
|
state: this._state
|
|
1359
953
|
}, {
|
|
1360
|
-
F:
|
|
1361
|
-
L:
|
|
954
|
+
F: __dxlog_file3,
|
|
955
|
+
L: 279,
|
|
1362
956
|
S: this,
|
|
1363
957
|
C: (f, a) => f(...a)
|
|
1364
958
|
});
|
|
1365
959
|
if (this._state === SignalState.RECONNECTING) {
|
|
1366
|
-
|
|
1367
|
-
F:
|
|
1368
|
-
L:
|
|
960
|
+
log3.info("Signal api already reconnecting.", void 0, {
|
|
961
|
+
F: __dxlog_file3,
|
|
962
|
+
L: 282,
|
|
1369
963
|
S: this,
|
|
1370
964
|
C: (f, a) => f(...a)
|
|
1371
965
|
});
|
|
@@ -1403,11 +997,11 @@ var SignalClient = class extends Resource {
|
|
|
1403
997
|
_setState(newState) {
|
|
1404
998
|
this._state = newState;
|
|
1405
999
|
this._monitor.recordStateChangeTime();
|
|
1406
|
-
|
|
1000
|
+
log3("signal state changed", {
|
|
1407
1001
|
status: this.getStatus()
|
|
1408
1002
|
}, {
|
|
1409
|
-
F:
|
|
1410
|
-
L:
|
|
1003
|
+
F: __dxlog_file3,
|
|
1004
|
+
L: 323,
|
|
1411
1005
|
S: this,
|
|
1412
1006
|
C: (f, a) => f(...a)
|
|
1413
1007
|
});
|
|
@@ -1429,293 +1023,23 @@ var SignalClient = class extends Resource {
|
|
|
1429
1023
|
}
|
|
1430
1024
|
};
|
|
1431
1025
|
|
|
1432
|
-
// src/signal-methods.ts
|
|
1433
|
-
var PeerInfoHash = ({ peerKey }) => peerKey;
|
|
1434
|
-
|
|
1435
|
-
// src/signal-manager/memory-signal-manager.ts
|
|
1436
|
-
import { Event as Event3, Trigger as Trigger3 } from "@dxos/async";
|
|
1437
|
-
import { Context as Context3 } from "@dxos/context";
|
|
1438
|
-
import { invariant as invariant4 } from "@dxos/invariant";
|
|
1439
|
-
import { PublicKey as PublicKey5 } from "@dxos/keys";
|
|
1440
|
-
import { log as log5 } from "@dxos/log";
|
|
1441
|
-
import { schema as schema3 } from "@dxos/protocols/proto";
|
|
1442
|
-
import { ComplexMap as ComplexMap3, ComplexSet as ComplexSet3 } from "@dxos/util";
|
|
1443
|
-
var __dxlog_file5 = "/__w/dxos/dxos/packages/core/mesh/messaging/src/signal-manager/memory-signal-manager.ts";
|
|
1444
|
-
var MemorySignalManagerContext = class {
|
|
1445
|
-
// Swarm messages.
|
|
1446
|
-
swarmEvent = new Event3();
|
|
1447
|
-
// Mapping from topic to set of peers.
|
|
1448
|
-
swarms = new ComplexMap3(PublicKey5.hash);
|
|
1449
|
-
// Map of connections for each peer for signaling.
|
|
1450
|
-
connections = new ComplexMap3(PeerInfoHash);
|
|
1451
|
-
};
|
|
1452
|
-
var MemorySignalManager = class {
|
|
1453
|
-
_context;
|
|
1454
|
-
statusChanged = new Event3();
|
|
1455
|
-
swarmEvent = new Event3();
|
|
1456
|
-
onMessage = new Event3();
|
|
1457
|
-
/** Will be used to emit SwarmEvents on .open() and .close() */
|
|
1458
|
-
_joinedSwarms = new ComplexSet3(({ topic, peer }) => topic.toHex() + peer.peerKey);
|
|
1459
|
-
_ctx;
|
|
1460
|
-
// TODO(dmaretskyi): Replace with callback.
|
|
1461
|
-
_freezeTrigger = new Trigger3().wake();
|
|
1462
|
-
constructor(_context) {
|
|
1463
|
-
this._context = _context;
|
|
1464
|
-
this._ctx = new Context3(void 0, {
|
|
1465
|
-
F: __dxlog_file5,
|
|
1466
|
-
L: 54
|
|
1467
|
-
});
|
|
1468
|
-
this._ctx.onDispose(this._context.swarmEvent.on((data) => this.swarmEvent.emit(data)));
|
|
1469
|
-
}
|
|
1470
|
-
async open() {
|
|
1471
|
-
if (!this._ctx.disposed) {
|
|
1472
|
-
return;
|
|
1473
|
-
}
|
|
1474
|
-
this._ctx = new Context3(void 0, {
|
|
1475
|
-
F: __dxlog_file5,
|
|
1476
|
-
L: 63
|
|
1477
|
-
});
|
|
1478
|
-
this._ctx.onDispose(this._context.swarmEvent.on((data) => this.swarmEvent.emit(data)));
|
|
1479
|
-
await Promise.all([
|
|
1480
|
-
...this._joinedSwarms.values()
|
|
1481
|
-
].map((value) => this.join(value)));
|
|
1482
|
-
}
|
|
1483
|
-
async close() {
|
|
1484
|
-
if (this._ctx.disposed) {
|
|
1485
|
-
return;
|
|
1486
|
-
}
|
|
1487
|
-
const joinedSwarmsCopy = new ComplexSet3(({ topic, peer }) => topic.toHex() + peer.peerKey, [
|
|
1488
|
-
...this._joinedSwarms.values()
|
|
1489
|
-
]);
|
|
1490
|
-
await Promise.all([
|
|
1491
|
-
...this._joinedSwarms.values()
|
|
1492
|
-
].map((value) => this.leave(value)));
|
|
1493
|
-
this._joinedSwarms = joinedSwarmsCopy;
|
|
1494
|
-
await this._ctx.dispose();
|
|
1495
|
-
}
|
|
1496
|
-
getStatus() {
|
|
1497
|
-
return [];
|
|
1498
|
-
}
|
|
1499
|
-
async join({ topic, peer }) {
|
|
1500
|
-
invariant4(!this._ctx.disposed, "Closed", {
|
|
1501
|
-
F: __dxlog_file5,
|
|
1502
|
-
L: 92,
|
|
1503
|
-
S: this,
|
|
1504
|
-
A: [
|
|
1505
|
-
"!this._ctx.disposed",
|
|
1506
|
-
"'Closed'"
|
|
1507
|
-
]
|
|
1508
|
-
});
|
|
1509
|
-
this._joinedSwarms.add({
|
|
1510
|
-
topic,
|
|
1511
|
-
peer
|
|
1512
|
-
});
|
|
1513
|
-
if (!this._context.swarms.has(topic)) {
|
|
1514
|
-
this._context.swarms.set(topic, new ComplexSet3(PeerInfoHash));
|
|
1515
|
-
}
|
|
1516
|
-
this._context.swarms.get(topic).add(peer);
|
|
1517
|
-
this._context.swarmEvent.emit({
|
|
1518
|
-
topic,
|
|
1519
|
-
peerAvailable: {
|
|
1520
|
-
peer,
|
|
1521
|
-
since: /* @__PURE__ */ new Date()
|
|
1522
|
-
}
|
|
1523
|
-
});
|
|
1524
|
-
for (const [topic2, peers] of this._context.swarms) {
|
|
1525
|
-
Array.from(peers).forEach((peer2) => {
|
|
1526
|
-
this.swarmEvent.emit({
|
|
1527
|
-
topic: topic2,
|
|
1528
|
-
peerAvailable: {
|
|
1529
|
-
peer: peer2,
|
|
1530
|
-
since: /* @__PURE__ */ new Date()
|
|
1531
|
-
}
|
|
1532
|
-
});
|
|
1533
|
-
});
|
|
1534
|
-
}
|
|
1535
|
-
}
|
|
1536
|
-
async leave({ topic, peer }) {
|
|
1537
|
-
invariant4(!this._ctx.disposed, "Closed", {
|
|
1538
|
-
F: __dxlog_file5,
|
|
1539
|
-
L: 124,
|
|
1540
|
-
S: this,
|
|
1541
|
-
A: [
|
|
1542
|
-
"!this._ctx.disposed",
|
|
1543
|
-
"'Closed'"
|
|
1544
|
-
]
|
|
1545
|
-
});
|
|
1546
|
-
this._joinedSwarms.delete({
|
|
1547
|
-
topic,
|
|
1548
|
-
peer
|
|
1549
|
-
});
|
|
1550
|
-
if (!this._context.swarms.has(topic)) {
|
|
1551
|
-
this._context.swarms.set(topic, new ComplexSet3(PeerInfoHash));
|
|
1552
|
-
}
|
|
1553
|
-
this._context.swarms.get(topic).delete(peer);
|
|
1554
|
-
const swarmEvent = {
|
|
1555
|
-
topic,
|
|
1556
|
-
peerLeft: {
|
|
1557
|
-
peer
|
|
1558
|
-
}
|
|
1559
|
-
};
|
|
1560
|
-
this._context.swarmEvent.emit(swarmEvent);
|
|
1561
|
-
}
|
|
1562
|
-
async query(request) {
|
|
1563
|
-
throw new Error("Not implemented");
|
|
1564
|
-
}
|
|
1565
|
-
async sendMessage({ author, recipient, payload }) {
|
|
1566
|
-
log5("send message", {
|
|
1567
|
-
author,
|
|
1568
|
-
recipient,
|
|
1569
|
-
...dec(payload)
|
|
1570
|
-
}, {
|
|
1571
|
-
F: __dxlog_file5,
|
|
1572
|
-
L: 157,
|
|
1573
|
-
S: this,
|
|
1574
|
-
C: (f, a) => f(...a)
|
|
1575
|
-
});
|
|
1576
|
-
invariant4(recipient, void 0, {
|
|
1577
|
-
F: __dxlog_file5,
|
|
1578
|
-
L: 159,
|
|
1579
|
-
S: this,
|
|
1580
|
-
A: [
|
|
1581
|
-
"recipient",
|
|
1582
|
-
""
|
|
1583
|
-
]
|
|
1584
|
-
});
|
|
1585
|
-
invariant4(!this._ctx.disposed, "Closed", {
|
|
1586
|
-
F: __dxlog_file5,
|
|
1587
|
-
L: 160,
|
|
1588
|
-
S: this,
|
|
1589
|
-
A: [
|
|
1590
|
-
"!this._ctx.disposed",
|
|
1591
|
-
"'Closed'"
|
|
1592
|
-
]
|
|
1593
|
-
});
|
|
1594
|
-
await this._freezeTrigger.wait();
|
|
1595
|
-
const remote = this._context.connections.get(recipient);
|
|
1596
|
-
if (!remote) {
|
|
1597
|
-
log5.warn("recipient is not subscribed for messages", {
|
|
1598
|
-
author,
|
|
1599
|
-
recipient
|
|
1600
|
-
}, {
|
|
1601
|
-
F: __dxlog_file5,
|
|
1602
|
-
L: 166,
|
|
1603
|
-
S: this,
|
|
1604
|
-
C: (f, a) => f(...a)
|
|
1605
|
-
});
|
|
1606
|
-
return;
|
|
1607
|
-
}
|
|
1608
|
-
if (remote._ctx.disposed) {
|
|
1609
|
-
log5.warn("recipient is disposed", {
|
|
1610
|
-
author,
|
|
1611
|
-
recipient
|
|
1612
|
-
}, {
|
|
1613
|
-
F: __dxlog_file5,
|
|
1614
|
-
L: 171,
|
|
1615
|
-
S: this,
|
|
1616
|
-
C: (f, a) => f(...a)
|
|
1617
|
-
});
|
|
1618
|
-
return;
|
|
1619
|
-
}
|
|
1620
|
-
remote._freezeTrigger.wait().then(() => {
|
|
1621
|
-
if (remote._ctx.disposed) {
|
|
1622
|
-
log5.warn("recipient is disposed", {
|
|
1623
|
-
author,
|
|
1624
|
-
recipient
|
|
1625
|
-
}, {
|
|
1626
|
-
F: __dxlog_file5,
|
|
1627
|
-
L: 179,
|
|
1628
|
-
S: this,
|
|
1629
|
-
C: (f, a) => f(...a)
|
|
1630
|
-
});
|
|
1631
|
-
return;
|
|
1632
|
-
}
|
|
1633
|
-
log5("receive message", {
|
|
1634
|
-
author,
|
|
1635
|
-
recipient,
|
|
1636
|
-
...dec(payload)
|
|
1637
|
-
}, {
|
|
1638
|
-
F: __dxlog_file5,
|
|
1639
|
-
L: 183,
|
|
1640
|
-
S: this,
|
|
1641
|
-
C: (f, a) => f(...a)
|
|
1642
|
-
});
|
|
1643
|
-
remote.onMessage.emit({
|
|
1644
|
-
author,
|
|
1645
|
-
recipient,
|
|
1646
|
-
payload
|
|
1647
|
-
});
|
|
1648
|
-
}).catch((err) => {
|
|
1649
|
-
log5.error("error while waiting for freeze", {
|
|
1650
|
-
err
|
|
1651
|
-
}, {
|
|
1652
|
-
F: __dxlog_file5,
|
|
1653
|
-
L: 188,
|
|
1654
|
-
S: this,
|
|
1655
|
-
C: (f, a) => f(...a)
|
|
1656
|
-
});
|
|
1657
|
-
});
|
|
1658
|
-
}
|
|
1659
|
-
async subscribeMessages(peerInfo) {
|
|
1660
|
-
log5("subscribing", {
|
|
1661
|
-
peerInfo
|
|
1662
|
-
}, {
|
|
1663
|
-
F: __dxlog_file5,
|
|
1664
|
-
L: 193,
|
|
1665
|
-
S: this,
|
|
1666
|
-
C: (f, a) => f(...a)
|
|
1667
|
-
});
|
|
1668
|
-
this._context.connections.set(peerInfo, this);
|
|
1669
|
-
}
|
|
1670
|
-
async unsubscribeMessages(peerInfo) {
|
|
1671
|
-
log5("unsubscribing", {
|
|
1672
|
-
peerInfo
|
|
1673
|
-
}, {
|
|
1674
|
-
F: __dxlog_file5,
|
|
1675
|
-
L: 198,
|
|
1676
|
-
S: this,
|
|
1677
|
-
C: (f, a) => f(...a)
|
|
1678
|
-
});
|
|
1679
|
-
this._context.connections.delete(peerInfo);
|
|
1680
|
-
}
|
|
1681
|
-
freeze() {
|
|
1682
|
-
this._freezeTrigger.reset();
|
|
1683
|
-
}
|
|
1684
|
-
unfreeze() {
|
|
1685
|
-
this._freezeTrigger.wake();
|
|
1686
|
-
}
|
|
1687
|
-
};
|
|
1688
|
-
var dec = (payload) => {
|
|
1689
|
-
if (!payload.type_url.endsWith("ReliablePayload")) {
|
|
1690
|
-
return {};
|
|
1691
|
-
}
|
|
1692
|
-
const relPayload = schema3.getCodecForType("dxos.mesh.messaging.ReliablePayload").decode(payload.value);
|
|
1693
|
-
if (typeof relPayload?.payload?.data === "object") {
|
|
1694
|
-
return {
|
|
1695
|
-
payload: Object.keys(relPayload?.payload?.data)[0],
|
|
1696
|
-
sessionId: relPayload?.payload?.sessionId
|
|
1697
|
-
};
|
|
1698
|
-
}
|
|
1699
|
-
return {};
|
|
1700
|
-
};
|
|
1701
|
-
|
|
1702
1026
|
// src/signal-manager/websocket-signal-manager.ts
|
|
1703
|
-
import { Event as
|
|
1027
|
+
import { Event as Event3, sleep as sleep2, synchronized } from "@dxos/async";
|
|
1704
1028
|
import { LifecycleState, Resource as Resource2 } from "@dxos/context";
|
|
1705
|
-
import { invariant as
|
|
1706
|
-
import { PublicKey as
|
|
1707
|
-
import { log as
|
|
1708
|
-
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";
|
|
1709
1033
|
import { BitField, safeAwaitAll as safeAwaitAll2 } from "@dxos/util";
|
|
1710
1034
|
|
|
1711
1035
|
// src/signal-manager/websocket-signal-manager-monitor.ts
|
|
1712
|
-
import { trace as
|
|
1036
|
+
import { trace as trace5 } from "@dxos/tracing";
|
|
1713
1037
|
var WebsocketSignalManagerMonitor = class {
|
|
1714
1038
|
recordRateLimitExceeded() {
|
|
1715
|
-
|
|
1039
|
+
trace5.metrics.increment("dxos.mesh.signal.signal-manager.rate-limit-hit", 1);
|
|
1716
1040
|
}
|
|
1717
1041
|
recordServerFailure(params) {
|
|
1718
|
-
|
|
1042
|
+
trace5.metrics.increment("dxos.mesh.signal.signal-manager.server-failure", 1, {
|
|
1719
1043
|
tags: {
|
|
1720
1044
|
server: params.serverName,
|
|
1721
1045
|
restarted: params.willRestart
|
|
@@ -1731,7 +1055,7 @@ function _ts_decorate(decorators, target, key, desc) {
|
|
|
1731
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;
|
|
1732
1056
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
1733
1057
|
}
|
|
1734
|
-
var
|
|
1058
|
+
var __dxlog_file4 = "/__w/dxos/dxos/packages/core/mesh/messaging/src/signal-manager/websocket-signal-manager.ts";
|
|
1735
1059
|
var MAX_SERVER_FAILURES = 5;
|
|
1736
1060
|
var WSS_SIGNAL_SERVER_REBOOT_DELAY = 3e3;
|
|
1737
1061
|
var WebsocketSignalManager = class extends Resource2 {
|
|
@@ -1744,17 +1068,17 @@ var WebsocketSignalManager = class extends Resource2 {
|
|
|
1744
1068
|
*/
|
|
1745
1069
|
_failedServersBitfield;
|
|
1746
1070
|
failureCount = /* @__PURE__ */ new Map();
|
|
1747
|
-
statusChanged = new
|
|
1748
|
-
swarmEvent = new
|
|
1749
|
-
onMessage = new
|
|
1750
|
-
_instanceId =
|
|
1071
|
+
statusChanged = new Event3();
|
|
1072
|
+
swarmEvent = new Event3();
|
|
1073
|
+
onMessage = new Event3();
|
|
1074
|
+
_instanceId = PublicKey4.random().toHex();
|
|
1751
1075
|
constructor(_hosts, _getMetadata) {
|
|
1752
1076
|
super(), this._hosts = _hosts, this._getMetadata = _getMetadata;
|
|
1753
|
-
|
|
1077
|
+
log4("Created WebsocketSignalManager", {
|
|
1754
1078
|
hosts: this._hosts
|
|
1755
1079
|
}, {
|
|
1756
|
-
F:
|
|
1757
|
-
L:
|
|
1080
|
+
F: __dxlog_file4,
|
|
1081
|
+
L: 58,
|
|
1758
1082
|
S: this,
|
|
1759
1083
|
C: (f, a) => f(...a)
|
|
1760
1084
|
});
|
|
@@ -1772,28 +1096,28 @@ var WebsocketSignalManager = class extends Resource2 {
|
|
|
1772
1096
|
this._failedServersBitfield = BitField.zeros(this._hosts.length);
|
|
1773
1097
|
}
|
|
1774
1098
|
async _open() {
|
|
1775
|
-
|
|
1099
|
+
log4("open signal manager", {
|
|
1776
1100
|
hosts: this._hosts
|
|
1777
1101
|
}, {
|
|
1778
|
-
F:
|
|
1779
|
-
L:
|
|
1102
|
+
F: __dxlog_file4,
|
|
1103
|
+
L: 78,
|
|
1780
1104
|
S: this,
|
|
1781
1105
|
C: (f, a) => f(...a)
|
|
1782
1106
|
});
|
|
1783
|
-
|
|
1107
|
+
log4.trace("dxos.mesh.websocket-signal-manager.open", trace6.begin({
|
|
1784
1108
|
id: this._instanceId
|
|
1785
1109
|
}), {
|
|
1786
|
-
F:
|
|
1787
|
-
L:
|
|
1110
|
+
F: __dxlog_file4,
|
|
1111
|
+
L: 79,
|
|
1788
1112
|
S: this,
|
|
1789
1113
|
C: (f, a) => f(...a)
|
|
1790
1114
|
});
|
|
1791
1115
|
await safeAwaitAll2(this._servers.values(), (server) => server.open());
|
|
1792
|
-
|
|
1116
|
+
log4.trace("dxos.mesh.websocket-signal-manager.open", trace6.end({
|
|
1793
1117
|
id: this._instanceId
|
|
1794
1118
|
}), {
|
|
1795
|
-
F:
|
|
1796
|
-
L:
|
|
1119
|
+
F: __dxlog_file4,
|
|
1120
|
+
L: 83,
|
|
1797
1121
|
S: this,
|
|
1798
1122
|
C: (f, a) => f(...a)
|
|
1799
1123
|
});
|
|
@@ -1802,17 +1126,17 @@ var WebsocketSignalManager = class extends Resource2 {
|
|
|
1802
1126
|
await safeAwaitAll2(this._servers.values(), (server) => server.close());
|
|
1803
1127
|
}
|
|
1804
1128
|
async restartServer(serverName) {
|
|
1805
|
-
|
|
1129
|
+
log4("restarting server", {
|
|
1806
1130
|
serverName
|
|
1807
1131
|
}, {
|
|
1808
|
-
F:
|
|
1809
|
-
L:
|
|
1132
|
+
F: __dxlog_file4,
|
|
1133
|
+
L: 91,
|
|
1810
1134
|
S: this,
|
|
1811
1135
|
C: (f, a) => f(...a)
|
|
1812
1136
|
});
|
|
1813
|
-
|
|
1814
|
-
F:
|
|
1815
|
-
L:
|
|
1137
|
+
invariant3(this._lifecycleState === LifecycleState.OPEN, void 0, {
|
|
1138
|
+
F: __dxlog_file4,
|
|
1139
|
+
L: 92,
|
|
1816
1140
|
S: this,
|
|
1817
1141
|
A: [
|
|
1818
1142
|
"this._lifecycleState === LifecycleState.OPEN",
|
|
@@ -1820,9 +1144,9 @@ var WebsocketSignalManager = class extends Resource2 {
|
|
|
1820
1144
|
]
|
|
1821
1145
|
});
|
|
1822
1146
|
const server = this._servers.get(serverName);
|
|
1823
|
-
|
|
1824
|
-
F:
|
|
1825
|
-
L:
|
|
1147
|
+
invariant3(server, "server not found", {
|
|
1148
|
+
F: __dxlog_file4,
|
|
1149
|
+
L: 95,
|
|
1826
1150
|
S: this,
|
|
1827
1151
|
A: [
|
|
1828
1152
|
"server",
|
|
@@ -1836,69 +1160,69 @@ var WebsocketSignalManager = class extends Resource2 {
|
|
|
1836
1160
|
getStatus() {
|
|
1837
1161
|
return Array.from(this._servers.values()).map((server) => server.getStatus());
|
|
1838
1162
|
}
|
|
1839
|
-
async join({ topic, peer }) {
|
|
1840
|
-
|
|
1163
|
+
async join(_ctx, { topic, peer }) {
|
|
1164
|
+
log4("join", {
|
|
1841
1165
|
topic,
|
|
1842
1166
|
peer
|
|
1843
1167
|
}, {
|
|
1844
|
-
F:
|
|
1845
|
-
L:
|
|
1168
|
+
F: __dxlog_file4,
|
|
1169
|
+
L: 108,
|
|
1846
1170
|
S: this,
|
|
1847
1171
|
C: (f, a) => f(...a)
|
|
1848
1172
|
});
|
|
1849
|
-
|
|
1850
|
-
F:
|
|
1851
|
-
L:
|
|
1173
|
+
invariant3(this._lifecycleState === LifecycleState.OPEN, void 0, {
|
|
1174
|
+
F: __dxlog_file4,
|
|
1175
|
+
L: 109,
|
|
1852
1176
|
S: this,
|
|
1853
1177
|
A: [
|
|
1854
1178
|
"this._lifecycleState === LifecycleState.OPEN",
|
|
1855
1179
|
""
|
|
1856
1180
|
]
|
|
1857
1181
|
});
|
|
1858
|
-
await this._forEachServer((server) => server.join({
|
|
1182
|
+
await this._forEachServer((server) => server.join(_ctx, {
|
|
1859
1183
|
topic,
|
|
1860
1184
|
peer
|
|
1861
1185
|
}));
|
|
1862
1186
|
}
|
|
1863
|
-
async leave({ topic, peer }) {
|
|
1864
|
-
|
|
1187
|
+
async leave(_ctx, { topic, peer }) {
|
|
1188
|
+
log4("leaving", {
|
|
1865
1189
|
topic,
|
|
1866
1190
|
peer
|
|
1867
1191
|
}, {
|
|
1868
|
-
F:
|
|
1869
|
-
L:
|
|
1192
|
+
F: __dxlog_file4,
|
|
1193
|
+
L: 115,
|
|
1870
1194
|
S: this,
|
|
1871
1195
|
C: (f, a) => f(...a)
|
|
1872
1196
|
});
|
|
1873
|
-
|
|
1874
|
-
F:
|
|
1875
|
-
L:
|
|
1197
|
+
invariant3(this._lifecycleState === LifecycleState.OPEN, void 0, {
|
|
1198
|
+
F: __dxlog_file4,
|
|
1199
|
+
L: 116,
|
|
1876
1200
|
S: this,
|
|
1877
1201
|
A: [
|
|
1878
1202
|
"this._lifecycleState === LifecycleState.OPEN",
|
|
1879
1203
|
""
|
|
1880
1204
|
]
|
|
1881
1205
|
});
|
|
1882
|
-
await this._forEachServer((server) => server.leave({
|
|
1206
|
+
await this._forEachServer((server) => server.leave(_ctx, {
|
|
1883
1207
|
topic,
|
|
1884
1208
|
peer
|
|
1885
1209
|
}));
|
|
1886
1210
|
}
|
|
1887
|
-
async query({ topic }) {
|
|
1211
|
+
async query(_ctx, { topic }) {
|
|
1888
1212
|
throw new Error("Not implemented");
|
|
1889
1213
|
}
|
|
1890
|
-
async sendMessage({ author, recipient, payload }) {
|
|
1891
|
-
|
|
1214
|
+
async sendMessage(_ctx, { author, recipient, payload }) {
|
|
1215
|
+
log4("signal", {
|
|
1892
1216
|
recipient
|
|
1893
1217
|
}, {
|
|
1894
|
-
F:
|
|
1895
|
-
L:
|
|
1218
|
+
F: __dxlog_file4,
|
|
1219
|
+
L: 125,
|
|
1896
1220
|
S: this,
|
|
1897
1221
|
C: (f, a) => f(...a)
|
|
1898
1222
|
});
|
|
1899
|
-
|
|
1900
|
-
F:
|
|
1901
|
-
L:
|
|
1223
|
+
invariant3(this._lifecycleState === LifecycleState.OPEN, void 0, {
|
|
1224
|
+
F: __dxlog_file4,
|
|
1225
|
+
L: 126,
|
|
1902
1226
|
S: this,
|
|
1903
1227
|
A: [
|
|
1904
1228
|
"this._lifecycleState === LifecycleState.OPEN",
|
|
@@ -1906,37 +1230,37 @@ var WebsocketSignalManager = class extends Resource2 {
|
|
|
1906
1230
|
]
|
|
1907
1231
|
});
|
|
1908
1232
|
void this._forEachServer(async (server, serverName, index) => {
|
|
1909
|
-
void server.sendMessage({
|
|
1233
|
+
void server.sendMessage(_ctx, {
|
|
1910
1234
|
author,
|
|
1911
1235
|
recipient,
|
|
1912
1236
|
payload
|
|
1913
1237
|
}).then(() => this._clearServerFailedFlag(serverName, index)).catch((err) => {
|
|
1914
1238
|
if (err instanceof RateLimitExceededError) {
|
|
1915
|
-
|
|
1239
|
+
log4.info("WSS rate limit exceeded", {
|
|
1916
1240
|
err
|
|
1917
1241
|
}, {
|
|
1918
|
-
F:
|
|
1919
|
-
L:
|
|
1242
|
+
F: __dxlog_file4,
|
|
1243
|
+
L: 134,
|
|
1920
1244
|
S: this,
|
|
1921
1245
|
C: (f, a) => f(...a)
|
|
1922
1246
|
});
|
|
1923
1247
|
this._monitor.recordRateLimitExceeded();
|
|
1924
|
-
} else if (err instanceof
|
|
1925
|
-
|
|
1248
|
+
} else if (err instanceof TimeoutError2 || err.constructor.name === "TimeoutError") {
|
|
1249
|
+
log4.info("WSS sendMessage timeout", {
|
|
1926
1250
|
err
|
|
1927
1251
|
}, {
|
|
1928
|
-
F:
|
|
1929
|
-
L:
|
|
1252
|
+
F: __dxlog_file4,
|
|
1253
|
+
L: 137,
|
|
1930
1254
|
S: this,
|
|
1931
1255
|
C: (f, a) => f(...a)
|
|
1932
1256
|
});
|
|
1933
1257
|
void this.checkServerFailure(serverName, index);
|
|
1934
1258
|
} else {
|
|
1935
|
-
|
|
1259
|
+
log4.warn(`error sending to ${serverName}`, {
|
|
1936
1260
|
err
|
|
1937
1261
|
}, {
|
|
1938
|
-
F:
|
|
1939
|
-
L:
|
|
1262
|
+
F: __dxlog_file4,
|
|
1263
|
+
L: 140,
|
|
1940
1264
|
S: this,
|
|
1941
1265
|
C: (f, a) => f(...a)
|
|
1942
1266
|
});
|
|
@@ -1954,12 +1278,12 @@ var WebsocketSignalManager = class extends Resource2 {
|
|
|
1954
1278
|
});
|
|
1955
1279
|
if (isRestartRequired) {
|
|
1956
1280
|
if (!BitField.get(this._failedServersBitfield, index)) {
|
|
1957
|
-
|
|
1281
|
+
log4.warn("too many failures for ws-server, restarting", {
|
|
1958
1282
|
serverName,
|
|
1959
1283
|
failureCount
|
|
1960
1284
|
}, {
|
|
1961
|
-
F:
|
|
1962
|
-
L:
|
|
1285
|
+
F: __dxlog_file4,
|
|
1286
|
+
L: 154,
|
|
1963
1287
|
S: this,
|
|
1964
1288
|
C: (f, a) => f(...a)
|
|
1965
1289
|
});
|
|
@@ -1973,11 +1297,11 @@ var WebsocketSignalManager = class extends Resource2 {
|
|
|
1973
1297
|
}
|
|
1974
1298
|
_clearServerFailedFlag(serverName, index) {
|
|
1975
1299
|
if (BitField.get(this._failedServersBitfield, index)) {
|
|
1976
|
-
|
|
1300
|
+
log4.info("server connection restored", {
|
|
1977
1301
|
serverName
|
|
1978
1302
|
}, {
|
|
1979
|
-
F:
|
|
1980
|
-
L:
|
|
1303
|
+
F: __dxlog_file4,
|
|
1304
|
+
L: 167,
|
|
1981
1305
|
S: this,
|
|
1982
1306
|
C: (f, a) => f(...a)
|
|
1983
1307
|
});
|
|
@@ -1986,17 +1310,17 @@ var WebsocketSignalManager = class extends Resource2 {
|
|
|
1986
1310
|
}
|
|
1987
1311
|
}
|
|
1988
1312
|
async subscribeMessages(peer) {
|
|
1989
|
-
|
|
1313
|
+
log4("subscribed for message stream", {
|
|
1990
1314
|
peer
|
|
1991
1315
|
}, {
|
|
1992
|
-
F:
|
|
1993
|
-
L:
|
|
1316
|
+
F: __dxlog_file4,
|
|
1317
|
+
L: 174,
|
|
1994
1318
|
S: this,
|
|
1995
1319
|
C: (f, a) => f(...a)
|
|
1996
1320
|
});
|
|
1997
|
-
|
|
1998
|
-
F:
|
|
1999
|
-
L:
|
|
1321
|
+
invariant3(this._lifecycleState === LifecycleState.OPEN, void 0, {
|
|
1322
|
+
F: __dxlog_file4,
|
|
1323
|
+
L: 175,
|
|
2000
1324
|
S: this,
|
|
2001
1325
|
A: [
|
|
2002
1326
|
"this._lifecycleState === LifecycleState.OPEN",
|
|
@@ -2006,17 +1330,17 @@ var WebsocketSignalManager = class extends Resource2 {
|
|
|
2006
1330
|
await this._forEachServer(async (server) => server.subscribeMessages(peer));
|
|
2007
1331
|
}
|
|
2008
1332
|
async unsubscribeMessages(peer) {
|
|
2009
|
-
|
|
1333
|
+
log4("subscribed for message stream", {
|
|
2010
1334
|
peer
|
|
2011
1335
|
}, {
|
|
2012
|
-
F:
|
|
2013
|
-
L:
|
|
1336
|
+
F: __dxlog_file4,
|
|
1337
|
+
L: 181,
|
|
2014
1338
|
S: this,
|
|
2015
1339
|
C: (f, a) => f(...a)
|
|
2016
1340
|
});
|
|
2017
|
-
|
|
2018
|
-
F:
|
|
2019
|
-
L:
|
|
1341
|
+
invariant3(this._lifecycleState === LifecycleState.OPEN, void 0, {
|
|
1342
|
+
F: __dxlog_file4,
|
|
1343
|
+
L: 182,
|
|
2020
1344
|
S: this,
|
|
2021
1345
|
A: [
|
|
2022
1346
|
"this._lifecycleState === LifecycleState.OPEN",
|
|
@@ -2040,29 +1364,29 @@ _ts_decorate([
|
|
|
2040
1364
|
], WebsocketSignalManager.prototype, "checkServerFailure", null);
|
|
2041
1365
|
|
|
2042
1366
|
// src/signal-manager/edge-signal-manager.ts
|
|
2043
|
-
import { Event as
|
|
1367
|
+
import { Event as Event4, scheduleMicroTask } from "@dxos/async";
|
|
2044
1368
|
import { Resource as Resource3, cancelWithContext as cancelWithContext3 } from "@dxos/context";
|
|
2045
1369
|
import { EdgeIdentityChangedError, protocol } from "@dxos/edge-client";
|
|
2046
|
-
import { invariant as
|
|
2047
|
-
import { PublicKey as
|
|
2048
|
-
import { log as
|
|
1370
|
+
import { invariant as invariant4 } from "@dxos/invariant";
|
|
1371
|
+
import { PublicKey as PublicKey5 } from "@dxos/keys";
|
|
1372
|
+
import { log as log5 } from "@dxos/log";
|
|
2049
1373
|
import { EdgeService } from "@dxos/protocols";
|
|
2050
1374
|
import { bufWkt } from "@dxos/protocols/buf";
|
|
2051
1375
|
import { SwarmRequest_Action as SwarmRequestAction, SwarmRequestSchema, SwarmResponseSchema } from "@dxos/protocols/buf/dxos/edge/messenger_pb";
|
|
2052
|
-
import { ComplexMap as
|
|
2053
|
-
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";
|
|
2054
1378
|
var EdgeSignalManager = class extends Resource3 {
|
|
2055
1379
|
/**
|
|
2056
1380
|
* @deprecated
|
|
2057
1381
|
*/
|
|
2058
|
-
swarmEvent = new
|
|
2059
|
-
swarmState = new
|
|
2060
|
-
onMessage = new
|
|
1382
|
+
swarmEvent = new Event4();
|
|
1383
|
+
swarmState = new Event4();
|
|
1384
|
+
onMessage = new Event4();
|
|
2061
1385
|
/**
|
|
2062
1386
|
* Swarm key -> { peer: <own state payload>, joinedPeers: <state of swarm> }.
|
|
2063
1387
|
*/
|
|
2064
1388
|
// TODO(mykola): This class should not contain swarm state joinedPeers. Temporary before network-manager API changes to accept list of peers.
|
|
2065
|
-
_swarmPeers = new
|
|
1389
|
+
_swarmPeers = new ComplexMap2(PublicKey5.hash);
|
|
2066
1390
|
_edgeConnection;
|
|
2067
1391
|
constructor({ edgeConnection }) {
|
|
2068
1392
|
super();
|
|
@@ -2077,17 +1401,17 @@ var EdgeSignalManager = class extends Resource3 {
|
|
|
2077
1401
|
/**
|
|
2078
1402
|
* Warning: PeerInfo is inferred from edgeConnection.
|
|
2079
1403
|
*/
|
|
2080
|
-
async join({ topic, peer }) {
|
|
1404
|
+
async join(ctx, { topic, peer }) {
|
|
2081
1405
|
if (!this._matchSelfPeerInfo(peer)) {
|
|
2082
|
-
|
|
1406
|
+
log5.warn("ignoring peer info on join request", {
|
|
2083
1407
|
peer,
|
|
2084
1408
|
expected: {
|
|
2085
1409
|
peerKey: this._edgeConnection.peerKey,
|
|
2086
1410
|
identityKey: this._edgeConnection.identityKey
|
|
2087
1411
|
}
|
|
2088
1412
|
}, {
|
|
2089
|
-
F:
|
|
2090
|
-
L:
|
|
1413
|
+
F: __dxlog_file5,
|
|
1414
|
+
L: 65,
|
|
2091
1415
|
S: this,
|
|
2092
1416
|
C: (f, a) => f(...a)
|
|
2093
1417
|
});
|
|
@@ -2096,9 +1420,9 @@ var EdgeSignalManager = class extends Resource3 {
|
|
|
2096
1420
|
}
|
|
2097
1421
|
this._swarmPeers.set(topic, {
|
|
2098
1422
|
lastState: peer.state,
|
|
2099
|
-
joinedPeers: new
|
|
1423
|
+
joinedPeers: new ComplexSet2(PeerInfoHash)
|
|
2100
1424
|
});
|
|
2101
|
-
await this._edgeConnection.send(protocol.createMessage(SwarmRequestSchema, {
|
|
1425
|
+
await this._edgeConnection.send(ctx, protocol.createMessage(SwarmRequestSchema, {
|
|
2102
1426
|
serviceId: EdgeService.SWARM,
|
|
2103
1427
|
source: createMessageSource(topic, peer),
|
|
2104
1428
|
payload: {
|
|
@@ -2109,10 +1433,10 @@ var EdgeSignalManager = class extends Resource3 {
|
|
|
2109
1433
|
}
|
|
2110
1434
|
}));
|
|
2111
1435
|
}
|
|
2112
|
-
async leave({ topic, peer }) {
|
|
1436
|
+
async leave(ctx, { topic, peer }) {
|
|
2113
1437
|
this._swarmPeers.delete(topic);
|
|
2114
1438
|
try {
|
|
2115
|
-
await this._edgeConnection.send(protocol.createMessage(SwarmRequestSchema, {
|
|
1439
|
+
await this._edgeConnection.send(ctx, protocol.createMessage(SwarmRequestSchema, {
|
|
2116
1440
|
serviceId: EdgeService.SWARM,
|
|
2117
1441
|
source: createMessageSource(topic, peer),
|
|
2118
1442
|
payload: {
|
|
@@ -2129,9 +1453,9 @@ var EdgeSignalManager = class extends Resource3 {
|
|
|
2129
1453
|
throw err;
|
|
2130
1454
|
}
|
|
2131
1455
|
}
|
|
2132
|
-
async query({ topic }) {
|
|
1456
|
+
async query(ctx, { topic }) {
|
|
2133
1457
|
const response = cancelWithContext3(this._ctx, this.swarmState.waitFor((state) => state.swarmKey === topic.toHex()));
|
|
2134
|
-
await this._edgeConnection.send(protocol.createMessage(SwarmRequestSchema, {
|
|
1458
|
+
await this._edgeConnection.send(ctx, protocol.createMessage(SwarmRequestSchema, {
|
|
2135
1459
|
serviceId: EdgeService.SWARM,
|
|
2136
1460
|
source: createMessageSource(topic, {
|
|
2137
1461
|
peerKey: this._edgeConnection.peerKey,
|
|
@@ -2146,22 +1470,22 @@ var EdgeSignalManager = class extends Resource3 {
|
|
|
2146
1470
|
}));
|
|
2147
1471
|
return response;
|
|
2148
1472
|
}
|
|
2149
|
-
async sendMessage(message) {
|
|
1473
|
+
async sendMessage(ctx, message) {
|
|
2150
1474
|
if (!this._matchSelfPeerInfo(message.author)) {
|
|
2151
|
-
|
|
1475
|
+
log5.warn("ignoring author on send request", {
|
|
2152
1476
|
author: message.author,
|
|
2153
1477
|
expected: {
|
|
2154
1478
|
peerKey: this._edgeConnection.peerKey,
|
|
2155
1479
|
identityKey: this._edgeConnection.identityKey
|
|
2156
1480
|
}
|
|
2157
1481
|
}, {
|
|
2158
|
-
F:
|
|
2159
|
-
L:
|
|
1482
|
+
F: __dxlog_file5,
|
|
1483
|
+
L: 133,
|
|
2160
1484
|
S: this,
|
|
2161
1485
|
C: (f, a) => f(...a)
|
|
2162
1486
|
});
|
|
2163
1487
|
}
|
|
2164
|
-
await this._edgeConnection.send(protocol.createMessage(bufWkt.AnySchema, {
|
|
1488
|
+
await this._edgeConnection.send(ctx, protocol.createMessage(bufWkt.AnySchema, {
|
|
2165
1489
|
serviceId: EdgeService.SIGNAL,
|
|
2166
1490
|
source: message.author,
|
|
2167
1491
|
target: [
|
|
@@ -2189,9 +1513,9 @@ var EdgeSignalManager = class extends Resource3 {
|
|
|
2189
1513
|
}
|
|
2190
1514
|
}
|
|
2191
1515
|
_processSwarmResponse(message) {
|
|
2192
|
-
|
|
2193
|
-
F:
|
|
2194
|
-
L:
|
|
1516
|
+
invariant4(protocol.getPayloadType(message) === SwarmResponseSchema.typeName, "Wrong payload type", {
|
|
1517
|
+
F: __dxlog_file5,
|
|
1518
|
+
L: 171,
|
|
2195
1519
|
S: this,
|
|
2196
1520
|
A: [
|
|
2197
1521
|
"protocol.getPayloadType(message) === SwarmResponseSchema.typeName",
|
|
@@ -2200,13 +1524,13 @@ var EdgeSignalManager = class extends Resource3 {
|
|
|
2200
1524
|
});
|
|
2201
1525
|
const payload = protocol.getPayload(message, SwarmResponseSchema);
|
|
2202
1526
|
this.swarmState.emit(payload);
|
|
2203
|
-
const topic =
|
|
1527
|
+
const topic = PublicKey5.from(payload.swarmKey);
|
|
2204
1528
|
if (!this._swarmPeers.has(topic)) {
|
|
2205
1529
|
return;
|
|
2206
1530
|
}
|
|
2207
1531
|
const { joinedPeers: oldPeers } = this._swarmPeers.get(topic);
|
|
2208
1532
|
const timestamp = message.timestamp ? new Date(Date.parse(message.timestamp)) : /* @__PURE__ */ new Date();
|
|
2209
|
-
const newPeers = new
|
|
1533
|
+
const newPeers = new ComplexSet2(PeerInfoHash, payload.peers);
|
|
2210
1534
|
for (const peer of newPeers) {
|
|
2211
1535
|
if (oldPeers.has(peer)) {
|
|
2212
1536
|
continue;
|
|
@@ -2233,9 +1557,9 @@ var EdgeSignalManager = class extends Resource3 {
|
|
|
2233
1557
|
this._swarmPeers.get(topic).joinedPeers = newPeers;
|
|
2234
1558
|
}
|
|
2235
1559
|
_processMessage(message) {
|
|
2236
|
-
|
|
2237
|
-
F:
|
|
2238
|
-
L:
|
|
1560
|
+
invariant4(protocol.getPayloadType(message) === bufWkt.AnySchema.typeName, "Wrong payload type", {
|
|
1561
|
+
F: __dxlog_file5,
|
|
1562
|
+
L: 209,
|
|
2239
1563
|
S: this,
|
|
2240
1564
|
A: [
|
|
2241
1565
|
"protocol.getPayloadType(message) === bufWkt.AnySchema.typeName",
|
|
@@ -2243,27 +1567,27 @@ var EdgeSignalManager = class extends Resource3 {
|
|
|
2243
1567
|
]
|
|
2244
1568
|
});
|
|
2245
1569
|
const payload = protocol.getPayload(message, bufWkt.AnySchema);
|
|
2246
|
-
|
|
2247
|
-
F:
|
|
2248
|
-
L:
|
|
1570
|
+
invariant4(message.source, "source is missing", {
|
|
1571
|
+
F: __dxlog_file5,
|
|
1572
|
+
L: 211,
|
|
2249
1573
|
S: this,
|
|
2250
1574
|
A: [
|
|
2251
1575
|
"message.source",
|
|
2252
1576
|
"'source is missing'"
|
|
2253
1577
|
]
|
|
2254
1578
|
});
|
|
2255
|
-
|
|
2256
|
-
F:
|
|
2257
|
-
L:
|
|
1579
|
+
invariant4(message.target, "target is missing", {
|
|
1580
|
+
F: __dxlog_file5,
|
|
1581
|
+
L: 212,
|
|
2258
1582
|
S: this,
|
|
2259
1583
|
A: [
|
|
2260
1584
|
"message.target",
|
|
2261
1585
|
"'target is missing'"
|
|
2262
1586
|
]
|
|
2263
1587
|
});
|
|
2264
|
-
|
|
2265
|
-
F:
|
|
2266
|
-
L:
|
|
1588
|
+
invariant4(message.target.length === 1, "target should have exactly one item", {
|
|
1589
|
+
F: __dxlog_file5,
|
|
1590
|
+
L: 213,
|
|
2267
1591
|
S: this,
|
|
2268
1592
|
A: [
|
|
2269
1593
|
"message.target.length === 1",
|
|
@@ -2283,16 +1607,16 @@ var EdgeSignalManager = class extends Resource3 {
|
|
|
2283
1607
|
return peer && (peer.peerKey === this._edgeConnection.peerKey || peer.identityKey === this._edgeConnection.identityKey);
|
|
2284
1608
|
}
|
|
2285
1609
|
async _rejoinAllSwarms() {
|
|
2286
|
-
|
|
1610
|
+
log5("rejoin swarms", {
|
|
2287
1611
|
swarms: Array.from(this._swarmPeers.keys())
|
|
2288
1612
|
}, {
|
|
2289
|
-
F:
|
|
2290
|
-
L:
|
|
1613
|
+
F: __dxlog_file5,
|
|
1614
|
+
L: 232,
|
|
2291
1615
|
S: this,
|
|
2292
1616
|
C: (f, a) => f(...a)
|
|
2293
1617
|
});
|
|
2294
1618
|
for (const [topic, { lastState }] of this._swarmPeers.entries()) {
|
|
2295
|
-
await this.join({
|
|
1619
|
+
await this.join(this._ctx, {
|
|
2296
1620
|
topic,
|
|
2297
1621
|
peer: {
|
|
2298
1622
|
peerKey: this._edgeConnection.peerKey,
|
|
@@ -2311,17 +1635,17 @@ var createMessageSource = (topic, peerInfo) => {
|
|
|
2311
1635
|
};
|
|
2312
1636
|
|
|
2313
1637
|
// src/signal-manager/utils.ts
|
|
2314
|
-
import { invariant as
|
|
2315
|
-
import { log as
|
|
1638
|
+
import { invariant as invariant5 } from "@dxos/invariant";
|
|
1639
|
+
import { log as log6 } from "@dxos/log";
|
|
2316
1640
|
import { DeviceKind } from "@dxos/protocols/proto/dxos/client/services";
|
|
2317
|
-
var
|
|
1641
|
+
var __dxlog_file6 = "/__w/dxos/dxos/packages/core/mesh/messaging/src/signal-manager/utils.ts";
|
|
2318
1642
|
var setIdentityTags = ({ identityService, devicesService, setTag }) => {
|
|
2319
1643
|
identityService.queryIdentity().subscribe((idqr) => {
|
|
2320
1644
|
if (!idqr?.identity?.identityKey) {
|
|
2321
|
-
|
|
1645
|
+
log6("empty response from identity service", {
|
|
2322
1646
|
idqr
|
|
2323
1647
|
}, {
|
|
2324
|
-
F:
|
|
1648
|
+
F: __dxlog_file6,
|
|
2325
1649
|
L: 21,
|
|
2326
1650
|
S: void 0,
|
|
2327
1651
|
C: (f, a) => f(...a)
|
|
@@ -2332,18 +1656,18 @@ var setIdentityTags = ({ identityService, devicesService, setTag }) => {
|
|
|
2332
1656
|
});
|
|
2333
1657
|
devicesService.queryDevices().subscribe((dqr) => {
|
|
2334
1658
|
if (!dqr || !dqr.devices || dqr.devices.length === 0) {
|
|
2335
|
-
|
|
1659
|
+
log6("empty response from device service", {
|
|
2336
1660
|
device: dqr
|
|
2337
1661
|
}, {
|
|
2338
|
-
F:
|
|
1662
|
+
F: __dxlog_file6,
|
|
2339
1663
|
L: 30,
|
|
2340
1664
|
S: void 0,
|
|
2341
1665
|
C: (f, a) => f(...a)
|
|
2342
1666
|
});
|
|
2343
1667
|
return;
|
|
2344
1668
|
}
|
|
2345
|
-
|
|
2346
|
-
F:
|
|
1669
|
+
invariant5(dqr, "empty response from device service", {
|
|
1670
|
+
F: __dxlog_file6,
|
|
2347
1671
|
L: 33,
|
|
2348
1672
|
S: void 0,
|
|
2349
1673
|
A: [
|
|
@@ -2353,10 +1677,10 @@ var setIdentityTags = ({ identityService, devicesService, setTag }) => {
|
|
|
2353
1677
|
});
|
|
2354
1678
|
const thisDevice = dqr.devices.find((device) => device.kind === DeviceKind.CURRENT);
|
|
2355
1679
|
if (!thisDevice) {
|
|
2356
|
-
|
|
1680
|
+
log6("no current device", {
|
|
2357
1681
|
device: dqr
|
|
2358
1682
|
}, {
|
|
2359
|
-
F:
|
|
1683
|
+
F: __dxlog_file6,
|
|
2360
1684
|
L: 37,
|
|
2361
1685
|
S: void 0,
|
|
2362
1686
|
C: (f, a) => f(...a)
|
|
@@ -2366,15 +1690,14 @@ var setIdentityTags = ({ identityService, devicesService, setTag }) => {
|
|
|
2366
1690
|
setTag("deviceKey", thisDevice.deviceKey.truncate());
|
|
2367
1691
|
});
|
|
2368
1692
|
};
|
|
2369
|
-
|
|
2370
1693
|
export {
|
|
1694
|
+
EdgeSignalManager,
|
|
1695
|
+
MemorySignalManager,
|
|
1696
|
+
MemorySignalManagerContext,
|
|
2371
1697
|
Messenger,
|
|
2372
|
-
SignalClient,
|
|
2373
1698
|
PeerInfoHash,
|
|
2374
|
-
|
|
2375
|
-
MemorySignalManager,
|
|
1699
|
+
SignalClient,
|
|
2376
1700
|
WebsocketSignalManager,
|
|
2377
|
-
EdgeSignalManager,
|
|
2378
1701
|
setIdentityTags
|
|
2379
1702
|
};
|
|
2380
|
-
//# sourceMappingURL=
|
|
1703
|
+
//# sourceMappingURL=index.mjs.map
|