@dxos/edge-client 0.8.2-main.85fa0e5 → 0.8.2-main.f11618f
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-CFIVYHE6.mjs → chunk-5DDWS5EC.mjs} +32 -37
- package/dist/lib/browser/chunk-5DDWS5EC.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +3 -9
- package/dist/lib/browser/index.mjs.map +2 -2
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +1 -1
- package/dist/lib/node/{chunk-FQM4JFRT.cjs → chunk-CNAHGYSS.cjs} +39 -46
- package/dist/lib/node/chunk-CNAHGYSS.cjs.map +7 -0
- package/dist/lib/node/index.cjs +10 -16
- package/dist/lib/node/index.cjs.map +2 -2
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/testing/index.cjs +5 -5
- package/dist/lib/node-esm/{chunk-APWFVC3U.mjs → chunk-O4TFZRSP.mjs} +32 -37
- package/dist/lib/node-esm/chunk-O4TFZRSP.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +3 -9
- package/dist/lib/node-esm/index.mjs.map +2 -2
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/testing/index.mjs +1 -1
- package/dist/types/src/edge-ws-connection.d.ts +0 -1
- package/dist/types/src/edge-ws-connection.d.ts.map +1 -1
- package/dist/types/src/edge-ws-muxer.d.ts +7 -16
- package/dist/types/src/edge-ws-muxer.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +0 -1
- package/dist/types/src/index.d.ts.map +1 -1
- package/package.json +14 -14
- package/src/edge-ws-connection.ts +3 -3
- package/src/edge-ws-muxer.ts +28 -43
- package/src/index.ts +0 -1
- package/dist/lib/browser/chunk-CFIVYHE6.mjs.map +0 -7
- package/dist/lib/node/chunk-FQM4JFRT.cjs.map +0 -7
- package/dist/lib/node-esm/chunk-APWFVC3U.mjs.map +0 -7
|
@@ -105,6 +105,7 @@ var protocol = new Protocol([
|
|
|
105
105
|
]);
|
|
106
106
|
|
|
107
107
|
// packages/core/mesh/edge-client/src/edge-ws-muxer.ts
|
|
108
|
+
import WebSocket from "isomorphic-ws";
|
|
108
109
|
import { Trigger } from "@dxos/async";
|
|
109
110
|
import { log } from "@dxos/log";
|
|
110
111
|
import { buf as buf2 } from "@dxos/protocols/buf";
|
|
@@ -112,17 +113,16 @@ import { MessageSchema as MessageSchema2 } from "@dxos/protocols/buf/dxos/edge/m
|
|
|
112
113
|
var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/core/mesh/edge-client/src/edge-ws-muxer.ts";
|
|
113
114
|
var FLAG_SEGMENT_SEQ = 1;
|
|
114
115
|
var FLAG_SEGMENT_SEQ_TERMINATED = 1 << 1;
|
|
115
|
-
var
|
|
116
|
-
var CLOUDFLARE_RPC_MAX_BYTES = 32 * 1e3 * 1e3;
|
|
116
|
+
var CLOUDFLARE_MESSAGE_LENGTH_LIMIT = 1024 * 1024;
|
|
117
117
|
var MAX_CHUNK_LENGTH = 16384;
|
|
118
|
-
var MAX_BUFFERED_AMOUNT =
|
|
118
|
+
var MAX_BUFFERED_AMOUNT = CLOUDFLARE_MESSAGE_LENGTH_LIMIT;
|
|
119
119
|
var BUFFER_FULL_BACKOFF_TIMEOUT = 100;
|
|
120
120
|
var WebSocketMuxer = class {
|
|
121
121
|
constructor(_ws) {
|
|
122
122
|
this._ws = _ws;
|
|
123
|
-
this.
|
|
124
|
-
this.
|
|
125
|
-
this.
|
|
123
|
+
this._incomingMessageAccumulator = /* @__PURE__ */ new Map();
|
|
124
|
+
this._outgoingMessageChunks = /* @__PURE__ */ new Map();
|
|
125
|
+
this._serviceToChannel = /* @__PURE__ */ new Map();
|
|
126
126
|
}
|
|
127
127
|
/**
|
|
128
128
|
* Resolves when all the message chunks get enqueued for sending.
|
|
@@ -130,15 +130,14 @@ var WebSocketMuxer = class {
|
|
|
130
130
|
async send(message) {
|
|
131
131
|
const binary = buf2.toBinary(MessageSchema2, message);
|
|
132
132
|
const channelId = this._resolveChannel(message);
|
|
133
|
-
if (channelId == null && binary.
|
|
134
|
-
log.error("Large message dropped", {
|
|
133
|
+
if (channelId == null && binary.length > CLOUDFLARE_MESSAGE_LENGTH_LIMIT) {
|
|
134
|
+
log.error("Large message dropped because channel resolution failed.", {
|
|
135
135
|
byteLength: binary.byteLength,
|
|
136
136
|
serviceId: message.serviceId,
|
|
137
|
-
payload: protocol.getPayloadType(message)
|
|
138
|
-
channelId
|
|
137
|
+
payload: protocol.getPayloadType(message)
|
|
139
138
|
}, {
|
|
140
139
|
F: __dxlog_file2,
|
|
141
|
-
L:
|
|
140
|
+
L: 52,
|
|
142
141
|
S: this,
|
|
143
142
|
C: (f, a) => f(...a)
|
|
144
143
|
});
|
|
@@ -183,11 +182,11 @@ var WebSocketMuxer = class {
|
|
|
183
182
|
});
|
|
184
183
|
}
|
|
185
184
|
}
|
|
186
|
-
const queuedMessages = this.
|
|
185
|
+
const queuedMessages = this._outgoingMessageChunks.get(channelId);
|
|
187
186
|
if (queuedMessages) {
|
|
188
187
|
queuedMessages.push(...messageChunks);
|
|
189
188
|
} else {
|
|
190
|
-
this.
|
|
189
|
+
this._outgoingMessageChunks.set(channelId, messageChunks);
|
|
191
190
|
}
|
|
192
191
|
this._sendChunkedMessages();
|
|
193
192
|
return terminatorSentTrigger.wait();
|
|
@@ -197,20 +196,20 @@ var WebSocketMuxer = class {
|
|
|
197
196
|
return buf2.fromBinary(MessageSchema2, data.slice(1));
|
|
198
197
|
}
|
|
199
198
|
const [flags, channelId, ...payload] = data;
|
|
200
|
-
let chunkAccumulator = this.
|
|
199
|
+
let chunkAccumulator = this._incomingMessageAccumulator.get(channelId);
|
|
201
200
|
if (chunkAccumulator) {
|
|
202
201
|
chunkAccumulator.push(Buffer.from(payload));
|
|
203
202
|
} else {
|
|
204
203
|
chunkAccumulator = [
|
|
205
204
|
Buffer.from(payload)
|
|
206
205
|
];
|
|
207
|
-
this.
|
|
206
|
+
this._incomingMessageAccumulator.set(channelId, chunkAccumulator);
|
|
208
207
|
}
|
|
209
208
|
if ((flags & FLAG_SEGMENT_SEQ_TERMINATED) === 0) {
|
|
210
209
|
return void 0;
|
|
211
210
|
}
|
|
212
211
|
const message = buf2.fromBinary(MessageSchema2, Buffer.concat(chunkAccumulator));
|
|
213
|
-
this.
|
|
212
|
+
this._incomingMessageAccumulator.delete(channelId);
|
|
214
213
|
return message;
|
|
215
214
|
}
|
|
216
215
|
destroy() {
|
|
@@ -218,12 +217,12 @@ var WebSocketMuxer = class {
|
|
|
218
217
|
clearTimeout(this._sendTimeout);
|
|
219
218
|
this._sendTimeout = void 0;
|
|
220
219
|
}
|
|
221
|
-
for (const channelChunks of this.
|
|
220
|
+
for (const channelChunks of this._outgoingMessageChunks.values()) {
|
|
222
221
|
channelChunks.forEach((chunk) => chunk.trigger?.wake());
|
|
223
222
|
}
|
|
224
|
-
this.
|
|
225
|
-
this.
|
|
226
|
-
this.
|
|
223
|
+
this._outgoingMessageChunks.clear();
|
|
224
|
+
this._incomingMessageAccumulator.clear();
|
|
225
|
+
this._serviceToChannel.clear();
|
|
227
226
|
}
|
|
228
227
|
_sendChunkedMessages() {
|
|
229
228
|
if (this._sendTimeout) {
|
|
@@ -233,7 +232,7 @@ var WebSocketMuxer = class {
|
|
|
233
232
|
if (this._ws.readyState === WebSocket.CLOSING || this._ws.readyState === WebSocket.CLOSED) {
|
|
234
233
|
log.warn("send called for closed websocket", void 0, {
|
|
235
234
|
F: __dxlog_file2,
|
|
236
|
-
L:
|
|
235
|
+
L: 135,
|
|
237
236
|
S: this,
|
|
238
237
|
C: (f, a) => f(...a)
|
|
239
238
|
});
|
|
@@ -242,12 +241,10 @@ var WebSocketMuxer = class {
|
|
|
242
241
|
}
|
|
243
242
|
let timeout = 0;
|
|
244
243
|
const emptyChannels = [];
|
|
245
|
-
for (const [channelId, messages] of this.
|
|
246
|
-
if (this._ws.bufferedAmount
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
break;
|
|
250
|
-
}
|
|
244
|
+
for (const [channelId, messages] of this._outgoingMessageChunks.entries()) {
|
|
245
|
+
if (this._ws.bufferedAmount + MAX_CHUNK_LENGTH > MAX_BUFFERED_AMOUNT) {
|
|
246
|
+
timeout = BUFFER_FULL_BACKOFF_TIMEOUT;
|
|
247
|
+
break;
|
|
251
248
|
}
|
|
252
249
|
const nextMessage = messages.shift();
|
|
253
250
|
if (nextMessage) {
|
|
@@ -257,8 +254,8 @@ var WebSocketMuxer = class {
|
|
|
257
254
|
emptyChannels.push(channelId);
|
|
258
255
|
}
|
|
259
256
|
}
|
|
260
|
-
emptyChannels.forEach((channelId) => this.
|
|
261
|
-
if (this.
|
|
257
|
+
emptyChannels.forEach((channelId) => this._outgoingMessageChunks.delete(channelId));
|
|
258
|
+
if (this._outgoingMessageChunks.size > 0) {
|
|
262
259
|
this._sendTimeout = setTimeout(send, timeout);
|
|
263
260
|
} else {
|
|
264
261
|
this._sendTimeout = void 0;
|
|
@@ -270,10 +267,10 @@ var WebSocketMuxer = class {
|
|
|
270
267
|
if (!message.serviceId) {
|
|
271
268
|
return void 0;
|
|
272
269
|
}
|
|
273
|
-
let id = this.
|
|
270
|
+
let id = this._serviceToChannel.get(message.serviceId);
|
|
274
271
|
if (!id) {
|
|
275
|
-
id = this.
|
|
276
|
-
this.
|
|
272
|
+
id = this._serviceToChannel.size + 1;
|
|
273
|
+
this._serviceToChannel.set(message.serviceId, id);
|
|
277
274
|
}
|
|
278
275
|
return id;
|
|
279
276
|
}
|
|
@@ -342,7 +339,7 @@ var EdgeWsConnection = class extends Resource {
|
|
|
342
339
|
});
|
|
343
340
|
if (this._ws?.protocol.includes(EDGE_WEBSOCKET_PROTOCOL_V0)) {
|
|
344
341
|
const binary = buf3.toBinary(MessageSchema3, message);
|
|
345
|
-
if (binary.length >
|
|
342
|
+
if (binary.length > CLOUDFLARE_MESSAGE_LENGTH_LIMIT) {
|
|
346
343
|
log2.error("Message dropped because it was too large (>1MB).", {
|
|
347
344
|
byteLength: binary.byteLength,
|
|
348
345
|
serviceId: message.serviceId,
|
|
@@ -541,11 +538,9 @@ export {
|
|
|
541
538
|
Protocol,
|
|
542
539
|
toUint8Array,
|
|
543
540
|
protocol,
|
|
544
|
-
|
|
545
|
-
CLOUDFLARE_RPC_MAX_BYTES,
|
|
541
|
+
CLOUDFLARE_MESSAGE_LENGTH_LIMIT,
|
|
546
542
|
WebSocketMuxer,
|
|
547
|
-
EDGE_WEBSOCKET_PROTOCOL_V0,
|
|
548
543
|
EDGE_WEBSOCKET_PROTOCOL_V1,
|
|
549
544
|
EdgeWsConnection
|
|
550
545
|
};
|
|
551
|
-
//# sourceMappingURL=chunk-
|
|
546
|
+
//# sourceMappingURL=chunk-5DDWS5EC.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/protocol.ts", "../../../src/defs.ts", "../../../src/edge-ws-muxer.ts", "../../../src/edge-ws-connection.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { invariant } from '@dxos/invariant';\nimport { buf, bufWkt } from '@dxos/protocols/buf';\nimport { type Message, MessageSchema, type PeerSchema } from '@dxos/protocols/buf/dxos/edge/messenger_pb';\nimport { bufferToArray } from '@dxos/util';\n\nexport type PeerData = buf.MessageInitShape<typeof PeerSchema>;\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\nimport { bufWkt } from '@dxos/protocols/buf';\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, bufWkt.AnySchema]);\n", "//\n// Copyright 2025 DXOS.org\n//\nimport WebSocket from 'isomorphic-ws';\n\nimport { Trigger } from '@dxos/async';\nimport { log } from '@dxos/log';\nimport { buf } from '@dxos/protocols/buf';\nimport { MessageSchema, type Message } from '@dxos/protocols/buf/dxos/edge/messenger_pb';\n\nimport { protocol } from './defs';\n\n/**\n * 0000 0001 - message contains a part of segmented message chunk sequence.\n * The next byte defines a channel id and the rest of the message contains a part of Message proto binary.\n * Messages from different channels might interleave.\n * When the flag is NOT set the rest of the message should be interpreted as the valid Message proto binary.\n */\nconst FLAG_SEGMENT_SEQ = 1;\n/**\n * 0000 0010 - message terminates a segmented message chunk sequence.\n * All the chunks accumulated for the channel specified by the second byte can be concatenated\n * and interpreted as a valid Message proto binary.\n */\nconst FLAG_SEGMENT_SEQ_TERMINATED = 1 << 1;\n\n/**\n * 1MB websocket message limit: https://developers.cloudflare.com/durable-objects/platform/limits/\n */\nexport const CLOUDFLARE_MESSAGE_LENGTH_LIMIT = 1024 * 1024;\n\nconst MAX_CHUNK_LENGTH = 16384;\nconst MAX_BUFFERED_AMOUNT = CLOUDFLARE_MESSAGE_LENGTH_LIMIT;\nconst BUFFER_FULL_BACKOFF_TIMEOUT = 100;\n\nexport class WebSocketMuxer {\n private readonly _incomingMessageAccumulator = new Map<number, Buffer[]>();\n private readonly _outgoingMessageChunks = new Map<number, MessageChunk[]>();\n private readonly _serviceToChannel = new Map<string, number>();\n\n private _sendTimeout: any | undefined;\n\n constructor(private readonly _ws: WebSocket) {}\n\n /**\n * Resolves when all the message chunks get enqueued for sending.\n */\n public async send(message: Message): Promise<void> {\n const binary = buf.toBinary(MessageSchema, message);\n const channelId = this._resolveChannel(message);\n if (channelId == null && binary.length > CLOUDFLARE_MESSAGE_LENGTH_LIMIT) {\n log.error('Large message dropped because channel resolution failed.', {\n byteLength: binary.byteLength,\n serviceId: message.serviceId,\n payload: protocol.getPayloadType(message),\n });\n return;\n }\n\n if (channelId == null || binary.length < MAX_CHUNK_LENGTH) {\n const flags = Buffer.from([0]);\n this._ws.send(Buffer.concat([flags, binary]));\n return;\n }\n\n const terminatorSentTrigger = new Trigger();\n const messageChunks: MessageChunk[] = [];\n for (let i = 0; i < binary.length; i += MAX_CHUNK_LENGTH) {\n const chunk = binary.slice(i, i + MAX_CHUNK_LENGTH);\n const isLastChunk = i + MAX_CHUNK_LENGTH < binary.length;\n if (isLastChunk) {\n const flags = Buffer.from([FLAG_SEGMENT_SEQ | FLAG_SEGMENT_SEQ_TERMINATED, channelId]);\n messageChunks.push({ payload: Buffer.concat([flags, chunk]), trigger: terminatorSentTrigger });\n } else {\n const flags = Buffer.from([FLAG_SEGMENT_SEQ]);\n messageChunks.push({ payload: Buffer.concat([flags, chunk]) });\n }\n }\n\n const queuedMessages = this._outgoingMessageChunks.get(channelId);\n if (queuedMessages) {\n queuedMessages.push(...messageChunks);\n } else {\n this._outgoingMessageChunks.set(channelId, messageChunks);\n }\n\n this._sendChunkedMessages();\n\n return terminatorSentTrigger.wait();\n }\n\n public receiveData(data: Uint8Array): Message | undefined {\n if ((data[0] & FLAG_SEGMENT_SEQ) === 0) {\n return buf.fromBinary(MessageSchema, data.slice(1));\n }\n\n const [flags, channelId, ...payload] = data;\n let chunkAccumulator = this._incomingMessageAccumulator.get(channelId);\n if (chunkAccumulator) {\n chunkAccumulator.push(Buffer.from(payload));\n } else {\n chunkAccumulator = [Buffer.from(payload)];\n this._incomingMessageAccumulator.set(channelId, chunkAccumulator);\n }\n\n if ((flags & FLAG_SEGMENT_SEQ_TERMINATED) === 0) {\n return undefined;\n }\n\n const message = buf.fromBinary(MessageSchema, Buffer.concat(chunkAccumulator));\n this._incomingMessageAccumulator.delete(channelId);\n return message;\n }\n\n public destroy() {\n if (this._sendTimeout) {\n clearTimeout(this._sendTimeout);\n this._sendTimeout = undefined;\n }\n for (const channelChunks of this._outgoingMessageChunks.values()) {\n channelChunks.forEach((chunk) => chunk.trigger?.wake());\n }\n this._outgoingMessageChunks.clear();\n this._incomingMessageAccumulator.clear();\n this._serviceToChannel.clear();\n }\n\n private _sendChunkedMessages() {\n if (this._sendTimeout) {\n return;\n }\n\n const send = () => {\n if (this._ws.readyState === WebSocket.CLOSING || this._ws.readyState === WebSocket.CLOSED) {\n log.warn('send called for closed websocket');\n this._sendTimeout = undefined;\n return;\n }\n\n let timeout = 0;\n const emptyChannels: number[] = [];\n for (const [channelId, messages] of this._outgoingMessageChunks.entries()) {\n if (this._ws.bufferedAmount + MAX_CHUNK_LENGTH > MAX_BUFFERED_AMOUNT) {\n timeout = BUFFER_FULL_BACKOFF_TIMEOUT;\n break;\n }\n\n const nextMessage = messages.shift();\n if (nextMessage) {\n this._ws.send(nextMessage.payload);\n nextMessage.trigger?.wake();\n } else {\n emptyChannels.push(channelId);\n }\n }\n\n emptyChannels.forEach((channelId) => this._outgoingMessageChunks.delete(channelId));\n\n if (this._outgoingMessageChunks.size > 0) {\n this._sendTimeout = setTimeout(send, timeout);\n } else {\n this._sendTimeout = undefined;\n }\n };\n this._sendTimeout = setTimeout(send);\n }\n\n private _resolveChannel(message: Message): number | undefined {\n if (!message.serviceId) {\n return undefined;\n }\n let id = this._serviceToChannel.get(message.serviceId);\n if (!id) {\n id = this._serviceToChannel.size + 1;\n this._serviceToChannel.set(message.serviceId, id);\n }\n return id;\n }\n}\n\ntype MessageChunk = {\n payload: Buffer;\n /**\n * Wakes when the payload is enqueued by WebSocket.\n */\n trigger?: Trigger;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport WebSocket from 'isomorphic-ws';\n\nimport { scheduleTask, scheduleTaskInterval } from '@dxos/async';\nimport { Context, Resource } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\nimport { log, logInfo } from '@dxos/log';\nimport { buf } from '@dxos/protocols/buf';\nimport { MessageSchema, type Message } from '@dxos/protocols/buf/dxos/edge/messenger_pb';\n\nimport { protocol } from './defs';\nimport { type EdgeIdentity } from './edge-identity';\nimport { CLOUDFLARE_MESSAGE_LENGTH_LIMIT, WebSocketMuxer } from './edge-ws-muxer';\nimport { toUint8Array } from './protocol';\n\nconst SIGNAL_KEEPALIVE_INTERVAL = 4_000;\nconst SIGNAL_KEEPALIVE_TIMEOUT = 12_000;\n\nconst EDGE_WEBSOCKET_PROTOCOL_V0 = 'edge-ws-v0';\n/**\n * Supports message segmentation and muxing.\n */\nexport const EDGE_WEBSOCKET_PROTOCOL_V1 = 'edge-ws-v1';\n\nexport type EdgeWsConnectionCallbacks = {\n onConnected: () => void;\n onMessage: (message: Message) => void;\n onRestartRequired: () => void;\n};\n\nexport class EdgeWsConnection extends Resource {\n private _inactivityTimeoutCtx: Context | undefined;\n private _ws: WebSocket | undefined;\n private _wsMuxer: WebSocketMuxer | undefined;\n\n constructor(\n private readonly _identity: EdgeIdentity,\n private readonly _connectionInfo: { url: URL; protocolHeader?: string },\n private readonly _callbacks: EdgeWsConnectionCallbacks,\n ) {\n super();\n }\n\n @logInfo\n public get info() {\n return {\n open: this.isOpen,\n identity: this._identity.identityKey,\n device: this._identity.peerKey,\n };\n }\n\n public send(message: Message) {\n invariant(this._ws);\n invariant(this._wsMuxer);\n log('sending...', { peerKey: this._identity.peerKey, payload: protocol.getPayloadType(message) });\n if (this._ws?.protocol.includes(EDGE_WEBSOCKET_PROTOCOL_V0)) {\n const binary = buf.toBinary(MessageSchema, message);\n if (binary.length > CLOUDFLARE_MESSAGE_LENGTH_LIMIT) {\n log.error('Message dropped because it was too large (>1MB).', {\n byteLength: binary.byteLength,\n serviceId: message.serviceId,\n payload: protocol.getPayloadType(message),\n });\n return;\n }\n this._ws.send(binary);\n } else {\n this._wsMuxer.send(message).catch((e) => log.catch(e));\n }\n }\n\n protected override async _open() {\n const baseProtocols = [EDGE_WEBSOCKET_PROTOCOL_V0, EDGE_WEBSOCKET_PROTOCOL_V1];\n this._ws = new WebSocket(\n this._connectionInfo.url.toString(),\n this._connectionInfo.protocolHeader\n ? [...baseProtocols, this._connectionInfo.protocolHeader]\n : [...baseProtocols],\n );\n const muxer = new WebSocketMuxer(this._ws);\n this._wsMuxer = muxer;\n\n this._ws.onopen = () => {\n if (this.isOpen) {\n log('connected');\n this._callbacks.onConnected();\n this._scheduleHeartbeats();\n } else {\n log.verbose('connected after becoming inactive', { currentIdentity: this._identity });\n }\n };\n this._ws.onclose = (event) => {\n if (this.isOpen) {\n log.warn('disconnected while being open', { code: event.code, reason: event.reason });\n this._callbacks.onRestartRequired();\n muxer.destroy();\n }\n };\n this._ws.onerror = (event) => {\n if (this.isOpen) {\n log.warn('edge connection socket error', { error: event.error, info: event.message });\n this._callbacks.onRestartRequired();\n } else {\n log.verbose('error ignored on closed connection', { error: event.error });\n }\n };\n /**\n * https://developer.mozilla.org/en-US/docs/Web/API/MessageEvent/data\n */\n this._ws.onmessage = async (event) => {\n if (!this.isOpen) {\n log.verbose('message ignored on closed connection', { event: event.type });\n return;\n }\n if (event.data === '__pong__') {\n this._rescheduleHeartbeatTimeout();\n return;\n }\n const bytes = await toUint8Array(event.data);\n if (!this.isOpen) {\n return;\n }\n\n const message = this._ws?.protocol?.includes(EDGE_WEBSOCKET_PROTOCOL_V0)\n ? buf.fromBinary(MessageSchema, bytes)\n : muxer.receiveData(bytes);\n\n if (message) {\n log('received', { from: message.source, payload: protocol.getPayloadType(message) });\n this._callbacks.onMessage(message);\n }\n };\n }\n\n protected override async _close() {\n void this._inactivityTimeoutCtx?.dispose().catch(() => {});\n\n try {\n this._ws?.close();\n this._ws = undefined;\n this._wsMuxer?.destroy();\n this._wsMuxer = 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 private _scheduleHeartbeats() {\n invariant(this._ws);\n scheduleTaskInterval(\n this._ctx,\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._rescheduleHeartbeatTimeout();\n }\n\n private _rescheduleHeartbeatTimeout() {\n if (!this.isOpen) {\n return;\n }\n void this._inactivityTimeoutCtx?.dispose();\n this._inactivityTimeoutCtx = new Context();\n scheduleTask(\n this._inactivityTimeoutCtx,\n () => {\n if (this.isOpen) {\n log.warn('restart due to inactivity timeout');\n this._callbacks.onRestartRequired();\n }\n },\n SIGNAL_KEEPALIVE_TIMEOUT,\n );\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["invariant", "buf", "bufWkt", "MessageSchema", "bufferToArray", "getTypename", "typeName", "Protocol", "constructor", "types", "_typeRegistry", "createRegistry", "typeRegistry", "toJson", "message", "registry", "err", "type", "getPayloadType", "getPayload", "payload", "payloadTypename", "Error", "anyIs", "anyUnpack", "undefined", "typeUrl", "split", "createMessage", "source", "target", "serviceId", "create", "timestamp", "Date", "toISOString", "anyPack", "toUint8Array", "data", "Buffer", "Blob", "Uint8Array", "arrayBuffer", "bufWkt", "SwarmRequestSchema", "SwarmResponseSchema", "TextMessageSchema", "protocol", "Protocol", "SwarmRequestSchema", "SwarmResponseSchema", "TextMessageSchema", "bufWkt", "AnySchema", "WebSocket", "Trigger", "log", "buf", "MessageSchema", "FLAG_SEGMENT_SEQ", "FLAG_SEGMENT_SEQ_TERMINATED", "CLOUDFLARE_MESSAGE_LENGTH_LIMIT", "MAX_CHUNK_LENGTH", "MAX_BUFFERED_AMOUNT", "BUFFER_FULL_BACKOFF_TIMEOUT", "WebSocketMuxer", "constructor", "_ws", "_incomingMessageAccumulator", "Map", "_outgoingMessageChunks", "_serviceToChannel", "send", "message", "binary", "buf", "toBinary", "MessageSchema", "channelId", "_resolveChannel", "length", "log", "error", "byteLength", "serviceId", "payload", "protocol", "getPayloadType", "flags", "Buffer", "from", "concat", "terminatorSentTrigger", "Trigger", "messageChunks", "i", "chunk", "slice", "isLastChunk", "push", "trigger", "queuedMessages", "get", "set", "_sendChunkedMessages", "wait", "receiveData", "data", "fromBinary", "chunkAccumulator", "undefined", "delete", "destroy", "_sendTimeout", "clearTimeout", "channelChunks", "values", "forEach", "wake", "clear", "readyState", "WebSocket", "CLOSING", "CLOSED", "warn", "timeout", "emptyChannels", "messages", "entries", "bufferedAmount", "nextMessage", "shift", "size", "setTimeout", "id", "WebSocket", "scheduleTask", "scheduleTaskInterval", "Context", "Resource", "invariant", "log", "logInfo", "buf", "MessageSchema", "SIGNAL_KEEPALIVE_INTERVAL", "SIGNAL_KEEPALIVE_TIMEOUT", "EDGE_WEBSOCKET_PROTOCOL_V0", "EDGE_WEBSOCKET_PROTOCOL_V1", "EdgeWsConnection", "Resource", "constructor", "_identity", "_connectionInfo", "_callbacks", "info", "open", "isOpen", "identity", "identityKey", "device", "peerKey", "send", "message", "invariant", "_ws", "_wsMuxer", "log", "payload", "protocol", "getPayloadType", "includes", "binary", "buf", "toBinary", "MessageSchema", "length", "CLOUDFLARE_MESSAGE_LENGTH_LIMIT", "error", "byteLength", "serviceId", "catch", "e", "_open", "baseProtocols", "WebSocket", "url", "toString", "protocolHeader", "muxer", "WebSocketMuxer", "onopen", "onConnected", "_scheduleHeartbeats", "verbose", "currentIdentity", "onclose", "event", "warn", "code", "reason", "onRestartRequired", "destroy", "onerror", "onmessage", "type", "data", "_rescheduleHeartbeatTimeout", "bytes", "toUint8Array", "fromBinary", "receiveData", "from", "source", "onMessage", "_close", "_inactivityTimeoutCtx", "dispose", "close", "undefined", "err", "Error", "scheduleTaskInterval", "_ctx", "Context", "scheduleTask", "logInfo"]
|
|
7
|
+
}
|
|
@@ -1,15 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
CLOUDFLARE_RPC_MAX_BYTES,
|
|
4
|
-
EDGE_WEBSOCKET_PROTOCOL_V0,
|
|
5
|
-
EDGE_WEBSOCKET_PROTOCOL_V1,
|
|
2
|
+
CLOUDFLARE_MESSAGE_LENGTH_LIMIT,
|
|
6
3
|
EdgeWsConnection,
|
|
7
4
|
Protocol,
|
|
8
5
|
WebSocketMuxer,
|
|
9
6
|
getTypename,
|
|
10
7
|
protocol,
|
|
11
8
|
toUint8Array
|
|
12
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-5DDWS5EC.mjs";
|
|
13
10
|
|
|
14
11
|
// packages/core/mesh/edge-client/src/index.ts
|
|
15
12
|
export * from "@dxos/protocols/buf/dxos/edge/messenger_pb";
|
|
@@ -774,10 +771,7 @@ var encodeAuthHeader = (challenge) => {
|
|
|
774
771
|
return `VerifiablePresentation pb;base64,${encodedChallenge}`;
|
|
775
772
|
};
|
|
776
773
|
export {
|
|
777
|
-
|
|
778
|
-
CLOUDFLARE_RPC_MAX_BYTES,
|
|
779
|
-
EDGE_WEBSOCKET_PROTOCOL_V0,
|
|
780
|
-
EDGE_WEBSOCKET_PROTOCOL_V1,
|
|
774
|
+
CLOUDFLARE_MESSAGE_LENGTH_LIMIT,
|
|
781
775
|
EdgeClient,
|
|
782
776
|
EdgeConnectionClosedError,
|
|
783
777
|
EdgeHttpClient,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/index.ts", "../../../src/edge-client.ts", "../../../src/edge-identity.ts", "../../../src/errors.ts", "../../../src/utils.ts", "../../../src/auth.ts", "../../../src/edge-http-client.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';\nexport * from './auth';\nexport * from './edge-http-client';\nexport * from './edge-identity';\nexport * from './edge-ws-muxer';\nexport { EDGE_WEBSOCKET_PROTOCOL_V0, EDGE_WEBSOCKET_PROTOCOL_V1 } from './edge-ws-connection';\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Trigger, scheduleMicroTask, TriggerState, PersistentLifecycle, Event } from '@dxos/async';\nimport { Resource, type Lifecycle } from '@dxos/context';\nimport { log, logInfo } from '@dxos/log';\nimport { type Message } from '@dxos/protocols/buf/dxos/edge/messenger_pb';\nimport { EdgeStatus } from '@dxos/protocols/proto/dxos/client/services';\n\nimport { protocol } from './defs';\nimport { type EdgeIdentity, handleAuthChallenge } from './edge-identity';\nimport { EdgeWsConnection } from './edge-ws-connection';\nimport { EdgeConnectionClosedError, EdgeIdentityChangedError } from './errors';\nimport { type Protocol } from './protocol';\nimport { getEdgeUrlWithProtocol } from './utils';\n\nconst DEFAULT_TIMEOUT = 10_000;\n\nexport type MessageListener = (message: Message) => void;\nexport type ReconnectListener = () => void;\n\nexport interface EdgeConnection extends Required<Lifecycle> {\n statusChanged: Event<EdgeStatus>;\n get info(): any;\n get identityKey(): string;\n get peerKey(): string;\n get isOpen(): boolean;\n get status(): EdgeStatus;\n setIdentity(identity: EdgeIdentity): void;\n onMessage(listener: MessageListener): () => void;\n onReconnected(listener: ReconnectListener): () => void;\n send(message: Message): Promise<void>;\n}\n\nexport type MessengerConfig = {\n socketEndpoint: string;\n timeout?: number;\n protocol?: Protocol;\n disableAuth?: boolean;\n};\n\n/**\n * Messenger client for EDGE:\n * - While open, uses PersistentLifecycle to keep an open EdgeWsConnection, reconnecting on failures.\n * - Manages identity and re-create EdgeWsConnection when identity changes.\n * - Dispatches connection state and message notifications.\n */\nexport class EdgeClient extends Resource implements EdgeConnection {\n public readonly statusChanged = new Event<EdgeStatus>();\n\n private readonly _persistentLifecycle = new PersistentLifecycle<EdgeWsConnection>({\n start: async () => this._connect(),\n stop: async (state: EdgeWsConnection) => this._disconnect(state),\n });\n\n private readonly _messageListeners = new Set<MessageListener>();\n private readonly _reconnectListeners = new Set<ReconnectListener>();\n private readonly _baseWsUrl: string;\n private readonly _baseHttpUrl: string;\n private _currentConnection?: EdgeWsConnection = undefined;\n private _ready = new Trigger();\n\n constructor(\n private _identity: EdgeIdentity,\n private readonly _config: MessengerConfig,\n ) {\n super();\n this._baseWsUrl = getEdgeUrlWithProtocol(_config.socketEndpoint, 'ws');\n this._baseHttpUrl = getEdgeUrlWithProtocol(_config.socketEndpoint, 'http');\n }\n\n @logInfo\n public get info() {\n return {\n open: this.isOpen,\n status: this.status,\n identity: this._identity.identityKey,\n device: this._identity.peerKey,\n };\n }\n\n get status(): EdgeStatus {\n return Boolean(this._currentConnection) && this._ready.state === TriggerState.RESOLVED\n ? EdgeStatus.CONNECTED\n : EdgeStatus.NOT_CONNECTED;\n }\n\n get identityKey() {\n return this._identity.identityKey;\n }\n\n get peerKey() {\n return this._identity.peerKey;\n }\n\n setIdentity(identity: EdgeIdentity) {\n if (identity.identityKey !== this._identity.identityKey || identity.peerKey !== this._identity.peerKey) {\n log('Edge identity changed', { identity, oldIdentity: this._identity });\n this._identity = identity;\n this._closeCurrentConnection(new EdgeIdentityChangedError());\n void this._persistentLifecycle.scheduleRestart();\n }\n }\n\n public onMessage(listener: MessageListener): () => void {\n this._messageListeners.add(listener);\n return () => this._messageListeners.delete(listener);\n }\n\n public onReconnected(listener: () => void): () => void {\n this._reconnectListeners.add(listener);\n if (this._ready.state === TriggerState.RESOLVED) {\n // Microtask so that listener is always called asynchronously, no matter the state of the ready trigger\n // at the moment of registration.\n scheduleMicroTask(this._ctx, () => {\n if (this._reconnectListeners.has(listener)) {\n try {\n listener();\n } catch (error) {\n log.catch(error);\n }\n }\n });\n }\n return () => this._reconnectListeners.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._identity.peerKey });\n this._closeCurrentConnection();\n await this._persistentLifecycle.close();\n }\n\n private async _connect(): Promise<EdgeWsConnection | undefined> {\n if (this._ctx.disposed) {\n return undefined;\n }\n\n const identity = this._identity;\n const path = `/ws/${identity.identityKey}/${identity.peerKey}`;\n const protocolHeader = this._config.disableAuth ? undefined : await this._createAuthHeader(path);\n if (this._identity !== identity) {\n log('identity changed during auth header request');\n return undefined;\n }\n\n const restartRequired = new Trigger();\n const url = new URL(path, this._baseWsUrl);\n log('Opening websocket', { url: url.toString(), protocolHeader });\n const connection = new EdgeWsConnection(\n identity,\n { url, protocolHeader },\n {\n onConnected: () => {\n if (this._isActive(connection)) {\n this._ready.wake();\n this._notifyReconnected();\n } else {\n log.verbose('connected callback ignored, because connection is not active');\n }\n },\n onRestartRequired: () => {\n if (this._isActive(connection)) {\n this._closeCurrentConnection();\n void this._persistentLifecycle.scheduleRestart();\n } else {\n log.verbose('restart requested by inactive connection');\n }\n restartRequired.wake();\n },\n onMessage: (message) => {\n if (this._isActive(connection)) {\n this._notifyMessageReceived(message);\n } else {\n log.verbose('ignored a message on inactive connection', {\n from: message.source,\n type: message.payload?.typeUrl,\n });\n }\n },\n },\n );\n this._currentConnection = connection;\n\n await connection.open();\n // Race with restartRequired so that restart is not blocked by _connect execution.\n // Wait on ready to attempt a reconnect if it times out.\n await Promise.race([this._ready.wait({ timeout: this._config.timeout ?? DEFAULT_TIMEOUT }), restartRequired]);\n\n return connection;\n }\n\n private async _disconnect(state: EdgeWsConnection) {\n await state.close();\n this.statusChanged.emit(this.status);\n }\n\n private _closeCurrentConnection(error: Error = new EdgeConnectionClosedError()) {\n this._currentConnection = undefined;\n this._ready.throw(error);\n this._ready.reset();\n this.statusChanged.emit(this.status);\n }\n\n private _notifyReconnected() {\n this.statusChanged.emit(this.status);\n for (const listener of this._reconnectListeners) {\n try {\n listener();\n } catch (err) {\n log.error('ws reconnect listener failed', { err });\n }\n }\n }\n\n private _notifyMessageReceived(message: Message) {\n for (const listener of this._messageListeners) {\n try {\n listener(message);\n } catch (err) {\n log.error('ws incoming message processing failed', { err, payload: protocol.getPayloadType(message) });\n }\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\n if (!this._currentConnection) {\n throw new EdgeConnectionClosedError();\n }\n\n if (\n message.source &&\n (message.source.peerKey !== this._identity.peerKey || message.source.identityKey !== this.identityKey)\n ) {\n throw new EdgeIdentityChangedError();\n }\n\n this._currentConnection.send(message);\n }\n\n private async _createAuthHeader(path: string): Promise<string | undefined> {\n const httpUrl = new URL(path, this._baseHttpUrl);\n httpUrl.protocol = getEdgeUrlWithProtocol(this._baseWsUrl.toString(), 'http');\n const response = await fetch(httpUrl, { method: 'GET' });\n if (response.status === 401) {\n return encodePresentationWsAuthHeader(await handleAuthChallenge(response, this._identity));\n } else {\n log.warn('no auth challenge from edge', { status: response.status, statusText: response.statusText });\n return undefined;\n }\n }\n\n private _isActive = (connection: EdgeWsConnection) => connection === this._currentConnection;\n}\n\nconst encodePresentationWsAuthHeader = (encodedPresentation: Uint8Array): string => {\n // = and / characters are not allowed in the WebSocket subprotocol header.\n const encodedToken = Buffer.from(encodedPresentation).toString('base64').replace(/=*$/, '').replaceAll('/', '|');\n return `base64url.bearer.authorization.dxos.org.${encodedToken}`;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { invariant } from '@dxos/invariant';\nimport { schema } from '@dxos/protocols/proto';\nimport { type Presentation } from '@dxos/protocols/proto/dxos/halo/credentials';\n\nexport interface EdgeIdentity {\n peerKey: string;\n identityKey: string;\n /**\n * Returns credential presentation issued by the identity key.\n * Presentation must have the provided challenge.\n * Presentation may include ServiceAccess credentials.\n */\n presentCredentials({ challenge }: { challenge: Uint8Array }): Promise<Presentation>;\n}\n\nexport const handleAuthChallenge = async (failedResponse: Response, identity: EdgeIdentity): Promise<Uint8Array> => {\n invariant(failedResponse.status === 401);\n\n const headerValue = failedResponse.headers.get('Www-Authenticate');\n invariant(headerValue?.startsWith('VerifiablePresentation challenge='));\n\n const challenge = headerValue?.slice('VerifiablePresentation challenge='.length);\n invariant(challenge);\n\n const presentation = await identity.presentCredentials({ challenge: Buffer.from(challenge, 'base64') });\n return schema.getCodecForType('dxos.halo.credentials.Presentation').encode(presentation);\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\nexport const getEdgeUrlWithProtocol = (baseUrl: string, protocol: 'http' | 'ws') => {\n const isSecure = baseUrl.startsWith('https') || baseUrl.startsWith('wss');\n const url = new URL(baseUrl);\n url.protocol = protocol + (isSecure ? 's' : '');\n return url.toString();\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { createCredential, signPresentation } from '@dxos/credentials';\nimport { type Signer } from '@dxos/crypto';\nimport { invariant } from '@dxos/invariant';\nimport { Keyring } from '@dxos/keyring';\nimport { PublicKey } from '@dxos/keys';\nimport { type Chain, type Credential } from '@dxos/protocols/proto/dxos/halo/credentials';\n\nimport type { EdgeIdentity } from './edge-identity';\n\n/**\n * Edge identity backed by a device key without a credential chain.\n */\nexport const createDeviceEdgeIdentity = async (signer: Signer, key: PublicKey): Promise<EdgeIdentity> => {\n return {\n identityKey: key.toHex(),\n peerKey: key.toHex(),\n presentCredentials: async ({ challenge }) => {\n return signPresentation({\n presentation: {\n credentials: [\n // Verifier requires at least one credential in the presentation to establish the subject.\n await createCredential({\n assertion: {\n '@type': 'dxos.halo.credentials.Auth',\n },\n issuer: key,\n subject: key,\n signer,\n }),\n ],\n },\n signer,\n signerKey: key,\n nonce: challenge,\n });\n },\n };\n};\n\n/**\n * Edge identity backed by a chain of credentials.\n */\nexport const createChainEdgeIdentity = async (\n signer: Signer,\n identityKey: PublicKey,\n peerKey: PublicKey,\n chain: Chain | undefined,\n credentials: Credential[],\n): Promise<EdgeIdentity> => {\n const credentialsToSign =\n credentials.length > 0\n ? credentials\n : [\n await createCredential({\n assertion: {\n '@type': 'dxos.halo.credentials.Auth',\n },\n issuer: identityKey,\n subject: identityKey,\n signer,\n chain,\n signingKey: peerKey,\n }),\n ];\n\n return {\n identityKey: identityKey.toHex(),\n peerKey: peerKey.toHex(),\n presentCredentials: async ({ challenge }) => {\n // TODO: make chain required after device invitation flow update release\n invariant(chain);\n return signPresentation({\n presentation: {\n credentials: credentialsToSign,\n },\n signer,\n nonce: challenge,\n signerKey: peerKey,\n chain,\n });\n },\n };\n};\n\n/**\n * Edge identity backed by a random ephemeral key without HALO.\n */\nexport const createEphemeralEdgeIdentity = async (): Promise<EdgeIdentity> => {\n const keyring = new Keyring();\n const key = await keyring.createKey();\n return createDeviceEdgeIdentity(keyring, key);\n};\n\n/**\n * Creates a HALO chain of credentials to act as an edge identity.\n */\nexport const createTestHaloEdgeIdentity = async (\n signer: Signer,\n identityKey: PublicKey,\n deviceKey: PublicKey,\n): Promise<EdgeIdentity> => {\n const deviceAdmission = await createCredential({\n assertion: {\n '@type': 'dxos.halo.credentials.AuthorizedDevice',\n deviceKey,\n identityKey,\n },\n issuer: identityKey,\n subject: deviceKey,\n signer,\n });\n return createChainEdgeIdentity(signer, identityKey, deviceKey, { credential: deviceAdmission }, [\n await createCredential({\n assertion: {\n '@type': 'dxos.halo.credentials.Auth',\n },\n issuer: identityKey,\n subject: identityKey,\n signer,\n }),\n ]);\n};\n\nexport const createStubEdgeIdentity = (): EdgeIdentity => {\n const identityKey = PublicKey.random();\n const deviceKey = PublicKey.random();\n return {\n identityKey: identityKey.toHex(),\n peerKey: deviceKey.toHex(),\n presentCredentials: async () => {\n throw new Error('Stub identity does not support authentication.');\n },\n };\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { sleep } from '@dxos/async';\nimport { Context } from '@dxos/context';\nimport { type PublicKey, type SpaceId } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport {\n EdgeCallFailedError,\n type EdgeHttpResponse,\n type GetNotarizationResponseBody,\n type PostNotarizationRequestBody,\n type JoinSpaceRequest,\n type JoinSpaceResponseBody,\n EdgeAuthChallengeError,\n type CreateAgentResponseBody,\n type CreateAgentRequestBody,\n type GetAgentStatusResponseBody,\n type RecoverIdentityRequest,\n type RecoverIdentityResponseBody,\n type UploadFunctionRequest,\n type UploadFunctionResponseBody,\n type ObjectId,\n type ExecuteWorkflowResponseBody,\n type QueueQuery,\n type QueryResult,\n type InitiateOAuthFlowRequest,\n type InitiateOAuthFlowResponse,\n type CreateSpaceRequest,\n type CreateSpaceResponseBody,\n} from '@dxos/protocols';\n\nimport { type EdgeIdentity, handleAuthChallenge } from './edge-identity';\nimport { getEdgeUrlWithProtocol } from './utils';\n\nconst DEFAULT_RETRY_TIMEOUT = 1500;\nconst DEFAULT_RETRY_JITTER = 500;\nconst DEFAULT_MAX_RETRIES_COUNT = 3;\n\nexport class EdgeHttpClient {\n private readonly _baseUrl: string;\n\n private _edgeIdentity: EdgeIdentity | undefined;\n\n /**\n * Auth header is cached until receiving the next 401 from EDGE, at which point it gets refreshed.\n */\n private _authHeader: string | undefined;\n\n constructor(baseUrl: string) {\n this._baseUrl = getEdgeUrlWithProtocol(baseUrl, 'http');\n log('created', { url: this._baseUrl });\n }\n\n get baseUrl() {\n return this._baseUrl;\n }\n\n setIdentity(identity: EdgeIdentity) {\n if (this._edgeIdentity?.identityKey !== identity.identityKey || this._edgeIdentity?.peerKey !== identity.peerKey) {\n this._edgeIdentity = identity;\n this._authHeader = undefined;\n }\n }\n\n public createAgent(body: CreateAgentRequestBody, args?: EdgeHttpGetArgs): Promise<CreateAgentResponseBody> {\n return this._call('/agents/create', { ...args, method: 'POST', body });\n }\n\n public getAgentStatus(\n request: { ownerIdentityKey: PublicKey },\n args?: EdgeHttpGetArgs,\n ): Promise<GetAgentStatusResponseBody> {\n return this._call(`/users/${request.ownerIdentityKey.toHex()}/agent/status`, { ...args, method: 'GET' });\n }\n\n public getCredentialsForNotarization(spaceId: SpaceId, args?: EdgeHttpGetArgs): Promise<GetNotarizationResponseBody> {\n return this._call(`/spaces/${spaceId}/notarization`, { ...args, method: 'GET' });\n }\n\n public async notarizeCredentials(\n spaceId: SpaceId,\n body: PostNotarizationRequestBody,\n args?: EdgeHttpGetArgs,\n ): Promise<void> {\n await this._call(`/spaces/${spaceId}/notarization`, { ...args, body, method: 'POST' });\n }\n\n public async joinSpaceByInvitation(\n spaceId: SpaceId,\n body: JoinSpaceRequest,\n args?: EdgeHttpGetArgs,\n ): Promise<JoinSpaceResponseBody> {\n return this._call(`/spaces/${spaceId}/join`, { ...args, body, method: 'POST' });\n }\n\n public async recoverIdentity(\n body: RecoverIdentityRequest,\n args?: EdgeHttpGetArgs,\n ): Promise<RecoverIdentityResponseBody> {\n return this._call('/identity/recover', { ...args, body, method: 'POST' });\n }\n\n public async executeWorkflow(\n spaceId: SpaceId,\n graphId: ObjectId,\n input: any,\n args?: EdgeHttpGetArgs,\n ): Promise<ExecuteWorkflowResponseBody> {\n return this._call(`/workflows/${spaceId}/${graphId}`, { ...args, body: input, method: 'POST' });\n }\n\n public async uploadFunction(\n pathParts: { spaceId: SpaceId; functionId?: string },\n body: UploadFunctionRequest,\n args?: EdgeHttpGetArgs,\n ): Promise<UploadFunctionResponseBody> {\n const path = ['functions', pathParts.spaceId, ...(pathParts.functionId ? [pathParts.functionId] : [])].join('/');\n return this._call(path, { ...args, body, method: 'PUT' });\n }\n\n public async initiateOAuthFlow(\n body: InitiateOAuthFlowRequest,\n args?: EdgeHttpGetArgs,\n ): Promise<InitiateOAuthFlowResponse> {\n return this._call('/oauth/initiate', { ...args, body, method: 'POST' });\n }\n\n public async queryQueue(\n subspaceTag: string,\n spaceId: SpaceId,\n query: QueueQuery,\n args?: EdgeHttpGetArgs,\n ): Promise<QueryResult> {\n const { queueId } = query;\n const queryParams = new URLSearchParams();\n if (query.after != null) {\n queryParams.set('after', query.after);\n }\n if (query.before != null) {\n queryParams.set('before', query.before);\n }\n if (query.limit != null) {\n queryParams.set('limit', query.limit.toString());\n }\n if (query.reverse != null) {\n queryParams.set('reverse', query.reverse.toString());\n }\n if (query.objectIds != null) {\n queryParams.set('objectIds', query.objectIds.join(','));\n }\n return this._call(`/spaces/${subspaceTag}/${spaceId}/queue/${queueId}/query?${queryParams.toString()}`, {\n ...args,\n method: 'GET',\n });\n }\n\n public async insertIntoQueue(\n subspaceTag: string,\n spaceId: SpaceId,\n queueId: ObjectId,\n objects: unknown[],\n args?: EdgeHttpGetArgs,\n ): Promise<void> {\n return this._call(`/spaces/${subspaceTag}/${spaceId}/queue/${queueId}`, {\n ...args,\n body: { objects },\n method: 'POST',\n });\n }\n\n async deleteFromQueue(\n subspaceTag: string,\n spaceId: SpaceId,\n queueId: ObjectId,\n objectIds: ObjectId[],\n args?: EdgeHttpGetArgs,\n ): Promise<void> {\n return this._call(`/spaces/${subspaceTag}/${spaceId}/queue/${queueId}`, {\n ...args,\n query: { ids: objectIds.join(',') },\n method: 'DELETE',\n });\n }\n\n async createSpace(body: CreateSpaceRequest, args?: EdgeHttpGetArgs): Promise<CreateSpaceResponseBody> {\n return this._call('/spaces/create', { ...args, body, method: 'POST' });\n }\n\n private async _call<T>(path: string, args: EdgeHttpCallArgs): Promise<T> {\n const requestContext = args.context ?? new Context();\n const shouldRetry = createRetryHandler(args);\n let url = `${this._baseUrl}${path.startsWith('/') ? path.slice(1) : path}`;\n\n if (args.query) {\n const queryParams = new URLSearchParams();\n for (const [key, value] of Object.entries(args.query)) {\n queryParams.set(key, value.toString());\n }\n url += `?${queryParams.toString()}`;\n }\n\n log('call', { method: args.method, path, request: args.body });\n\n let handledAuth = false;\n let authHeader = this._authHeader;\n while (true) {\n let processingError: EdgeCallFailedError;\n let retryAfterHeaderValue: number = Number.NaN;\n try {\n const request = createRequest(args, authHeader);\n const response = await fetch(url, request);\n\n retryAfterHeaderValue = Number(response.headers.get('Retry-After'));\n\n if (response.ok) {\n const body = (await response.json()) as EdgeHttpResponse<T>;\n if (body.success) {\n return body.data;\n }\n\n log('unsuccessful edge response', { path, body });\n\n if (body.errorData?.type === 'auth_challenge' && typeof body.errorData?.challenge === 'string') {\n processingError = new EdgeAuthChallengeError(body.errorData.challenge, body.errorData);\n } else {\n processingError = EdgeCallFailedError.fromUnsuccessfulResponse(response, body);\n }\n } else if (response.status === 401 && !handledAuth) {\n authHeader = await this._handleUnauthorized(response);\n handledAuth = true;\n continue;\n } else {\n processingError = EdgeCallFailedError.fromHttpFailure(response);\n }\n } catch (error: any) {\n processingError = EdgeCallFailedError.fromProcessingFailureCause(error);\n }\n\n if (processingError.isRetryable && (await shouldRetry(requestContext, retryAfterHeaderValue))) {\n log('retrying edge request', { path, processingError });\n } else {\n throw processingError;\n }\n }\n }\n\n private async _handleUnauthorized(response: Response) {\n if (!this._edgeIdentity) {\n log.warn('edge unauthorized response received before identity was set');\n throw EdgeCallFailedError.fromHttpFailure(response);\n }\n const challenge = await handleAuthChallenge(response, this._edgeIdentity);\n this._authHeader = encodeAuthHeader(challenge);\n log('auth header updated');\n return this._authHeader;\n }\n}\n\nconst createRetryHandler = (args: EdgeHttpCallArgs) => {\n if (!args.retry || args.retry.count < 1) {\n return async () => false;\n }\n let retries = 0;\n const maxRetries = args.retry.count ?? DEFAULT_MAX_RETRIES_COUNT;\n const baseTimeout = args.retry.timeout ?? DEFAULT_RETRY_TIMEOUT;\n const jitter = args.retry.jitter ?? DEFAULT_RETRY_JITTER;\n return async (ctx: Context, retryAfter: number) => {\n if (++retries > maxRetries || ctx.disposed) {\n return false;\n }\n\n if (retryAfter) {\n await sleep(retryAfter);\n } else {\n const timeout = baseTimeout + Math.random() * jitter;\n await sleep(timeout);\n }\n\n return true;\n };\n};\n\nexport type RetryConfig = {\n /**\n * A number of call retries, not counting the initial request.\n */\n count: number;\n /**\n * Delay before retries in ms.\n */\n timeout?: number;\n /**\n * A random amount of time before retrying to help prevent large bursts of requests.\n */\n jitter?: number;\n};\n\nexport type EdgeHttpGetArgs = { context?: Context; retry?: RetryConfig };\n\nexport type EdgeHttpPostArgs = { context?: Context; body?: any; retry?: RetryConfig };\n\ntype EdgeHttpCallArgs = {\n method: string;\n body?: any;\n context?: Context;\n retry?: RetryConfig;\n query?: Record<string, string>;\n};\n\nconst createRequest = (args: EdgeHttpCallArgs, authHeader: string | undefined): RequestInit => {\n return {\n method: args.method,\n body: args.body && JSON.stringify(args.body),\n headers: authHeader ? { Authorization: authHeader } : undefined,\n };\n};\n\nconst encodeAuthHeader = (challenge: Uint8Array) => {\n const encodedChallenge = Buffer.from(challenge).toString('base64');\n return `VerifiablePresentation pb;base64,${encodedChallenge}`;\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
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';\nexport * from './auth';\nexport * from './edge-http-client';\nexport * from './edge-identity';\nexport * from './edge-ws-muxer';\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Trigger, scheduleMicroTask, TriggerState, PersistentLifecycle, Event } from '@dxos/async';\nimport { Resource, type Lifecycle } from '@dxos/context';\nimport { log, logInfo } from '@dxos/log';\nimport { type Message } from '@dxos/protocols/buf/dxos/edge/messenger_pb';\nimport { EdgeStatus } from '@dxos/protocols/proto/dxos/client/services';\n\nimport { protocol } from './defs';\nimport { type EdgeIdentity, handleAuthChallenge } from './edge-identity';\nimport { EdgeWsConnection } from './edge-ws-connection';\nimport { EdgeConnectionClosedError, EdgeIdentityChangedError } from './errors';\nimport { type Protocol } from './protocol';\nimport { getEdgeUrlWithProtocol } from './utils';\n\nconst DEFAULT_TIMEOUT = 10_000;\n\nexport type MessageListener = (message: Message) => void;\nexport type ReconnectListener = () => void;\n\nexport interface EdgeConnection extends Required<Lifecycle> {\n statusChanged: Event<EdgeStatus>;\n get info(): any;\n get identityKey(): string;\n get peerKey(): string;\n get isOpen(): boolean;\n get status(): EdgeStatus;\n setIdentity(identity: EdgeIdentity): void;\n onMessage(listener: MessageListener): () => void;\n onReconnected(listener: ReconnectListener): () => void;\n send(message: Message): Promise<void>;\n}\n\nexport type MessengerConfig = {\n socketEndpoint: string;\n timeout?: number;\n protocol?: Protocol;\n disableAuth?: boolean;\n};\n\n/**\n * Messenger client for EDGE:\n * - While open, uses PersistentLifecycle to keep an open EdgeWsConnection, reconnecting on failures.\n * - Manages identity and re-create EdgeWsConnection when identity changes.\n * - Dispatches connection state and message notifications.\n */\nexport class EdgeClient extends Resource implements EdgeConnection {\n public readonly statusChanged = new Event<EdgeStatus>();\n\n private readonly _persistentLifecycle = new PersistentLifecycle<EdgeWsConnection>({\n start: async () => this._connect(),\n stop: async (state: EdgeWsConnection) => this._disconnect(state),\n });\n\n private readonly _messageListeners = new Set<MessageListener>();\n private readonly _reconnectListeners = new Set<ReconnectListener>();\n private readonly _baseWsUrl: string;\n private readonly _baseHttpUrl: string;\n private _currentConnection?: EdgeWsConnection = undefined;\n private _ready = new Trigger();\n\n constructor(\n private _identity: EdgeIdentity,\n private readonly _config: MessengerConfig,\n ) {\n super();\n this._baseWsUrl = getEdgeUrlWithProtocol(_config.socketEndpoint, 'ws');\n this._baseHttpUrl = getEdgeUrlWithProtocol(_config.socketEndpoint, 'http');\n }\n\n @logInfo\n public get info() {\n return {\n open: this.isOpen,\n status: this.status,\n identity: this._identity.identityKey,\n device: this._identity.peerKey,\n };\n }\n\n get status(): EdgeStatus {\n return Boolean(this._currentConnection) && this._ready.state === TriggerState.RESOLVED\n ? EdgeStatus.CONNECTED\n : EdgeStatus.NOT_CONNECTED;\n }\n\n get identityKey() {\n return this._identity.identityKey;\n }\n\n get peerKey() {\n return this._identity.peerKey;\n }\n\n setIdentity(identity: EdgeIdentity) {\n if (identity.identityKey !== this._identity.identityKey || identity.peerKey !== this._identity.peerKey) {\n log('Edge identity changed', { identity, oldIdentity: this._identity });\n this._identity = identity;\n this._closeCurrentConnection(new EdgeIdentityChangedError());\n void this._persistentLifecycle.scheduleRestart();\n }\n }\n\n public onMessage(listener: MessageListener): () => void {\n this._messageListeners.add(listener);\n return () => this._messageListeners.delete(listener);\n }\n\n public onReconnected(listener: () => void): () => void {\n this._reconnectListeners.add(listener);\n if (this._ready.state === TriggerState.RESOLVED) {\n // Microtask so that listener is always called asynchronously, no matter the state of the ready trigger\n // at the moment of registration.\n scheduleMicroTask(this._ctx, () => {\n if (this._reconnectListeners.has(listener)) {\n try {\n listener();\n } catch (error) {\n log.catch(error);\n }\n }\n });\n }\n return () => this._reconnectListeners.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._identity.peerKey });\n this._closeCurrentConnection();\n await this._persistentLifecycle.close();\n }\n\n private async _connect(): Promise<EdgeWsConnection | undefined> {\n if (this._ctx.disposed) {\n return undefined;\n }\n\n const identity = this._identity;\n const path = `/ws/${identity.identityKey}/${identity.peerKey}`;\n const protocolHeader = this._config.disableAuth ? undefined : await this._createAuthHeader(path);\n if (this._identity !== identity) {\n log('identity changed during auth header request');\n return undefined;\n }\n\n const restartRequired = new Trigger();\n const url = new URL(path, this._baseWsUrl);\n log('Opening websocket', { url: url.toString(), protocolHeader });\n const connection = new EdgeWsConnection(\n identity,\n { url, protocolHeader },\n {\n onConnected: () => {\n if (this._isActive(connection)) {\n this._ready.wake();\n this._notifyReconnected();\n } else {\n log.verbose('connected callback ignored, because connection is not active');\n }\n },\n onRestartRequired: () => {\n if (this._isActive(connection)) {\n this._closeCurrentConnection();\n void this._persistentLifecycle.scheduleRestart();\n } else {\n log.verbose('restart requested by inactive connection');\n }\n restartRequired.wake();\n },\n onMessage: (message) => {\n if (this._isActive(connection)) {\n this._notifyMessageReceived(message);\n } else {\n log.verbose('ignored a message on inactive connection', {\n from: message.source,\n type: message.payload?.typeUrl,\n });\n }\n },\n },\n );\n this._currentConnection = connection;\n\n await connection.open();\n // Race with restartRequired so that restart is not blocked by _connect execution.\n // Wait on ready to attempt a reconnect if it times out.\n await Promise.race([this._ready.wait({ timeout: this._config.timeout ?? DEFAULT_TIMEOUT }), restartRequired]);\n\n return connection;\n }\n\n private async _disconnect(state: EdgeWsConnection) {\n await state.close();\n this.statusChanged.emit(this.status);\n }\n\n private _closeCurrentConnection(error: Error = new EdgeConnectionClosedError()) {\n this._currentConnection = undefined;\n this._ready.throw(error);\n this._ready.reset();\n this.statusChanged.emit(this.status);\n }\n\n private _notifyReconnected() {\n this.statusChanged.emit(this.status);\n for (const listener of this._reconnectListeners) {\n try {\n listener();\n } catch (err) {\n log.error('ws reconnect listener failed', { err });\n }\n }\n }\n\n private _notifyMessageReceived(message: Message) {\n for (const listener of this._messageListeners) {\n try {\n listener(message);\n } catch (err) {\n log.error('ws incoming message processing failed', { err, payload: protocol.getPayloadType(message) });\n }\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\n if (!this._currentConnection) {\n throw new EdgeConnectionClosedError();\n }\n\n if (\n message.source &&\n (message.source.peerKey !== this._identity.peerKey || message.source.identityKey !== this.identityKey)\n ) {\n throw new EdgeIdentityChangedError();\n }\n\n this._currentConnection.send(message);\n }\n\n private async _createAuthHeader(path: string): Promise<string | undefined> {\n const httpUrl = new URL(path, this._baseHttpUrl);\n httpUrl.protocol = getEdgeUrlWithProtocol(this._baseWsUrl.toString(), 'http');\n const response = await fetch(httpUrl, { method: 'GET' });\n if (response.status === 401) {\n return encodePresentationWsAuthHeader(await handleAuthChallenge(response, this._identity));\n } else {\n log.warn('no auth challenge from edge', { status: response.status, statusText: response.statusText });\n return undefined;\n }\n }\n\n private _isActive = (connection: EdgeWsConnection) => connection === this._currentConnection;\n}\n\nconst encodePresentationWsAuthHeader = (encodedPresentation: Uint8Array): string => {\n // = and / characters are not allowed in the WebSocket subprotocol header.\n const encodedToken = Buffer.from(encodedPresentation).toString('base64').replace(/=*$/, '').replaceAll('/', '|');\n return `base64url.bearer.authorization.dxos.org.${encodedToken}`;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { invariant } from '@dxos/invariant';\nimport { schema } from '@dxos/protocols/proto';\nimport { type Presentation } from '@dxos/protocols/proto/dxos/halo/credentials';\n\nexport interface EdgeIdentity {\n peerKey: string;\n identityKey: string;\n /**\n * Returns credential presentation issued by the identity key.\n * Presentation must have the provided challenge.\n * Presentation may include ServiceAccess credentials.\n */\n presentCredentials({ challenge }: { challenge: Uint8Array }): Promise<Presentation>;\n}\n\nexport const handleAuthChallenge = async (failedResponse: Response, identity: EdgeIdentity): Promise<Uint8Array> => {\n invariant(failedResponse.status === 401);\n\n const headerValue = failedResponse.headers.get('Www-Authenticate');\n invariant(headerValue?.startsWith('VerifiablePresentation challenge='));\n\n const challenge = headerValue?.slice('VerifiablePresentation challenge='.length);\n invariant(challenge);\n\n const presentation = await identity.presentCredentials({ challenge: Buffer.from(challenge, 'base64') });\n return schema.getCodecForType('dxos.halo.credentials.Presentation').encode(presentation);\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\nexport const getEdgeUrlWithProtocol = (baseUrl: string, protocol: 'http' | 'ws') => {\n const isSecure = baseUrl.startsWith('https') || baseUrl.startsWith('wss');\n const url = new URL(baseUrl);\n url.protocol = protocol + (isSecure ? 's' : '');\n return url.toString();\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { createCredential, signPresentation } from '@dxos/credentials';\nimport { type Signer } from '@dxos/crypto';\nimport { invariant } from '@dxos/invariant';\nimport { Keyring } from '@dxos/keyring';\nimport { PublicKey } from '@dxos/keys';\nimport { type Chain, type Credential } from '@dxos/protocols/proto/dxos/halo/credentials';\n\nimport type { EdgeIdentity } from './edge-identity';\n\n/**\n * Edge identity backed by a device key without a credential chain.\n */\nexport const createDeviceEdgeIdentity = async (signer: Signer, key: PublicKey): Promise<EdgeIdentity> => {\n return {\n identityKey: key.toHex(),\n peerKey: key.toHex(),\n presentCredentials: async ({ challenge }) => {\n return signPresentation({\n presentation: {\n credentials: [\n // Verifier requires at least one credential in the presentation to establish the subject.\n await createCredential({\n assertion: {\n '@type': 'dxos.halo.credentials.Auth',\n },\n issuer: key,\n subject: key,\n signer,\n }),\n ],\n },\n signer,\n signerKey: key,\n nonce: challenge,\n });\n },\n };\n};\n\n/**\n * Edge identity backed by a chain of credentials.\n */\nexport const createChainEdgeIdentity = async (\n signer: Signer,\n identityKey: PublicKey,\n peerKey: PublicKey,\n chain: Chain | undefined,\n credentials: Credential[],\n): Promise<EdgeIdentity> => {\n const credentialsToSign =\n credentials.length > 0\n ? credentials\n : [\n await createCredential({\n assertion: {\n '@type': 'dxos.halo.credentials.Auth',\n },\n issuer: identityKey,\n subject: identityKey,\n signer,\n chain,\n signingKey: peerKey,\n }),\n ];\n\n return {\n identityKey: identityKey.toHex(),\n peerKey: peerKey.toHex(),\n presentCredentials: async ({ challenge }) => {\n // TODO: make chain required after device invitation flow update release\n invariant(chain);\n return signPresentation({\n presentation: {\n credentials: credentialsToSign,\n },\n signer,\n nonce: challenge,\n signerKey: peerKey,\n chain,\n });\n },\n };\n};\n\n/**\n * Edge identity backed by a random ephemeral key without HALO.\n */\nexport const createEphemeralEdgeIdentity = async (): Promise<EdgeIdentity> => {\n const keyring = new Keyring();\n const key = await keyring.createKey();\n return createDeviceEdgeIdentity(keyring, key);\n};\n\n/**\n * Creates a HALO chain of credentials to act as an edge identity.\n */\nexport const createTestHaloEdgeIdentity = async (\n signer: Signer,\n identityKey: PublicKey,\n deviceKey: PublicKey,\n): Promise<EdgeIdentity> => {\n const deviceAdmission = await createCredential({\n assertion: {\n '@type': 'dxos.halo.credentials.AuthorizedDevice',\n deviceKey,\n identityKey,\n },\n issuer: identityKey,\n subject: deviceKey,\n signer,\n });\n return createChainEdgeIdentity(signer, identityKey, deviceKey, { credential: deviceAdmission }, [\n await createCredential({\n assertion: {\n '@type': 'dxos.halo.credentials.Auth',\n },\n issuer: identityKey,\n subject: identityKey,\n signer,\n }),\n ]);\n};\n\nexport const createStubEdgeIdentity = (): EdgeIdentity => {\n const identityKey = PublicKey.random();\n const deviceKey = PublicKey.random();\n return {\n identityKey: identityKey.toHex(),\n peerKey: deviceKey.toHex(),\n presentCredentials: async () => {\n throw new Error('Stub identity does not support authentication.');\n },\n };\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { sleep } from '@dxos/async';\nimport { Context } from '@dxos/context';\nimport { type PublicKey, type SpaceId } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport {\n EdgeCallFailedError,\n type EdgeHttpResponse,\n type GetNotarizationResponseBody,\n type PostNotarizationRequestBody,\n type JoinSpaceRequest,\n type JoinSpaceResponseBody,\n EdgeAuthChallengeError,\n type CreateAgentResponseBody,\n type CreateAgentRequestBody,\n type GetAgentStatusResponseBody,\n type RecoverIdentityRequest,\n type RecoverIdentityResponseBody,\n type UploadFunctionRequest,\n type UploadFunctionResponseBody,\n type ObjectId,\n type ExecuteWorkflowResponseBody,\n type QueueQuery,\n type QueryResult,\n type InitiateOAuthFlowRequest,\n type InitiateOAuthFlowResponse,\n type CreateSpaceRequest,\n type CreateSpaceResponseBody,\n} from '@dxos/protocols';\n\nimport { type EdgeIdentity, handleAuthChallenge } from './edge-identity';\nimport { getEdgeUrlWithProtocol } from './utils';\n\nconst DEFAULT_RETRY_TIMEOUT = 1500;\nconst DEFAULT_RETRY_JITTER = 500;\nconst DEFAULT_MAX_RETRIES_COUNT = 3;\n\nexport class EdgeHttpClient {\n private readonly _baseUrl: string;\n\n private _edgeIdentity: EdgeIdentity | undefined;\n\n /**\n * Auth header is cached until receiving the next 401 from EDGE, at which point it gets refreshed.\n */\n private _authHeader: string | undefined;\n\n constructor(baseUrl: string) {\n this._baseUrl = getEdgeUrlWithProtocol(baseUrl, 'http');\n log('created', { url: this._baseUrl });\n }\n\n get baseUrl() {\n return this._baseUrl;\n }\n\n setIdentity(identity: EdgeIdentity) {\n if (this._edgeIdentity?.identityKey !== identity.identityKey || this._edgeIdentity?.peerKey !== identity.peerKey) {\n this._edgeIdentity = identity;\n this._authHeader = undefined;\n }\n }\n\n public createAgent(body: CreateAgentRequestBody, args?: EdgeHttpGetArgs): Promise<CreateAgentResponseBody> {\n return this._call('/agents/create', { ...args, method: 'POST', body });\n }\n\n public getAgentStatus(\n request: { ownerIdentityKey: PublicKey },\n args?: EdgeHttpGetArgs,\n ): Promise<GetAgentStatusResponseBody> {\n return this._call(`/users/${request.ownerIdentityKey.toHex()}/agent/status`, { ...args, method: 'GET' });\n }\n\n public getCredentialsForNotarization(spaceId: SpaceId, args?: EdgeHttpGetArgs): Promise<GetNotarizationResponseBody> {\n return this._call(`/spaces/${spaceId}/notarization`, { ...args, method: 'GET' });\n }\n\n public async notarizeCredentials(\n spaceId: SpaceId,\n body: PostNotarizationRequestBody,\n args?: EdgeHttpGetArgs,\n ): Promise<void> {\n await this._call(`/spaces/${spaceId}/notarization`, { ...args, body, method: 'POST' });\n }\n\n public async joinSpaceByInvitation(\n spaceId: SpaceId,\n body: JoinSpaceRequest,\n args?: EdgeHttpGetArgs,\n ): Promise<JoinSpaceResponseBody> {\n return this._call(`/spaces/${spaceId}/join`, { ...args, body, method: 'POST' });\n }\n\n public async recoverIdentity(\n body: RecoverIdentityRequest,\n args?: EdgeHttpGetArgs,\n ): Promise<RecoverIdentityResponseBody> {\n return this._call('/identity/recover', { ...args, body, method: 'POST' });\n }\n\n public async executeWorkflow(\n spaceId: SpaceId,\n graphId: ObjectId,\n input: any,\n args?: EdgeHttpGetArgs,\n ): Promise<ExecuteWorkflowResponseBody> {\n return this._call(`/workflows/${spaceId}/${graphId}`, { ...args, body: input, method: 'POST' });\n }\n\n public async uploadFunction(\n pathParts: { spaceId: SpaceId; functionId?: string },\n body: UploadFunctionRequest,\n args?: EdgeHttpGetArgs,\n ): Promise<UploadFunctionResponseBody> {\n const path = ['functions', pathParts.spaceId, ...(pathParts.functionId ? [pathParts.functionId] : [])].join('/');\n return this._call(path, { ...args, body, method: 'PUT' });\n }\n\n public async initiateOAuthFlow(\n body: InitiateOAuthFlowRequest,\n args?: EdgeHttpGetArgs,\n ): Promise<InitiateOAuthFlowResponse> {\n return this._call('/oauth/initiate', { ...args, body, method: 'POST' });\n }\n\n public async queryQueue(\n subspaceTag: string,\n spaceId: SpaceId,\n query: QueueQuery,\n args?: EdgeHttpGetArgs,\n ): Promise<QueryResult> {\n const { queueId } = query;\n const queryParams = new URLSearchParams();\n if (query.after != null) {\n queryParams.set('after', query.after);\n }\n if (query.before != null) {\n queryParams.set('before', query.before);\n }\n if (query.limit != null) {\n queryParams.set('limit', query.limit.toString());\n }\n if (query.reverse != null) {\n queryParams.set('reverse', query.reverse.toString());\n }\n if (query.objectIds != null) {\n queryParams.set('objectIds', query.objectIds.join(','));\n }\n return this._call(`/spaces/${subspaceTag}/${spaceId}/queue/${queueId}/query?${queryParams.toString()}`, {\n ...args,\n method: 'GET',\n });\n }\n\n public async insertIntoQueue(\n subspaceTag: string,\n spaceId: SpaceId,\n queueId: ObjectId,\n objects: unknown[],\n args?: EdgeHttpGetArgs,\n ): Promise<void> {\n return this._call(`/spaces/${subspaceTag}/${spaceId}/queue/${queueId}`, {\n ...args,\n body: { objects },\n method: 'POST',\n });\n }\n\n async deleteFromQueue(\n subspaceTag: string,\n spaceId: SpaceId,\n queueId: ObjectId,\n objectIds: ObjectId[],\n args?: EdgeHttpGetArgs,\n ): Promise<void> {\n return this._call(`/spaces/${subspaceTag}/${spaceId}/queue/${queueId}`, {\n ...args,\n query: { ids: objectIds.join(',') },\n method: 'DELETE',\n });\n }\n\n async createSpace(body: CreateSpaceRequest, args?: EdgeHttpGetArgs): Promise<CreateSpaceResponseBody> {\n return this._call('/spaces/create', { ...args, body, method: 'POST' });\n }\n\n private async _call<T>(path: string, args: EdgeHttpCallArgs): Promise<T> {\n const requestContext = args.context ?? new Context();\n const shouldRetry = createRetryHandler(args);\n let url = `${this._baseUrl}${path.startsWith('/') ? path.slice(1) : path}`;\n\n if (args.query) {\n const queryParams = new URLSearchParams();\n for (const [key, value] of Object.entries(args.query)) {\n queryParams.set(key, value.toString());\n }\n url += `?${queryParams.toString()}`;\n }\n\n log('call', { method: args.method, path, request: args.body });\n\n let handledAuth = false;\n let authHeader = this._authHeader;\n while (true) {\n let processingError: EdgeCallFailedError;\n let retryAfterHeaderValue: number = Number.NaN;\n try {\n const request = createRequest(args, authHeader);\n const response = await fetch(url, request);\n\n retryAfterHeaderValue = Number(response.headers.get('Retry-After'));\n\n if (response.ok) {\n const body = (await response.json()) as EdgeHttpResponse<T>;\n if (body.success) {\n return body.data;\n }\n\n log('unsuccessful edge response', { path, body });\n\n if (body.errorData?.type === 'auth_challenge' && typeof body.errorData?.challenge === 'string') {\n processingError = new EdgeAuthChallengeError(body.errorData.challenge, body.errorData);\n } else {\n processingError = EdgeCallFailedError.fromUnsuccessfulResponse(response, body);\n }\n } else if (response.status === 401 && !handledAuth) {\n authHeader = await this._handleUnauthorized(response);\n handledAuth = true;\n continue;\n } else {\n processingError = EdgeCallFailedError.fromHttpFailure(response);\n }\n } catch (error: any) {\n processingError = EdgeCallFailedError.fromProcessingFailureCause(error);\n }\n\n if (processingError.isRetryable && (await shouldRetry(requestContext, retryAfterHeaderValue))) {\n log('retrying edge request', { path, processingError });\n } else {\n throw processingError;\n }\n }\n }\n\n private async _handleUnauthorized(response: Response) {\n if (!this._edgeIdentity) {\n log.warn('edge unauthorized response received before identity was set');\n throw EdgeCallFailedError.fromHttpFailure(response);\n }\n const challenge = await handleAuthChallenge(response, this._edgeIdentity);\n this._authHeader = encodeAuthHeader(challenge);\n log('auth header updated');\n return this._authHeader;\n }\n}\n\nconst createRetryHandler = (args: EdgeHttpCallArgs) => {\n if (!args.retry || args.retry.count < 1) {\n return async () => false;\n }\n let retries = 0;\n const maxRetries = args.retry.count ?? DEFAULT_MAX_RETRIES_COUNT;\n const baseTimeout = args.retry.timeout ?? DEFAULT_RETRY_TIMEOUT;\n const jitter = args.retry.jitter ?? DEFAULT_RETRY_JITTER;\n return async (ctx: Context, retryAfter: number) => {\n if (++retries > maxRetries || ctx.disposed) {\n return false;\n }\n\n if (retryAfter) {\n await sleep(retryAfter);\n } else {\n const timeout = baseTimeout + Math.random() * jitter;\n await sleep(timeout);\n }\n\n return true;\n };\n};\n\nexport type RetryConfig = {\n /**\n * A number of call retries, not counting the initial request.\n */\n count: number;\n /**\n * Delay before retries in ms.\n */\n timeout?: number;\n /**\n * A random amount of time before retrying to help prevent large bursts of requests.\n */\n jitter?: number;\n};\n\nexport type EdgeHttpGetArgs = { context?: Context; retry?: RetryConfig };\n\nexport type EdgeHttpPostArgs = { context?: Context; body?: any; retry?: RetryConfig };\n\ntype EdgeHttpCallArgs = {\n method: string;\n body?: any;\n context?: Context;\n retry?: RetryConfig;\n query?: Record<string, string>;\n};\n\nconst createRequest = (args: EdgeHttpCallArgs, authHeader: string | undefined): RequestInit => {\n return {\n method: args.method,\n body: args.body && JSON.stringify(args.body),\n headers: authHeader ? { Authorization: authHeader } : undefined,\n };\n};\n\nconst encodeAuthHeader = (challenge: Uint8Array) => {\n const encodedChallenge = Buffer.from(challenge).toString('base64');\n return `VerifiablePresentation pb;base64,${encodedChallenge}`;\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["Trigger", "scheduleMicroTask", "TriggerState", "PersistentLifecycle", "Event", "Resource", "log", "logInfo", "EdgeStatus", "invariant", "schema", "handleAuthChallenge", "failedResponse", "identity", "status", "headerValue", "headers", "get", "startsWith", "challenge", "slice", "length", "presentation", "presentCredentials", "Buffer", "from", "getCodecForType", "encode", "EdgeConnectionClosedError", "Error", "constructor", "EdgeIdentityChangedError", "getEdgeUrlWithProtocol", "baseUrl", "protocol", "isSecure", "startsWith", "url", "URL", "toString", "DEFAULT_TIMEOUT", "EdgeClient", "Resource", "constructor", "_identity", "_config", "statusChanged", "Event", "_persistentLifecycle", "PersistentLifecycle", "start", "_connect", "stop", "state", "_disconnect", "_messageListeners", "Set", "_reconnectListeners", "_currentConnection", "undefined", "_ready", "Trigger", "_isActive", "connection", "_baseWsUrl", "getEdgeUrlWithProtocol", "socketEndpoint", "_baseHttpUrl", "info", "open", "isOpen", "status", "identity", "identityKey", "device", "peerKey", "Boolean", "TriggerState", "RESOLVED", "EdgeStatus", "CONNECTED", "NOT_CONNECTED", "setIdentity", "log", "oldIdentity", "_closeCurrentConnection", "EdgeIdentityChangedError", "scheduleRestart", "onMessage", "listener", "add", "delete", "onReconnected", "scheduleMicroTask", "_ctx", "has", "error", "catch", "_open", "err", "warn", "_close", "close", "disposed", "path", "protocolHeader", "disableAuth", "_createAuthHeader", "restartRequired", "url", "URL", "toString", "EdgeWsConnection", "onConnected", "wake", "_notifyReconnected", "verbose", "onRestartRequired", "message", "_notifyMessageReceived", "from", "source", "type", "payload", "typeUrl", "Promise", "race", "wait", "timeout", "emit", "EdgeConnectionClosedError", "throw", "reset", "protocol", "getPayloadType", "send", "httpUrl", "response", "fetch", "method", "encodePresentationWsAuthHeader", "handleAuthChallenge", "statusText", "logInfo", "encodedPresentation", "encodedToken", "Buffer", "replace", "replaceAll", "createCredential", "signPresentation", "invariant", "Keyring", "PublicKey", "createDeviceEdgeIdentity", "signer", "key", "identityKey", "toHex", "peerKey", "presentCredentials", "challenge", "presentation", "credentials", "assertion", "issuer", "subject", "signerKey", "nonce", "createChainEdgeIdentity", "chain", "credentialsToSign", "length", "signingKey", "createEphemeralEdgeIdentity", "keyring", "createKey", "createTestHaloEdgeIdentity", "deviceKey", "deviceAdmission", "credential", "createStubEdgeIdentity", "random", "Error", "sleep", "Context", "log", "EdgeCallFailedError", "EdgeAuthChallengeError", "DEFAULT_RETRY_TIMEOUT", "DEFAULT_RETRY_JITTER", "DEFAULT_MAX_RETRIES_COUNT", "EdgeHttpClient", "constructor", "baseUrl", "_baseUrl", "getEdgeUrlWithProtocol", "log", "url", "setIdentity", "identity", "_edgeIdentity", "identityKey", "peerKey", "_authHeader", "undefined", "createAgent", "body", "args", "_call", "method", "getAgentStatus", "request", "ownerIdentityKey", "toHex", "getCredentialsForNotarization", "spaceId", "notarizeCredentials", "joinSpaceByInvitation", "recoverIdentity", "executeWorkflow", "graphId", "input", "uploadFunction", "pathParts", "path", "functionId", "join", "initiateOAuthFlow", "queryQueue", "subspaceTag", "query", "queueId", "queryParams", "URLSearchParams", "after", "set", "before", "limit", "toString", "reverse", "objectIds", "insertIntoQueue", "objects", "deleteFromQueue", "ids", "createSpace", "requestContext", "context", "Context", "shouldRetry", "createRetryHandler", "startsWith", "slice", "key", "value", "Object", "entries", "handledAuth", "authHeader", "processingError", "retryAfterHeaderValue", "Number", "NaN", "createRequest", "response", "fetch", "headers", "get", "ok", "json", "success", "data", "errorData", "type", "challenge", "EdgeAuthChallengeError", "EdgeCallFailedError", "fromUnsuccessfulResponse", "status", "_handleUnauthorized", "fromHttpFailure", "error", "fromProcessingFailureCause", "isRetryable", "warn", "handleAuthChallenge", "encodeAuthHeader", "retry", "count", "retries", "maxRetries", "baseTimeout", "timeout", "jitter", "ctx", "retryAfter", "disposed", "sleep", "Math", "random", "JSON", "stringify", "Authorization", "encodedChallenge", "Buffer", "from"]
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
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/edge-identity.ts":{"bytes":4069,"imports":[{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto","kind":"import-statement","external":true}],"format":"esm"},"packages/core/mesh/edge-client/src/edge-ws-muxer.ts":{"bytes":23416,"imports":[{"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"}],"format":"esm"},"packages/core/mesh/edge-client/src/edge-ws-connection.ts":{"bytes":24781,"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/invariant","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/edge-ws-muxer.ts","kind":"import-statement","original":"./edge-ws-muxer"},{"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/utils.ts":{"bytes":1451,"imports":[],"format":"esm"},"packages/core/mesh/edge-client/src/edge-client.ts":{"bytes":35621,"imports":[{"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/proto/dxos/client/services","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/edge-identity.ts","kind":"import-statement","original":"./edge-identity"},{"path":"packages/core/mesh/edge-client/src/edge-ws-connection.ts","kind":"import-statement","original":"./edge-ws-connection"},{"path":"packages/core/mesh/edge-client/src/errors.ts","kind":"import-statement","original":"./errors"},{"path":"packages/core/mesh/edge-client/src/utils.ts","kind":"import-statement","original":"./utils"}],"format":"esm"},"packages/core/mesh/edge-client/src/auth.ts":{"bytes":12314,"imports":[{"path":"@dxos/credentials","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keyring","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true}],"format":"esm"},"packages/core/mesh/edge-client/src/edge-http-client.ts":{"bytes":34436,"imports":[{"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","kind":"import-statement","external":true},{"path":"packages/core/mesh/edge-client/src/edge-identity.ts","kind":"import-statement","original":"./edge-identity"},{"path":"packages/core/mesh/edge-client/src/utils.ts","kind":"import-statement","original":"./utils"}],"format":"esm"},"packages/core/mesh/edge-client/src/index.ts":{"bytes":1692,"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"},{"path":"packages/core/mesh/edge-client/src/auth.ts","kind":"import-statement","original":"./auth"},{"path":"packages/core/mesh/edge-client/src/edge-http-client.ts","kind":"import-statement","original":"./edge-http-client"},{"path":"packages/core/mesh/edge-client/src/edge-identity.ts","kind":"import-statement","original":"./edge-identity"},{"path":"packages/core/mesh/edge-client/src/edge-ws-muxer.ts","kind":"import-statement","original":"./edge-ws-muxer"},{"path":"packages/core/mesh/edge-client/src/edge-ws-connection.ts","kind":"import-statement","original":"./edge-ws-connection"}],"format":"esm"},"packages/core/mesh/edge-client/src/testing/test-utils.ts":{"bytes":14271,"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/edge-ws-connection.ts","kind":"import-statement","original":"../edge-ws-connection"},{"path":"packages/core/mesh/edge-client/src/edge-ws-muxer.ts","kind":"import-statement","original":"../edge-ws-muxer"},{"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/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":43119},"packages/core/mesh/edge-client/dist/lib/browser/index.mjs":{"imports":[{"path":"packages/core/mesh/edge-client/dist/lib/browser/chunk-CFIVYHE6.mjs","kind":"import-statement"},{"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/log","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto/dxos/client/services","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto","kind":"import-statement","external":true},{"path":"@dxos/credentials","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keyring","kind":"import-statement","external":true},{"path":"@dxos/keys","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","kind":"import-statement","external":true}],"exports":["CLOUDFLARE_MESSAGE_MAX_BYTES","CLOUDFLARE_RPC_MAX_BYTES","EDGE_WEBSOCKET_PROTOCOL_V0","EDGE_WEBSOCKET_PROTOCOL_V1","EdgeClient","EdgeConnectionClosedError","EdgeHttpClient","EdgeIdentityChangedError","Protocol","WebSocketMuxer","createChainEdgeIdentity","createDeviceEdgeIdentity","createEphemeralEdgeIdentity","createStubEdgeIdentity","createTestHaloEdgeIdentity","getTypename","handleAuthChallenge","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":9372},"packages/core/mesh/edge-client/src/edge-identity.ts":{"bytesInOutput":1150},"packages/core/mesh/edge-client/src/errors.ts":{"bytesInOutput":232},"packages/core/mesh/edge-client/src/utils.ts":{"bytesInOutput":244},"packages/core/mesh/edge-client/src/auth.ts":{"bytesInOutput":2993},"packages/core/mesh/edge-client/src/edge-http-client.ts":{"bytesInOutput":8008}},"bytes":23219},"packages/core/mesh/edge-client/dist/lib/browser/testing/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":7198},"packages/core/mesh/edge-client/dist/lib/browser/testing/index.mjs":{"imports":[{"path":"packages/core/mesh/edge-client/dist/lib/browser/chunk-CFIVYHE6.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":3633},"packages/core/mesh/edge-client/src/testing/index.ts":{"bytesInOutput":0}},"bytes":3898},"packages/core/mesh/edge-client/dist/lib/browser/chunk-CFIVYHE6.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":27489},"packages/core/mesh/edge-client/dist/lib/browser/chunk-CFIVYHE6.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},{"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":"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/invariant","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":["CLOUDFLARE_MESSAGE_MAX_BYTES","CLOUDFLARE_RPC_MAX_BYTES","EDGE_WEBSOCKET_PROTOCOL_V0","EDGE_WEBSOCKET_PROTOCOL_V1","EdgeWsConnection","Protocol","WebSocketMuxer","getTypename","protocol","toUint8Array"],"inputs":{"packages/core/mesh/edge-client/src/protocol.ts":{"bytesInOutput":2600},"packages/core/mesh/edge-client/src/defs.ts":{"bytesInOutput":298},"packages/core/mesh/edge-client/src/edge-ws-muxer.ts":{"bytesInOutput":5594},"packages/core/mesh/edge-client/src/edge-ws-connection.ts":{"bytesInOutput":7303}},"bytes":16278}}}
|
|
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/edge-identity.ts":{"bytes":4069,"imports":[{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto","kind":"import-statement","external":true}],"format":"esm"},"packages/core/mesh/edge-client/src/edge-ws-muxer.ts":{"bytes":22688,"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"}],"format":"esm"},"packages/core/mesh/edge-client/src/edge-ws-connection.ts":{"bytes":24768,"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/invariant","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/edge-ws-muxer.ts","kind":"import-statement","original":"./edge-ws-muxer"},{"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/utils.ts":{"bytes":1451,"imports":[],"format":"esm"},"packages/core/mesh/edge-client/src/edge-client.ts":{"bytes":35621,"imports":[{"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/proto/dxos/client/services","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/edge-identity.ts","kind":"import-statement","original":"./edge-identity"},{"path":"packages/core/mesh/edge-client/src/edge-ws-connection.ts","kind":"import-statement","original":"./edge-ws-connection"},{"path":"packages/core/mesh/edge-client/src/errors.ts","kind":"import-statement","original":"./errors"},{"path":"packages/core/mesh/edge-client/src/utils.ts","kind":"import-statement","original":"./utils"}],"format":"esm"},"packages/core/mesh/edge-client/src/auth.ts":{"bytes":12314,"imports":[{"path":"@dxos/credentials","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keyring","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true}],"format":"esm"},"packages/core/mesh/edge-client/src/edge-http-client.ts":{"bytes":34436,"imports":[{"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","kind":"import-statement","external":true},{"path":"packages/core/mesh/edge-client/src/edge-identity.ts","kind":"import-statement","original":"./edge-identity"},{"path":"packages/core/mesh/edge-client/src/utils.ts","kind":"import-statement","original":"./utils"}],"format":"esm"},"packages/core/mesh/edge-client/src/index.ts":{"bytes":1333,"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"},{"path":"packages/core/mesh/edge-client/src/auth.ts","kind":"import-statement","original":"./auth"},{"path":"packages/core/mesh/edge-client/src/edge-http-client.ts","kind":"import-statement","original":"./edge-http-client"},{"path":"packages/core/mesh/edge-client/src/edge-identity.ts","kind":"import-statement","original":"./edge-identity"},{"path":"packages/core/mesh/edge-client/src/edge-ws-muxer.ts","kind":"import-statement","original":"./edge-ws-muxer"}],"format":"esm"},"packages/core/mesh/edge-client/src/testing/test-utils.ts":{"bytes":14271,"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/edge-ws-connection.ts","kind":"import-statement","original":"../edge-ws-connection"},{"path":"packages/core/mesh/edge-client/src/edge-ws-muxer.ts","kind":"import-statement","original":"../edge-ws-muxer"},{"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/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":43020},"packages/core/mesh/edge-client/dist/lib/browser/index.mjs":{"imports":[{"path":"packages/core/mesh/edge-client/dist/lib/browser/chunk-5DDWS5EC.mjs","kind":"import-statement"},{"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/log","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto/dxos/client/services","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto","kind":"import-statement","external":true},{"path":"@dxos/credentials","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keyring","kind":"import-statement","external":true},{"path":"@dxos/keys","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","kind":"import-statement","external":true}],"exports":["CLOUDFLARE_MESSAGE_LENGTH_LIMIT","EdgeClient","EdgeConnectionClosedError","EdgeHttpClient","EdgeIdentityChangedError","Protocol","WebSocketMuxer","createChainEdgeIdentity","createDeviceEdgeIdentity","createEphemeralEdgeIdentity","createStubEdgeIdentity","createTestHaloEdgeIdentity","getTypename","handleAuthChallenge","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":9372},"packages/core/mesh/edge-client/src/edge-identity.ts":{"bytesInOutput":1150},"packages/core/mesh/edge-client/src/errors.ts":{"bytesInOutput":232},"packages/core/mesh/edge-client/src/utils.ts":{"bytesInOutput":244},"packages/core/mesh/edge-client/src/auth.ts":{"bytesInOutput":2993},"packages/core/mesh/edge-client/src/edge-http-client.ts":{"bytesInOutput":8008}},"bytes":23049},"packages/core/mesh/edge-client/dist/lib/browser/testing/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":7198},"packages/core/mesh/edge-client/dist/lib/browser/testing/index.mjs":{"imports":[{"path":"packages/core/mesh/edge-client/dist/lib/browser/chunk-5DDWS5EC.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":3633},"packages/core/mesh/edge-client/src/testing/index.ts":{"bytesInOutput":0}},"bytes":3898},"packages/core/mesh/edge-client/dist/lib/browser/chunk-5DDWS5EC.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":27088},"packages/core/mesh/edge-client/dist/lib/browser/chunk-5DDWS5EC.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},{"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":"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/invariant","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":["CLOUDFLARE_MESSAGE_LENGTH_LIMIT","EDGE_WEBSOCKET_PROTOCOL_V1","EdgeWsConnection","Protocol","WebSocketMuxer","getTypename","protocol","toUint8Array"],"inputs":{"packages/core/mesh/edge-client/src/protocol.ts":{"bytesInOutput":2600},"packages/core/mesh/edge-client/src/defs.ts":{"bytesInOutput":298},"packages/core/mesh/edge-client/src/edge-ws-muxer.ts":{"bytesInOutput":5516},"packages/core/mesh/edge-client/src/edge-ws-connection.ts":{"bytesInOutput":7306}},"bytes":16148}}}
|