@dxos/edge-client 0.8.4-main.ead640a → 0.8.4-main.ef1bc66f44
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 → neutral/chunk-VESGVCLQ.mjs} +15 -44
- package/dist/lib/{browser/chunk-IKP53CBQ.mjs.map → neutral/chunk-VESGVCLQ.mjs.map} +2 -2
- package/dist/lib/{browser → neutral}/edge-ws-muxer.mjs +1 -1
- package/dist/lib/{browser → neutral}/index.mjs +159 -141
- package/dist/lib/neutral/index.mjs.map +7 -0
- package/dist/lib/neutral/meta.json +1 -0
- package/dist/lib/{browser → neutral}/testing/index.mjs +1 -1
- package/dist/lib/{browser → neutral}/testing/index.mjs.map +1 -1
- package/dist/types/src/edge-http-client.d.ts +13 -7
- package/dist/types/src/edge-http-client.d.ts.map +1 -1
- package/dist/types/src/http-client.d.ts.map +1 -1
- package/dist/types/src/testing/test-utils.d.ts +2 -2
- package/dist/types/src/testing/test-utils.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +25 -23
- package/src/edge-http-client.test.ts +1 -1
- package/src/edge-http-client.ts +60 -36
- package/src/http-client.test.ts +3 -2
- package/src/http-client.ts +5 -1
- package/src/testing/test-utils.ts +4 -4
- package/dist/lib/browser/index.mjs.map +0 -7
- package/dist/lib/browser/meta.json +0 -1
- package/dist/lib/node-esm/chunk-DR5YNW5K.mjs +0 -332
- package/dist/lib/node-esm/chunk-DR5YNW5K.mjs.map +0 -7
- package/dist/lib/node-esm/edge-ws-muxer.mjs +0 -12
- package/dist/lib/node-esm/edge-ws-muxer.mjs.map +0 -7
- package/dist/lib/node-esm/index.mjs +0 -1357
- package/dist/lib/node-esm/index.mjs.map +0 -7
- package/dist/lib/node-esm/meta.json +0 -1
- package/dist/lib/node-esm/testing/index.mjs +0 -186
- package/dist/lib/node-esm/testing/index.mjs.map +0 -7
- /package/dist/lib/{browser → neutral}/edge-ws-muxer.mjs.map +0 -0
|
@@ -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,8 @@ 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 { runAndForwardErrors } from "@dxos/effect";
|
|
871
|
+
import { invariant as invariant4 } from "@dxos/invariant";
|
|
878
872
|
import { log as log4 } from "@dxos/log";
|
|
879
873
|
import { EdgeAuthChallengeError, EdgeCallFailedError } from "@dxos/protocols";
|
|
880
874
|
import { createUrl } from "@dxos/util";
|
|
@@ -886,28 +880,14 @@ import * as Effect from "effect/Effect";
|
|
|
886
880
|
import * as Layer from "effect/Layer";
|
|
887
881
|
import * as Schedule from "effect/Schedule";
|
|
888
882
|
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
883
|
var __dxlog_file5 = "/__w/dxos/dxos/packages/core/mesh/edge-client/src/http-client.ts";
|
|
903
|
-
var
|
|
904
|
-
|
|
884
|
+
var HttpConfig = class _HttpConfig extends Context2.Tag("HttpConfig")() {
|
|
885
|
+
static default = Layer.succeed(_HttpConfig, {
|
|
886
|
+
timeout: Duration.millis(1e3),
|
|
887
|
+
retryTimes: 3,
|
|
888
|
+
retryBaseDelay: Duration.millis(1e3)
|
|
889
|
+
});
|
|
905
890
|
};
|
|
906
|
-
_define_property3(HttpConfig, "default", Layer.succeed(HttpConfig, {
|
|
907
|
-
timeout: Duration.millis(1e3),
|
|
908
|
-
retryTimes: 3,
|
|
909
|
-
retryBaseDelay: Duration.millis(1e3)
|
|
910
|
-
}));
|
|
911
891
|
var withRetry = (effect, { timeout: timeout2 = Duration.millis(1e3), retryBaseDelay = Duration.millis(1e3), retryTimes = 3 } = {}) => {
|
|
912
892
|
return effect.pipe(Effect.flatMap((res) => (
|
|
913
893
|
// Treat 500 errors as retryable?
|
|
@@ -921,39 +901,45 @@ var withRetryConfig = (effect) => Effect.gen(function* () {
|
|
|
921
901
|
const config = yield* HttpConfig;
|
|
922
902
|
return yield* withRetry(effect, config);
|
|
923
903
|
});
|
|
924
|
-
var withLogging = (effect) => effect.pipe(Effect.tap((res) =>
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
904
|
+
var withLogging = (effect) => effect.pipe(Effect.tap((res) => {
|
|
905
|
+
log3.info("response", {
|
|
906
|
+
status: res.status
|
|
907
|
+
}, {
|
|
908
|
+
F: __dxlog_file5,
|
|
909
|
+
L: 66,
|
|
910
|
+
S: void 0,
|
|
911
|
+
C: (f, a) => f(...a)
|
|
912
|
+
});
|
|
913
|
+
}));
|
|
932
914
|
var encodeAuthHeader = (challenge) => {
|
|
933
915
|
const encodedChallenge = Buffer.from(challenge).toString("base64");
|
|
934
916
|
return `VerifiablePresentation pb;base64,${encodedChallenge}`;
|
|
935
917
|
};
|
|
936
918
|
|
|
937
919
|
// 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
920
|
var __dxlog_file6 = "/__w/dxos/dxos/packages/core/mesh/edge-client/src/edge-http-client.ts";
|
|
952
921
|
var DEFAULT_RETRY_TIMEOUT = 1500;
|
|
953
922
|
var DEFAULT_RETRY_JITTER = 500;
|
|
954
923
|
var DEFAULT_MAX_RETRIES_COUNT = 3;
|
|
955
924
|
var WARNING_BODY_SIZE = 10 * 1024 * 1024;
|
|
956
925
|
var EdgeHttpClient = class {
|
|
926
|
+
_baseUrl;
|
|
927
|
+
_edgeIdentity;
|
|
928
|
+
/**
|
|
929
|
+
* Auth header is cached until receiving the next 401 from EDGE, at which point it gets refreshed.
|
|
930
|
+
*/
|
|
931
|
+
_authHeader;
|
|
932
|
+
constructor(baseUrl) {
|
|
933
|
+
this._baseUrl = getEdgeUrlWithProtocol(baseUrl, "http");
|
|
934
|
+
log4("created", {
|
|
935
|
+
url: this._baseUrl
|
|
936
|
+
}, {
|
|
937
|
+
F: __dxlog_file6,
|
|
938
|
+
L: 106,
|
|
939
|
+
S: this,
|
|
940
|
+
C: (f, a) => f(...a)
|
|
941
|
+
});
|
|
942
|
+
}
|
|
957
943
|
get baseUrl() {
|
|
958
944
|
return this._baseUrl;
|
|
959
945
|
}
|
|
@@ -969,7 +955,8 @@ var EdgeHttpClient = class {
|
|
|
969
955
|
async getStatus(args) {
|
|
970
956
|
return this._call(new URL("/status", this.baseUrl), {
|
|
971
957
|
...args,
|
|
972
|
-
method: "GET"
|
|
958
|
+
method: "GET",
|
|
959
|
+
auth: true
|
|
973
960
|
});
|
|
974
961
|
}
|
|
975
962
|
//
|
|
@@ -1048,7 +1035,16 @@ var EdgeHttpClient = class {
|
|
|
1048
1035
|
// Queues
|
|
1049
1036
|
//
|
|
1050
1037
|
async queryQueue(subspaceTag, spaceId, query, args) {
|
|
1051
|
-
const
|
|
1038
|
+
const queueId = query.queueIds?.[0];
|
|
1039
|
+
invariant4(queueId, "queueId required", {
|
|
1040
|
+
F: __dxlog_file6,
|
|
1041
|
+
L: 215,
|
|
1042
|
+
S: this,
|
|
1043
|
+
A: [
|
|
1044
|
+
"queueId",
|
|
1045
|
+
"'queueId required'"
|
|
1046
|
+
]
|
|
1047
|
+
});
|
|
1052
1048
|
return this._call(createUrl(new URL(`/spaces/${subspaceTag}/${spaceId}/queue/${queueId}/query`, this.baseUrl), {
|
|
1053
1049
|
after: query.after,
|
|
1054
1050
|
before: query.before,
|
|
@@ -1086,6 +1082,7 @@ var EdgeHttpClient = class {
|
|
|
1086
1082
|
formData.append("version", body.version);
|
|
1087
1083
|
formData.append("ownerPublicKey", body.ownerPublicKey);
|
|
1088
1084
|
formData.append("entryPoint", body.entryPoint);
|
|
1085
|
+
body.runtime && formData.append("runtime", body.runtime);
|
|
1089
1086
|
for (const [filename, content] of Object.entries(body.assets)) {
|
|
1090
1087
|
formData.append("assets", new Blob([
|
|
1091
1088
|
content
|
|
@@ -1129,8 +1126,7 @@ var EdgeHttpClient = class {
|
|
|
1129
1126
|
return this._call(url, {
|
|
1130
1127
|
...args,
|
|
1131
1128
|
body: input,
|
|
1132
|
-
method: "POST"
|
|
1133
|
-
rawResponse: true
|
|
1129
|
+
method: "POST"
|
|
1134
1130
|
});
|
|
1135
1131
|
}
|
|
1136
1132
|
//
|
|
@@ -1151,6 +1147,11 @@ var EdgeHttpClient = class {
|
|
|
1151
1147
|
method: "GET"
|
|
1152
1148
|
});
|
|
1153
1149
|
}
|
|
1150
|
+
async forceRunCronTrigger(spaceId, triggerId) {
|
|
1151
|
+
return this._call(new URL(`/test/functions/${spaceId}/triggers/crons/${triggerId}/run`, this.baseUrl), {
|
|
1152
|
+
method: "POST"
|
|
1153
|
+
});
|
|
1154
|
+
}
|
|
1154
1155
|
//
|
|
1155
1156
|
// Import/Export space.
|
|
1156
1157
|
//
|
|
@@ -1171,75 +1172,106 @@ var EdgeHttpClient = class {
|
|
|
1171
1172
|
//
|
|
1172
1173
|
// Internal
|
|
1173
1174
|
//
|
|
1174
|
-
async _fetch(url,
|
|
1175
|
-
return Function.pipe(HttpClient.get(url), withLogging, withRetryConfig, Effect2.provide(FetchHttpClient.layer), Effect2.provide(HttpConfig.default), Effect2.withSpan("EdgeHttpClient"),
|
|
1175
|
+
async _fetch(url, _args) {
|
|
1176
|
+
return Function.pipe(HttpClient.get(url), withLogging, withRetryConfig, Effect2.provide(FetchHttpClient.layer), Effect2.provide(HttpConfig.default), Effect2.withSpan("EdgeHttpClient"), runAndForwardErrors);
|
|
1176
1177
|
}
|
|
1177
1178
|
// TODO(burdon): Refactor with effect (see edge-http-client.test.ts).
|
|
1178
1179
|
async _call(url, args) {
|
|
1179
1180
|
const shouldRetry = createRetryHandler(args);
|
|
1180
|
-
const requestContext = args.context ??
|
|
1181
|
+
const requestContext = args.context ?? Context3.default(void 0, {
|
|
1181
1182
|
F: __dxlog_file6,
|
|
1182
|
-
L:
|
|
1183
|
+
L: 407
|
|
1183
1184
|
});
|
|
1184
1185
|
log4("fetch", {
|
|
1185
1186
|
url,
|
|
1186
1187
|
request: args.body
|
|
1187
1188
|
}, {
|
|
1188
1189
|
F: __dxlog_file6,
|
|
1189
|
-
L:
|
|
1190
|
+
L: 408,
|
|
1190
1191
|
S: this,
|
|
1191
1192
|
C: (f, a) => f(...a)
|
|
1192
1193
|
});
|
|
1193
1194
|
let handledAuth = false;
|
|
1195
|
+
const tryCount = 1;
|
|
1194
1196
|
while (true) {
|
|
1195
1197
|
let processingError = void 0;
|
|
1196
|
-
let retryAfterHeaderValue = Number.NaN;
|
|
1197
1198
|
try {
|
|
1199
|
+
if (!this._authHeader && args.auth) {
|
|
1200
|
+
const response2 = await fetch(new URL(`/auth`, this.baseUrl));
|
|
1201
|
+
if (response2.status === 401) {
|
|
1202
|
+
this._authHeader = await this._handleUnauthorized(response2);
|
|
1203
|
+
}
|
|
1204
|
+
}
|
|
1198
1205
|
const request = createRequest(args, this._authHeader);
|
|
1206
|
+
log4("call edge", {
|
|
1207
|
+
url,
|
|
1208
|
+
tryCount,
|
|
1209
|
+
authHeader: !!this._authHeader
|
|
1210
|
+
}, {
|
|
1211
|
+
F: __dxlog_file6,
|
|
1212
|
+
L: 423,
|
|
1213
|
+
S: this,
|
|
1214
|
+
C: (f, a) => f(...a)
|
|
1215
|
+
});
|
|
1199
1216
|
const response = await fetch(url, request);
|
|
1200
|
-
retryAfterHeaderValue = Number(response.headers.get("Retry-After"));
|
|
1201
1217
|
if (response.ok) {
|
|
1202
|
-
const
|
|
1203
|
-
|
|
1204
|
-
return body;
|
|
1205
|
-
}
|
|
1206
|
-
if (!("success" in body)) {
|
|
1207
|
-
return body;
|
|
1208
|
-
}
|
|
1209
|
-
if (body.success) {
|
|
1210
|
-
return body.data;
|
|
1211
|
-
}
|
|
1212
|
-
log4.warn("unsuccessful edge response", {
|
|
1213
|
-
url,
|
|
1214
|
-
body
|
|
1215
|
-
}, {
|
|
1218
|
+
const body2 = await response.clone().json();
|
|
1219
|
+
invariant4(body2, "Expected body to be present", {
|
|
1216
1220
|
F: __dxlog_file6,
|
|
1217
|
-
L:
|
|
1221
|
+
L: 428,
|
|
1218
1222
|
S: this,
|
|
1219
|
-
|
|
1223
|
+
A: [
|
|
1224
|
+
"body",
|
|
1225
|
+
"'Expected body to be present'"
|
|
1226
|
+
]
|
|
1220
1227
|
});
|
|
1221
|
-
if (
|
|
1222
|
-
|
|
1223
|
-
}
|
|
1224
|
-
|
|
1228
|
+
if (!("success" in body2)) {
|
|
1229
|
+
return body2;
|
|
1230
|
+
}
|
|
1231
|
+
if (body2.success) {
|
|
1232
|
+
return body2.data;
|
|
1225
1233
|
}
|
|
1226
1234
|
} else if (response.status === 401 && !handledAuth) {
|
|
1227
1235
|
this._authHeader = await this._handleUnauthorized(response);
|
|
1228
1236
|
handledAuth = true;
|
|
1229
1237
|
continue;
|
|
1238
|
+
}
|
|
1239
|
+
const body = response.headers.get("Content-Type") === "application/json" ? await response.clone().json() : void 0;
|
|
1240
|
+
invariant4(!body?.success, "Expected body to not be a failure response or undefined.", {
|
|
1241
|
+
F: __dxlog_file6,
|
|
1242
|
+
L: 444,
|
|
1243
|
+
S: this,
|
|
1244
|
+
A: [
|
|
1245
|
+
"!body?.success",
|
|
1246
|
+
"'Expected body to not be a failure response or undefined.'"
|
|
1247
|
+
]
|
|
1248
|
+
});
|
|
1249
|
+
if (body?.data?.type === "auth_challenge" && typeof body?.data?.challenge === "string") {
|
|
1250
|
+
processingError = new EdgeAuthChallengeError(body.data.challenge, body.data);
|
|
1251
|
+
} else if (body?.success === false) {
|
|
1252
|
+
processingError = EdgeCallFailedError.fromUnsuccessfulResponse(response, body);
|
|
1230
1253
|
} else {
|
|
1254
|
+
invariant4(!response.ok, "Expected response to not be ok.", {
|
|
1255
|
+
F: __dxlog_file6,
|
|
1256
|
+
L: 451,
|
|
1257
|
+
S: this,
|
|
1258
|
+
A: [
|
|
1259
|
+
"!response.ok",
|
|
1260
|
+
"'Expected response to not be ok.'"
|
|
1261
|
+
]
|
|
1262
|
+
});
|
|
1231
1263
|
processingError = await EdgeCallFailedError.fromHttpFailure(response);
|
|
1232
1264
|
}
|
|
1233
1265
|
} catch (error) {
|
|
1234
1266
|
processingError = EdgeCallFailedError.fromProcessingFailureCause(error);
|
|
1235
1267
|
}
|
|
1236
|
-
if (processingError?.isRetryable && await shouldRetry(requestContext,
|
|
1237
|
-
log4("retrying edge request", {
|
|
1268
|
+
if (processingError?.isRetryable && await shouldRetry(requestContext, processingError.retryAfterMs)) {
|
|
1269
|
+
log4.verbose("retrying edge request", {
|
|
1238
1270
|
url,
|
|
1239
1271
|
processingError
|
|
1240
1272
|
}, {
|
|
1241
1273
|
F: __dxlog_file6,
|
|
1242
|
-
L:
|
|
1274
|
+
L: 459,
|
|
1243
1275
|
S: this,
|
|
1244
1276
|
C: (f, a) => f(...a)
|
|
1245
1277
|
});
|
|
@@ -1252,7 +1284,7 @@ var EdgeHttpClient = class {
|
|
|
1252
1284
|
if (!this._edgeIdentity) {
|
|
1253
1285
|
log4.warn("unauthorized response received before identity was set", void 0, {
|
|
1254
1286
|
F: __dxlog_file6,
|
|
1255
|
-
L:
|
|
1287
|
+
L: 468,
|
|
1256
1288
|
S: this,
|
|
1257
1289
|
C: (f, a) => f(...a)
|
|
1258
1290
|
});
|
|
@@ -1261,20 +1293,6 @@ var EdgeHttpClient = class {
|
|
|
1261
1293
|
const challenge = await handleAuthChallenge(response, this._edgeIdentity);
|
|
1262
1294
|
return encodeAuthHeader(challenge);
|
|
1263
1295
|
}
|
|
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
1296
|
};
|
|
1279
1297
|
var createRequest = ({ method, body, json = true }, authHeader) => {
|
|
1280
1298
|
let requestBody;
|
|
@@ -1290,7 +1308,7 @@ var createRequest = ({ method, body, json = true }, authHeader) => {
|
|
|
1290
1308
|
bodySize: requestBody.length
|
|
1291
1309
|
}, {
|
|
1292
1310
|
F: __dxlog_file6,
|
|
1293
|
-
L:
|
|
1311
|
+
L: 492,
|
|
1294
1312
|
S: void 0,
|
|
1295
1313
|
C: (f, a) => f(...a)
|
|
1296
1314
|
});
|