@dxos/edge-client 0.8.4-main.406dc2a → 0.8.4-main.548089c
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-IKP53CBQ.mjs → chunk-VESGVCLQ.mjs} +15 -44
- package/dist/lib/browser/{chunk-IKP53CBQ.mjs.map → chunk-VESGVCLQ.mjs.map} +2 -2
- package/dist/lib/browser/edge-ws-muxer.mjs +1 -1
- package/dist/lib/browser/index.mjs +111 -124
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +1 -1
- package/dist/lib/node-esm/{chunk-DR5YNW5K.mjs → chunk-JTBFRYNM.mjs} +15 -44
- package/dist/lib/node-esm/{chunk-DR5YNW5K.mjs.map → chunk-JTBFRYNM.mjs.map} +2 -2
- package/dist/lib/node-esm/edge-ws-muxer.mjs +1 -1
- package/dist/lib/node-esm/index.mjs +111 -124
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/testing/index.mjs +1 -1
- package/dist/types/src/edge-http-client.d.ts +1 -0
- package/dist/types/src/edge-http-client.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +14 -14
- package/src/edge-http-client.test.ts +1 -1
- package/src/edge-http-client.ts +21 -17
|
@@ -13,22 +13,13 @@ import { invariant } from "@dxos/invariant";
|
|
|
13
13
|
import { buf, bufWkt } from "@dxos/protocols/buf";
|
|
14
14
|
import { MessageSchema } from "@dxos/protocols/buf/dxos/edge/messenger_pb";
|
|
15
15
|
import { bufferToArray } from "@dxos/util";
|
|
16
|
-
function _define_property(obj, key, value) {
|
|
17
|
-
if (key in obj) {
|
|
18
|
-
Object.defineProperty(obj, key, {
|
|
19
|
-
value,
|
|
20
|
-
enumerable: true,
|
|
21
|
-
configurable: true,
|
|
22
|
-
writable: true
|
|
23
|
-
});
|
|
24
|
-
} else {
|
|
25
|
-
obj[key] = value;
|
|
26
|
-
}
|
|
27
|
-
return obj;
|
|
28
|
-
}
|
|
29
16
|
var __dxlog_file = "/__w/dxos/dxos/packages/core/mesh/edge-client/src/protocol.ts";
|
|
30
17
|
var getTypename = (typeName) => `type.googleapis.com/${typeName}`;
|
|
31
18
|
var Protocol = class {
|
|
19
|
+
_typeRegistry;
|
|
20
|
+
constructor(types) {
|
|
21
|
+
this._typeRegistry = buf.createRegistry(...types);
|
|
22
|
+
}
|
|
32
23
|
get typeRegistry() {
|
|
33
24
|
return this._typeRegistry;
|
|
34
25
|
}
|
|
@@ -103,10 +94,6 @@ var Protocol = class {
|
|
|
103
94
|
payload: payload ? bufWkt.anyPack(type, buf.create(type, payload)) : void 0
|
|
104
95
|
});
|
|
105
96
|
}
|
|
106
|
-
constructor(types) {
|
|
107
|
-
_define_property(this, "_typeRegistry", void 0);
|
|
108
|
-
this._typeRegistry = buf.createRegistry(...types);
|
|
109
|
-
}
|
|
110
97
|
};
|
|
111
98
|
var toUint8Array = async (data) => {
|
|
112
99
|
if (data instanceof Buffer) {
|
|
@@ -127,19 +114,6 @@ var protocol = new Protocol([
|
|
|
127
114
|
]);
|
|
128
115
|
|
|
129
116
|
// src/edge-ws-muxer.ts
|
|
130
|
-
function _define_property2(obj, key, value) {
|
|
131
|
-
if (key in obj) {
|
|
132
|
-
Object.defineProperty(obj, key, {
|
|
133
|
-
value,
|
|
134
|
-
enumerable: true,
|
|
135
|
-
configurable: true,
|
|
136
|
-
writable: true
|
|
137
|
-
});
|
|
138
|
-
} else {
|
|
139
|
-
obj[key] = value;
|
|
140
|
-
}
|
|
141
|
-
return obj;
|
|
142
|
-
}
|
|
143
117
|
var __dxlog_file2 = "/__w/dxos/dxos/packages/core/mesh/edge-client/src/edge-ws-muxer.ts";
|
|
144
118
|
var FLAG_SEGMENT_SEQ = 1;
|
|
145
119
|
var FLAG_SEGMENT_SEQ_TERMINATED = 1 << 1;
|
|
@@ -149,6 +123,16 @@ var MAX_CHUNK_LENGTH = 16384;
|
|
|
149
123
|
var MAX_BUFFERED_AMOUNT = CLOUDFLARE_MESSAGE_MAX_BYTES;
|
|
150
124
|
var BUFFER_FULL_BACKOFF_TIMEOUT = 100;
|
|
151
125
|
var WebSocketMuxer = class {
|
|
126
|
+
_ws;
|
|
127
|
+
_inMessageAccumulator = /* @__PURE__ */ new Map();
|
|
128
|
+
_outMessageChunks = /* @__PURE__ */ new Map();
|
|
129
|
+
_outMessageChannelByService = /* @__PURE__ */ new Map();
|
|
130
|
+
_sendTimeout;
|
|
131
|
+
_maxChunkLength;
|
|
132
|
+
constructor(_ws, config) {
|
|
133
|
+
this._ws = _ws;
|
|
134
|
+
this._maxChunkLength = config?.maxChunkLength ?? MAX_CHUNK_LENGTH;
|
|
135
|
+
}
|
|
152
136
|
/**
|
|
153
137
|
* Resolves when all the message chunks get enqueued for sending.
|
|
154
138
|
*/
|
|
@@ -303,19 +287,6 @@ var WebSocketMuxer = class {
|
|
|
303
287
|
}
|
|
304
288
|
return id;
|
|
305
289
|
}
|
|
306
|
-
constructor(_ws, config) {
|
|
307
|
-
_define_property2(this, "_ws", void 0);
|
|
308
|
-
_define_property2(this, "_inMessageAccumulator", void 0);
|
|
309
|
-
_define_property2(this, "_outMessageChunks", void 0);
|
|
310
|
-
_define_property2(this, "_outMessageChannelByService", void 0);
|
|
311
|
-
_define_property2(this, "_sendTimeout", void 0);
|
|
312
|
-
_define_property2(this, "_maxChunkLength", void 0);
|
|
313
|
-
this._ws = _ws;
|
|
314
|
-
this._inMessageAccumulator = /* @__PURE__ */ new Map();
|
|
315
|
-
this._outMessageChunks = /* @__PURE__ */ new Map();
|
|
316
|
-
this._outMessageChannelByService = /* @__PURE__ */ new Map();
|
|
317
|
-
this._maxChunkLength = config?.maxChunkLength ?? MAX_CHUNK_LENGTH;
|
|
318
|
-
}
|
|
319
290
|
};
|
|
320
291
|
|
|
321
292
|
export {
|
|
@@ -327,4 +298,4 @@ export {
|
|
|
327
298
|
CLOUDFLARE_RPC_MAX_BYTES,
|
|
328
299
|
WebSocketMuxer
|
|
329
300
|
};
|
|
330
|
-
//# sourceMappingURL=chunk-
|
|
301
|
+
//# sourceMappingURL=chunk-VESGVCLQ.mjs.map
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/edge-ws-muxer.ts", "../../../src/defs.ts", "../../../src/protocol.ts"],
|
|
4
4
|
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Trigger } from '@dxos/async';\nimport { log } from '@dxos/log';\nimport { buf } from '@dxos/protocols/buf';\nimport { type Message, MessageSchema } from '@dxos/protocols/buf/dxos/edge/messenger_pb';\n\nimport { protocol } from './defs';\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 * https://developers.cloudflare.com/durable-objects/platform/limits/\n */\nexport const CLOUDFLARE_MESSAGE_MAX_BYTES = 1000 * 1000; // 1MB\nexport const CLOUDFLARE_RPC_MAX_BYTES = 32 * 1000 * 1000; // 32MB\n\nconst MAX_CHUNK_LENGTH = 16384;\nconst MAX_BUFFERED_AMOUNT = CLOUDFLARE_MESSAGE_MAX_BYTES;\nconst BUFFER_FULL_BACKOFF_TIMEOUT = 100;\n\nexport class WebSocketMuxer {\n private readonly _inMessageAccumulator = new Map<number, Buffer[]>();\n private readonly _outMessageChunks = new Map<number, MessageChunk[]>();\n private readonly _outMessageChannelByService = new Map<string, number>();\n\n private _sendTimeout: any | undefined;\n\n private readonly _maxChunkLength: number;\n\n constructor(\n private readonly _ws: WebSocketCompat,\n config?: { maxChunkLength: number },\n ) {\n this._maxChunkLength = config?.maxChunkLength ?? MAX_CHUNK_LENGTH;\n }\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 (\n (channelId == null && binary.byteLength > CLOUDFLARE_MESSAGE_MAX_BYTES) ||\n binary.byteLength > CLOUDFLARE_RPC_MAX_BYTES\n ) {\n log.error('Large message dropped', {\n byteLength: binary.byteLength,\n serviceId: message.serviceId,\n payload: protocol.getPayloadType(message),\n channelId,\n });\n return;\n }\n\n if (channelId == null || binary.length < this._maxChunkLength) {\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 += this._maxChunkLength) {\n const chunk = binary.slice(i, i + this._maxChunkLength);\n const isLastChunk = i + this._maxChunkLength >= 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, channelId]);\n messageChunks.push({ payload: Buffer.concat([flags, chunk]) });\n }\n }\n\n const queuedMessages = this._outMessageChunks.get(channelId);\n if (queuedMessages) {\n queuedMessages.push(...messageChunks);\n } else {\n this._outMessageChunks.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._inMessageAccumulator.get(channelId);\n if (chunkAccumulator) {\n chunkAccumulator.push(Buffer.from(payload));\n } else {\n chunkAccumulator = [Buffer.from(payload)];\n this._inMessageAccumulator.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._inMessageAccumulator.delete(channelId);\n return message;\n }\n\n public destroy(): void {\n if (this._sendTimeout) {\n clearTimeout(this._sendTimeout);\n this._sendTimeout = undefined;\n }\n for (const channelChunks of this._outMessageChunks.values()) {\n channelChunks.forEach((chunk) => chunk.trigger?.wake());\n }\n this._outMessageChunks.clear();\n this._inMessageAccumulator.clear();\n this._outMessageChannelByService.clear();\n }\n\n private _sendChunkedMessages(): void {\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._outMessageChunks.entries()) {\n if (this._ws.bufferedAmount != null) {\n if (this._ws.bufferedAmount + MAX_CHUNK_LENGTH > MAX_BUFFERED_AMOUNT) {\n timeout = BUFFER_FULL_BACKOFF_TIMEOUT;\n break;\n }\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._outMessageChunks.delete(channelId));\n\n if (this._outMessageChunks.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._outMessageChannelByService.get(message.serviceId);\n if (!id) {\n id = this._outMessageChannelByService.size + 1;\n this._outMessageChannelByService.set(message.serviceId, id);\n }\n return id;\n }\n}\n\ntype WebSocketCompat = {\n readonly readyState: number;\n /**\n * Not available in workerd.\n */\n bufferedAmount?: number;\n send(message: (ArrayBuffer | ArrayBufferView) | string): void;\n};\n\ntype MessageChunk = {\n payload: Buffer;\n /**\n * Wakes when the payload is enqueued by WebSocket.\n */\n trigger?: Trigger;\n};\n\n/**\n * To avoid using isomorphic-ws on edge.\n */\nenum WebSocket {\n CLOSING = 2,\n CLOSED = 3,\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 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 ): Message {\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"],
|
|
5
|
-
"mappings": ";AAIA,SAASA,eAAe;AACxB,SAASC,WAAW;AACpB,SAASC,OAAAA,YAAW;AACpB,SAAuBC,iBAAAA,sBAAqB;;;ACH5C,SAASC,UAAAA,eAAc;AACvB,SAASC,oBAAoBC,qBAAqBC,yBAAyB;;;ACD3E,SAASC,iBAAiB;AAC1B,SAASC,KAAKC,cAAc;AAC5B,SAAuBC,qBAAsC;AAC7D,SAASC,qBAAqB
|
|
6
|
-
"names": ["Trigger", "log", "buf", "MessageSchema", "bufWkt", "SwarmRequestSchema", "SwarmResponseSchema", "TextMessageSchema", "invariant", "buf", "bufWkt", "MessageSchema", "bufferToArray", "getTypename", "typeName", "Protocol", "
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["Trigger", "log", "buf", "MessageSchema", "bufWkt", "SwarmRequestSchema", "SwarmResponseSchema", "TextMessageSchema", "invariant", "buf", "bufWkt", "MessageSchema", "bufferToArray", "getTypename", "typeName", "Protocol", "_typeRegistry", "types", "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", "protocol", "Protocol", "SwarmRequestSchema", "SwarmResponseSchema", "TextMessageSchema", "bufWkt", "AnySchema", "FLAG_SEGMENT_SEQ", "FLAG_SEGMENT_SEQ_TERMINATED", "CLOUDFLARE_MESSAGE_MAX_BYTES", "CLOUDFLARE_RPC_MAX_BYTES", "MAX_CHUNK_LENGTH", "MAX_BUFFERED_AMOUNT", "BUFFER_FULL_BACKOFF_TIMEOUT", "WebSocketMuxer", "_inMessageAccumulator", "Map", "_outMessageChunks", "_outMessageChannelByService", "_sendTimeout", "_maxChunkLength", "_ws", "config", "maxChunkLength", "send", "message", "binary", "buf", "toBinary", "MessageSchema", "channelId", "_resolveChannel", "byteLength", "log", "error", "serviceId", "payload", "protocol", "getPayloadType", "length", "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", "clearTimeout", "channelChunks", "values", "forEach", "wake", "clear", "readyState", "warn", "timeout", "emptyChannels", "messages", "entries", "bufferedAmount", "nextMessage", "shift", "size", "setTimeout", "id"]
|
|
7
7
|
}
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
getTypename,
|
|
7
7
|
protocol,
|
|
8
8
|
toUint8Array
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-VESGVCLQ.mjs";
|
|
10
10
|
|
|
11
11
|
// src/index.ts
|
|
12
12
|
export * from "@dxos/protocols/buf/dxos/edge/messenger_pb";
|
|
@@ -177,19 +177,6 @@ import { log, logInfo } from "@dxos/log";
|
|
|
177
177
|
import { EdgeWebsocketProtocol } from "@dxos/protocols";
|
|
178
178
|
import { buf } from "@dxos/protocols/buf";
|
|
179
179
|
import { MessageSchema } from "@dxos/protocols/buf/dxos/edge/messenger_pb";
|
|
180
|
-
function _define_property(obj, key, value) {
|
|
181
|
-
if (key in obj) {
|
|
182
|
-
Object.defineProperty(obj, key, {
|
|
183
|
-
value,
|
|
184
|
-
enumerable: true,
|
|
185
|
-
configurable: true,
|
|
186
|
-
writable: true
|
|
187
|
-
});
|
|
188
|
-
} else {
|
|
189
|
-
obj[key] = value;
|
|
190
|
-
}
|
|
191
|
-
return obj;
|
|
192
|
-
}
|
|
193
180
|
function _ts_decorate(decorators, target, key, desc) {
|
|
194
181
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
195
182
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
@@ -200,6 +187,28 @@ var __dxlog_file3 = "/__w/dxos/dxos/packages/core/mesh/edge-client/src/edge-ws-c
|
|
|
200
187
|
var SIGNAL_KEEPALIVE_INTERVAL = 4e3;
|
|
201
188
|
var SIGNAL_KEEPALIVE_TIMEOUT = 12e3;
|
|
202
189
|
var EdgeWsConnection = class extends Resource {
|
|
190
|
+
_identity;
|
|
191
|
+
_connectionInfo;
|
|
192
|
+
_callbacks;
|
|
193
|
+
_inactivityTimeoutCtx;
|
|
194
|
+
_ws;
|
|
195
|
+
_wsMuxer;
|
|
196
|
+
_lastReceivedMessageTimestamp = Date.now();
|
|
197
|
+
_openTimestamp;
|
|
198
|
+
// Latency tracking.
|
|
199
|
+
_pingTimestamp;
|
|
200
|
+
_rtt = 0;
|
|
201
|
+
// Rate tracking with sliding window.
|
|
202
|
+
_uploadRate = 0;
|
|
203
|
+
_downloadRate = 0;
|
|
204
|
+
_rateWindow = 1e4;
|
|
205
|
+
_rateUpdateInterval = 1e3;
|
|
206
|
+
_bytesSamples = [];
|
|
207
|
+
_messagesSent = 0;
|
|
208
|
+
_messagesReceived = 0;
|
|
209
|
+
constructor(_identity, _connectionInfo, _callbacks) {
|
|
210
|
+
super(), this._identity = _identity, this._connectionInfo = _connectionInfo, this._callbacks = _callbacks;
|
|
211
|
+
}
|
|
203
212
|
get info() {
|
|
204
213
|
return {
|
|
205
214
|
open: this.isOpen,
|
|
@@ -505,21 +514,6 @@ var EdgeWsConnection = class extends Resource {
|
|
|
505
514
|
this._uploadRate = timeSpan > 0 ? Math.round(totalSent / timeSpan) : 0;
|
|
506
515
|
this._downloadRate = timeSpan > 0 ? Math.round(totalReceived / timeSpan) : 0;
|
|
507
516
|
}
|
|
508
|
-
constructor(_identity, _connectionInfo, _callbacks) {
|
|
509
|
-
super(), _define_property(this, "_identity", void 0), _define_property(this, "_connectionInfo", void 0), _define_property(this, "_callbacks", void 0), _define_property(this, "_inactivityTimeoutCtx", void 0), _define_property(this, "_ws", void 0), _define_property(this, "_wsMuxer", void 0), _define_property(this, "_lastReceivedMessageTimestamp", void 0), _define_property(this, "_openTimestamp", void 0), // Latency tracking.
|
|
510
|
-
_define_property(this, "_pingTimestamp", void 0), _define_property(this, "_rtt", void 0), // Rate tracking with sliding window.
|
|
511
|
-
_define_property(this, "_uploadRate", void 0), _define_property(this, "_downloadRate", void 0), _define_property(
|
|
512
|
-
this,
|
|
513
|
-
"_rateWindow",
|
|
514
|
-
void 0
|
|
515
|
-
// 10 second sliding window.
|
|
516
|
-
), _define_property(
|
|
517
|
-
this,
|
|
518
|
-
"_rateUpdateInterval",
|
|
519
|
-
void 0
|
|
520
|
-
// Update rates every second.
|
|
521
|
-
), _define_property(this, "_bytesSamples", void 0), _define_property(this, "_messagesSent", void 0), _define_property(this, "_messagesReceived", void 0), this._identity = _identity, this._connectionInfo = _connectionInfo, this._callbacks = _callbacks, this._lastReceivedMessageTimestamp = Date.now(), this._rtt = 0, this._uploadRate = 0, this._downloadRate = 0, this._rateWindow = 1e4, this._rateUpdateInterval = 1e3, this._bytesSamples = [], this._messagesSent = 0, this._messagesReceived = 0;
|
|
522
|
-
}
|
|
523
517
|
};
|
|
524
518
|
_ts_decorate([
|
|
525
519
|
logInfo
|
|
@@ -546,19 +540,6 @@ var getEdgeUrlWithProtocol = (baseUrl, protocol2) => {
|
|
|
546
540
|
};
|
|
547
541
|
|
|
548
542
|
// src/edge-client.ts
|
|
549
|
-
function _define_property2(obj, key, value) {
|
|
550
|
-
if (key in obj) {
|
|
551
|
-
Object.defineProperty(obj, key, {
|
|
552
|
-
value,
|
|
553
|
-
enumerable: true,
|
|
554
|
-
configurable: true,
|
|
555
|
-
writable: true
|
|
556
|
-
});
|
|
557
|
-
} else {
|
|
558
|
-
obj[key] = value;
|
|
559
|
-
}
|
|
560
|
-
return obj;
|
|
561
|
-
}
|
|
562
543
|
function _ts_decorate2(decorators, target, key, desc) {
|
|
563
544
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
564
545
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
@@ -569,6 +550,24 @@ var __dxlog_file4 = "/__w/dxos/dxos/packages/core/mesh/edge-client/src/edge-clie
|
|
|
569
550
|
var DEFAULT_TIMEOUT = 1e4;
|
|
570
551
|
var STATUS_REFRESH_INTERVAL = 1e3;
|
|
571
552
|
var EdgeClient = class extends Resource2 {
|
|
553
|
+
_identity;
|
|
554
|
+
_config;
|
|
555
|
+
statusChanged = new Event();
|
|
556
|
+
_persistentLifecycle = new PersistentLifecycle({
|
|
557
|
+
start: async () => this._connect(),
|
|
558
|
+
stop: async (state) => this._disconnect(state)
|
|
559
|
+
});
|
|
560
|
+
_messageListeners = /* @__PURE__ */ new Set();
|
|
561
|
+
_reconnectListeners = /* @__PURE__ */ new Set();
|
|
562
|
+
_baseWsUrl;
|
|
563
|
+
_baseHttpUrl;
|
|
564
|
+
_currentConnection = void 0;
|
|
565
|
+
_ready = new Trigger();
|
|
566
|
+
constructor(_identity, _config) {
|
|
567
|
+
super(), this._identity = _identity, this._config = _config;
|
|
568
|
+
this._baseWsUrl = getEdgeUrlWithProtocol(_config.socketEndpoint, "ws");
|
|
569
|
+
this._baseHttpUrl = getEdgeUrlWithProtocol(_config.socketEndpoint, "http");
|
|
570
|
+
}
|
|
572
571
|
get info() {
|
|
573
572
|
return {
|
|
574
573
|
open: this.isOpen,
|
|
@@ -851,14 +850,7 @@ var EdgeClient = class extends Resource2 {
|
|
|
851
850
|
return void 0;
|
|
852
851
|
}
|
|
853
852
|
}
|
|
854
|
-
|
|
855
|
-
super(), _define_property2(this, "_identity", void 0), _define_property2(this, "_config", void 0), _define_property2(this, "statusChanged", void 0), _define_property2(this, "_persistentLifecycle", void 0), _define_property2(this, "_messageListeners", void 0), _define_property2(this, "_reconnectListeners", void 0), _define_property2(this, "_baseWsUrl", void 0), _define_property2(this, "_baseHttpUrl", void 0), _define_property2(this, "_currentConnection", void 0), _define_property2(this, "_ready", void 0), _define_property2(this, "_isActive", void 0), this._identity = _identity, this._config = _config, this.statusChanged = new Event(), this._persistentLifecycle = new PersistentLifecycle({
|
|
856
|
-
start: async () => this._connect(),
|
|
857
|
-
stop: async (state) => this._disconnect(state)
|
|
858
|
-
}), this._messageListeners = /* @__PURE__ */ new Set(), this._reconnectListeners = /* @__PURE__ */ new Set(), this._currentConnection = void 0, this._ready = new Trigger(), this._isActive = (connection) => connection === this._currentConnection;
|
|
859
|
-
this._baseWsUrl = getEdgeUrlWithProtocol(_config.socketEndpoint, "ws");
|
|
860
|
-
this._baseHttpUrl = getEdgeUrlWithProtocol(_config.socketEndpoint, "http");
|
|
861
|
-
}
|
|
853
|
+
_isActive = (connection) => connection === this._currentConnection;
|
|
862
854
|
};
|
|
863
855
|
_ts_decorate2([
|
|
864
856
|
logInfo2
|
|
@@ -875,6 +867,7 @@ import * as Effect2 from "effect/Effect";
|
|
|
875
867
|
import * as Function from "effect/Function";
|
|
876
868
|
import { sleep } from "@dxos/async";
|
|
877
869
|
import { Context as Context3 } from "@dxos/context";
|
|
870
|
+
import { invariant as invariant4 } from "@dxos/invariant";
|
|
878
871
|
import { log as log4 } from "@dxos/log";
|
|
879
872
|
import { EdgeAuthChallengeError, EdgeCallFailedError } from "@dxos/protocols";
|
|
880
873
|
import { createUrl } from "@dxos/util";
|
|
@@ -886,28 +879,14 @@ import * as Effect from "effect/Effect";
|
|
|
886
879
|
import * as Layer from "effect/Layer";
|
|
887
880
|
import * as Schedule from "effect/Schedule";
|
|
888
881
|
import { log as log3 } from "@dxos/log";
|
|
889
|
-
function _define_property3(obj, key, value) {
|
|
890
|
-
if (key in obj) {
|
|
891
|
-
Object.defineProperty(obj, key, {
|
|
892
|
-
value,
|
|
893
|
-
enumerable: true,
|
|
894
|
-
configurable: true,
|
|
895
|
-
writable: true
|
|
896
|
-
});
|
|
897
|
-
} else {
|
|
898
|
-
obj[key] = value;
|
|
899
|
-
}
|
|
900
|
-
return obj;
|
|
901
|
-
}
|
|
902
882
|
var __dxlog_file5 = "/__w/dxos/dxos/packages/core/mesh/edge-client/src/http-client.ts";
|
|
903
|
-
var
|
|
904
|
-
|
|
883
|
+
var HttpConfig = class _HttpConfig extends Context2.Tag("HttpConfig")() {
|
|
884
|
+
static default = Layer.succeed(_HttpConfig, {
|
|
885
|
+
timeout: Duration.millis(1e3),
|
|
886
|
+
retryTimes: 3,
|
|
887
|
+
retryBaseDelay: Duration.millis(1e3)
|
|
888
|
+
});
|
|
905
889
|
};
|
|
906
|
-
_define_property3(HttpConfig, "default", Layer.succeed(HttpConfig, {
|
|
907
|
-
timeout: Duration.millis(1e3),
|
|
908
|
-
retryTimes: 3,
|
|
909
|
-
retryBaseDelay: Duration.millis(1e3)
|
|
910
|
-
}));
|
|
911
890
|
var withRetry = (effect, { timeout: timeout2 = Duration.millis(1e3), retryBaseDelay = Duration.millis(1e3), retryTimes = 3 } = {}) => {
|
|
912
891
|
return effect.pipe(Effect.flatMap((res) => (
|
|
913
892
|
// Treat 500 errors as retryable?
|
|
@@ -935,25 +914,29 @@ var encodeAuthHeader = (challenge) => {
|
|
|
935
914
|
};
|
|
936
915
|
|
|
937
916
|
// src/edge-http-client.ts
|
|
938
|
-
function _define_property4(obj, key, value) {
|
|
939
|
-
if (key in obj) {
|
|
940
|
-
Object.defineProperty(obj, key, {
|
|
941
|
-
value,
|
|
942
|
-
enumerable: true,
|
|
943
|
-
configurable: true,
|
|
944
|
-
writable: true
|
|
945
|
-
});
|
|
946
|
-
} else {
|
|
947
|
-
obj[key] = value;
|
|
948
|
-
}
|
|
949
|
-
return obj;
|
|
950
|
-
}
|
|
951
917
|
var __dxlog_file6 = "/__w/dxos/dxos/packages/core/mesh/edge-client/src/edge-http-client.ts";
|
|
952
918
|
var DEFAULT_RETRY_TIMEOUT = 1500;
|
|
953
919
|
var DEFAULT_RETRY_JITTER = 500;
|
|
954
920
|
var DEFAULT_MAX_RETRIES_COUNT = 3;
|
|
955
921
|
var WARNING_BODY_SIZE = 10 * 1024 * 1024;
|
|
956
922
|
var EdgeHttpClient = class {
|
|
923
|
+
_baseUrl;
|
|
924
|
+
_edgeIdentity;
|
|
925
|
+
/**
|
|
926
|
+
* Auth header is cached until receiving the next 401 from EDGE, at which point it gets refreshed.
|
|
927
|
+
*/
|
|
928
|
+
_authHeader;
|
|
929
|
+
constructor(baseUrl) {
|
|
930
|
+
this._baseUrl = getEdgeUrlWithProtocol(baseUrl, "http");
|
|
931
|
+
log4("created", {
|
|
932
|
+
url: this._baseUrl
|
|
933
|
+
}, {
|
|
934
|
+
F: __dxlog_file6,
|
|
935
|
+
L: 100,
|
|
936
|
+
S: this,
|
|
937
|
+
C: (f, a) => f(...a)
|
|
938
|
+
});
|
|
939
|
+
}
|
|
957
940
|
get baseUrl() {
|
|
958
941
|
return this._baseUrl;
|
|
959
942
|
}
|
|
@@ -1086,6 +1069,7 @@ var EdgeHttpClient = class {
|
|
|
1086
1069
|
formData.append("version", body.version);
|
|
1087
1070
|
formData.append("ownerPublicKey", body.ownerPublicKey);
|
|
1088
1071
|
formData.append("entryPoint", body.entryPoint);
|
|
1072
|
+
body.runtime && formData.append("runtime", body.runtime);
|
|
1089
1073
|
for (const [filename, content] of Object.entries(body.assets)) {
|
|
1090
1074
|
formData.append("assets", new Blob([
|
|
1091
1075
|
content
|
|
@@ -1177,69 +1161,86 @@ var EdgeHttpClient = class {
|
|
|
1177
1161
|
// TODO(burdon): Refactor with effect (see edge-http-client.test.ts).
|
|
1178
1162
|
async _call(url, args) {
|
|
1179
1163
|
const shouldRetry = createRetryHandler(args);
|
|
1180
|
-
const requestContext = args.context ??
|
|
1164
|
+
const requestContext = args.context ?? Context3.default(void 0, {
|
|
1181
1165
|
F: __dxlog_file6,
|
|
1182
|
-
L:
|
|
1166
|
+
L: 393
|
|
1183
1167
|
});
|
|
1184
1168
|
log4("fetch", {
|
|
1185
1169
|
url,
|
|
1186
1170
|
request: args.body
|
|
1187
1171
|
}, {
|
|
1188
1172
|
F: __dxlog_file6,
|
|
1189
|
-
L:
|
|
1173
|
+
L: 394,
|
|
1190
1174
|
S: this,
|
|
1191
1175
|
C: (f, a) => f(...a)
|
|
1192
1176
|
});
|
|
1193
1177
|
let handledAuth = false;
|
|
1194
1178
|
while (true) {
|
|
1195
1179
|
let processingError = void 0;
|
|
1196
|
-
let retryAfterHeaderValue = Number.NaN;
|
|
1197
1180
|
try {
|
|
1198
1181
|
const request = createRequest(args, this._authHeader);
|
|
1199
1182
|
const response = await fetch(url, request);
|
|
1200
|
-
retryAfterHeaderValue = Number(response.headers.get("Retry-After"));
|
|
1201
1183
|
if (response.ok) {
|
|
1202
|
-
const
|
|
1184
|
+
const body2 = await response.clone().json();
|
|
1203
1185
|
if (args.rawResponse) {
|
|
1204
|
-
return
|
|
1205
|
-
}
|
|
1206
|
-
if (!("success" in body)) {
|
|
1207
|
-
return body;
|
|
1186
|
+
return body2;
|
|
1208
1187
|
}
|
|
1209
|
-
|
|
1210
|
-
return body.data;
|
|
1211
|
-
}
|
|
1212
|
-
log4.warn("unsuccessful edge response", {
|
|
1213
|
-
url,
|
|
1214
|
-
body
|
|
1215
|
-
}, {
|
|
1188
|
+
invariant4(body2, "Expected body to be present", {
|
|
1216
1189
|
F: __dxlog_file6,
|
|
1217
|
-
L:
|
|
1190
|
+
L: 408,
|
|
1218
1191
|
S: this,
|
|
1219
|
-
|
|
1192
|
+
A: [
|
|
1193
|
+
"body",
|
|
1194
|
+
"'Expected body to be present'"
|
|
1195
|
+
]
|
|
1220
1196
|
});
|
|
1221
|
-
if (
|
|
1222
|
-
|
|
1223
|
-
}
|
|
1224
|
-
|
|
1197
|
+
if (!("success" in body2)) {
|
|
1198
|
+
return body2;
|
|
1199
|
+
}
|
|
1200
|
+
if (body2.success) {
|
|
1201
|
+
return body2.data;
|
|
1225
1202
|
}
|
|
1226
1203
|
} else if (response.status === 401 && !handledAuth) {
|
|
1227
1204
|
this._authHeader = await this._handleUnauthorized(response);
|
|
1228
1205
|
handledAuth = true;
|
|
1229
1206
|
continue;
|
|
1207
|
+
}
|
|
1208
|
+
const body = response.headers.get("Content-Type") === "application/json" ? await response.clone().json() : void 0;
|
|
1209
|
+
invariant4(!body?.success, "Expected body to not be a failure response or undefined.", {
|
|
1210
|
+
F: __dxlog_file6,
|
|
1211
|
+
L: 424,
|
|
1212
|
+
S: this,
|
|
1213
|
+
A: [
|
|
1214
|
+
"!body?.success",
|
|
1215
|
+
"'Expected body to not be a failure response or undefined.'"
|
|
1216
|
+
]
|
|
1217
|
+
});
|
|
1218
|
+
if (body?.errorData?.type === "auth_challenge" && typeof body?.errorData?.challenge === "string") {
|
|
1219
|
+
processingError = new EdgeAuthChallengeError(body.errorData.challenge, body.errorData);
|
|
1220
|
+
} else if (body?.success === false) {
|
|
1221
|
+
processingError = EdgeCallFailedError.fromUnsuccessfulResponse(response, body);
|
|
1230
1222
|
} else {
|
|
1223
|
+
invariant4(!response.ok, "Expected response to not be ok.", {
|
|
1224
|
+
F: __dxlog_file6,
|
|
1225
|
+
L: 431,
|
|
1226
|
+
S: this,
|
|
1227
|
+
A: [
|
|
1228
|
+
"!response.ok",
|
|
1229
|
+
"'Expected response to not be ok.'"
|
|
1230
|
+
]
|
|
1231
|
+
});
|
|
1231
1232
|
processingError = await EdgeCallFailedError.fromHttpFailure(response);
|
|
1232
1233
|
}
|
|
1233
1234
|
} catch (error) {
|
|
1234
1235
|
processingError = EdgeCallFailedError.fromProcessingFailureCause(error);
|
|
1235
1236
|
}
|
|
1236
|
-
if (processingError?.isRetryable && await shouldRetry(requestContext,
|
|
1237
|
+
if (processingError?.isRetryable && await shouldRetry(requestContext, processingError.retryAfterMs)) {
|
|
1237
1238
|
log4("retrying edge request", {
|
|
1238
1239
|
url,
|
|
1239
1240
|
processingError
|
|
1240
1241
|
}, {
|
|
1241
1242
|
F: __dxlog_file6,
|
|
1242
|
-
L:
|
|
1243
|
+
L: 439,
|
|
1243
1244
|
S: this,
|
|
1244
1245
|
C: (f, a) => f(...a)
|
|
1245
1246
|
});
|
|
@@ -1252,7 +1253,7 @@ var EdgeHttpClient = class {
|
|
|
1252
1253
|
if (!this._edgeIdentity) {
|
|
1253
1254
|
log4.warn("unauthorized response received before identity was set", void 0, {
|
|
1254
1255
|
F: __dxlog_file6,
|
|
1255
|
-
L:
|
|
1256
|
+
L: 448,
|
|
1256
1257
|
S: this,
|
|
1257
1258
|
C: (f, a) => f(...a)
|
|
1258
1259
|
});
|
|
@@ -1261,20 +1262,6 @@ var EdgeHttpClient = class {
|
|
|
1261
1262
|
const challenge = await handleAuthChallenge(response, this._edgeIdentity);
|
|
1262
1263
|
return encodeAuthHeader(challenge);
|
|
1263
1264
|
}
|
|
1264
|
-
constructor(baseUrl) {
|
|
1265
|
-
_define_property4(this, "_baseUrl", void 0);
|
|
1266
|
-
_define_property4(this, "_edgeIdentity", void 0);
|
|
1267
|
-
_define_property4(this, "_authHeader", void 0);
|
|
1268
|
-
this._baseUrl = getEdgeUrlWithProtocol(baseUrl, "http");
|
|
1269
|
-
log4("created", {
|
|
1270
|
-
url: this._baseUrl
|
|
1271
|
-
}, {
|
|
1272
|
-
F: __dxlog_file6,
|
|
1273
|
-
L: 99,
|
|
1274
|
-
S: this,
|
|
1275
|
-
C: (f, a) => f(...a)
|
|
1276
|
-
});
|
|
1277
|
-
}
|
|
1278
1265
|
};
|
|
1279
1266
|
var createRequest = ({ method, body, json = true }, authHeader) => {
|
|
1280
1267
|
let requestBody;
|
|
@@ -1290,7 +1277,7 @@ var createRequest = ({ method, body, json = true }, authHeader) => {
|
|
|
1290
1277
|
bodySize: requestBody.length
|
|
1291
1278
|
}, {
|
|
1292
1279
|
F: __dxlog_file6,
|
|
1293
|
-
L:
|
|
1280
|
+
L: 472,
|
|
1294
1281
|
S: void 0,
|
|
1295
1282
|
C: (f, a) => f(...a)
|
|
1296
1283
|
});
|