@dxos/edge-client 0.6.12-main.15a606f → 0.6.12-main.78ddbdf
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/browser/chunk-ZWJXA37R.mjs +113 -0
- package/dist/lib/browser/chunk-ZWJXA37R.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +57 -157
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +122 -0
- package/dist/lib/browser/testing/index.mjs.map +7 -0
- package/dist/lib/node/chunk-ANV2HBEH.cjs +136 -0
- package/dist/lib/node/chunk-ANV2HBEH.cjs.map +7 -0
- package/dist/lib/node/index.cjs +56 -154
- package/dist/lib/node/index.cjs.map +4 -4
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/testing/index.cjs +152 -0
- package/dist/lib/node/testing/index.cjs.map +7 -0
- package/dist/lib/node-esm/chunk-HNVT57AU.mjs +115 -0
- package/dist/lib/node-esm/chunk-HNVT57AU.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +56 -157
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/testing/index.mjs +123 -0
- package/dist/lib/node-esm/testing/index.mjs.map +7 -0
- package/dist/types/src/defs.d.ts.map +1 -1
- package/dist/types/src/edge-client.d.ts +3 -2
- package/dist/types/src/edge-client.d.ts.map +1 -1
- package/dist/types/src/errors.d.ts +4 -1
- package/dist/types/src/errors.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +1 -0
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/protocol.d.ts +2 -2
- package/dist/types/src/protocol.d.ts.map +1 -1
- package/dist/types/src/testing/index.d.ts +2 -0
- package/dist/types/src/testing/index.d.ts.map +1 -0
- package/dist/types/src/testing/test-utils.d.ts +20 -0
- package/dist/types/src/testing/test-utils.d.ts.map +1 -0
- package/package.json +24 -13
- package/src/defs.ts +2 -3
- package/src/edge-client.test.ts +8 -5
- package/src/edge-client.ts +17 -8
- package/src/errors.ts +8 -2
- package/src/index.ts +1 -0
- package/src/protocol.ts +2 -2
- package/src/testing/index.ts +5 -0
- package/src/testing/test-utils.ts +111 -0
- package/src/websocket.test.ts +6 -5
- package/dist/types/src/test-utils.d.ts +0 -11
- package/dist/types/src/test-utils.d.ts.map +0 -1
- package/src/test-utils.ts +0 -49
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
|
|
2
|
+
import {
|
|
3
|
+
Protocol,
|
|
4
|
+
getTypename,
|
|
5
|
+
protocol,
|
|
6
|
+
toUint8Array
|
|
7
|
+
} from "./chunk-HNVT57AU.mjs";
|
|
2
8
|
|
|
3
9
|
// packages/core/mesh/edge-client/src/index.ts
|
|
4
10
|
export * from "@dxos/protocols/buf/dxos/edge/messenger_pb";
|
|
@@ -7,123 +13,19 @@ export * from "@dxos/protocols/buf/dxos/edge/messenger_pb";
|
|
|
7
13
|
import WebSocket from "isomorphic-ws";
|
|
8
14
|
import { Trigger, Event, scheduleTaskInterval, scheduleTask, TriggerState } from "@dxos/async";
|
|
9
15
|
import { Context, LifecycleState as LifecycleState2, Resource as Resource2 } from "@dxos/context";
|
|
10
|
-
import { invariant as invariant2 } from "@dxos/invariant";
|
|
11
16
|
import { log as log2 } from "@dxos/log";
|
|
12
|
-
import { buf
|
|
13
|
-
import { MessageSchema as MessageSchema2 } from "@dxos/protocols/buf/dxos/edge/messenger_pb";
|
|
14
|
-
|
|
15
|
-
// packages/core/mesh/edge-client/src/defs.ts
|
|
16
|
-
import { AnySchema } from "@bufbuild/protobuf/wkt";
|
|
17
|
-
import { SwarmRequestSchema, SwarmResponseSchema, TextMessageSchema } from "@dxos/protocols/buf/dxos/edge/messenger_pb";
|
|
18
|
-
|
|
19
|
-
// packages/core/mesh/edge-client/src/protocol.ts
|
|
20
|
-
import { invariant } from "@dxos/invariant";
|
|
21
|
-
import { buf, bufWkt } from "@dxos/protocols/buf";
|
|
17
|
+
import { buf } from "@dxos/protocols/buf";
|
|
22
18
|
import { MessageSchema } from "@dxos/protocols/buf/dxos/edge/messenger_pb";
|
|
23
|
-
import { bufferToArray } from "@dxos/util";
|
|
24
|
-
var __dxlog_file = "/home/runner/work/dxos/dxos/packages/core/mesh/edge-client/src/protocol.ts";
|
|
25
|
-
var getTypename = (typeName) => `type.googleapis.com/${typeName}`;
|
|
26
|
-
var Protocol = class {
|
|
27
|
-
constructor(types) {
|
|
28
|
-
this._typeRegistry = buf.createRegistry(...types);
|
|
29
|
-
}
|
|
30
|
-
get typeRegistry() {
|
|
31
|
-
return this._typeRegistry;
|
|
32
|
-
}
|
|
33
|
-
toJson(message) {
|
|
34
|
-
try {
|
|
35
|
-
return buf.toJson(MessageSchema, message, {
|
|
36
|
-
registry: this.typeRegistry
|
|
37
|
-
});
|
|
38
|
-
} catch (err) {
|
|
39
|
-
return {
|
|
40
|
-
type: this.getPayloadType(message)
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Return the payload with the given type.
|
|
46
|
-
*/
|
|
47
|
-
getPayload(message, type) {
|
|
48
|
-
invariant(message.payload, void 0, {
|
|
49
|
-
F: __dxlog_file,
|
|
50
|
-
L: 40,
|
|
51
|
-
S: this,
|
|
52
|
-
A: [
|
|
53
|
-
"message.payload",
|
|
54
|
-
""
|
|
55
|
-
]
|
|
56
|
-
});
|
|
57
|
-
const payloadTypename = this.getPayloadType(message);
|
|
58
|
-
if (type && type.typeName !== payloadTypename) {
|
|
59
|
-
throw new Error(`Unexpected payload type: ${payloadTypename}; expected ${type.typeName}`);
|
|
60
|
-
}
|
|
61
|
-
invariant(bufWkt.anyIs(message.payload, type), `Unexpected payload type: ${payloadTypename}}`, {
|
|
62
|
-
F: __dxlog_file,
|
|
63
|
-
L: 46,
|
|
64
|
-
S: this,
|
|
65
|
-
A: [
|
|
66
|
-
"bufWkt.anyIs(message.payload, type)",
|
|
67
|
-
"`Unexpected payload type: ${payloadTypename}}`"
|
|
68
|
-
]
|
|
69
|
-
});
|
|
70
|
-
const payload = bufWkt.anyUnpack(message.payload, this.typeRegistry);
|
|
71
|
-
invariant(payload, `Empty payload: ${payloadTypename}}`, {
|
|
72
|
-
F: __dxlog_file,
|
|
73
|
-
L: 48,
|
|
74
|
-
S: this,
|
|
75
|
-
A: [
|
|
76
|
-
"payload",
|
|
77
|
-
"`Empty payload: ${payloadTypename}}`"
|
|
78
|
-
]
|
|
79
|
-
});
|
|
80
|
-
return payload;
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Get the payload type.
|
|
84
|
-
*/
|
|
85
|
-
getPayloadType(message) {
|
|
86
|
-
if (!message.payload) {
|
|
87
|
-
return void 0;
|
|
88
|
-
}
|
|
89
|
-
const [, type] = message.payload.typeUrl.split("/");
|
|
90
|
-
return type;
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* Create a packed message.
|
|
94
|
-
*/
|
|
95
|
-
createMessage(type, { source, target, payload, serviceId }) {
|
|
96
|
-
return buf.create(MessageSchema, {
|
|
97
|
-
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
98
|
-
source,
|
|
99
|
-
target,
|
|
100
|
-
serviceId,
|
|
101
|
-
payload: payload ? bufWkt.anyPack(type, buf.create(type, payload)) : void 0
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
};
|
|
105
|
-
var toUint8Array = async (data) => {
|
|
106
|
-
if (data instanceof Buffer) {
|
|
107
|
-
return bufferToArray(data);
|
|
108
|
-
}
|
|
109
|
-
if (data instanceof Blob) {
|
|
110
|
-
return new Uint8Array(await data.arrayBuffer());
|
|
111
|
-
}
|
|
112
|
-
throw new Error(`Unexpected datatype: ${data}`);
|
|
113
|
-
};
|
|
114
|
-
|
|
115
|
-
// packages/core/mesh/edge-client/src/defs.ts
|
|
116
|
-
var protocol = new Protocol([
|
|
117
|
-
SwarmRequestSchema,
|
|
118
|
-
SwarmResponseSchema,
|
|
119
|
-
TextMessageSchema,
|
|
120
|
-
AnySchema
|
|
121
|
-
]);
|
|
122
19
|
|
|
123
20
|
// packages/core/mesh/edge-client/src/errors.ts
|
|
124
|
-
var
|
|
21
|
+
var EdgeConnectionClosedError = class extends Error {
|
|
22
|
+
constructor() {
|
|
23
|
+
super("Edge connection closed.");
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
var EdgeIdentityChangedError = class extends Error {
|
|
125
27
|
constructor() {
|
|
126
|
-
super("
|
|
28
|
+
super("Edge identity changed.");
|
|
127
29
|
}
|
|
128
30
|
};
|
|
129
31
|
|
|
@@ -138,7 +40,7 @@ function _ts_decorate(decorators, target, key, desc) {
|
|
|
138
40
|
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;
|
|
139
41
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
140
42
|
}
|
|
141
|
-
var
|
|
43
|
+
var __dxlog_file = "/home/runner/work/dxos/dxos/packages/core/mesh/edge-client/src/persistent-lifecycle.ts";
|
|
142
44
|
var INIT_RESTART_DELAY = 100;
|
|
143
45
|
var DEFAULT_MAX_RESTART_DELAY = 5e3;
|
|
144
46
|
var PersistentLifecycle = class extends Resource {
|
|
@@ -159,7 +61,7 @@ var PersistentLifecycle = class extends Resource {
|
|
|
159
61
|
log.warn("Restart failed", {
|
|
160
62
|
err
|
|
161
63
|
}, {
|
|
162
|
-
F:
|
|
64
|
+
F: __dxlog_file,
|
|
163
65
|
L: 64,
|
|
164
66
|
S: this,
|
|
165
67
|
C: (f, a) => f(...a)
|
|
@@ -171,7 +73,7 @@ var PersistentLifecycle = class extends Resource {
|
|
|
171
73
|
log.warn("Start failed", {
|
|
172
74
|
err
|
|
173
75
|
}, {
|
|
174
|
-
F:
|
|
76
|
+
F: __dxlog_file,
|
|
175
77
|
L: 69,
|
|
176
78
|
S: this,
|
|
177
79
|
C: (f, a) => f(...a)
|
|
@@ -188,7 +90,7 @@ var PersistentLifecycle = class extends Resource {
|
|
|
188
90
|
log(`restarting in ${this._restartAfter}ms`, {
|
|
189
91
|
state: this._lifecycleState
|
|
190
92
|
}, {
|
|
191
|
-
F:
|
|
93
|
+
F: __dxlog_file,
|
|
192
94
|
L: 81,
|
|
193
95
|
S: this,
|
|
194
96
|
C: (f, a) => f(...a)
|
|
@@ -221,7 +123,7 @@ _ts_decorate([
|
|
|
221
123
|
], PersistentLifecycle.prototype, "scheduleRestart", null);
|
|
222
124
|
|
|
223
125
|
// packages/core/mesh/edge-client/src/edge-client.ts
|
|
224
|
-
var
|
|
126
|
+
var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/core/mesh/edge-client/src/edge-client.ts";
|
|
225
127
|
var DEFAULT_TIMEOUT = 1e4;
|
|
226
128
|
var SIGNAL_KEEPALIVE_INTERVAL = 5e3;
|
|
227
129
|
var EdgeClient = class extends Resource2 {
|
|
@@ -231,6 +133,7 @@ var EdgeClient = class extends Resource2 {
|
|
|
231
133
|
this._peerKey = _peerKey;
|
|
232
134
|
this._config = _config;
|
|
233
135
|
this.reconnect = new Event();
|
|
136
|
+
this.connected = new Event();
|
|
234
137
|
this._persistentLifecycle = new PersistentLifecycle({
|
|
235
138
|
start: async () => this._openWebSocket(),
|
|
236
139
|
stop: async () => this._closeWebSocket(),
|
|
@@ -241,7 +144,6 @@ var EdgeClient = class extends Resource2 {
|
|
|
241
144
|
this._ws = void 0;
|
|
242
145
|
this._keepaliveCtx = void 0;
|
|
243
146
|
this._heartBeatContext = void 0;
|
|
244
|
-
this._protocol = this._config.protocol ?? protocol;
|
|
245
147
|
}
|
|
246
148
|
// TODO(burdon): Attach logging.
|
|
247
149
|
get info() {
|
|
@@ -273,8 +175,8 @@ var EdgeClient = class extends Resource2 {
|
|
|
273
175
|
log2("opening...", {
|
|
274
176
|
info: this.info
|
|
275
177
|
}, {
|
|
276
|
-
F:
|
|
277
|
-
L:
|
|
178
|
+
F: __dxlog_file2,
|
|
179
|
+
L: 100,
|
|
278
180
|
S: this,
|
|
279
181
|
C: (f, a) => f(...a)
|
|
280
182
|
});
|
|
@@ -282,8 +184,8 @@ var EdgeClient = class extends Resource2 {
|
|
|
282
184
|
log2.warn("Error while opening connection", {
|
|
283
185
|
err
|
|
284
186
|
}, {
|
|
285
|
-
F:
|
|
286
|
-
L:
|
|
187
|
+
F: __dxlog_file2,
|
|
188
|
+
L: 102,
|
|
287
189
|
S: this,
|
|
288
190
|
C: (f, a) => f(...a)
|
|
289
191
|
});
|
|
@@ -296,8 +198,8 @@ var EdgeClient = class extends Resource2 {
|
|
|
296
198
|
log2("closing...", {
|
|
297
199
|
peerKey: this._peerKey
|
|
298
200
|
}, {
|
|
299
|
-
F:
|
|
300
|
-
L:
|
|
201
|
+
F: __dxlog_file2,
|
|
202
|
+
L: 110,
|
|
301
203
|
S: this,
|
|
302
204
|
C: (f, a) => f(...a)
|
|
303
205
|
});
|
|
@@ -308,16 +210,17 @@ var EdgeClient = class extends Resource2 {
|
|
|
308
210
|
this._ws = new WebSocket(url);
|
|
309
211
|
this._ws.onopen = () => {
|
|
310
212
|
log2("opened", this.info, {
|
|
311
|
-
F:
|
|
312
|
-
L:
|
|
213
|
+
F: __dxlog_file2,
|
|
214
|
+
L: 119,
|
|
313
215
|
S: this,
|
|
314
216
|
C: (f, a) => f(...a)
|
|
315
217
|
});
|
|
316
218
|
this._ready.wake();
|
|
219
|
+
this.connected.emit();
|
|
317
220
|
};
|
|
318
221
|
this._ws.onclose = () => {
|
|
319
222
|
log2("closed", this.info, {
|
|
320
|
-
F:
|
|
223
|
+
F: __dxlog_file2,
|
|
321
224
|
L: 124,
|
|
322
225
|
S: this,
|
|
323
226
|
C: (f, a) => f(...a)
|
|
@@ -329,7 +232,7 @@ var EdgeClient = class extends Resource2 {
|
|
|
329
232
|
error: event.error,
|
|
330
233
|
info: event.message
|
|
331
234
|
}, {
|
|
332
|
-
F:
|
|
235
|
+
F: __dxlog_file2,
|
|
333
236
|
L: 128,
|
|
334
237
|
S: this,
|
|
335
238
|
C: (f, a) => f(...a)
|
|
@@ -342,12 +245,12 @@ var EdgeClient = class extends Resource2 {
|
|
|
342
245
|
return;
|
|
343
246
|
}
|
|
344
247
|
const data = await toUint8Array(event.data);
|
|
345
|
-
const message =
|
|
248
|
+
const message = buf.fromBinary(MessageSchema, data);
|
|
346
249
|
log2("received", {
|
|
347
250
|
peerKey: this._peerKey,
|
|
348
251
|
payload: protocol.getPayloadType(message)
|
|
349
252
|
}, {
|
|
350
|
-
F:
|
|
253
|
+
F: __dxlog_file2,
|
|
351
254
|
L: 141,
|
|
352
255
|
S: this,
|
|
353
256
|
C: (f, a) => f(...a)
|
|
@@ -361,7 +264,7 @@ var EdgeClient = class extends Resource2 {
|
|
|
361
264
|
err,
|
|
362
265
|
payload: protocol.getPayloadType(message)
|
|
363
266
|
}, {
|
|
364
|
-
F:
|
|
267
|
+
F: __dxlog_file2,
|
|
365
268
|
L: 147,
|
|
366
269
|
S: this,
|
|
367
270
|
C: (f, a) => f(...a)
|
|
@@ -374,7 +277,7 @@ var EdgeClient = class extends Resource2 {
|
|
|
374
277
|
timeout: this._config.timeout ?? DEFAULT_TIMEOUT
|
|
375
278
|
});
|
|
376
279
|
this._keepaliveCtx = new Context(void 0, {
|
|
377
|
-
F:
|
|
280
|
+
F: __dxlog_file2,
|
|
378
281
|
L: 154
|
|
379
282
|
});
|
|
380
283
|
scheduleTaskInterval(this._keepaliveCtx, async () => {
|
|
@@ -388,7 +291,7 @@ var EdgeClient = class extends Resource2 {
|
|
|
388
291
|
return;
|
|
389
292
|
}
|
|
390
293
|
try {
|
|
391
|
-
this._ready.throw(new
|
|
294
|
+
this._ready.throw(this.isOpen ? new EdgeIdentityChangedError() : new EdgeConnectionClosedError());
|
|
392
295
|
this._ready.reset();
|
|
393
296
|
void this._keepaliveCtx?.dispose();
|
|
394
297
|
this._keepaliveCtx = void 0;
|
|
@@ -409,7 +312,7 @@ var EdgeClient = class extends Resource2 {
|
|
|
409
312
|
log2.warn("Error closing websocket", {
|
|
410
313
|
err
|
|
411
314
|
}, {
|
|
412
|
-
F:
|
|
315
|
+
F: __dxlog_file2,
|
|
413
316
|
L: 190,
|
|
414
317
|
S: this,
|
|
415
318
|
C: (f, a) => f(...a)
|
|
@@ -422,38 +325,32 @@ var EdgeClient = class extends Resource2 {
|
|
|
422
325
|
*/
|
|
423
326
|
async send(message) {
|
|
424
327
|
if (this._ready.state !== TriggerState.RESOLVED) {
|
|
328
|
+
log2("waiting for websocket to become ready", void 0, {
|
|
329
|
+
F: __dxlog_file2,
|
|
330
|
+
L: 200,
|
|
331
|
+
S: this,
|
|
332
|
+
C: (f, a) => f(...a)
|
|
333
|
+
});
|
|
425
334
|
await this._ready.wait({
|
|
426
335
|
timeout: this._config.timeout ?? DEFAULT_TIMEOUT
|
|
427
336
|
});
|
|
428
337
|
}
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
""
|
|
436
|
-
]
|
|
437
|
-
});
|
|
438
|
-
invariant2(!message.source || message.source.peerKey === this._peerKey, void 0, {
|
|
439
|
-
F: __dxlog_file3,
|
|
440
|
-
L: 203,
|
|
441
|
-
S: this,
|
|
442
|
-
A: [
|
|
443
|
-
"!message.source || message.source.peerKey === this._peerKey",
|
|
444
|
-
""
|
|
445
|
-
]
|
|
446
|
-
});
|
|
338
|
+
if (!this._ws) {
|
|
339
|
+
throw new EdgeConnectionClosedError();
|
|
340
|
+
}
|
|
341
|
+
if (message.source && (message.source.peerKey !== this._peerKey || message.source.identityKey !== this.identityKey)) {
|
|
342
|
+
throw new EdgeIdentityChangedError();
|
|
343
|
+
}
|
|
447
344
|
log2("sending...", {
|
|
448
345
|
peerKey: this._peerKey,
|
|
449
346
|
payload: protocol.getPayloadType(message)
|
|
450
347
|
}, {
|
|
451
|
-
F:
|
|
452
|
-
L:
|
|
348
|
+
F: __dxlog_file2,
|
|
349
|
+
L: 213,
|
|
453
350
|
S: this,
|
|
454
351
|
C: (f, a) => f(...a)
|
|
455
352
|
});
|
|
456
|
-
this._ws.send(
|
|
353
|
+
this._ws.send(buf.toBinary(MessageSchema, message));
|
|
457
354
|
}
|
|
458
355
|
_onHeartbeat() {
|
|
459
356
|
if (this._lifecycleState !== LifecycleState2.OPEN) {
|
|
@@ -461,8 +358,8 @@ var EdgeClient = class extends Resource2 {
|
|
|
461
358
|
}
|
|
462
359
|
void this._heartBeatContext?.dispose();
|
|
463
360
|
this._heartBeatContext = new Context(void 0, {
|
|
464
|
-
F:
|
|
465
|
-
L:
|
|
361
|
+
F: __dxlog_file2,
|
|
362
|
+
L: 222
|
|
466
363
|
});
|
|
467
364
|
scheduleTask(this._heartBeatContext, () => {
|
|
468
365
|
this._persistentLifecycle.scheduleRestart();
|
|
@@ -471,6 +368,8 @@ var EdgeClient = class extends Resource2 {
|
|
|
471
368
|
};
|
|
472
369
|
export {
|
|
473
370
|
EdgeClient,
|
|
371
|
+
EdgeConnectionClosedError,
|
|
372
|
+
EdgeIdentityChangedError,
|
|
474
373
|
Protocol,
|
|
475
374
|
getTypename,
|
|
476
375
|
protocol,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../../src/index.ts", "../../../src/edge-client.ts", "../../../src/
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nexport * from '@dxos/protocols/buf/dxos/edge/messenger_pb';\n\nexport * from './edge-client';\nexport * from './defs';\nexport * from './protocol';\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport WebSocket from 'isomorphic-ws';\n\nimport { Trigger, Event, scheduleTaskInterval, scheduleTask, TriggerState } from '@dxos/async';\nimport { Context, LifecycleState, Resource, type Lifecycle } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport { buf } from '@dxos/protocols/buf';\nimport { type Message, MessageSchema } from '@dxos/protocols/buf/dxos/edge/messenger_pb';\n\nimport { protocol } from './defs';\nimport { WebsocketClosedError } from './errors';\nimport { PersistentLifecycle } from './persistent-lifecycle';\nimport { type Protocol, toUint8Array } from './protocol';\n\nconst DEFAULT_TIMEOUT = 10_000;\nconst SIGNAL_KEEPALIVE_INTERVAL = 5_000;\n\nexport type MessageListener = (message: Message) => void | Promise<void>;\n\nexport interface EdgeConnection extends Required<Lifecycle> {\n reconnect: Event;\n\n get info(): any;\n get identityKey(): string;\n get peerKey(): string;\n get isOpen(): boolean;\n setIdentity(params: { peerKey: string; identityKey: string }): void;\n addListener(listener: MessageListener): () => void;\n send(message: Message): Promise<void>;\n}\n\nexport type MessengerConfig = {\n socketEndpoint: string;\n timeout?: number;\n protocol?: Protocol;\n};\n\n/**\n * Messenger client.\n */\nexport class EdgeClient extends Resource implements EdgeConnection {\n public reconnect = new Event();\n private readonly _persistentLifecycle = new PersistentLifecycle({\n start: async () => this._openWebSocket(),\n stop: async () => this._closeWebSocket(),\n onRestart: async () => this.reconnect.emit(),\n });\n\n private readonly _listeners = new Set<MessageListener>();\n private readonly _protocol: Protocol;\n private _ready = new Trigger();\n private _ws?: WebSocket = undefined;\n private _keepaliveCtx?: Context = undefined;\n private _heartBeatContext?: Context = undefined;\n\n constructor(\n private _identityKey: string,\n private _peerKey: string,\n private readonly _config: MessengerConfig,\n ) {\n super();\n this._protocol = this._config.protocol ?? protocol;\n }\n\n // TODO(burdon): Attach logging.\n public get info() {\n return {\n open: this.isOpen,\n identity: this._identityKey,\n device: this._peerKey,\n };\n }\n\n get identityKey() {\n return this._identityKey;\n }\n\n get peerKey() {\n return this._peerKey;\n }\n\n setIdentity({ peerKey, identityKey }: { peerKey: string; identityKey: string }) {\n this._peerKey = peerKey;\n this._identityKey = identityKey;\n this._persistentLifecycle.scheduleRestart();\n }\n\n public addListener(listener: MessageListener): () => void {\n this._listeners.add(listener);\n return () => this._listeners.delete(listener);\n }\n\n /**\n * Open connection to messaging service.\n */\n protected override async _open() {\n log('opening...', { info: this.info });\n this._persistentLifecycle.open().catch((err) => {\n log.warn('Error while opening connection', { err });\n });\n }\n\n /**\n * Close connection and free resources.\n */\n protected override async _close() {\n log('closing...', { peerKey: this._peerKey });\n await this._persistentLifecycle.close();\n }\n\n private async _openWebSocket() {\n const url = new URL(`/ws/${this._identityKey}/${this._peerKey}`, this._config.socketEndpoint);\n this._ws = new WebSocket(url);\n\n this._ws.onopen = () => {\n log('opened', this.info);\n this._ready.wake();\n };\n this._ws.onclose = () => {\n log('closed', this.info);\n this._persistentLifecycle.scheduleRestart();\n };\n this._ws.onerror = (event) => {\n log.warn('EdgeClient socket error', { error: event.error, info: event.message });\n this._persistentLifecycle.scheduleRestart();\n };\n /**\n * https://developer.mozilla.org/en-US/docs/Web/API/MessageEvent/data\n */\n this._ws.onmessage = async (event) => {\n if (event.data === '__pong__') {\n this._onHeartbeat();\n return;\n }\n const data = await toUint8Array(event.data);\n const message = buf.fromBinary(MessageSchema, data);\n log('received', { peerKey: this._peerKey, payload: protocol.getPayloadType(message) });\n if (message) {\n for (const listener of this._listeners) {\n try {\n await listener(message);\n } catch (err) {\n log.error('processing', { err, payload: protocol.getPayloadType(message) });\n }\n }\n }\n };\n\n await this._ready.wait({ timeout: this._config.timeout ?? DEFAULT_TIMEOUT });\n this._keepaliveCtx = new Context();\n scheduleTaskInterval(\n this._keepaliveCtx,\n async () => {\n // TODO(mykola): use RFC6455 ping/pong once implemented in the browser?\n // Cloudflare's worker responds to this `without interrupting hibernation`. https://developers.cloudflare.com/durable-objects/api/websockets/#setwebsocketautoresponse\n this._ws?.send('__ping__');\n },\n SIGNAL_KEEPALIVE_INTERVAL,\n );\n this._ws.send('__ping__');\n this._onHeartbeat();\n }\n\n private async _closeWebSocket() {\n if (!this._ws) {\n return;\n }\n try {\n this._ready.throw(new WebsocketClosedError());\n this._ready.reset();\n void this._keepaliveCtx?.dispose();\n this._keepaliveCtx = undefined;\n void this._heartBeatContext?.dispose();\n this._heartBeatContext = undefined;\n\n // NOTE: Remove event handlers to avoid scheduling restart.\n this._ws.onopen = () => {};\n this._ws.onclose = () => {};\n this._ws.onerror = () => {};\n this._ws.close();\n this._ws = undefined;\n } catch (err) {\n if (err instanceof Error && err.message.includes('WebSocket is closed before the connection is established.')) {\n return;\n }\n log.warn('Error closing websocket', { err });\n }\n }\n\n /**\n * Send message.\n * NOTE: The message is guaranteed to be delivered but the service must respond with a message to confirm processing.\n */\n public async send(message: Message): Promise<void> {\n if (this._ready.state !== TriggerState.RESOLVED) {\n await this._ready.wait({ timeout: this._config.timeout ?? DEFAULT_TIMEOUT });\n }\n invariant(this._ws);\n invariant(!message.source || message.source.peerKey === this._peerKey);\n log('sending...', { peerKey: this._peerKey, payload: protocol.getPayloadType(message) });\n this._ws.send(buf.toBinary(MessageSchema, message));\n }\n\n private _onHeartbeat() {\n if (this._lifecycleState !== LifecycleState.OPEN) {\n return;\n }\n void this._heartBeatContext?.dispose();\n this._heartBeatContext = new Context();\n scheduleTask(\n this._heartBeatContext,\n () => {\n this._persistentLifecycle.scheduleRestart();\n },\n 2 * SIGNAL_KEEPALIVE_INTERVAL,\n );\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { AnySchema } from '@bufbuild/protobuf/wkt';\n\nimport { SwarmRequestSchema, SwarmResponseSchema, TextMessageSchema } from '@dxos/protocols/buf/dxos/edge/messenger_pb';\n\nimport { Protocol } from './protocol';\n\nexport const protocol = new Protocol([SwarmRequestSchema, SwarmResponseSchema, TextMessageSchema, AnySchema]);\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { invariant } from '@dxos/invariant';\nimport { buf, bufWkt } from '@dxos/protocols/buf';\nimport { type Message, MessageSchema, type Peer as PeerProto } from '@dxos/protocols/buf/dxos/edge/messenger_pb';\nimport { bufferToArray } from '@dxos/util';\n\nexport type PeerData = Partial<PeerProto>;\n\nexport const getTypename = (typeName: string) => `type.googleapis.com/${typeName}`;\n\n/**\n * NOTE: The type registry should be extended with all message types.\n */\nexport class Protocol {\n private readonly _typeRegistry: buf.Registry;\n\n constructor(types: buf.DescMessage[]) {\n this._typeRegistry = buf.createRegistry(...types);\n }\n\n get typeRegistry(): buf.Registry {\n return this._typeRegistry;\n }\n\n toJson(message: Message): any {\n try {\n return buf.toJson(MessageSchema, message, { registry: this.typeRegistry });\n } catch (err) {\n return { type: this.getPayloadType(message) };\n }\n }\n\n /**\n * Return the payload with the given type.\n */\n getPayload<Desc extends buf.DescMessage>(message: Message, type: Desc): buf.MessageShape<Desc> {\n invariant(message.payload);\n const payloadTypename = this.getPayloadType(message);\n if (type && type.typeName !== payloadTypename) {\n throw new Error(`Unexpected payload type: ${payloadTypename}; expected ${type.typeName}`);\n }\n\n invariant(bufWkt.anyIs(message.payload, type), `Unexpected payload type: ${payloadTypename}}`);\n const payload = bufWkt.anyUnpack(message.payload, this.typeRegistry) as buf.MessageShape<Desc>;\n invariant(payload, `Empty payload: ${payloadTypename}}`);\n return payload;\n }\n\n /**\n * Get the payload type.\n */\n getPayloadType(message: Message): string | undefined {\n if (!message.payload) {\n return undefined;\n }\n\n const [, type] = message.payload.typeUrl.split('/');\n return type;\n }\n\n /**\n * Create a packed message.\n */\n createMessage<Desc extends buf.DescMessage>(\n type: Desc,\n {\n source,\n target,\n payload,\n serviceId,\n }: {\n source?: PeerData;\n target?: PeerData[];\n payload?: buf.MessageInitShape<Desc>;\n serviceId?: string;\n },\n ) {\n return buf.create(MessageSchema, {\n timestamp: new Date().toISOString(),\n source,\n target,\n serviceId,\n payload: payload ? bufWkt.anyPack(type, buf.create(type, payload)) : undefined,\n });\n }\n}\n\n/**\n * Convert websocket data to Uint8Array.\n */\nexport const toUint8Array = async (data: any): Promise<Uint8Array> => {\n // Node.\n if (data instanceof Buffer) {\n return bufferToArray(data);\n }\n\n // Browser.\n if (data instanceof Blob) {\n return new Uint8Array(await (data as Blob).arrayBuffer());\n }\n\n throw new Error(`Unexpected datatype: ${data}`);\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nexport class WebsocketClosedError extends Error {\n constructor() {\n super('WebSocket connection closed');\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { DeferredTask, sleep, synchronized } from '@dxos/async';\nimport { cancelWithContext, LifecycleState, Resource } from '@dxos/context';\nimport { warnAfterTimeout } from '@dxos/debug';\nimport { log } from '@dxos/log';\n\nconst INIT_RESTART_DELAY = 100;\nconst DEFAULT_MAX_RESTART_DELAY = 5000;\n\nexport type PersistentLifecycleParams = {\n /**\n * Create connection.\n * If promise resolves successfully, connection is considered established.\n */\n start: () => Promise<void>;\n\n /**\n * Reset connection to initial state.\n */\n stop: () => Promise<void>;\n\n /**\n * Called after successful start.\n */\n onRestart?: () => Promise<void>;\n\n /**\n * Maximum delay between restartion attempts.\n * Default: 5000ms\n */\n maxRestartDelay?: number;\n};\n\n/**\n * Handles restarts (e.g. persists connection).\n * Restarts are scheduled with exponential backoff.\n */\nexport class PersistentLifecycle extends Resource {\n private readonly _start: () => Promise<void>;\n private readonly _stop: () => Promise<void>;\n private readonly _onRestart?: () => Promise<void>;\n private readonly _maxRestartDelay: number;\n\n private _restartTask?: DeferredTask = undefined;\n private _restartAfter = 0;\n\n constructor({ start, stop, onRestart, maxRestartDelay = DEFAULT_MAX_RESTART_DELAY }: PersistentLifecycleParams) {\n super();\n this._start = start;\n this._stop = stop;\n this._onRestart = onRestart;\n this._maxRestartDelay = maxRestartDelay;\n }\n\n @synchronized\n protected override async _open() {\n this._restartTask = new DeferredTask(this._ctx, async () => {\n try {\n await this._restart();\n } catch (err) {\n log.warn('Restart failed', { err });\n this._restartTask?.schedule();\n }\n });\n await this._start().catch((err) => {\n log.warn('Start failed', { err });\n this._restartTask?.schedule();\n });\n }\n\n protected override async _close() {\n await this._restartTask?.join();\n await this._stop();\n this._restartTask = undefined;\n }\n\n private async _restart() {\n log(`restarting in ${this._restartAfter}ms`, { state: this._lifecycleState });\n await this._stop();\n if (this._lifecycleState !== LifecycleState.OPEN) {\n return;\n }\n await cancelWithContext(this._ctx!, sleep(this._restartAfter));\n this._restartAfter = Math.min(Math.max(this._restartAfter * 2, INIT_RESTART_DELAY), this._maxRestartDelay);\n\n // May fail if the connection is not established.\n await warnAfterTimeout(5_000, 'Connection establishment takes too long', () => this._start());\n\n this._restartAfter = 0;\n await this._onRestart?.();\n }\n\n /**\n * Scheduling restart should be done from outside.\n */\n @synchronized\n scheduleRestart() {\n if (this._lifecycleState !== LifecycleState.OPEN) {\n return;\n }\n this._restartTask!.schedule();\n }\n}\n"],
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": ["WebSocket", "Trigger", "Event", "scheduleTaskInterval", "scheduleTask", "TriggerState", "Context", "LifecycleState", "Resource", "
|
|
3
|
+
"sources": ["../../../src/index.ts", "../../../src/edge-client.ts", "../../../src/errors.ts", "../../../src/persistent-lifecycle.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nexport * from '@dxos/protocols/buf/dxos/edge/messenger_pb';\n\nexport * from './edge-client';\nexport * from './defs';\nexport * from './protocol';\nexport * from './errors';\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport WebSocket from 'isomorphic-ws';\n\nimport { Trigger, Event, scheduleTaskInterval, scheduleTask, TriggerState } from '@dxos/async';\nimport { Context, LifecycleState, Resource, type Lifecycle } from '@dxos/context';\nimport { log } from '@dxos/log';\nimport { buf } from '@dxos/protocols/buf';\nimport { type Message, MessageSchema } from '@dxos/protocols/buf/dxos/edge/messenger_pb';\n\nimport { protocol } from './defs';\nimport { EdgeConnectionClosedError, EdgeIdentityChangedError } from './errors';\nimport { PersistentLifecycle } from './persistent-lifecycle';\nimport { type Protocol, toUint8Array } from './protocol';\n\nconst DEFAULT_TIMEOUT = 10_000;\nconst SIGNAL_KEEPALIVE_INTERVAL = 5_000;\n\nexport type MessageListener = (message: Message) => void | Promise<void>;\n\nexport interface EdgeConnection extends Required<Lifecycle> {\n connected: Event;\n reconnect: Event;\n\n get info(): any;\n get identityKey(): string;\n get peerKey(): string;\n get isOpen(): boolean;\n setIdentity(params: { peerKey: string; identityKey: string }): void;\n addListener(listener: MessageListener): () => void;\n send(message: Message): Promise<void>;\n}\n\nexport type MessengerConfig = {\n socketEndpoint: string;\n timeout?: number;\n protocol?: Protocol;\n};\n\n/**\n * Messenger client.\n */\nexport class EdgeClient extends Resource implements EdgeConnection {\n public readonly reconnect = new Event();\n public readonly connected = new Event();\n private readonly _persistentLifecycle = new PersistentLifecycle({\n start: async () => this._openWebSocket(),\n stop: async () => this._closeWebSocket(),\n onRestart: async () => this.reconnect.emit(),\n });\n\n private readonly _listeners = new Set<MessageListener>();\n private _ready = new Trigger();\n private _ws?: WebSocket = undefined;\n private _keepaliveCtx?: Context = undefined;\n private _heartBeatContext?: Context = undefined;\n\n constructor(\n private _identityKey: string,\n private _peerKey: string,\n private readonly _config: MessengerConfig,\n ) {\n super();\n }\n\n // TODO(burdon): Attach logging.\n public get info() {\n return {\n open: this.isOpen,\n identity: this._identityKey,\n device: this._peerKey,\n };\n }\n\n get identityKey() {\n return this._identityKey;\n }\n\n get peerKey() {\n return this._peerKey;\n }\n\n setIdentity({ peerKey, identityKey }: { peerKey: string; identityKey: string }) {\n this._peerKey = peerKey;\n this._identityKey = identityKey;\n this._persistentLifecycle.scheduleRestart();\n }\n\n public addListener(listener: MessageListener): () => void {\n this._listeners.add(listener);\n return () => this._listeners.delete(listener);\n }\n\n /**\n * Open connection to messaging service.\n */\n protected override async _open() {\n log('opening...', { info: this.info });\n this._persistentLifecycle.open().catch((err) => {\n log.warn('Error while opening connection', { err });\n });\n }\n\n /**\n * Close connection and free resources.\n */\n protected override async _close() {\n log('closing...', { peerKey: this._peerKey });\n await this._persistentLifecycle.close();\n }\n\n private async _openWebSocket() {\n const url = new URL(`/ws/${this._identityKey}/${this._peerKey}`, this._config.socketEndpoint);\n this._ws = new WebSocket(url);\n\n this._ws.onopen = () => {\n log('opened', this.info);\n this._ready.wake();\n this.connected.emit();\n };\n this._ws.onclose = () => {\n log('closed', this.info);\n this._persistentLifecycle.scheduleRestart();\n };\n this._ws.onerror = (event) => {\n log.warn('EdgeClient socket error', { error: event.error, info: event.message });\n this._persistentLifecycle.scheduleRestart();\n };\n /**\n * https://developer.mozilla.org/en-US/docs/Web/API/MessageEvent/data\n */\n this._ws.onmessage = async (event) => {\n if (event.data === '__pong__') {\n this._onHeartbeat();\n return;\n }\n const data = await toUint8Array(event.data);\n const message = buf.fromBinary(MessageSchema, data);\n log('received', { peerKey: this._peerKey, payload: protocol.getPayloadType(message) });\n if (message) {\n for (const listener of this._listeners) {\n try {\n await listener(message);\n } catch (err) {\n log.error('processing', { err, payload: protocol.getPayloadType(message) });\n }\n }\n }\n };\n\n await this._ready.wait({ timeout: this._config.timeout ?? DEFAULT_TIMEOUT });\n this._keepaliveCtx = new Context();\n scheduleTaskInterval(\n this._keepaliveCtx,\n async () => {\n // TODO(mykola): use RFC6455 ping/pong once implemented in the browser?\n // Cloudflare's worker responds to this `without interrupting hibernation`. https://developers.cloudflare.com/durable-objects/api/websockets/#setwebsocketautoresponse\n this._ws?.send('__ping__');\n },\n SIGNAL_KEEPALIVE_INTERVAL,\n );\n this._ws.send('__ping__');\n this._onHeartbeat();\n }\n\n private async _closeWebSocket() {\n if (!this._ws) {\n return;\n }\n try {\n this._ready.throw(this.isOpen ? new EdgeIdentityChangedError() : new EdgeConnectionClosedError());\n this._ready.reset();\n void this._keepaliveCtx?.dispose();\n this._keepaliveCtx = undefined;\n void this._heartBeatContext?.dispose();\n this._heartBeatContext = undefined;\n\n // NOTE: Remove event handlers to avoid scheduling restart.\n this._ws.onopen = () => {};\n this._ws.onclose = () => {};\n this._ws.onerror = () => {};\n this._ws.close();\n this._ws = undefined;\n } catch (err) {\n if (err instanceof Error && err.message.includes('WebSocket is closed before the connection is established.')) {\n return;\n }\n log.warn('Error closing websocket', { err });\n }\n }\n\n /**\n * Send message.\n * NOTE: The message is guaranteed to be delivered but the service must respond with a message to confirm processing.\n */\n public async send(message: Message): Promise<void> {\n if (this._ready.state !== TriggerState.RESOLVED) {\n log('waiting for websocket to become ready');\n await this._ready.wait({ timeout: this._config.timeout ?? DEFAULT_TIMEOUT });\n }\n if (!this._ws) {\n throw new EdgeConnectionClosedError();\n }\n if (\n message.source &&\n (message.source.peerKey !== this._peerKey || message.source.identityKey !== this.identityKey)\n ) {\n throw new EdgeIdentityChangedError();\n }\n\n log('sending...', { peerKey: this._peerKey, payload: protocol.getPayloadType(message) });\n this._ws.send(buf.toBinary(MessageSchema, message));\n }\n\n private _onHeartbeat() {\n if (this._lifecycleState !== LifecycleState.OPEN) {\n return;\n }\n void this._heartBeatContext?.dispose();\n this._heartBeatContext = new Context();\n scheduleTask(\n this._heartBeatContext,\n () => {\n this._persistentLifecycle.scheduleRestart();\n },\n 2 * SIGNAL_KEEPALIVE_INTERVAL,\n );\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nexport class EdgeConnectionClosedError extends Error {\n constructor() {\n super('Edge connection closed.');\n }\n}\n\nexport class EdgeIdentityChangedError extends Error {\n constructor() {\n super('Edge identity changed.');\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { DeferredTask, sleep, synchronized } from '@dxos/async';\nimport { cancelWithContext, LifecycleState, Resource } from '@dxos/context';\nimport { warnAfterTimeout } from '@dxos/debug';\nimport { log } from '@dxos/log';\n\nconst INIT_RESTART_DELAY = 100;\nconst DEFAULT_MAX_RESTART_DELAY = 5000;\n\nexport type PersistentLifecycleParams = {\n /**\n * Create connection.\n * If promise resolves successfully, connection is considered established.\n */\n start: () => Promise<void>;\n\n /**\n * Reset connection to initial state.\n */\n stop: () => Promise<void>;\n\n /**\n * Called after successful start.\n */\n onRestart?: () => Promise<void>;\n\n /**\n * Maximum delay between restartion attempts.\n * Default: 5000ms\n */\n maxRestartDelay?: number;\n};\n\n/**\n * Handles restarts (e.g. persists connection).\n * Restarts are scheduled with exponential backoff.\n */\nexport class PersistentLifecycle extends Resource {\n private readonly _start: () => Promise<void>;\n private readonly _stop: () => Promise<void>;\n private readonly _onRestart?: () => Promise<void>;\n private readonly _maxRestartDelay: number;\n\n private _restartTask?: DeferredTask = undefined;\n private _restartAfter = 0;\n\n constructor({ start, stop, onRestart, maxRestartDelay = DEFAULT_MAX_RESTART_DELAY }: PersistentLifecycleParams) {\n super();\n this._start = start;\n this._stop = stop;\n this._onRestart = onRestart;\n this._maxRestartDelay = maxRestartDelay;\n }\n\n @synchronized\n protected override async _open() {\n this._restartTask = new DeferredTask(this._ctx, async () => {\n try {\n await this._restart();\n } catch (err) {\n log.warn('Restart failed', { err });\n this._restartTask?.schedule();\n }\n });\n await this._start().catch((err) => {\n log.warn('Start failed', { err });\n this._restartTask?.schedule();\n });\n }\n\n protected override async _close() {\n await this._restartTask?.join();\n await this._stop();\n this._restartTask = undefined;\n }\n\n private async _restart() {\n log(`restarting in ${this._restartAfter}ms`, { state: this._lifecycleState });\n await this._stop();\n if (this._lifecycleState !== LifecycleState.OPEN) {\n return;\n }\n await cancelWithContext(this._ctx!, sleep(this._restartAfter));\n this._restartAfter = Math.min(Math.max(this._restartAfter * 2, INIT_RESTART_DELAY), this._maxRestartDelay);\n\n // May fail if the connection is not established.\n await warnAfterTimeout(5_000, 'Connection establishment takes too long', () => this._start());\n\n this._restartAfter = 0;\n await this._onRestart?.();\n }\n\n /**\n * Scheduling restart should be done from outside.\n */\n @synchronized\n scheduleRestart() {\n if (this._lifecycleState !== LifecycleState.OPEN) {\n return;\n }\n this._restartTask!.schedule();\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["WebSocket", "Trigger", "Event", "scheduleTaskInterval", "scheduleTask", "TriggerState", "Context", "LifecycleState", "Resource", "log", "buf", "MessageSchema", "EdgeConnectionClosedError", "Error", "constructor", "EdgeIdentityChangedError", "DeferredTask", "sleep", "synchronized", "cancelWithContext", "LifecycleState", "Resource", "warnAfterTimeout", "log", "INIT_RESTART_DELAY", "DEFAULT_MAX_RESTART_DELAY", "PersistentLifecycle", "constructor", "start", "stop", "onRestart", "maxRestartDelay", "_restartTask", "undefined", "_restartAfter", "_start", "_stop", "_onRestart", "_maxRestartDelay", "_open", "_ctx", "_restart", "err", "warn", "schedule", "catch", "_close", "join", "state", "_lifecycleState", "OPEN", "Math", "min", "max", "scheduleRestart", "DEFAULT_TIMEOUT", "SIGNAL_KEEPALIVE_INTERVAL", "EdgeClient", "Resource", "constructor", "_identityKey", "_peerKey", "_config", "reconnect", "Event", "connected", "_persistentLifecycle", "PersistentLifecycle", "start", "_openWebSocket", "stop", "_closeWebSocket", "onRestart", "emit", "_listeners", "Set", "_ready", "Trigger", "_ws", "undefined", "_keepaliveCtx", "_heartBeatContext", "info", "open", "isOpen", "identity", "device", "identityKey", "peerKey", "setIdentity", "scheduleRestart", "addListener", "listener", "add", "delete", "_open", "log", "catch", "err", "warn", "_close", "close", "url", "URL", "socketEndpoint", "WebSocket", "onopen", "wake", "onclose", "onerror", "event", "error", "message", "onmessage", "data", "_onHeartbeat", "toUint8Array", "buf", "fromBinary", "MessageSchema", "payload", "protocol", "getPayloadType", "wait", "timeout", "Context", "scheduleTaskInterval", "send", "throw", "EdgeIdentityChangedError", "EdgeConnectionClosedError", "reset", "dispose", "Error", "includes", "state", "TriggerState", "RESOLVED", "source", "toBinary", "_lifecycleState", "LifecycleState", "OPEN", "scheduleTask"]
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"inputs":{"packages/core/mesh/edge-client/src/protocol.ts":{"bytes":
|
|
1
|
+
{"inputs":{"packages/core/mesh/edge-client/src/protocol.ts":{"bytes":10334,"imports":[{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf/dxos/edge/messenger_pb","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"format":"esm"},"packages/core/mesh/edge-client/src/defs.ts":{"bytes":1607,"imports":[{"path":"@dxos/protocols/buf","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf/dxos/edge/messenger_pb","kind":"import-statement","external":true},{"path":"packages/core/mesh/edge-client/src/protocol.ts","kind":"import-statement","original":"./protocol"}],"format":"esm"},"packages/core/mesh/edge-client/src/errors.ts":{"bytes":1265,"imports":[],"format":"esm"},"packages/core/mesh/edge-client/src/persistent-lifecycle.ts":{"bytes":10868,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"format":"esm"},"packages/core/mesh/edge-client/src/edge-client.ts":{"bytes":27085,"imports":[{"path":"isomorphic-ws","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf/dxos/edge/messenger_pb","kind":"import-statement","external":true},{"path":"packages/core/mesh/edge-client/src/defs.ts","kind":"import-statement","original":"./defs"},{"path":"packages/core/mesh/edge-client/src/errors.ts","kind":"import-statement","original":"./errors"},{"path":"packages/core/mesh/edge-client/src/persistent-lifecycle.ts","kind":"import-statement","original":"./persistent-lifecycle"},{"path":"packages/core/mesh/edge-client/src/protocol.ts","kind":"import-statement","original":"./protocol"}],"format":"esm"},"packages/core/mesh/edge-client/src/index.ts":{"bytes":935,"imports":[{"path":"@dxos/protocols/buf/dxos/edge/messenger_pb","kind":"import-statement","external":true},{"path":"packages/core/mesh/edge-client/src/edge-client.ts","kind":"import-statement","original":"./edge-client"},{"path":"packages/core/mesh/edge-client/src/defs.ts","kind":"import-statement","original":"./defs"},{"path":"packages/core/mesh/edge-client/src/protocol.ts","kind":"import-statement","original":"./protocol"},{"path":"packages/core/mesh/edge-client/src/errors.ts","kind":"import-statement","original":"./errors"}],"format":"esm"},"packages/core/mesh/edge-client/src/testing/test-utils.ts":{"bytes":12455,"imports":[{"path":"isomorphic-ws","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf/dxos/edge/messenger_pb","kind":"import-statement","external":true},{"path":"packages/core/mesh/edge-client/src/defs.ts","kind":"import-statement","original":"../defs"},{"path":"packages/core/mesh/edge-client/src/protocol.ts","kind":"import-statement","original":"../protocol"}],"format":"esm"},"packages/core/mesh/edge-client/src/testing/index.ts":{"bytes":516,"imports":[{"path":"packages/core/mesh/edge-client/src/testing/test-utils.ts","kind":"import-statement","original":"./test-utils"}],"format":"esm"}},"outputs":{"packages/core/mesh/edge-client/dist/lib/node-esm/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":18218},"packages/core/mesh/edge-client/dist/lib/node-esm/index.mjs":{"imports":[{"path":"packages/core/mesh/edge-client/dist/lib/node-esm/chunk-HNVT57AU.mjs","kind":"import-statement"},{"path":"@dxos/protocols/buf/dxos/edge/messenger_pb","kind":"import-statement","external":true},{"path":"isomorphic-ws","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf/dxos/edge/messenger_pb","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"exports":["EdgeClient","EdgeConnectionClosedError","EdgeIdentityChangedError","Protocol","getTypename","protocol","toUint8Array"],"entryPoint":"packages/core/mesh/edge-client/src/index.ts","inputs":{"packages/core/mesh/edge-client/src/index.ts":{"bytesInOutput":60},"packages/core/mesh/edge-client/src/edge-client.ts":{"bytesInOutput":6943},"packages/core/mesh/edge-client/src/errors.ts":{"bytesInOutput":232},"packages/core/mesh/edge-client/src/persistent-lifecycle.ts":{"bytesInOutput":3015}},"bytes":10876},"packages/core/mesh/edge-client/dist/lib/node-esm/testing/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":6342},"packages/core/mesh/edge-client/dist/lib/node-esm/testing/index.mjs":{"imports":[{"path":"packages/core/mesh/edge-client/dist/lib/node-esm/chunk-HNVT57AU.mjs","kind":"import-statement"},{"path":"isomorphic-ws","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf/dxos/edge/messenger_pb","kind":"import-statement","external":true}],"exports":["DEFAULT_PORT","createTestEdgeWsServer"],"entryPoint":"packages/core/mesh/edge-client/src/testing/index.ts","inputs":{"packages/core/mesh/edge-client/src/testing/test-utils.ts":{"bytesInOutput":3276},"packages/core/mesh/edge-client/src/testing/index.ts":{"bytesInOutput":0}},"bytes":3585},"packages/core/mesh/edge-client/dist/lib/node-esm/chunk-HNVT57AU.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":5678},"packages/core/mesh/edge-client/dist/lib/node-esm/chunk-HNVT57AU.mjs":{"imports":[{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf/dxos/edge/messenger_pb","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf/dxos/edge/messenger_pb","kind":"import-statement","external":true}],"exports":["Protocol","getTypename","protocol","toUint8Array"],"inputs":{"packages/core/mesh/edge-client/src/protocol.ts":{"bytesInOutput":2600},"packages/core/mesh/edge-client/src/defs.ts":{"bytesInOutput":298}},"bytes":3199}}}
|