@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.
Files changed (32) hide show
  1. package/dist/lib/{browser/chunk-IKP53CBQ.mjs → neutral/chunk-VESGVCLQ.mjs} +15 -44
  2. package/dist/lib/{browser/chunk-IKP53CBQ.mjs.map → neutral/chunk-VESGVCLQ.mjs.map} +2 -2
  3. package/dist/lib/{browser → neutral}/edge-ws-muxer.mjs +1 -1
  4. package/dist/lib/{browser → neutral}/index.mjs +159 -141
  5. package/dist/lib/neutral/index.mjs.map +7 -0
  6. package/dist/lib/neutral/meta.json +1 -0
  7. package/dist/lib/{browser → neutral}/testing/index.mjs +1 -1
  8. package/dist/lib/{browser → neutral}/testing/index.mjs.map +1 -1
  9. package/dist/types/src/edge-http-client.d.ts +13 -7
  10. package/dist/types/src/edge-http-client.d.ts.map +1 -1
  11. package/dist/types/src/http-client.d.ts.map +1 -1
  12. package/dist/types/src/testing/test-utils.d.ts +2 -2
  13. package/dist/types/src/testing/test-utils.d.ts.map +1 -1
  14. package/dist/types/tsconfig.tsbuildinfo +1 -1
  15. package/package.json +25 -23
  16. package/src/edge-http-client.test.ts +1 -1
  17. package/src/edge-http-client.ts +60 -36
  18. package/src/http-client.test.ts +3 -2
  19. package/src/http-client.ts +5 -1
  20. package/src/testing/test-utils.ts +4 -4
  21. package/dist/lib/browser/index.mjs.map +0 -7
  22. package/dist/lib/browser/meta.json +0 -1
  23. package/dist/lib/node-esm/chunk-DR5YNW5K.mjs +0 -332
  24. package/dist/lib/node-esm/chunk-DR5YNW5K.mjs.map +0 -7
  25. package/dist/lib/node-esm/edge-ws-muxer.mjs +0 -12
  26. package/dist/lib/node-esm/edge-ws-muxer.mjs.map +0 -7
  27. package/dist/lib/node-esm/index.mjs +0 -1357
  28. package/dist/lib/node-esm/index.mjs.map +0 -7
  29. package/dist/lib/node-esm/meta.json +0 -1
  30. package/dist/lib/node-esm/testing/index.mjs +0 -186
  31. package/dist/lib/node-esm/testing/index.mjs.map +0 -7
  32. /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-IKP53CBQ.mjs.map
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": "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",
6
- "names": ["Trigger", "log", "buf", "MessageSchema", "bufWkt", "SwarmRequestSchema", "SwarmResponseSchema", "TextMessageSchema", "invariant", "buf", "bufWkt", "MessageSchema", "bufferToArray", "getTypename", "typeName", "Protocol", "typeRegistry", "_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", "types", "createRegistry", "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", "send", "message", "binary", "buf", "toBinary", "MessageSchema", "channelId", "_resolveChannel", "byteLength", "log", "error", "serviceId", "payload", "protocol", "getPayloadType", "length", "_maxChunkLength", "flags", "Buffer", "from", "_ws", "concat", "terminatorSentTrigger", "Trigger", "messageChunks", "i", "chunk", "slice", "isLastChunk", "push", "trigger", "queuedMessages", "_outMessageChunks", "get", "set", "_sendChunkedMessages", "wait", "receiveData", "data", "fromBinary", "chunkAccumulator", "_inMessageAccumulator", "undefined", "delete", "destroy", "_sendTimeout", "clearTimeout", "channelChunks", "values", "forEach", "wake", "clear", "_outMessageChannelByService", "readyState", "warn", "timeout", "emptyChannels", "messages", "entries", "bufferedAmount", "nextMessage", "shift", "size", "setTimeout", "id", "config", "_define_property", "Map", "maxChunkLength"]
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
  }
@@ -2,7 +2,7 @@ import {
2
2
  CLOUDFLARE_MESSAGE_MAX_BYTES,
3
3
  CLOUDFLARE_RPC_MAX_BYTES,
4
4
  WebSocketMuxer
5
- } from "./chunk-IKP53CBQ.mjs";
5
+ } from "./chunk-VESGVCLQ.mjs";
6
6
  export {
7
7
  CLOUDFLARE_MESSAGE_MAX_BYTES,
8
8
  CLOUDFLARE_RPC_MAX_BYTES,
@@ -6,7 +6,7 @@ import {
6
6
  getTypename,
7
7
  protocol,
8
8
  toUint8Array
9
- } from "./chunk-IKP53CBQ.mjs";
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
- constructor(_identity, _config) {
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 _Context_Tag;
904
- var HttpConfig = class extends (_Context_Tag = Context2.Tag("HttpConfig")()) {
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) => log3.info("response", {
925
- status: res.status
926
- }, {
927
- F: __dxlog_file5,
928
- L: 64,
929
- S: void 0,
930
- C: (f, a) => f(...a)
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 { queueId } = query;
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, args) {
1175
- return Function.pipe(HttpClient.get(url), withLogging, withRetryConfig, Effect2.provide(FetchHttpClient.layer), Effect2.provide(HttpConfig.default), Effect2.withSpan("EdgeHttpClient"), Effect2.runPromise);
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 ?? new Context3(void 0, {
1181
+ const requestContext = args.context ?? Context3.default(void 0, {
1181
1182
  F: __dxlog_file6,
1182
- L: 391
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: 392,
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 body = await response.json();
1203
- if (args.rawResponse) {
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: 417,
1221
+ L: 428,
1218
1222
  S: this,
1219
- C: (f, a) => f(...a)
1223
+ A: [
1224
+ "body",
1225
+ "'Expected body to be present'"
1226
+ ]
1220
1227
  });
1221
- if (body.errorData?.type === "auth_challenge" && typeof body.errorData?.challenge === "string") {
1222
- processingError = new EdgeAuthChallengeError(body.errorData.challenge, body.errorData);
1223
- } else if (body.errorData) {
1224
- processingError = EdgeCallFailedError.fromUnsuccessfulResponse(response, body);
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, retryAfterHeaderValue)) {
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: 435,
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: 444,
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: 468,
1311
+ L: 492,
1294
1312
  S: void 0,
1295
1313
  C: (f, a) => f(...a)
1296
1314
  });