@dxos/edge-client 0.13.0 → 0.14.0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../src/auth.ts","../../package.json","../../src/reconnect-reason.ts","../../src/edge-ws-connection.ts","../../src/edge-client.ts","../../src/edge-ai-http-client.ts","../../src/hub-http-client.ts","../../src/browser-rendering.ts"],"sourcesContent":["//\n// Copyright 2024 DXOS.org\n//\n\nimport { create } from '@bufbuild/protobuf';\n\nimport { createCredential, createDidFromIdentityKey, signPresentation } from '@dxos/credentials';\nimport { type Signer } from '@dxos/crypto';\nimport { invariant } from '@dxos/invariant';\nimport { Keyring } from '@dxos/keyring';\nimport { IdentityDid, PublicKey } from '@dxos/keys';\nimport { fromPublicKey } from '@dxos/protocols/buf';\nimport {\n AuthorizedDeviceSchema,\n AuthSchema,\n type Chain,\n ChainSchema,\n type Credential,\n PresentationSchema,\n} from '@dxos/protocols/buf/dxos/halo/credentials_pb';\n\nimport type { EdgeIdentity } from './edge-identity.ts';\n\n/**\n * Edge identity backed by a device key without a credential chain.\n */\nexport const createDeviceEdgeIdentity = async (signer: Signer, key: PublicKey): Promise<EdgeIdentity> => {\n return {\n identityDid: await createDidFromIdentityKey(key),\n peerKey: key.toHex(),\n presentCredentials: async ({ challenge }) => {\n return signPresentation({\n presentation: create(PresentationSchema, {\n credentials: [\n // Verifier requires at least one credential in the presentation to establish the subject.\n await createCredential({\n assertion: create(AuthSchema, {}),\n issuer: key,\n subject: key,\n signer,\n }),\n ],\n }),\n signer,\n signerKey: key,\n nonce: challenge,\n });\n },\n };\n};\n\n/**\n * Edge identity backed by a chain of credentials.\n */\nexport const createChainEdgeIdentity = async (\n signer: Signer,\n identityKey: PublicKey,\n peerKey: PublicKey,\n chain: Chain | undefined,\n credentials: Credential[],\n): Promise<EdgeIdentity> => {\n const credentialsToSign =\n credentials.length > 0\n ? credentials\n : [\n await createCredential({\n assertion: create(AuthSchema, {}),\n issuer: identityKey,\n subject: identityKey,\n signer,\n chain,\n signingKey: peerKey,\n }),\n ];\n\n return {\n identityDid: await createDidFromIdentityKey(identityKey),\n peerKey: peerKey.toHex(),\n presentCredentials: async ({ challenge }) => {\n // TODO: make chain required after device invitation flow update release\n invariant(chain);\n return signPresentation({\n presentation: create(PresentationSchema, {\n credentials: credentialsToSign,\n }),\n signer,\n nonce: challenge,\n signerKey: peerKey,\n chain,\n });\n },\n };\n};\n\n/**\n * Edge identity backed by a random ephemeral key without HALO.\n */\nexport const createEphemeralEdgeIdentity = async (): Promise<EdgeIdentity> => {\n const keyring = new Keyring();\n const key = await keyring.createKey();\n return createDeviceEdgeIdentity(keyring, key);\n};\n\n/**\n * Creates a HALO chain of credentials to act as an edge identity.\n */\nexport const createTestHaloEdgeIdentity = async (\n signer: Signer,\n identityKey: PublicKey,\n deviceKey: PublicKey,\n): Promise<EdgeIdentity> => {\n const deviceAdmission = await createCredential({\n assertion: create(AuthorizedDeviceSchema, {\n deviceKey: fromPublicKey(deviceKey),\n identityKey: fromPublicKey(identityKey),\n }),\n issuer: identityKey,\n subject: deviceKey,\n signer,\n });\n return createChainEdgeIdentity(signer, identityKey, deviceKey, create(ChainSchema, { credential: deviceAdmission }), [\n await createCredential({\n assertion: create(AuthSchema, {}),\n issuer: identityKey,\n subject: identityKey,\n signer,\n }),\n ]);\n};\n\nexport const createStubEdgeIdentity = (): EdgeIdentity => {\n const deviceKey = PublicKey.random();\n return {\n // Random placeholder DID — the stub never authenticates or connects; a real identity replaces it.\n identityDid: IdentityDid.random(),\n peerKey: deviceKey.toHex(),\n presentCredentials: async () => {\n throw new Error('Stub identity does not support authentication.');\n },\n };\n};\n","{\n \"name\": \"@dxos/edge-client\",\n \"version\": \"0.13.0\",\n \"description\": \"EDGE Client\",\n \"homepage\": \"https://dxos.org\",\n \"bugs\": \"https://github.com/dxos/dxos/issues\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/dxos/dxos\"\n },\n \"license\": \"FSL-1.1-Apache-2.0\",\n \"author\": \"DXOS.org\",\n \"sideEffects\": false,\n \"type\": \"module\",\n \"exports\": {\n \".\": {\n \"source\": \"./src/index.ts\",\n \"types\": \"./dist/types/src/index.d.ts\",\n \"import\": \"./dist/lib/index.mjs\"\n },\n \"./cors-proxy\": {\n \"source\": \"./src/cors-proxy.ts\",\n \"types\": \"./dist/types/src/cors-proxy.d.ts\",\n \"import\": \"./dist/lib/cors-proxy.mjs\"\n },\n \"./muxer\": {\n \"source\": \"./src/edge-ws-muxer.ts\",\n \"types\": \"./dist/types/src/edge-ws-muxer.d.ts\",\n \"import\": \"./dist/lib/edge-ws-muxer.mjs\"\n },\n \"./service\": {\n \"source\": \"./src/service/index.ts\",\n \"types\": \"./dist/types/src/service/index.d.ts\",\n \"import\": \"./dist/lib/service.mjs\"\n },\n \"./testing\": {\n \"source\": \"./src/testing/index.ts\",\n \"types\": \"./dist/types/src/testing/index.d.ts\",\n \"import\": \"./dist/lib/testing.mjs\"\n },\n \"./http\": {\n \"source\": \"./src/edge-http-client.ts\",\n \"types\": \"./dist/types/src/edge-http-client.d.ts\",\n \"import\": \"./dist/lib/edge-http-client.mjs\"\n }\n },\n \"types\": \"dist/types/src/index.d.ts\",\n \"typesVersions\": {\n \"*\": {\n \"http\": [\n \"dist/types/src/edge-http-client.d.ts\"\n ]\n }\n },\n \"files\": [\n \"dist\",\n \"src\",\n \"README.md\"\n ],\n \"dependencies\": {\n \"@bufbuild/protobuf\": \"catalog:\",\n \"@dxos/async\": \"workspace:*\",\n \"@dxos/context\": \"workspace:*\",\n \"@dxos/credentials\": \"workspace:*\",\n \"@dxos/crypto\": \"workspace:*\",\n \"@dxos/effect\": \"workspace:*\",\n \"@dxos/errors\": \"workspace:*\",\n \"@dxos/invariant\": \"workspace:*\",\n \"@dxos/keyring\": \"workspace:*\",\n \"@dxos/keys\": \"workspace:*\",\n \"@dxos/log\": \"workspace:*\",\n \"@dxos/node-std\": \"workspace:*\",\n \"@dxos/protocols\": \"workspace:*\",\n \"@dxos/tracing\": \"workspace:*\",\n \"@dxos/util\": \"workspace:*\",\n \"isomorphic-ws\": \"catalog:\",\n \"ws\": \"catalog:\"\n },\n \"devDependencies\": {\n \"@dxos/test-utils\": \"workspace:*\"\n },\n \"peerDependencies\": {\n \"effect\": \"catalog:\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n }\n}\n","//\n// Copyright 2026 DXOS.org\n//\n\n/**\n * Why a websocket restart was required. A bounded enum, never a raw message: this is a metric\n * attribute, and one unbounded value would mint a new time series per distinct error string.\n */\nexport type ReconnectReason =\n /** The browser reports no network. The clearest \"lost the internet\" signal available. */\n | 'offline'\n /** Closed with 1006 — no close frame arrived, so the connection died rather than being closed. */\n | 'abnormal'\n /** Server closed deliberately and cleanly. */\n | 'normal'\n /** Server is going away or restarting (1001, 1012, 1013). */\n | 'going_away'\n /** Server-side failure (1011, 1014, 1015). */\n | 'server_error'\n /** Closed on policy or protocol grounds (1002, 1003, 1007, 1008, 1009, 1010). */\n | 'policy'\n /** Application close code, which EDGE uses for auth rejection. */\n | 'app'\n /** Socket-level error rather than a close frame — TLS, DNS, refused connect. */\n | 'socket_error'\n /** Keepalive watchdog fired: pings were flowing and the loop was live, but the peer went silent. */\n | 'inactivity_timeout'\n /** The local identity changed, so the socket was torn down deliberately. */\n | 'identity_changed'\n | 'other';\n\n/**\n * Classifies a close event.\n * `online` is checked first: a 1006 while the browser is offline is a lost network, not a server\n * fault, and conflating the two makes the metric useless for exactly the question it is asked.\n */\nexport const classifyCloseCode = (code: number | undefined, online: boolean | undefined): ReconnectReason => {\n if (online === false) {\n return 'offline';\n }\n if (code === undefined) {\n return 'other';\n }\n if (code >= 4000) {\n return 'app';\n }\n\n switch (code) {\n case 1000:\n return 'normal';\n case 1001:\n case 1012:\n case 1013:\n return 'going_away';\n case 1006:\n return 'abnormal';\n case 1011:\n case 1014:\n case 1015:\n return 'server_error';\n case 1002:\n case 1003:\n case 1007:\n case 1008:\n case 1009:\n case 1010:\n return 'policy';\n default:\n return 'other';\n }\n};\n\n/** Classifies a socket-level error, which carries no close code. */\nexport const classifySocketError = (online: boolean | undefined): ReconnectReason =>\n online === false ? 'offline' : 'socket_error';\n\n/** Reads `navigator.onLine` where available; `undefined` outside a browser-like realm. */\nexport const isOnline = (): boolean | undefined => {\n const nav = (globalThis as { navigator?: { onLine?: boolean } }).navigator;\n return typeof nav?.onLine === 'boolean' ? nav.onLine : undefined;\n};\n","//\n// Copyright 2024 DXOS.org\n//\n\nimport WebSocket from 'isomorphic-ws';\n\nimport { Mutex, scheduleTask, scheduleTaskInterval } from '@dxos/async';\nimport { Context, Resource } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\nimport { log, logInfo } from '@dxos/log';\nimport { EDGE_CLIENT_VERSION_PROTOCOL_PREFIX, EdgeWebsocketProtocol } from '@dxos/protocols';\nimport { buf } from '@dxos/protocols/buf';\nimport { type Message, MessageSchema } from '@dxos/protocols/buf/dxos/edge/messenger_pb';\n\nimport { version } from '../package.json';\nimport { protocol } from './defs.ts';\nimport { type EdgeIdentity } from './edge-identity.ts';\nimport { CLOUDFLARE_MESSAGE_MAX_BYTES, WebSocketClosedError, WebSocketMuxer } from './edge-ws-muxer.ts';\nimport { toUint8Array } from './protocol.ts';\nimport { type ReconnectReason, classifyCloseCode, classifySocketError, isOnline } from './reconnect-reason.ts';\n\nconst SIGNAL_KEEPALIVE_INTERVAL = 4_000;\nconst SIGNAL_KEEPALIVE_TIMEOUT = 12_000;\n/**\n * Watchdog self-check: if the inactivity timer fires later than its schedule by more than this,\n * the local event loop was starved (heavy WASM sync compute pins it for seconds at a time) —\n * our pings were not being sent and inbound pongs were not being processed, so the silence says\n * nothing about the connection. Probe and re-arm instead of restarting.\n */\nconst KEEPALIVE_WATCHDOG_LATE_TOLERANCE = 3_000;\n/**\n * Probes in a row that may go unanswered before the watchdog restarts even though the loop keeps stalling: a live\n * connection answers between blocks, so only a dead one gets this far.\n */\nconst KEEPALIVE_MAX_UNANSWERED_PROBES = 3;\n\n/** `WebSocket.CONNECTING`, inlined because `isomorphic-ws` exposes no static in every runtime. */\nconst WS_CONNECTING = 0;\n\n/**\n * Bound on messages held while the socket completes its handshake. A handshake takes a\n * round trip, so the backlog is small in practice; the cap stops a server that never\n * finishes connecting from growing the queue without limit.\n */\nconst MAX_PENDING_MESSAGES = 256;\n\nexport type EdgeWsConnectionCallbacks = {\n onConnected: () => void;\n onMessage: (message: Message) => void;\n onRestartRequired: (reason: ReconnectReason) => void;\n};\n\nexport class EdgeWsConnection extends Resource {\n private _inactivityTimeoutCtx: Context | undefined;\n private _ws: WebSocket | undefined;\n private _wsMuxer: WebSocketMuxer | undefined;\n private _lastReceivedMessageTimestamp = Date.now();\n\n private _openTimestamp: number | undefined;\n\n // Latency tracking.\n private _pingTimestamp: number | undefined;\n private _lastPingSentTimestamp = 0;\n /**\n * When a ping last went out later than its interval allows: the event loop was blocked until then,\n * so pongs that arrived meanwhile went unread.\n */\n private _loopStalledAt: number | undefined;\n /** Probes the watchdog sent since anything was last received. */\n private _unansweredProbes = 0;\n private _rtt = 0;\n\n // Rate tracking with sliding window.\n private _uploadRate = 0;\n private _downloadRate = 0;\n private readonly _rateWindow = 10000; // 10 second sliding window.\n private readonly _rateUpdateInterval = 1000; // Update rates every second.\n private _bytesSamples: Array<{ timestamp: number; sent: number; received: number }> = [];\n\n private _messagesSent = 0;\n private _messagesReceived = 0;\n\n /**\n * WebSocket frames arrive in order, but converting frame data to bytes is async\n * (the `Blob` fallback path awaits `blob.arrayBuffer()`), and concurrent conversions\n * are not guaranteed to complete in arrival order. Segmented-message reassembly in\n * `WebSocketMuxer` requires chunks to reach `receiveData` in arrival order, so message\n * processing is serialized through this lock.\n */\n private readonly _receiveMutex = new Mutex();\n\n /**\n * Messages submitted before the handshake completed. `send()` on a CONNECTING socket throws\n * `InvalidStateError`, and callers holding the connection across a reconnect do exactly that.\n */\n private _pendingMessages: Message[] = [];\n\n constructor(\n private readonly _identity: EdgeIdentity,\n private readonly _connectionInfo: { url: URL; protocolHeader?: string; headers?: Record<string, string> },\n private readonly _callbacks: EdgeWsConnectionCallbacks,\n ) {\n super();\n }\n\n @logInfo\n public get info() {\n return {\n open: this.isOpen,\n identity: this._identity.identityDid,\n device: this._identity.peerKey,\n };\n }\n\n public get rtt(): number {\n return this._rtt;\n }\n\n /** Floor uptime to satisfy the int32 EdgeStatus.uptime wire type. */\n public get uptime(): number {\n return this._openTimestamp ? Math.floor((Date.now() - this._openTimestamp) / 1000) : 0;\n }\n\n public get uploadRate(): number {\n return this._uploadRate;\n }\n\n public get downloadRate(): number {\n return this._downloadRate;\n }\n\n public get messagesSent(): number {\n return this._messagesSent;\n }\n\n public get messagesReceived(): number {\n return this._messagesReceived;\n }\n\n public send(message: Message): void {\n invariant(this._ws);\n invariant(this._wsMuxer);\n if (this._ws.readyState === WS_CONNECTING) {\n if (this._pendingMessages.length >= MAX_PENDING_MESSAGES) {\n // Drop the oldest: during a reconnect the freshest signalling state is the useful one.\n const dropped = this._pendingMessages.shift();\n log.warn('pending message dropped (queue full while connecting)', {\n payload: dropped && protocol.getPayloadType(dropped),\n });\n }\n this._pendingMessages.push(message);\n return;\n }\n log('sending...', { peerKey: this._identity.peerKey, payload: protocol.getPayloadType(message) });\n this._messagesSent++;\n if (this._ws?.protocol.includes(EdgeWebsocketProtocol.V0)) {\n const binary = buf.toBinary(MessageSchema, message);\n if (binary.length > CLOUDFLARE_MESSAGE_MAX_BYTES) {\n log.error('Message dropped because it was too large (>1MB).', {\n byteLength: binary.byteLength,\n serviceId: message.serviceId,\n payload: protocol.getPayloadType(message),\n });\n return;\n }\n this._recordBytes(binary.byteLength, 0);\n this._ws.send(binary);\n } else {\n // For muxer, we need to track the size of the message being sent.\n const binary = buf.toBinary(MessageSchema, message);\n this._recordBytes(binary.byteLength, 0);\n this._wsMuxer.send(message).catch((error) => {\n // A close mid-send is routine (the close handler reconnects), so it is not reported as an error.\n if (error instanceof WebSocketClosedError) {\n log.verbose('message dropped (websocket closed)', { payload: protocol.getPayloadType(message) });\n } else {\n log.catch(error);\n }\n });\n }\n }\n\n protected override async _open(): Promise<void> {\n // Browsers cannot set WebSocket headers, so the SDK version rides in the subprotocol list.\n const baseProtocols = [...Object.values(EdgeWebsocketProtocol), `${EDGE_CLIENT_VERSION_PROTOCOL_PREFIX}${version}`];\n this._ws = new WebSocket(\n this._connectionInfo.url.toString(),\n this._connectionInfo.protocolHeader\n ? [...baseProtocols, this._connectionInfo.protocolHeader]\n : [...baseProtocols],\n this._connectionInfo.headers ? { headers: this._connectionInfo.headers } : undefined,\n );\n // Deliver frame data as `ArrayBuffer` rather than `Blob` so bytes are available\n // synchronously; avoids the async `blob.arrayBuffer()` reads that can otherwise\n // complete out of arrival order (see `_receiveChain`).\n this._ws.binaryType = 'arraybuffer';\n const muxer = new WebSocketMuxer(this._ws);\n this._wsMuxer = muxer;\n\n this._ws.onopen = () => {\n if (this.isOpen) {\n log('connected');\n this._openTimestamp = Date.now();\n this._flushPendingMessages();\n this._callbacks.onConnected();\n this._scheduleHeartbeats();\n this._scheduleRateCalculation();\n } else {\n this._pendingMessages = [];\n log.verbose('connected after becoming inactive', { currentIdentity: this._identity });\n }\n };\n this._ws.onclose = (event: WebSocket.CloseEvent) => {\n if (this.isOpen) {\n const reason = classifyCloseCode(event.code, isOnline());\n log.warn('server disconnected', { code: event.code, reason: event.reason, classified: reason });\n this._pendingMessages = [];\n this._callbacks.onRestartRequired(reason);\n muxer.destroy();\n }\n };\n this._ws.onerror = (event: WebSocket.ErrorEvent) => {\n if (this.isOpen) {\n log.warn('edge connection socket error', { error: event.error, info: event.message });\n this._callbacks.onRestartRequired(classifySocketError(isOnline()));\n } else {\n log.verbose('error ignored on closed connection', { error: event.error });\n }\n };\n /**\n * https://developer.mozilla.org/en-US/docs/Web/API/MessageEvent/data\n */\n this._ws.onmessage = (event: WebSocket.MessageEvent) => {\n if (!this.isOpen) {\n log.verbose('message ignored on closed connection', { event: event.type });\n return;\n }\n this._lastReceivedMessageTimestamp = Date.now();\n this._unansweredProbes = 0;\n if (event.data === '__pong__') {\n // Calculate latency.\n if (this._pingTimestamp) {\n this._rtt = Date.now() - this._pingTimestamp;\n this._pingTimestamp = undefined;\n }\n this._rescheduleHeartbeatTimeout();\n return;\n }\n\n // `_receiveMessage` serializes on `_receiveMutex`; `acquire` enqueues synchronously,\n // so locks are taken in arrival order regardless of async conversion timing.\n void this._receiveMessage(event.data, muxer).catch((err) => log.catch(err));\n };\n }\n\n /** Replays messages buffered during the handshake, in submission order. */\n private _flushPendingMessages(): void {\n const pending = this._pendingMessages;\n this._pendingMessages = [];\n for (const message of pending) {\n this.send(message);\n }\n }\n\n private async _receiveMessage(data: WebSocket.Data, muxer: WebSocketMuxer): Promise<void> {\n // Serialize processing so bytes reach `muxer.receiveData` in arrival order. The guard\n // releases on scope exit even if processing throws, so a single bad message is logged\n // and dropped instead of stalling every message queued after it.\n using _guard = await this._receiveMutex.acquire();\n const bytes = await toUint8Array(data);\n this._recordBytes(0, bytes.byteLength);\n if (!this.isOpen) {\n return;\n }\n\n this._messagesReceived++;\n\n const message = this._ws?.protocol?.includes(EdgeWebsocketProtocol.V0)\n ? buf.fromBinary(MessageSchema, bytes)\n : muxer.receiveData(bytes);\n\n if (message) {\n log('received', { from: message.source, payload: protocol.getPayloadType(message) });\n this._callbacks.onMessage(message);\n }\n }\n\n protected override async _close(): Promise<void> {\n void this._inactivityTimeoutCtx?.dispose().catch(() => {});\n this._pendingMessages = [];\n\n try {\n this._ws?.close();\n this._ws = undefined;\n this._wsMuxer?.destroy();\n this._wsMuxer = undefined;\n } catch (err) {\n if (err instanceof Error && err.message.includes('WebSocket is closed before the connection is established.')) {\n return;\n }\n log.warn('error closing websocket', { err });\n }\n }\n\n private _scheduleHeartbeats(): void {\n invariant(this._ws);\n scheduleTaskInterval(\n this._ctx,\n async () => {\n // TODO(mykola): use RFC6455 ping/pong once implemented in the browser?\n // Cloudflare's worker responds to this `without interrupting hibernation`. https://developers.cloudflare.com/durable-objects/api/websockets/#setwebsocketautoresponse\n this._sendPing();\n },\n SIGNAL_KEEPALIVE_INTERVAL,\n );\n this._sendPing();\n this._rescheduleHeartbeatTimeout();\n }\n\n private _sendPing(): void {\n if (!this._ws) {\n return;\n }\n const now = Date.now();\n if (\n this._lastPingSentTimestamp &&\n now - this._lastPingSentTimestamp > SIGNAL_KEEPALIVE_INTERVAL + KEEPALIVE_WATCHDOG_LATE_TOLERANCE\n ) {\n this._loopStalledAt = now;\n }\n this._pingTimestamp = now;\n this._lastPingSentTimestamp = now;\n this._ws.send('__ping__');\n }\n\n /**\n * Inactivity watchdog. Restarts the connection only after a fair trial: pings were actually\n * flowing (a recent send), the timer fired on schedule and no ping went out late within the\n * window (the local event loop was alive to process an answer), and still nothing was received\n * for the full window. Wall-clock silence alone is not evidence — sync compute can pin the event\n * loop for seconds, during which the ping sender does not run and arrived pongs are not\n * processed; restarting a healthy connection on that basis costs a re-handshake and fails\n * in-flight sync rounds. A stalled loop is excused only until {@link KEEPALIVE_MAX_UNANSWERED_PROBES}\n * probes in a row go unanswered.\n */\n private _rescheduleHeartbeatTimeout(): void {\n if (!this.isOpen) {\n return;\n }\n void this._inactivityTimeoutCtx?.dispose();\n this._inactivityTimeoutCtx = new Context();\n const armedAt = Date.now();\n scheduleTask(\n this._inactivityTimeoutCtx,\n () => {\n if (!this.isOpen) {\n return;\n }\n const now = Date.now();\n const silenceMs = now - this._lastReceivedMessageTimestamp;\n if (silenceMs <= SIGNAL_KEEPALIVE_TIMEOUT) {\n this._rescheduleHeartbeatTimeout();\n return;\n }\n const pingAgeMs = this._lastPingSentTimestamp ? now - this._lastPingSentTimestamp : Number.POSITIVE_INFINITY;\n const firedLateByMs = now - armedAt - SIGNAL_KEEPALIVE_TIMEOUT;\n const pingsWereFlowing = pingAgeMs <= SIGNAL_KEEPALIVE_INTERVAL * 2;\n // The timer fires on time when the loop was blocked for most of the window but freed up before\n // the deadline, so the late ping that block caused has to count too.\n const loopStalledAgoMs =\n this._loopStalledAt === undefined ? Number.POSITIVE_INFINITY : now - this._loopStalledAt;\n const loopWasLive =\n firedLateByMs < KEEPALIVE_WATCHDOG_LATE_TOLERANCE && loopStalledAgoMs >= SIGNAL_KEEPALIVE_TIMEOUT;\n if ((pingsWereFlowing && loopWasLive) || this._unansweredProbes >= KEEPALIVE_MAX_UNANSWERED_PROBES) {\n log.warn('restart due to inactivity timeout', {\n silenceMs,\n pingAgeMs,\n unansweredProbes: this._unansweredProbes,\n lastReceivedMessageTimestamp: this._lastReceivedMessageTimestamp,\n });\n this._callbacks.onRestartRequired('inactivity_timeout');\n return;\n }\n // The silence is self-inflicted (starved event loop stopped our pings and delayed this\n // timer). Probe immediately and give the connection a fresh full window to answer.\n log.verbose('keepalive starved by event loop; probing instead of restarting', {\n silenceMs,\n pingAgeMs,\n firedLateByMs,\n loopStalledAgoMs,\n unansweredProbes: this._unansweredProbes,\n });\n this._unansweredProbes++;\n this._sendPing();\n this._rescheduleHeartbeatTimeout();\n },\n SIGNAL_KEEPALIVE_TIMEOUT,\n );\n }\n\n private _recordBytes(sent: number, received: number): void {\n const now = Date.now();\n\n // Find if we have a sample for the current second.\n const currentSecond = Math.floor(now / 1000) * 1000;\n const existingSample = this._bytesSamples.find((s) => Math.floor(s.timestamp / 1000) * 1000 === currentSecond);\n\n if (existingSample) {\n existingSample.sent += sent;\n existingSample.received += received;\n } else {\n this._bytesSamples.push({ timestamp: now, sent, received });\n }\n }\n\n private _scheduleRateCalculation(): void {\n scheduleTaskInterval(\n this._ctx,\n async () => {\n this._calculateRates();\n },\n this._rateUpdateInterval,\n );\n // Calculate initial rates.\n this._calculateRates();\n }\n\n private _calculateRates(): void {\n const now = Date.now();\n const cutoff = now - this._rateWindow;\n\n // Remove old samples.\n this._bytesSamples = this._bytesSamples.filter((s) => s.timestamp > cutoff);\n\n if (this._bytesSamples.length === 0) {\n this._uploadRate = 0;\n this._downloadRate = 0;\n return;\n }\n\n // Calculate total bytes and time span.\n let totalSent = 0;\n let totalReceived = 0;\n const oldestTimestamp = Math.min(...this._bytesSamples.map((s) => s.timestamp));\n const timeSpan = (now - oldestTimestamp) / 1000; // Convert to seconds.\n\n for (const sample of this._bytesSamples) {\n totalSent += sample.sent;\n totalReceived += sample.received;\n }\n\n // Calculate rates (bytes per second).\n this._uploadRate = timeSpan > 0 ? Math.round(totalSent / timeSpan) : 0;\n this._downloadRate = timeSpan > 0 ? Math.round(totalReceived / timeSpan) : 0;\n }\n}\n","//\n// Copyright 2024 DXOS.org\n//\n\nimport { create } from '@bufbuild/protobuf';\nimport * as EffectContext from 'effect/Context';\n\nimport {\n type CleanupFn,\n Event,\n PersistentLifecycle,\n Trigger,\n TriggerState,\n scheduleMicroTask,\n scheduleTaskInterval,\n} from '@dxos/async';\nimport { Context, TRACE_SPAN_ATTRIBUTE, type TraceContextData } from '@dxos/context';\nimport { type Lifecycle, Resource } from '@dxos/context';\nimport { log, logInfo } from '@dxos/log';\nimport { EdgeCredentialsHeaderCodec } from '@dxos/protocols';\nimport {\n type EdgeStatus,\n EdgeStatus_ConnectionState,\n EdgeStatusSchema,\n} from '@dxos/protocols/buf/dxos/client/services_pb';\nimport { type Message } from '@dxos/protocols/buf/dxos/edge/messenger_pb';\nimport { trace } from '@dxos/tracing';\n\nimport {\n authenticateViaChallengeEndpoint,\n presentCredentialsForChallenge,\n readAuthChallenge,\n} from './auth-challenge.ts';\nimport { protocol } from './defs.ts';\nimport { type EdgeIdentity } from './edge-identity.ts';\nimport { EdgeWsConnection } from './edge-ws-connection.ts';\nimport { EdgeConnectionClosedError, EdgeIdentityChangedError } from './errors.ts';\nimport { type Protocol } from './protocol.ts';\nimport { type ReconnectReason } from './reconnect-reason.ts';\nimport { getEdgeUrlWithProtocol } from './utils.ts';\n\nconst DEFAULT_TIMEOUT = 10_000;\n\n// Refresh status every second: rtt, rate counters.\nconst STATUS_REFRESH_INTERVAL = 1000;\n\nexport type MessageListener = (message: Message) => void;\nexport type ReconnectListener = () => void;\n\nexport type MessengerConfig = {\n socketEndpoint: string;\n timeout?: number;\n protocol?: Protocol;\n disableAuth?: boolean;\n /** Sent as `X-DXOS-Client-Tag` on the WebSocket upgrade (Node/`ws` only; ignored in browsers). */\n clientTag?: string;\n /**\n * When set, `open()` does not dial; the owner must call {@link EdgeClient.startNetworking}. Lets a\n * host that shares this thread with latency-sensitive work decide when connecting is safe — the\n * policy (and any delay) belongs to that owner, not here. Reconnects are unaffected.\n * @default false (dial on open)\n */\n deferConnect?: boolean;\n};\n\nexport interface EdgeConnection extends Required<Lifecycle> {\n statusChanged: Event<EdgeStatus>;\n get info(): any;\n /** Identity DID (`did:halo:…`) of the connected identity. */\n get identityDid(): string;\n get peerKey(): string;\n get isOpen(): boolean;\n get status(): EdgeStatus;\n setIdentity(identity: EdgeIdentity): void;\n /** Begins dialing. Required only when constructed with `deferConnect`; otherwise a no-op repeat. */\n startNetworking(): void;\n send(ctx: Context, message: Message): Promise<void>;\n onMessage(listener: MessageListener): () => void;\n /**\n * Subscribe to connection (re-)establishment.\n *\n * By default the listener also fires once immediately when the connection is already ready at\n * subscription time — a current-state notification for late subscribers. Pass\n * `emitCurrentState: false` for reconnect-reaction logic (e.g. restarting a session): reacting\n * to the subscribe-time firing there causes restart loops, since each restart re-subscribes.\n */\n onReconnected(listener: ReconnectListener, opts?: { emitCurrentState?: boolean }): () => void;\n}\n\n/**\n * Effect service tag for {@link EdgeConnection}.\n */\nexport class EdgeConnectionService extends EffectContext.Service<EdgeConnectionService, EdgeConnection>()(\n '@dxos/edge-client/EdgeConnection',\n) {}\n\n/**\n * Messenger client for EDGE:\n * - While open, uses PersistentLifecycle to keep an open EdgeWsConnection, reconnecting on failures.\n * - Manages identity and re-create EdgeWsConnection when identity changes.\n * - Dispatches connection state and message notifications.\n */\nexport class EdgeClient extends Resource implements EdgeConnection {\n public readonly statusChanged = new Event<EdgeStatus>();\n\n private readonly _persistentLifecycle = new PersistentLifecycle<EdgeWsConnection>({\n start: async () => this._connect(),\n stop: async (state: EdgeWsConnection) => this._disconnect(state),\n });\n\n private readonly _messageListeners = new Set<MessageListener>();\n\n /** Guards {@link startNetworking} so the connection loop is only ever started once. */\n private _networkingStarted = false;\n private readonly _reconnectListeners = new Set<ReconnectListener>();\n /** Reconnects since this process started, which is what \"per session\" means for a browser client. */\n #sessionReconnects = 0;\n #metricsCleanup: CleanupFn[] = [];\n private readonly _baseWsUrl: string;\n private readonly _baseHttpUrl: string;\n private _currentConnection?: EdgeWsConnection = undefined;\n private _ready = new Trigger();\n\n constructor(\n private _identity: EdgeIdentity,\n private readonly _config: MessengerConfig,\n ) {\n super();\n this._baseWsUrl = getEdgeUrlWithProtocol(_config.socketEndpoint, 'ws');\n this._baseHttpUrl = getEdgeUrlWithProtocol(_config.socketEndpoint, 'http');\n }\n\n @logInfo\n public get info() {\n return {\n open: this.isOpen,\n status: this.status,\n identity: this._identity.identityDid,\n device: this._identity.peerKey,\n };\n }\n\n get status(): EdgeStatus {\n return create(EdgeStatusSchema, {\n state:\n Boolean(this._currentConnection) && this._ready.state === TriggerState.RESOLVED\n ? EdgeStatus_ConnectionState.CONNECTED\n : EdgeStatus_ConnectionState.NOT_CONNECTED,\n uptime: this._currentConnection?.uptime ?? 0,\n rtt: this._currentConnection?.rtt ?? 0,\n rateBytesUp: this._currentConnection?.uploadRate ?? 0,\n rateBytesDown: this._currentConnection?.downloadRate ?? 0,\n messagesSent: this._currentConnection?.messagesSent ?? 0,\n messagesReceived: this._currentConnection?.messagesReceived ?? 0,\n });\n }\n\n get identityDid() {\n return this._identity.identityDid;\n }\n\n get peerKey() {\n return this._identity.peerKey;\n }\n\n setIdentity(identity: EdgeIdentity) {\n if (identity.identityDid !== this._identity.identityDid || identity.peerKey !== this._identity.peerKey) {\n log('Edge identity changed', { identity, oldIdentity: this._identity });\n this._identity = identity;\n this._closeCurrentConnection(new EdgeIdentityChangedError());\n void this._persistentLifecycle.scheduleRestart();\n }\n }\n\n /**\n * Send message.\n * NOTE: The message is guaranteed to be delivered but the service must respond with a message to confirm processing.\n */\n public async send(ctx: Context, message: Message) {\n if (this._ready.state !== TriggerState.RESOLVED) {\n log('waiting for websocket');\n await this._ready.wait({ timeout: this._config.timeout ?? DEFAULT_TIMEOUT });\n }\n\n if (!this._currentConnection) {\n throw new EdgeConnectionClosedError();\n }\n\n // DX-1059: sources are DID-only; validate against identityDid.\n if (\n message.source &&\n (message.source.peerKey !== this._identity.peerKey || message.source.identityDid !== this.identityDid)\n ) {\n throw new EdgeIdentityChangedError();\n }\n\n const traceCtx = ctx.getAttribute(TRACE_SPAN_ATTRIBUTE) as TraceContextData | undefined;\n if (traceCtx) {\n message.traceContext = {\n $typeName: 'dxos.edge.messenger.TraceContext',\n traceparent: traceCtx.traceparent,\n tracestate: traceCtx.tracestate,\n };\n }\n\n this._currentConnection.send(message);\n }\n\n public onMessage(listener: MessageListener) {\n this._messageListeners.add(listener);\n return () => this._messageListeners.delete(listener);\n }\n\n public onReconnected(listener: ReconnectListener, opts?: { emitCurrentState?: boolean }) {\n this._reconnectListeners.add(listener);\n if ((opts?.emitCurrentState ?? true) && this._ready.state === TriggerState.RESOLVED) {\n // Microtask so that listener is always called asynchronously, no matter the state of the ready trigger\n // at the moment of registration.\n scheduleMicroTask(this._ctx, () => {\n if (this._reconnectListeners.has(listener)) {\n try {\n listener();\n } catch (error) {\n log.catch(error);\n }\n }\n });\n }\n\n return () => this._reconnectListeners.delete(listener);\n }\n\n /**\n * Begins dialing (and keeps reconnecting). Idempotent, so an owner that calls it explicitly and a\n * later `open()` cannot start two connection loops. Returns without waiting for the socket.\n */\n startNetworking(): void {\n if (this._networkingStarted) {\n return;\n }\n this._networkingStarted = true;\n this._persistentLifecycle.open().catch((err) => {\n log.warn('Error while opening connection', { err });\n });\n }\n\n /**\n * Open connection to messaging service.\n */\n protected override async _open(): Promise<void> {\n log('opening...', { info: this.info });\n this.#registerMetrics();\n if (this._config.deferConnect) {\n log('deferring connection until startNetworking');\n } else {\n this.startNetworking();\n }\n\n // Notify about status changes (rtt, rate counters).\n scheduleTaskInterval(\n this._ctx,\n async () => {\n if (!this._currentConnection) {\n return;\n }\n this.statusChanged.emit(this.status);\n },\n STATUS_REFRESH_INTERVAL,\n );\n }\n\n /**\n * Close connection and free resources.\n */\n protected override async _close(): Promise<void> {\n log('closing...', { peerKey: this._identity.peerKey });\n for (const cleanup of this.#metricsCleanup) {\n cleanup();\n }\n this.#metricsCleanup = [];\n this._closeCurrentConnection();\n await this._persistentLifecycle.close();\n }\n\n private async _connect(): Promise<EdgeWsConnection | undefined> {\n if (this._ctx.disposed) {\n return undefined;\n }\n\n const identity = this._identity;\n const path = `/ws/${identity.identityDid}/${identity.peerKey}`;\n const protocolHeader = this._config.disableAuth ? undefined : await this._createAuthHeader(path);\n if (this._identity !== identity) {\n log('identity changed during auth header request');\n return undefined;\n }\n\n const restartRequired = new Trigger();\n const url = new URL(path, this._baseWsUrl);\n log('Opening websocket', { url: url.toString(), protocolHeader });\n const connection = new EdgeWsConnection(\n identity,\n {\n url,\n protocolHeader,\n headers: this._config.clientTag ? { 'X-DXOS-Client-Tag': this._config.clientTag } : undefined,\n },\n {\n onConnected: () => {\n if (this._isActive(connection)) {\n this._ready.wake();\n this._notifyReconnected();\n } else {\n // EDGE's router writes to a device's newest open socket, so a replaced one left open takes every reply.\n log.verbose('closing a connection that connected after it was replaced');\n void connection.close().catch((err) => log.catch(err));\n }\n },\n onRestartRequired: (reason) => {\n if (this._isActive(connection)) {\n this._recordReconnect(reason);\n this._closeCurrentConnection();\n void this._persistentLifecycle.scheduleRestart();\n } else {\n log.verbose('restart requested by inactive connection');\n }\n restartRequired.wake();\n },\n onMessage: (message) => {\n if (this._isActive(connection)) {\n this._notifyMessageReceived(message);\n } else {\n log.verbose('ignored a message on inactive connection', {\n from: message.source,\n type: message.payload?.typeUrl,\n });\n void connection.close().catch((err) => log.catch(err));\n }\n },\n },\n );\n this._currentConnection = connection;\n\n await connection.open();\n\n // The connection is only a successful start once the socket becomes ready. A socket that\n // closes or errors before becoming ready (or never connects within the timeout) is a failed\n // start: throwing lets PersistentLifecycle apply its backoff. Returning here would mark the\n // attempt as successful and reset the backoff, degenerating reconnects into a hot loop when\n // the server accepts then immediately drops the socket.\n const becameReady = await Promise.race([\n this._ready.wait({ timeout: this._config.timeout ?? DEFAULT_TIMEOUT }).then(\n () => true,\n () => false,\n ),\n restartRequired.wait().then(() => false),\n ]);\n if (!becameReady) {\n // Left dialing, the socket could still be admitted after the retry's, and EDGE writes to the newest.\n await connection.close();\n throw new EdgeConnectionClosedError();\n }\n\n return connection;\n }\n\n /** Registers the observed gauges. Idempotent, so an owner that calls `connect` twice is harmless. */\n #registerMetrics(): void {\n if (this.#metricsCleanup.length > 0) {\n return;\n }\n\n this.#metricsCleanup.push(\n trace.metrics.observe('dxos.edge.ws.session.reconnects', () => this.#sessionReconnects, {\n unit: '{reconnect}',\n }),\n // Averaged across clients this is the fraction of the fleet currently online, which a\n // counter cannot express.\n trace.metrics.observe('dxos.edge.ws.connected', () => (this._currentConnection ? 1 : 0), { unit: '1' }),\n );\n }\n\n private async _disconnect(state: EdgeWsConnection): Promise<void> {\n await state.close();\n this.statusChanged.emit(this.status);\n }\n\n private _closeCurrentConnection(error: Error = new EdgeConnectionClosedError()): void {\n this._currentConnection = undefined;\n this._ready.throw(error);\n this._ready.reset();\n this.statusChanged.emit(this.status);\n }\n\n /**\n * Publishes one reconnect.\n * The counter answers \"how often, and why\" across the fleet; the session gauge answers \"how bad\n * is this one client's session\", which a delta counter cannot — it resets with the process, so\n * its value IS the per-session total.\n */\n private _recordReconnect(reason: ReconnectReason): void {\n this.#sessionReconnects++;\n log('edge ws reconnect', { reason, sessionReconnects: this.#sessionReconnects });\n trace.metrics.increment('dxos.edge.ws.reconnect.count', 1, {\n unit: '{reconnect}',\n tags: { reason },\n });\n }\n\n private _notifyReconnected(): void {\n this.statusChanged.emit(this.status);\n for (const listener of this._reconnectListeners) {\n try {\n listener();\n } catch (err) {\n log.error('ws reconnect listener failed', { err });\n }\n }\n }\n\n private _notifyMessageReceived(message: Message): void {\n for (const listener of this._messageListeners) {\n try {\n listener(message);\n } catch (err) {\n log.error('ws incoming message processing failed', { err, payload: protocol.getPayloadType(message) });\n }\n }\n }\n\n /**\n * Obtain the challenge from `/auth` and sign it into the WebSocket subprotocol auth header.\n *\n * This used to fire a GET at the `/ws/:identityDid/:peerKey` upgrade path itself and harvest the\n * challenge off the resulting 401 — a request sent specifically to be rejected, which surfaced as\n * a console error on every connect and as a routine auth failure in the server's audit trail.\n * `/auth` answers the same challenge with a 200. The nonce is not bound to a path, so the\n * challenge issued at `/auth` is equally valid for the upgrade request.\n *\n * Falls back to the old behaviour when `/auth` yields nothing, so this still connects to servers\n * that predate the challenge endpoint.\n */\n private async _createAuthHeader(path: string): Promise<string | undefined> {\n const authentication = await authenticateViaChallengeEndpoint(this._baseHttpUrl, this._identity);\n if (authentication) {\n return encodePresentationWsAuthHeader(authentication.presentation);\n }\n\n const response = await fetch(new URL(path, this._baseHttpUrl), { method: 'GET' });\n // Gate on a parsed VP challenge, not merely on a 401. A 401 forwarded from upstream can carry\n // an unrelated `WWW-Authenticate` (or none), and signing a challenge that isn't there would\n // throw instead of degrading to an unauthenticated attempt.\n const challenge = response.status === 401 ? await readAuthChallenge(response) : undefined;\n if (challenge) {\n return encodePresentationWsAuthHeader(await presentCredentialsForChallenge(this._identity, challenge));\n }\n log.warn('no auth challenge from edge', { status: response.status, statusText: response.statusText });\n return undefined;\n }\n\n private _isActive = (connection: EdgeWsConnection) => connection === this._currentConnection;\n}\n\nconst encodePresentationWsAuthHeader = (encodedPresentation: Uint8Array): string =>\n EdgeCredentialsHeaderCodec.encodeWebSocketProtocol(encodedPresentation);\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\nimport * as FetchHttpClient from 'effect/http/FetchHttpClient';\nimport * as Headers from 'effect/http/Headers';\nimport * as HttpClient from 'effect/http/HttpClient';\nimport * as HttpClientError from 'effect/http/HttpClientError';\nimport * as HttpClientResponse from 'effect/http/HttpClientResponse';\nimport * as Layer from 'effect/Layer';\nimport * as Stream from 'effect/Stream';\n\nimport { BaseError, type BaseErrorOptions } from '@dxos/errors';\nimport { log } from '@dxos/log';\nimport { BYOK_HEADER } from '@dxos/protocols';\n\nimport { type EdgeAiService, type EdgeHttpClient } from './edge-http-client.ts';\n\nexport type GetEdgeHttpClient = () => EdgeHttpClient;\n\nexport type EdgeAiHttpClientOptions = {\n /** Upstream service; defaults to Anthropic. */\n readonly service?: EdgeAiService;\n};\n\n/**\n * Thrown by {@link EdgeAiHttpClient} when an AI request carrying {@link BYOK_HEADER} is rejected\n * with 401/403 by the upstream provider — i.e. the user-supplied API key is invalid. Wrapped as\n * the `cause` of an `HttpClientError.ResponseError` so it flows through `@effect/ai`'s error\n * mapping; callers walk the cause chain (via {@link ByokError.is}) to render a useful message.\n */\nexport class ByokError extends BaseError.extend('ByokError', 'BYOK authentication failed') {\n constructor(options: { status: number; provider: string } & BaseErrorOptions) {\n super({ context: { status: options.status, provider: options.provider }, ...options });\n }\n}\n\n/**\n * Thrown by {@link EdgeAiHttpClient} when EDGE rejects an AI request with 429 because the\n * authenticated profile exceeded a metering limit. Wrapped as the `cause` of an\n * {@link HttpClientError.ResponseError} so it survives `@effect/ai`'s error mapping.\n */\nexport class UsageQuotaExceededError extends BaseError.extend('UsageQuotaExceededError', 'Usage quota exceeded') {}\n\ntype AnthropicMessagesPayload = {\n tools?: ReadonlyArray<Record<string, unknown>>;\n};\n\nconst isUserDefinedAnthropicTool = (tool: Record<string, unknown>): boolean =>\n tool.input_schema != null && typeof tool.input_schema === 'object';\n\n/**\n * Enables Anthropic fine-grained tool input streaming for client-defined tools.\n * Provider tools (bash, web_search, etc.) are left unchanged.\n */\nexport const patchAnthropicMessagesRequestBody = (body: BodyInit | undefined): BodyInit | undefined => {\n if (body == null) {\n return body;\n }\n\n const decodeBody = (): string | undefined => {\n if (typeof body === 'string') {\n return body;\n }\n if (body instanceof Uint8Array) {\n return new TextDecoder().decode(body);\n }\n return undefined;\n };\n\n const text = decodeBody();\n if (text == null) {\n return body;\n }\n\n try {\n const payload = JSON.parse(text) as AnthropicMessagesPayload;\n if (!Array.isArray(payload.tools)) {\n return body;\n }\n\n payload.tools = payload.tools.map((tool) =>\n isUserDefinedAnthropicTool(tool) ? { ...tool, eager_input_streaming: true } : tool,\n );\n\n const patched = JSON.stringify(payload);\n return typeof body === 'string' ? patched : new TextEncoder().encode(patched);\n } catch {\n return body;\n }\n};\n\nconst readStreamBody = (stream: ReadableStream<Uint8Array>): Effect.Effect<string | undefined> =>\n Effect.promise(async () => {\n const response = new Response(stream);\n return await response.text();\n });\n\n/**\n * An `@effect/platform` {@link HttpClient.HttpClient} that routes requests through the\n * authenticated EDGE AI endpoint via {@link EdgeHttpClient.aiRequest}, instead of\n * fetching the AI service directly.\n *\n * Provide this layer in place of `FetchHttpClient.layer` when constructing a provider client, e.g.\n * `AnthropicClient.layer({ apiUrl: 'http://edge' }).pipe(Layer.provide(EdgeAiHttpClient.layer(() => edgeClient)))`.\n * The `apiUrl` host is a sentinel; only the request path is forwarded (see `aiRequest`).\n *\n * Modeled on `FunctionsAiHttpClient` in `@dxos/functions`.\n */\nexport class EdgeAiHttpClient {\n static make = (getClient: GetEdgeHttpClient, { service = 'anthropic' }: EdgeAiHttpClientOptions = {}) =>\n HttpClient.make((request, url, signal, fiber) => {\n const edgeClient = getClient();\n const options: RequestInit = fiber.context.mapUnsafe.get(FetchHttpClient.RequestInit.key) ?? {};\n const headers = options.headers\n ? Headers.merge(Headers.fromInput(options.headers), request.headers)\n : request.headers;\n\n const carriedByok = !!headers[BYOK_HEADER.toLowerCase()];\n\n const send = (body: BodyInit | undefined) =>\n Effect.tryPromise({\n try: () =>\n edgeClient.aiRequest(\n service,\n new Request(url, {\n ...options,\n method: request.method,\n headers,\n // Fine-grained tool streaming is an Anthropic Messages API extension.\n body: service === 'anthropic' ? patchAnthropicMessagesRequestBody(body) : body,\n signal,\n }),\n ),\n catch: (cause) => {\n log.error('Failed to fetch', { cause });\n return new HttpClientError.HttpClientError({\n reason: new HttpClientError.TransportError({ request, cause }),\n });\n },\n }).pipe(\n Effect.flatMap((response) => {\n const httpResponse = HttpClientResponse.fromWeb(request, response);\n // A 401/403 on a BYOK-carrying request means the user's upstream key was rejected.\n // Wrap as a typed ResponseError with `cause: ByokError` so it survives AiError's\n // `fromRequestError` mapping; callers walk the cause chain to render a useful message.\n if (carriedByok && (response.status === 401 || response.status === 403)) {\n return Effect.tryPromise({\n try: () => response.clone().json() as Promise<{ error?: { message?: string } } | undefined>,\n catch: () => undefined,\n }).pipe(\n Effect.orElseSucceed(() => undefined),\n Effect.flatMap((body) =>\n Effect.fail(\n new HttpClientError.HttpClientError({\n reason: new HttpClientError.StatusCodeError({\n request,\n response: httpResponse,\n cause: new ByokError({\n status: response.status,\n provider: service,\n message: body?.error?.message ?? 'Authentication failed',\n }),\n }),\n }),\n ),\n ),\n );\n }\n // Platform quota (not BYOK): reserve/commit rejected the request before upstream AI.\n if (!carriedByok && response.status === 429) {\n return Effect.tryPromise({\n try: () => response.clone().json() as Promise<{ error?: { message?: string } } | undefined>,\n catch: () => undefined,\n }).pipe(\n Effect.orElseSucceed(() => undefined),\n Effect.flatMap((body) =>\n Effect.fail(\n new HttpClientError.HttpClientError({\n reason: new HttpClientError.StatusCodeError({\n request,\n response: httpResponse,\n cause: new UsageQuotaExceededError({\n message: body?.error?.message,\n }),\n }),\n }),\n ),\n ),\n );\n }\n return Effect.succeed(httpResponse);\n }),\n );\n\n switch (request.body._tag) {\n case 'Raw':\n case 'Uint8Array':\n return send(request.body.body as any);\n case 'FormData':\n return send(request.body.formData);\n case 'Stream':\n return Stream.toReadableStreamEffect(request.body.stream).pipe(\n Effect.flatMap((readable) => readStreamBody(readable)),\n Effect.flatMap((text) => send(text)),\n );\n }\n\n return send(undefined);\n });\n\n static layer = (getClient: GetEdgeHttpClient, options?: EdgeAiHttpClientOptions) =>\n Layer.succeed(HttpClient.HttpClient, EdgeAiHttpClient.make(getClient, options));\n}\n","//\n// Copyright 2024 DXOS.org\n//\n\nimport { type Context } from '@dxos/context';\nimport {\n type CheckEmailExistsResponse,\n type GetAccountResponse,\n type GetProfileUsageResponse,\n type IssueInvitationResponse,\n type ListAccountInvitationsResponse,\n type LoginRequest,\n type LoginResponse,\n type RedeemInvitationCodeRequest,\n type RedeemInvitationCodeResponse,\n type RequestAccessRequest,\n type RequestAccessResponse,\n type ResendVerificationEmailResponse,\n type ValidateInvitationCodeResponse,\n} from '@dxos/protocols';\nimport { createUrl } from '@dxos/util';\n\nimport { BaseHttpClient, type BaseHttpClientOptions, type EdgeHttpCallArgs } from './base-http-client.ts';\n\n/**\n * HTTP client for the hub-service API (accounts, invitations, email verification).\n *\n * Hub-service and the edge worker are separate Cloudflare Workers deployed at different\n * URLs (`DX_HUB_URL` vs `DX_EDGE_URL`). This client is never used to talk to the edge\n * worker, and vice versa — keep them separate.\n *\n * NOTE: Do NOT set `auth: true` on any call here. Hub-service has no `/auth` VP-challenge\n * endpoint (it has an admin login page that 302s and is not CORS-enabled). Auth is handled\n * via the regular request → 401 → WWW-Authenticate challenge → retry path.\n */\nexport class HubHttpClient extends BaseHttpClient {\n constructor(hubUrl: string, options?: BaseHttpClientOptions) {\n super(hubUrl, options);\n }\n\n //\n // Public (unauthenticated) endpoints\n //\n\n public async checkEmailExists(\n ctx: Context,\n body: { email: string },\n args?: EdgeHttpCallArgs,\n ): Promise<CheckEmailExistsResponse> {\n return this._call(ctx, new URL('account/email/exists', this.baseUrl), { ...args, body, method: 'POST' });\n }\n\n public async validateInvitationCode(\n ctx: Context,\n body: { code: string },\n args?: EdgeHttpCallArgs,\n ): Promise<ValidateInvitationCodeResponse> {\n return this._call(ctx, new URL('account/invitation-code/validate', this.baseUrl), {\n ...args,\n body,\n method: 'POST',\n });\n }\n\n public async redeemInvitationCode(\n ctx: Context,\n body: RedeemInvitationCodeRequest,\n args?: EdgeHttpCallArgs,\n ): Promise<RedeemInvitationCodeResponse> {\n return this._call(ctx, new URL('account/invitation-code/redeem', this.baseUrl), {\n ...args,\n body,\n method: 'POST',\n });\n }\n\n /**\n * Existing-account email recovery. The link is delivered out of band — the response never carries\n * a token. Test emails in dev-like environments short-circuit instead with `needsIdentity` /\n * `admitted` before any token exists. Enumeration-safe: the response is identical for unknown\n * emails. Account creation goes through {@link redeemInvitationCode}.\n */\n public async login(ctx: Context, body: LoginRequest, args?: EdgeHttpCallArgs): Promise<LoginResponse> {\n return this._call(ctx, new URL('account/login', this.baseUrl), { ...args, body, method: 'POST' });\n }\n\n public async requestAccess(\n ctx: Context,\n body: RequestAccessRequest,\n args?: EdgeHttpCallArgs,\n ): Promise<RequestAccessResponse> {\n return this._call(ctx, new URL('account/request-access', this.baseUrl), { ...args, body, method: 'POST' });\n }\n\n //\n // Authenticated (VP) endpoints\n //\n\n public async getAccount(ctx: Context, args?: EdgeHttpCallArgs): Promise<GetAccountResponse> {\n return this._call(ctx, new URL('account/me', this.baseUrl), { ...args, method: 'GET' });\n }\n\n public async deleteAccount(ctx: Context, args?: EdgeHttpCallArgs): Promise<{ deleted: boolean }> {\n return this._call(ctx, new URL('account/me', this.baseUrl), { ...args, method: 'DELETE' });\n }\n\n public async listAccountInvitations(ctx: Context, args?: EdgeHttpCallArgs): Promise<ListAccountInvitationsResponse> {\n return this._call(ctx, new URL('account/invitation', this.baseUrl), { ...args, method: 'GET' });\n }\n\n public async issueAccountInvitation(ctx: Context, args?: EdgeHttpCallArgs): Promise<IssueInvitationResponse> {\n return this._call(ctx, new URL('account/invitation/issue', this.baseUrl), { ...args, method: 'POST' });\n }\n\n public async resendVerificationEmail(\n ctx: Context,\n args?: EdgeHttpCallArgs,\n ): Promise<ResendVerificationEmailResponse> {\n return this._call(ctx, new URL('account/email/resend-verification', this.baseUrl), { ...args, method: 'POST' });\n }\n\n /**\n * Rolling-window usage and effective limits for the authenticated identity.\n * Served from the per-user metering DO; optional `windowSeconds` defaults to the largest limit window.\n */\n public async getProfileUsage(\n ctx: Context,\n query?: { windowSeconds?: number },\n args?: EdgeHttpCallArgs,\n ): Promise<GetProfileUsageResponse> {\n return this._call(\n ctx,\n createUrl(new URL('api/metering/profile/usage', this.baseUrl), {\n windowSeconds: query?.windowSeconds,\n }),\n { ...args, method: 'GET' },\n );\n }\n}\n","//\n// Copyright 2026 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\n\n/** Request body for EDGE `/ai/browser-rendering/markdown` (ai-service Browser Run markdown quick action). */\nexport const MarkdownRequest = Schema.Struct({\n url: Schema.optional(Schema.String),\n html: Schema.optional(Schema.String),\n gotoOptions: Schema.optional(\n Schema.Struct({\n waitUntil: Schema.optional(Schema.Literals(['load', 'domcontentloaded', 'networkidle0', 'networkidle2'])),\n timeout: Schema.optional(Schema.Number),\n }),\n ),\n rejectRequestPattern: Schema.optional(Schema.Array(Schema.String)),\n userAgent: Schema.optional(Schema.String),\n waitForSelector: Schema.optional(Schema.String),\n});\n\nexport type MarkdownRequest = Schema.Schema.Type<typeof MarkdownRequest>;\n\n/** JSON body returned by Cloudflare Browser Run markdown quick action. */\nexport const MarkdownResponse = Schema.Struct({\n success: Schema.Boolean,\n result: Schema.String,\n});\n\nexport type MarkdownResponse = Schema.Schema.Type<typeof MarkdownResponse>;\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/auth.ts","../../src/reconnect-reason.ts","../../src/edge-ws-connection.ts","../../src/edge-client.ts","../../src/edge-ai-http-client.ts","../../src/hub-http-client.ts","../../src/browser-rendering.ts"],"sourcesContent":["//\n// Copyright 2024 DXOS.org\n//\n\nimport { create } from '@bufbuild/protobuf';\n\nimport { createCredential, createDidFromIdentityKey, signPresentation } from '@dxos/credentials';\nimport { type Signer } from '@dxos/crypto';\nimport { invariant } from '@dxos/invariant';\nimport { Keyring } from '@dxos/keyring';\nimport { IdentityDid, PublicKey } from '@dxos/keys';\nimport { fromPublicKey } from '@dxos/protocols/buf';\nimport {\n AuthorizedDeviceSchema,\n AuthSchema,\n type Chain,\n ChainSchema,\n type Credential,\n PresentationSchema,\n} from '@dxos/protocols/buf/dxos/halo/credentials_pb';\n\nimport type { EdgeIdentity } from './edge-identity.ts';\n\n/**\n * Edge identity backed by a device key without a credential chain.\n */\nexport const createDeviceEdgeIdentity = async (signer: Signer, key: PublicKey): Promise<EdgeIdentity> => {\n return {\n identityDid: await createDidFromIdentityKey(key),\n peerKey: key.toHex(),\n presentCredentials: async ({ challenge }) => {\n return signPresentation({\n presentation: create(PresentationSchema, {\n credentials: [\n // Verifier requires at least one credential in the presentation to establish the subject.\n await createCredential({\n assertion: create(AuthSchema, {}),\n issuer: key,\n subject: key,\n signer,\n }),\n ],\n }),\n signer,\n signerKey: key,\n nonce: challenge,\n });\n },\n };\n};\n\n/**\n * Edge identity backed by a chain of credentials.\n */\nexport const createChainEdgeIdentity = async (\n signer: Signer,\n identityKey: PublicKey,\n peerKey: PublicKey,\n chain: Chain | undefined,\n credentials: Credential[],\n): Promise<EdgeIdentity> => {\n const credentialsToSign =\n credentials.length > 0\n ? credentials\n : [\n await createCredential({\n assertion: create(AuthSchema, {}),\n issuer: identityKey,\n subject: identityKey,\n signer,\n chain,\n signingKey: peerKey,\n }),\n ];\n\n return {\n identityDid: await createDidFromIdentityKey(identityKey),\n peerKey: peerKey.toHex(),\n presentCredentials: async ({ challenge }) => {\n // TODO: make chain required after device invitation flow update release\n invariant(chain);\n return signPresentation({\n presentation: create(PresentationSchema, {\n credentials: credentialsToSign,\n }),\n signer,\n nonce: challenge,\n signerKey: peerKey,\n chain,\n });\n },\n };\n};\n\n/**\n * Edge identity backed by a random ephemeral key without HALO.\n */\nexport const createEphemeralEdgeIdentity = async (): Promise<EdgeIdentity> => {\n const keyring = new Keyring();\n const key = await keyring.createKey();\n return createDeviceEdgeIdentity(keyring, key);\n};\n\n/**\n * Creates a HALO chain of credentials to act as an edge identity.\n */\nexport const createTestHaloEdgeIdentity = async (\n signer: Signer,\n identityKey: PublicKey,\n deviceKey: PublicKey,\n): Promise<EdgeIdentity> => {\n const deviceAdmission = await createCredential({\n assertion: create(AuthorizedDeviceSchema, {\n deviceKey: fromPublicKey(deviceKey),\n identityKey: fromPublicKey(identityKey),\n }),\n issuer: identityKey,\n subject: deviceKey,\n signer,\n });\n return createChainEdgeIdentity(signer, identityKey, deviceKey, create(ChainSchema, { credential: deviceAdmission }), [\n await createCredential({\n assertion: create(AuthSchema, {}),\n issuer: identityKey,\n subject: identityKey,\n signer,\n }),\n ]);\n};\n\nexport const createStubEdgeIdentity = (): EdgeIdentity => {\n const deviceKey = PublicKey.random();\n return {\n // Random placeholder DID — the stub never authenticates or connects; a real identity replaces it.\n identityDid: IdentityDid.random(),\n peerKey: deviceKey.toHex(),\n presentCredentials: async () => {\n throw new Error('Stub identity does not support authentication.');\n },\n };\n};\n","//\n// Copyright 2026 DXOS.org\n//\n\n/**\n * Why a websocket restart was required. A bounded enum, never a raw message: this is a metric\n * attribute, and one unbounded value would mint a new time series per distinct error string.\n */\nexport type ReconnectReason =\n /** The browser reports no network. The clearest \"lost the internet\" signal available. */\n | 'offline'\n /** Closed with 1006 — no close frame arrived, so the connection died rather than being closed. */\n | 'abnormal'\n /** Server closed deliberately and cleanly. */\n | 'normal'\n /** Server is going away or restarting (1001, 1012, 1013). */\n | 'going_away'\n /** Server-side failure (1011, 1014, 1015). */\n | 'server_error'\n /** Closed on policy or protocol grounds (1002, 1003, 1007, 1008, 1009, 1010). */\n | 'policy'\n /** Application close code, which EDGE uses for auth rejection. */\n | 'app'\n /** Socket-level error rather than a close frame — TLS, DNS, refused connect. */\n | 'socket_error'\n /** Keepalive watchdog fired: pings were flowing and the loop was live, but the peer went silent. */\n | 'inactivity_timeout'\n /** The local identity changed, so the socket was torn down deliberately. */\n | 'identity_changed'\n | 'other';\n\n/**\n * Classifies a close event.\n * `online` is checked first: a 1006 while the browser is offline is a lost network, not a server\n * fault, and conflating the two makes the metric useless for exactly the question it is asked.\n */\nexport const classifyCloseCode = (code: number | undefined, online: boolean | undefined): ReconnectReason => {\n if (online === false) {\n return 'offline';\n }\n if (code === undefined) {\n return 'other';\n }\n if (code >= 4000) {\n return 'app';\n }\n\n switch (code) {\n case 1000:\n return 'normal';\n case 1001:\n case 1012:\n case 1013:\n return 'going_away';\n case 1006:\n return 'abnormal';\n case 1011:\n case 1014:\n case 1015:\n return 'server_error';\n case 1002:\n case 1003:\n case 1007:\n case 1008:\n case 1009:\n case 1010:\n return 'policy';\n default:\n return 'other';\n }\n};\n\n/** Classifies a socket-level error, which carries no close code. */\nexport const classifySocketError = (online: boolean | undefined): ReconnectReason =>\n online === false ? 'offline' : 'socket_error';\n\n/** Reads `navigator.onLine` where available; `undefined` outside a browser-like realm. */\nexport const isOnline = (): boolean | undefined => {\n const nav = (globalThis as { navigator?: { onLine?: boolean } }).navigator;\n return typeof nav?.onLine === 'boolean' ? nav.onLine : undefined;\n};\n","//\n// Copyright 2024 DXOS.org\n//\n\nimport WebSocket from 'isomorphic-ws';\n\nimport { Mutex, scheduleTask, scheduleTaskInterval } from '@dxos/async';\nimport { Context, Resource } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\nimport { log, logInfo } from '@dxos/log';\nimport { EdgeWebsocketProtocol } from '@dxos/protocols';\nimport { buf } from '@dxos/protocols/buf';\nimport { type Message, MessageSchema } from '@dxos/protocols/buf/dxos/edge/messenger_pb';\n\nimport { clientVersionProtocol } from './client-version.ts';\nimport { protocol } from './defs.ts';\nimport { type EdgeIdentity } from './edge-identity.ts';\nimport { CLOUDFLARE_MESSAGE_MAX_BYTES, WebSocketClosedError, WebSocketMuxer } from './edge-ws-muxer.ts';\nimport { toUint8Array } from './protocol.ts';\nimport { type ReconnectReason, classifyCloseCode, classifySocketError, isOnline } from './reconnect-reason.ts';\n\nconst SIGNAL_KEEPALIVE_INTERVAL = 4_000;\nconst SIGNAL_KEEPALIVE_TIMEOUT = 12_000;\n/**\n * Watchdog self-check: if the inactivity timer fires later than its schedule by more than this,\n * the local event loop was starved (heavy WASM sync compute pins it for seconds at a time) —\n * our pings were not being sent and inbound pongs were not being processed, so the silence says\n * nothing about the connection. Probe and re-arm instead of restarting.\n */\nconst KEEPALIVE_WATCHDOG_LATE_TOLERANCE = 3_000;\n/**\n * Probes in a row that may go unanswered before the watchdog restarts even though the loop keeps stalling: a live\n * connection answers between blocks, so only a dead one gets this far.\n */\nconst KEEPALIVE_MAX_UNANSWERED_PROBES = 3;\n\n/** `WebSocket.CONNECTING`, inlined because `isomorphic-ws` exposes no static in every runtime. */\nconst WS_CONNECTING = 0;\n\n/**\n * Bound on messages held while the socket completes its handshake. A handshake takes a\n * round trip, so the backlog is small in practice; the cap stops a server that never\n * finishes connecting from growing the queue without limit.\n */\nconst MAX_PENDING_MESSAGES = 256;\n\nexport type EdgeWsConnectionCallbacks = {\n onConnected: () => void;\n onMessage: (message: Message) => void;\n onRestartRequired: (reason: ReconnectReason) => void;\n};\n\nexport class EdgeWsConnection extends Resource {\n private _inactivityTimeoutCtx: Context | undefined;\n private _ws: WebSocket | undefined;\n private _wsMuxer: WebSocketMuxer | undefined;\n private _lastReceivedMessageTimestamp = Date.now();\n\n private _openTimestamp: number | undefined;\n\n // Latency tracking.\n private _pingTimestamp: number | undefined;\n private _lastPingSentTimestamp = 0;\n /**\n * When a ping last went out later than its interval allows: the event loop was blocked until then,\n * so pongs that arrived meanwhile went unread.\n */\n private _loopStalledAt: number | undefined;\n /** Probes the watchdog sent since anything was last received. */\n private _unansweredProbes = 0;\n private _rtt = 0;\n\n // Rate tracking with sliding window.\n private _uploadRate = 0;\n private _downloadRate = 0;\n private readonly _rateWindow = 10000; // 10 second sliding window.\n private readonly _rateUpdateInterval = 1000; // Update rates every second.\n private _bytesSamples: Array<{ timestamp: number; sent: number; received: number }> = [];\n\n private _messagesSent = 0;\n private _messagesReceived = 0;\n\n /**\n * WebSocket frames arrive in order, but converting frame data to bytes is async\n * (the `Blob` fallback path awaits `blob.arrayBuffer()`), and concurrent conversions\n * are not guaranteed to complete in arrival order. Segmented-message reassembly in\n * `WebSocketMuxer` requires chunks to reach `receiveData` in arrival order, so message\n * processing is serialized through this lock.\n */\n private readonly _receiveMutex = new Mutex();\n\n /**\n * Messages submitted before the handshake completed. `send()` on a CONNECTING socket throws\n * `InvalidStateError`, and callers holding the connection across a reconnect do exactly that.\n */\n private _pendingMessages: Message[] = [];\n\n constructor(\n private readonly _identity: EdgeIdentity,\n private readonly _connectionInfo: { url: URL; protocolHeader?: string; headers?: Record<string, string> },\n private readonly _callbacks: EdgeWsConnectionCallbacks,\n ) {\n super();\n }\n\n @logInfo\n public get info() {\n return {\n open: this.isOpen,\n identity: this._identity.identityDid,\n device: this._identity.peerKey,\n };\n }\n\n public get rtt(): number {\n return this._rtt;\n }\n\n /** Floor uptime to satisfy the int32 EdgeStatus.uptime wire type. */\n public get uptime(): number {\n return this._openTimestamp ? Math.floor((Date.now() - this._openTimestamp) / 1000) : 0;\n }\n\n public get uploadRate(): number {\n return this._uploadRate;\n }\n\n public get downloadRate(): number {\n return this._downloadRate;\n }\n\n public get messagesSent(): number {\n return this._messagesSent;\n }\n\n public get messagesReceived(): number {\n return this._messagesReceived;\n }\n\n public send(message: Message): void {\n invariant(this._ws);\n invariant(this._wsMuxer);\n if (this._ws.readyState === WS_CONNECTING) {\n if (this._pendingMessages.length >= MAX_PENDING_MESSAGES) {\n // Drop the oldest: during a reconnect the freshest signalling state is the useful one.\n const dropped = this._pendingMessages.shift();\n log.warn('pending message dropped (queue full while connecting)', {\n payload: dropped && protocol.getPayloadType(dropped),\n });\n }\n this._pendingMessages.push(message);\n return;\n }\n log('sending...', { peerKey: this._identity.peerKey, payload: protocol.getPayloadType(message) });\n this._messagesSent++;\n if (this._ws?.protocol.includes(EdgeWebsocketProtocol.V0)) {\n const binary = buf.toBinary(MessageSchema, message);\n if (binary.length > CLOUDFLARE_MESSAGE_MAX_BYTES) {\n log.error('Message dropped because it was too large (>1MB).', {\n byteLength: binary.byteLength,\n serviceId: message.serviceId,\n payload: protocol.getPayloadType(message),\n });\n return;\n }\n this._recordBytes(binary.byteLength, 0);\n this._ws.send(binary);\n } else {\n // For muxer, we need to track the size of the message being sent.\n const binary = buf.toBinary(MessageSchema, message);\n this._recordBytes(binary.byteLength, 0);\n this._wsMuxer.send(message).catch((error) => {\n // A close mid-send is routine (the close handler reconnects), so it is not reported as an error.\n if (error instanceof WebSocketClosedError) {\n log.verbose('message dropped (websocket closed)', { payload: protocol.getPayloadType(message) });\n } else {\n log.catch(error);\n }\n });\n }\n }\n\n protected override async _open(): Promise<void> {\n const baseProtocols = [...Object.values(EdgeWebsocketProtocol), clientVersionProtocol()];\n this._ws = new WebSocket(\n this._connectionInfo.url.toString(),\n this._connectionInfo.protocolHeader\n ? [...baseProtocols, this._connectionInfo.protocolHeader]\n : [...baseProtocols],\n this._connectionInfo.headers ? { headers: this._connectionInfo.headers } : undefined,\n );\n // Deliver frame data as `ArrayBuffer` rather than `Blob` so bytes are available\n // synchronously; avoids the async `blob.arrayBuffer()` reads that can otherwise\n // complete out of arrival order (see `_receiveChain`).\n this._ws.binaryType = 'arraybuffer';\n const muxer = new WebSocketMuxer(this._ws);\n this._wsMuxer = muxer;\n\n this._ws.onopen = () => {\n if (this.isOpen) {\n log('connected');\n this._openTimestamp = Date.now();\n this._flushPendingMessages();\n this._callbacks.onConnected();\n this._scheduleHeartbeats();\n this._scheduleRateCalculation();\n } else {\n this._pendingMessages = [];\n log.verbose('connected after becoming inactive', { currentIdentity: this._identity });\n }\n };\n this._ws.onclose = (event: WebSocket.CloseEvent) => {\n if (this.isOpen) {\n const reason = classifyCloseCode(event.code, isOnline());\n log.warn('server disconnected', { code: event.code, reason: event.reason, classified: reason });\n this._pendingMessages = [];\n this._callbacks.onRestartRequired(reason);\n muxer.destroy();\n }\n };\n this._ws.onerror = (event: WebSocket.ErrorEvent) => {\n if (this.isOpen) {\n log.warn('edge connection socket error', { error: event.error, info: event.message });\n this._callbacks.onRestartRequired(classifySocketError(isOnline()));\n } else {\n log.verbose('error ignored on closed connection', { error: event.error });\n }\n };\n /**\n * https://developer.mozilla.org/en-US/docs/Web/API/MessageEvent/data\n */\n this._ws.onmessage = (event: WebSocket.MessageEvent) => {\n if (!this.isOpen) {\n log.verbose('message ignored on closed connection', { event: event.type });\n return;\n }\n this._lastReceivedMessageTimestamp = Date.now();\n this._unansweredProbes = 0;\n if (event.data === '__pong__') {\n // Calculate latency.\n if (this._pingTimestamp) {\n this._rtt = Date.now() - this._pingTimestamp;\n this._pingTimestamp = undefined;\n }\n this._rescheduleHeartbeatTimeout();\n return;\n }\n\n // `_receiveMessage` serializes on `_receiveMutex`; `acquire` enqueues synchronously,\n // so locks are taken in arrival order regardless of async conversion timing.\n void this._receiveMessage(event.data, muxer).catch((err) => log.catch(err));\n };\n }\n\n /** Replays messages buffered during the handshake, in submission order. */\n private _flushPendingMessages(): void {\n const pending = this._pendingMessages;\n this._pendingMessages = [];\n for (const message of pending) {\n this.send(message);\n }\n }\n\n private async _receiveMessage(data: WebSocket.Data, muxer: WebSocketMuxer): Promise<void> {\n // Serialize processing so bytes reach `muxer.receiveData` in arrival order. The guard\n // releases on scope exit even if processing throws, so a single bad message is logged\n // and dropped instead of stalling every message queued after it.\n using _guard = await this._receiveMutex.acquire();\n const bytes = await toUint8Array(data);\n this._recordBytes(0, bytes.byteLength);\n if (!this.isOpen) {\n return;\n }\n\n this._messagesReceived++;\n\n const message = this._ws?.protocol?.includes(EdgeWebsocketProtocol.V0)\n ? buf.fromBinary(MessageSchema, bytes)\n : muxer.receiveData(bytes);\n\n if (message) {\n log('received', { from: message.source, payload: protocol.getPayloadType(message) });\n this._callbacks.onMessage(message);\n }\n }\n\n protected override async _close(): Promise<void> {\n void this._inactivityTimeoutCtx?.dispose().catch(() => {});\n this._pendingMessages = [];\n\n try {\n this._ws?.close();\n this._ws = undefined;\n this._wsMuxer?.destroy();\n this._wsMuxer = undefined;\n } catch (err) {\n if (err instanceof Error && err.message.includes('WebSocket is closed before the connection is established.')) {\n return;\n }\n log.warn('error closing websocket', { err });\n }\n }\n\n private _scheduleHeartbeats(): void {\n invariant(this._ws);\n scheduleTaskInterval(\n this._ctx,\n async () => {\n // TODO(mykola): use RFC6455 ping/pong once implemented in the browser?\n // Cloudflare's worker responds to this `without interrupting hibernation`. https://developers.cloudflare.com/durable-objects/api/websockets/#setwebsocketautoresponse\n this._sendPing();\n },\n SIGNAL_KEEPALIVE_INTERVAL,\n );\n this._sendPing();\n this._rescheduleHeartbeatTimeout();\n }\n\n private _sendPing(): void {\n if (!this._ws) {\n return;\n }\n const now = Date.now();\n if (\n this._lastPingSentTimestamp &&\n now - this._lastPingSentTimestamp > SIGNAL_KEEPALIVE_INTERVAL + KEEPALIVE_WATCHDOG_LATE_TOLERANCE\n ) {\n this._loopStalledAt = now;\n }\n this._pingTimestamp = now;\n this._lastPingSentTimestamp = now;\n this._ws.send('__ping__');\n }\n\n /**\n * Inactivity watchdog. Restarts the connection only after a fair trial: pings were actually\n * flowing (a recent send), the timer fired on schedule and no ping went out late within the\n * window (the local event loop was alive to process an answer), and still nothing was received\n * for the full window. Wall-clock silence alone is not evidence — sync compute can pin the event\n * loop for seconds, during which the ping sender does not run and arrived pongs are not\n * processed; restarting a healthy connection on that basis costs a re-handshake and fails\n * in-flight sync rounds. A stalled loop is excused only until {@link KEEPALIVE_MAX_UNANSWERED_PROBES}\n * probes in a row go unanswered.\n */\n private _rescheduleHeartbeatTimeout(): void {\n if (!this.isOpen) {\n return;\n }\n void this._inactivityTimeoutCtx?.dispose();\n this._inactivityTimeoutCtx = new Context();\n const armedAt = Date.now();\n scheduleTask(\n this._inactivityTimeoutCtx,\n () => {\n if (!this.isOpen) {\n return;\n }\n const now = Date.now();\n const silenceMs = now - this._lastReceivedMessageTimestamp;\n if (silenceMs <= SIGNAL_KEEPALIVE_TIMEOUT) {\n this._rescheduleHeartbeatTimeout();\n return;\n }\n const pingAgeMs = this._lastPingSentTimestamp ? now - this._lastPingSentTimestamp : Number.POSITIVE_INFINITY;\n const firedLateByMs = now - armedAt - SIGNAL_KEEPALIVE_TIMEOUT;\n const pingsWereFlowing = pingAgeMs <= SIGNAL_KEEPALIVE_INTERVAL * 2;\n // The timer fires on time when the loop was blocked for most of the window but freed up before\n // the deadline, so the late ping that block caused has to count too.\n const loopStalledAgoMs =\n this._loopStalledAt === undefined ? Number.POSITIVE_INFINITY : now - this._loopStalledAt;\n const loopWasLive =\n firedLateByMs < KEEPALIVE_WATCHDOG_LATE_TOLERANCE && loopStalledAgoMs >= SIGNAL_KEEPALIVE_TIMEOUT;\n if ((pingsWereFlowing && loopWasLive) || this._unansweredProbes >= KEEPALIVE_MAX_UNANSWERED_PROBES) {\n log.warn('restart due to inactivity timeout', {\n silenceMs,\n pingAgeMs,\n unansweredProbes: this._unansweredProbes,\n lastReceivedMessageTimestamp: this._lastReceivedMessageTimestamp,\n });\n this._callbacks.onRestartRequired('inactivity_timeout');\n return;\n }\n // The silence is self-inflicted (starved event loop stopped our pings and delayed this\n // timer). Probe immediately and give the connection a fresh full window to answer.\n log.verbose('keepalive starved by event loop; probing instead of restarting', {\n silenceMs,\n pingAgeMs,\n firedLateByMs,\n loopStalledAgoMs,\n unansweredProbes: this._unansweredProbes,\n });\n this._unansweredProbes++;\n this._sendPing();\n this._rescheduleHeartbeatTimeout();\n },\n SIGNAL_KEEPALIVE_TIMEOUT,\n );\n }\n\n private _recordBytes(sent: number, received: number): void {\n const now = Date.now();\n\n // Find if we have a sample for the current second.\n const currentSecond = Math.floor(now / 1000) * 1000;\n const existingSample = this._bytesSamples.find((s) => Math.floor(s.timestamp / 1000) * 1000 === currentSecond);\n\n if (existingSample) {\n existingSample.sent += sent;\n existingSample.received += received;\n } else {\n this._bytesSamples.push({ timestamp: now, sent, received });\n }\n }\n\n private _scheduleRateCalculation(): void {\n scheduleTaskInterval(\n this._ctx,\n async () => {\n this._calculateRates();\n },\n this._rateUpdateInterval,\n );\n // Calculate initial rates.\n this._calculateRates();\n }\n\n private _calculateRates(): void {\n const now = Date.now();\n const cutoff = now - this._rateWindow;\n\n // Remove old samples.\n this._bytesSamples = this._bytesSamples.filter((s) => s.timestamp > cutoff);\n\n if (this._bytesSamples.length === 0) {\n this._uploadRate = 0;\n this._downloadRate = 0;\n return;\n }\n\n // Calculate total bytes and time span.\n let totalSent = 0;\n let totalReceived = 0;\n const oldestTimestamp = Math.min(...this._bytesSamples.map((s) => s.timestamp));\n const timeSpan = (now - oldestTimestamp) / 1000; // Convert to seconds.\n\n for (const sample of this._bytesSamples) {\n totalSent += sample.sent;\n totalReceived += sample.received;\n }\n\n // Calculate rates (bytes per second).\n this._uploadRate = timeSpan > 0 ? Math.round(totalSent / timeSpan) : 0;\n this._downloadRate = timeSpan > 0 ? Math.round(totalReceived / timeSpan) : 0;\n }\n}\n","//\n// Copyright 2024 DXOS.org\n//\n\nimport { create } from '@bufbuild/protobuf';\nimport * as EffectContext from 'effect/Context';\n\nimport {\n type CleanupFn,\n Event,\n PersistentLifecycle,\n Trigger,\n TriggerState,\n scheduleMicroTask,\n scheduleTaskInterval,\n} from '@dxos/async';\nimport { Context, TRACE_SPAN_ATTRIBUTE, type TraceContextData } from '@dxos/context';\nimport { type Lifecycle, Resource } from '@dxos/context';\nimport { log, logInfo } from '@dxos/log';\nimport { EdgeClientTooOldError, EdgeCredentialsHeaderCodec } from '@dxos/protocols';\nimport {\n type EdgeStatus,\n EdgeStatus_ConnectionState,\n EdgeStatusSchema,\n} from '@dxos/protocols/buf/dxos/client/services_pb';\nimport { type Message } from '@dxos/protocols/buf/dxos/edge/messenger_pb';\nimport { trace } from '@dxos/tracing';\n\nimport {\n authenticateViaChallengeEndpoint,\n presentCredentialsForChallenge,\n readAuthChallenge,\n} from './auth-challenge.ts';\nimport { assertClientSupported, clientVersionHeaders } from './client-version.ts';\nimport { protocol } from './defs.ts';\nimport { type EdgeIdentity } from './edge-identity.ts';\nimport { EdgeWsConnection } from './edge-ws-connection.ts';\nimport { EdgeConnectionClosedError, EdgeIdentityChangedError } from './errors.ts';\nimport { type Protocol } from './protocol.ts';\nimport { type ReconnectReason } from './reconnect-reason.ts';\nimport { getEdgeUrlWithProtocol } from './utils.ts';\n\nconst DEFAULT_TIMEOUT = 10_000;\n\n// Refresh status every second: rtt, rate counters.\nconst STATUS_REFRESH_INTERVAL = 1000;\n\nexport type MessageListener = (message: Message) => void;\nexport type ReconnectListener = () => void;\n\nexport type MessengerConfig = {\n socketEndpoint: string;\n timeout?: number;\n protocol?: Protocol;\n disableAuth?: boolean;\n /** Sent as `X-DXOS-Client-Tag` on the WebSocket upgrade (Node/`ws` only; ignored in browsers). */\n clientTag?: string;\n /**\n * When set, `open()` does not dial; the owner must call {@link EdgeClient.startNetworking}. Lets a\n * host that shares this thread with latency-sensitive work decide when connecting is safe — the\n * policy (and any delay) belongs to that owner, not here. Reconnects are unaffected.\n * @default false (dial on open)\n */\n deferConnect?: boolean;\n};\n\nexport interface EdgeConnection extends Required<Lifecycle> {\n statusChanged: Event<EdgeStatus>;\n get info(): any;\n /** Identity DID (`did:halo:…`) of the connected identity. */\n get identityDid(): string;\n get peerKey(): string;\n get isOpen(): boolean;\n get status(): EdgeStatus;\n setIdentity(identity: EdgeIdentity): void;\n /** Begins dialing. Required only when constructed with `deferConnect`; otherwise a no-op repeat. */\n startNetworking(): void;\n send(ctx: Context, message: Message): Promise<void>;\n onMessage(listener: MessageListener): () => void;\n /**\n * Subscribe to connection (re-)establishment.\n *\n * By default the listener also fires once immediately when the connection is already ready at\n * subscription time — a current-state notification for late subscribers. Pass\n * `emitCurrentState: false` for reconnect-reaction logic (e.g. restarting a session): reacting\n * to the subscribe-time firing there causes restart loops, since each restart re-subscribes.\n */\n onReconnected(listener: ReconnectListener, opts?: { emitCurrentState?: boolean }): () => void;\n}\n\n/**\n * Effect service tag for {@link EdgeConnection}.\n */\nexport class EdgeConnectionService extends EffectContext.Service<EdgeConnectionService, EdgeConnection>()(\n '@dxos/edge-client/EdgeConnection',\n) {}\n\n/**\n * Messenger client for EDGE:\n * - While open, uses PersistentLifecycle to keep an open EdgeWsConnection, reconnecting on failures.\n * - Manages identity and re-create EdgeWsConnection when identity changes.\n * - Dispatches connection state and message notifications.\n */\nexport class EdgeClient extends Resource implements EdgeConnection {\n public readonly statusChanged = new Event<EdgeStatus>();\n\n private readonly _persistentLifecycle = new PersistentLifecycle<EdgeWsConnection>({\n start: async () => this._connect(),\n stop: async (state: EdgeWsConnection) => this._disconnect(state),\n });\n\n private readonly _messageListeners = new Set<MessageListener>();\n\n /** Guards {@link startNetworking} so the connection loop is only ever started once. */\n private _networkingStarted = false;\n private readonly _reconnectListeners = new Set<ReconnectListener>();\n /** Reconnects since this process started, which is what \"per session\" means for a browser client. */\n #sessionReconnects = 0;\n #metricsCleanup: CleanupFn[] = [];\n private readonly _baseWsUrl: string;\n private readonly _baseHttpUrl: string;\n private _currentConnection?: EdgeWsConnection = undefined;\n private _ready = new Trigger();\n /** Set when EDGE refused this SDK as outdated; a retry would carry the same version, so none is made. */\n #refusal: EdgeClientTooOldError | undefined = undefined;\n\n constructor(\n private _identity: EdgeIdentity,\n private readonly _config: MessengerConfig,\n ) {\n super();\n this._baseWsUrl = getEdgeUrlWithProtocol(_config.socketEndpoint, 'ws');\n this._baseHttpUrl = getEdgeUrlWithProtocol(_config.socketEndpoint, 'http');\n }\n\n @logInfo\n public get info() {\n return {\n open: this.isOpen,\n status: this.status,\n identity: this._identity.identityDid,\n device: this._identity.peerKey,\n };\n }\n\n get status(): EdgeStatus {\n return create(EdgeStatusSchema, {\n state:\n Boolean(this._currentConnection) && this._ready.state === TriggerState.RESOLVED\n ? EdgeStatus_ConnectionState.CONNECTED\n : EdgeStatus_ConnectionState.NOT_CONNECTED,\n uptime: this._currentConnection?.uptime ?? 0,\n rtt: this._currentConnection?.rtt ?? 0,\n rateBytesUp: this._currentConnection?.uploadRate ?? 0,\n rateBytesDown: this._currentConnection?.downloadRate ?? 0,\n messagesSent: this._currentConnection?.messagesSent ?? 0,\n messagesReceived: this._currentConnection?.messagesReceived ?? 0,\n });\n }\n\n get identityDid() {\n return this._identity.identityDid;\n }\n\n get peerKey() {\n return this._identity.peerKey;\n }\n\n setIdentity(identity: EdgeIdentity) {\n if (identity.identityDid !== this._identity.identityDid || identity.peerKey !== this._identity.peerKey) {\n log('Edge identity changed', { identity, oldIdentity: this._identity });\n this._identity = identity;\n this._closeCurrentConnection(new EdgeIdentityChangedError());\n void this._persistentLifecycle.scheduleRestart();\n }\n }\n\n /**\n * Send message.\n * NOTE: The message is guaranteed to be delivered but the service must respond with a message to confirm processing.\n */\n public async send(ctx: Context, message: Message) {\n if (this.#refusal) {\n throw this.#refusal;\n }\n if (this._ready.state !== TriggerState.RESOLVED) {\n log('waiting for websocket');\n await this._ready.wait({ timeout: this._config.timeout ?? DEFAULT_TIMEOUT });\n }\n\n if (!this._currentConnection) {\n throw new EdgeConnectionClosedError();\n }\n\n // DX-1059: sources are DID-only; validate against identityDid.\n if (\n message.source &&\n (message.source.peerKey !== this._identity.peerKey || message.source.identityDid !== this.identityDid)\n ) {\n throw new EdgeIdentityChangedError();\n }\n\n const traceCtx = ctx.getAttribute(TRACE_SPAN_ATTRIBUTE) as TraceContextData | undefined;\n if (traceCtx) {\n message.traceContext = {\n $typeName: 'dxos.edge.messenger.TraceContext',\n traceparent: traceCtx.traceparent,\n tracestate: traceCtx.tracestate,\n };\n }\n\n this._currentConnection.send(message);\n }\n\n public onMessage(listener: MessageListener) {\n this._messageListeners.add(listener);\n return () => this._messageListeners.delete(listener);\n }\n\n public onReconnected(listener: ReconnectListener, opts?: { emitCurrentState?: boolean }) {\n this._reconnectListeners.add(listener);\n if ((opts?.emitCurrentState ?? true) && this._ready.state === TriggerState.RESOLVED) {\n // Microtask so that listener is always called asynchronously, no matter the state of the ready trigger\n // at the moment of registration.\n scheduleMicroTask(this._ctx, () => {\n if (this._reconnectListeners.has(listener)) {\n try {\n listener();\n } catch (error) {\n log.catch(error);\n }\n }\n });\n }\n\n return () => this._reconnectListeners.delete(listener);\n }\n\n /**\n * Begins dialing (and keeps reconnecting). Idempotent, so an owner that calls it explicitly and a\n * later `open()` cannot start two connection loops. Returns without waiting for the socket.\n */\n startNetworking(): void {\n if (this._networkingStarted) {\n return;\n }\n this._networkingStarted = true;\n this._persistentLifecycle.open().catch((err) => {\n log.warn('Error while opening connection', { err });\n });\n }\n\n /**\n * Open connection to messaging service.\n */\n protected override async _open(): Promise<void> {\n log('opening...', { info: this.info });\n this.#registerMetrics();\n if (this._config.deferConnect) {\n log('deferring connection until startNetworking');\n } else {\n this.startNetworking();\n }\n\n // Notify about status changes (rtt, rate counters).\n scheduleTaskInterval(\n this._ctx,\n async () => {\n if (!this._currentConnection) {\n return;\n }\n this.statusChanged.emit(this.status);\n },\n STATUS_REFRESH_INTERVAL,\n );\n }\n\n /**\n * Close connection and free resources.\n */\n protected override async _close(): Promise<void> {\n log('closing...', { peerKey: this._identity.peerKey });\n for (const cleanup of this.#metricsCleanup) {\n cleanup();\n }\n this.#metricsCleanup = [];\n this._closeCurrentConnection();\n await this._persistentLifecycle.close();\n }\n\n private async _connect(): Promise<EdgeWsConnection | undefined> {\n if (this._ctx.disposed) {\n return undefined;\n }\n\n const identity = this._identity;\n const path = `/ws/${identity.identityDid}/${identity.peerKey}`;\n this.#refusal = undefined;\n let protocolHeader: string | undefined;\n try {\n protocolHeader = this._config.disableAuth ? undefined : await this._createAuthHeader(path);\n } catch (err) {\n if (!(err instanceof EdgeClientTooOldError)) {\n throw err;\n }\n // Returning, not throwing, ends PersistentLifecycle's backoff loop: every retry would be refused the same way.\n log.warn('EDGE refused this SDK as outdated; not reconnecting until the app is updated', { data: err.data });\n this.#refusal = err;\n this._ready.throw(err);\n this._ready.reset();\n this.statusChanged.emit(this.status);\n return undefined;\n }\n if (this._identity !== identity) {\n log('identity changed during auth header request');\n return undefined;\n }\n\n const restartRequired = new Trigger();\n const url = new URL(path, this._baseWsUrl);\n log('Opening websocket', { url: url.toString(), protocolHeader });\n const connection = new EdgeWsConnection(\n identity,\n {\n url,\n protocolHeader,\n headers: this._config.clientTag ? { 'X-DXOS-Client-Tag': this._config.clientTag } : undefined,\n },\n {\n onConnected: () => {\n if (this._isActive(connection)) {\n this._ready.wake();\n this._notifyReconnected();\n } else {\n // EDGE's router writes to a device's newest open socket, so a replaced one left open takes every reply.\n log.verbose('closing a connection that connected after it was replaced');\n void connection.close().catch((err) => log.catch(err));\n }\n },\n onRestartRequired: (reason) => {\n if (this._isActive(connection)) {\n this._recordReconnect(reason);\n this._closeCurrentConnection();\n void this._persistentLifecycle.scheduleRestart();\n } else {\n log.verbose('restart requested by inactive connection');\n }\n restartRequired.wake();\n },\n onMessage: (message) => {\n if (this._isActive(connection)) {\n this._notifyMessageReceived(message);\n } else {\n log.verbose('ignored a message on inactive connection', {\n from: message.source,\n type: message.payload?.typeUrl,\n });\n void connection.close().catch((err) => log.catch(err));\n }\n },\n },\n );\n this._currentConnection = connection;\n\n await connection.open();\n\n // The connection is only a successful start once the socket becomes ready. A socket that\n // closes or errors before becoming ready (or never connects within the timeout) is a failed\n // start: throwing lets PersistentLifecycle apply its backoff. Returning here would mark the\n // attempt as successful and reset the backoff, degenerating reconnects into a hot loop when\n // the server accepts then immediately drops the socket.\n const becameReady = await Promise.race([\n this._ready.wait({ timeout: this._config.timeout ?? DEFAULT_TIMEOUT }).then(\n () => true,\n () => false,\n ),\n restartRequired.wait().then(() => false),\n ]);\n if (!becameReady) {\n // Left dialing, the socket could still be admitted after the retry's, and EDGE writes to the newest.\n await connection.close();\n throw new EdgeConnectionClosedError();\n }\n\n return connection;\n }\n\n /** Registers the observed gauges. Idempotent, so an owner that calls `connect` twice is harmless. */\n #registerMetrics(): void {\n if (this.#metricsCleanup.length > 0) {\n return;\n }\n\n this.#metricsCleanup.push(\n trace.metrics.observe('dxos.edge.ws.session.reconnects', () => this.#sessionReconnects, {\n unit: '{reconnect}',\n }),\n // Averaged across clients this is the fraction of the fleet currently online, which a\n // counter cannot express.\n trace.metrics.observe('dxos.edge.ws.connected', () => (this._currentConnection ? 1 : 0), { unit: '1' }),\n );\n }\n\n private async _disconnect(state: EdgeWsConnection): Promise<void> {\n await state.close();\n this.statusChanged.emit(this.status);\n }\n\n private _closeCurrentConnection(error: Error = new EdgeConnectionClosedError()): void {\n this._currentConnection = undefined;\n this._ready.throw(error);\n this._ready.reset();\n this.statusChanged.emit(this.status);\n }\n\n /**\n * Publishes one reconnect.\n * The counter answers \"how often, and why\" across the fleet; the session gauge answers \"how bad\n * is this one client's session\", which a delta counter cannot — it resets with the process, so\n * its value IS the per-session total.\n */\n private _recordReconnect(reason: ReconnectReason): void {\n this.#sessionReconnects++;\n log('edge ws reconnect', { reason, sessionReconnects: this.#sessionReconnects });\n trace.metrics.increment('dxos.edge.ws.reconnect.count', 1, {\n unit: '{reconnect}',\n tags: { reason },\n });\n }\n\n private _notifyReconnected(): void {\n this.statusChanged.emit(this.status);\n for (const listener of this._reconnectListeners) {\n try {\n listener();\n } catch (err) {\n log.error('ws reconnect listener failed', { err });\n }\n }\n }\n\n private _notifyMessageReceived(message: Message): void {\n for (const listener of this._messageListeners) {\n try {\n listener(message);\n } catch (err) {\n log.error('ws incoming message processing failed', { err, payload: protocol.getPayloadType(message) });\n }\n }\n }\n\n /**\n * Obtain the challenge from `/auth` and sign it into the WebSocket subprotocol auth header.\n *\n * This used to fire a GET at the `/ws/:identityDid/:peerKey` upgrade path itself and harvest the\n * challenge off the resulting 401 — a request sent specifically to be rejected, which surfaced as\n * a console error on every connect and as a routine auth failure in the server's audit trail.\n * `/auth` answers the same challenge with a 200. The nonce is not bound to a path, so the\n * challenge issued at `/auth` is equally valid for the upgrade request.\n *\n * Falls back to the old behaviour when `/auth` yields nothing, so this still connects to servers\n * that predate the challenge endpoint.\n */\n private async _createAuthHeader(path: string): Promise<string | undefined> {\n const authentication = await authenticateViaChallengeEndpoint(this._baseHttpUrl, this._identity);\n if (authentication) {\n return encodePresentationWsAuthHeader(authentication.presentation);\n }\n\n const response = await fetch(new URL(path, this._baseHttpUrl), { method: 'GET', headers: clientVersionHeaders() });\n await assertClientSupported(response);\n // Gate on a parsed VP challenge, not merely on a 401. A 401 forwarded from upstream can carry\n // an unrelated `WWW-Authenticate` (or none), and signing a challenge that isn't there would\n // throw instead of degrading to an unauthenticated attempt.\n const challenge = response.status === 401 ? await readAuthChallenge(response) : undefined;\n if (challenge) {\n return encodePresentationWsAuthHeader(await presentCredentialsForChallenge(this._identity, challenge));\n }\n log.warn('no auth challenge from edge', { status: response.status, statusText: response.statusText });\n return undefined;\n }\n\n private _isActive = (connection: EdgeWsConnection) => connection === this._currentConnection;\n}\n\nconst encodePresentationWsAuthHeader = (encodedPresentation: Uint8Array): string =>\n EdgeCredentialsHeaderCodec.encodeWebSocketProtocol(encodedPresentation);\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\nimport * as FetchHttpClient from 'effect/http/FetchHttpClient';\nimport * as Headers from 'effect/http/Headers';\nimport * as HttpClient from 'effect/http/HttpClient';\nimport * as HttpClientError from 'effect/http/HttpClientError';\nimport * as HttpClientResponse from 'effect/http/HttpClientResponse';\nimport * as Layer from 'effect/Layer';\nimport * as Stream from 'effect/Stream';\n\nimport { BaseError, type BaseErrorOptions } from '@dxos/errors';\nimport { log } from '@dxos/log';\nimport { BYOK_HEADER } from '@dxos/protocols';\n\nimport { type EdgeAiService, type EdgeHttpClient } from './edge-http-client.ts';\n\nexport type GetEdgeHttpClient = () => EdgeHttpClient;\n\nexport type EdgeAiHttpClientOptions = {\n /** Upstream service; defaults to Anthropic. */\n readonly service?: EdgeAiService;\n};\n\n/**\n * Thrown by {@link EdgeAiHttpClient} when an AI request carrying {@link BYOK_HEADER} is rejected\n * with 401/403 by the upstream provider — i.e. the user-supplied API key is invalid. Wrapped as\n * the `cause` of an `HttpClientError.ResponseError` so it flows through `@effect/ai`'s error\n * mapping; callers walk the cause chain (via {@link ByokError.is}) to render a useful message.\n */\nexport class ByokError extends BaseError.extend('ByokError', 'BYOK authentication failed') {\n constructor(options: { status: number; provider: string } & BaseErrorOptions) {\n super({ context: { status: options.status, provider: options.provider }, ...options });\n }\n}\n\n/**\n * Thrown by {@link EdgeAiHttpClient} when EDGE rejects an AI request with 429 because the\n * authenticated profile exceeded a metering limit. Wrapped as the `cause` of an\n * {@link HttpClientError.ResponseError} so it survives `@effect/ai`'s error mapping.\n */\nexport class UsageQuotaExceededError extends BaseError.extend('UsageQuotaExceededError', 'Usage quota exceeded') {}\n\ntype AnthropicMessagesPayload = {\n tools?: ReadonlyArray<Record<string, unknown>>;\n};\n\nconst isUserDefinedAnthropicTool = (tool: Record<string, unknown>): boolean =>\n tool.input_schema != null && typeof tool.input_schema === 'object';\n\n/**\n * Enables Anthropic fine-grained tool input streaming for client-defined tools.\n * Provider tools (bash, web_search, etc.) are left unchanged.\n */\nexport const patchAnthropicMessagesRequestBody = (body: BodyInit | undefined): BodyInit | undefined => {\n if (body == null) {\n return body;\n }\n\n const decodeBody = (): string | undefined => {\n if (typeof body === 'string') {\n return body;\n }\n if (body instanceof Uint8Array) {\n return new TextDecoder().decode(body);\n }\n return undefined;\n };\n\n const text = decodeBody();\n if (text == null) {\n return body;\n }\n\n try {\n const payload = JSON.parse(text) as AnthropicMessagesPayload;\n if (!Array.isArray(payload.tools)) {\n return body;\n }\n\n payload.tools = payload.tools.map((tool) =>\n isUserDefinedAnthropicTool(tool) ? { ...tool, eager_input_streaming: true } : tool,\n );\n\n const patched = JSON.stringify(payload);\n return typeof body === 'string' ? patched : new TextEncoder().encode(patched);\n } catch {\n return body;\n }\n};\n\nconst readStreamBody = (stream: ReadableStream<Uint8Array>): Effect.Effect<string | undefined> =>\n Effect.promise(async () => {\n const response = new Response(stream);\n return await response.text();\n });\n\n/**\n * An `@effect/platform` {@link HttpClient.HttpClient} that routes requests through the\n * authenticated EDGE AI endpoint via {@link EdgeHttpClient.aiRequest}, instead of\n * fetching the AI service directly.\n *\n * Provide this layer in place of `FetchHttpClient.layer` when constructing a provider client, e.g.\n * `AnthropicClient.layer({ apiUrl: 'http://edge' }).pipe(Layer.provide(EdgeAiHttpClient.layer(() => edgeClient)))`.\n * The `apiUrl` host is a sentinel; only the request path is forwarded (see `aiRequest`).\n *\n * Modeled on `FunctionsAiHttpClient` in `@dxos/functions`.\n */\nexport class EdgeAiHttpClient {\n static make = (getClient: GetEdgeHttpClient, { service = 'anthropic' }: EdgeAiHttpClientOptions = {}) =>\n HttpClient.make((request, url, signal, fiber) => {\n const edgeClient = getClient();\n const options: RequestInit = fiber.context.mapUnsafe.get(FetchHttpClient.RequestInit.key) ?? {};\n const headers = options.headers\n ? Headers.merge(Headers.fromInput(options.headers), request.headers)\n : request.headers;\n\n const carriedByok = !!headers[BYOK_HEADER.toLowerCase()];\n\n const send = (body: BodyInit | undefined) =>\n Effect.tryPromise({\n try: () =>\n edgeClient.aiRequest(\n service,\n new Request(url, {\n ...options,\n method: request.method,\n headers,\n // Fine-grained tool streaming is an Anthropic Messages API extension.\n body: service === 'anthropic' ? patchAnthropicMessagesRequestBody(body) : body,\n signal,\n }),\n ),\n catch: (cause) => {\n log.error('Failed to fetch', { cause });\n return new HttpClientError.HttpClientError({\n reason: new HttpClientError.TransportError({ request, cause }),\n });\n },\n }).pipe(\n Effect.flatMap((response) => {\n const httpResponse = HttpClientResponse.fromWeb(request, response);\n // A 401/403 on a BYOK-carrying request means the user's upstream key was rejected.\n // Wrap as a typed ResponseError with `cause: ByokError` so it survives AiError's\n // `fromRequestError` mapping; callers walk the cause chain to render a useful message.\n if (carriedByok && (response.status === 401 || response.status === 403)) {\n return Effect.tryPromise({\n try: () => response.clone().json() as Promise<{ error?: { message?: string } } | undefined>,\n catch: () => undefined,\n }).pipe(\n Effect.orElseSucceed(() => undefined),\n Effect.flatMap((body) =>\n Effect.fail(\n new HttpClientError.HttpClientError({\n reason: new HttpClientError.StatusCodeError({\n request,\n response: httpResponse,\n cause: new ByokError({\n status: response.status,\n provider: service,\n message: body?.error?.message ?? 'Authentication failed',\n }),\n }),\n }),\n ),\n ),\n );\n }\n // Platform quota (not BYOK): reserve/commit rejected the request before upstream AI.\n if (!carriedByok && response.status === 429) {\n return Effect.tryPromise({\n try: () => response.clone().json() as Promise<{ error?: { message?: string } } | undefined>,\n catch: () => undefined,\n }).pipe(\n Effect.orElseSucceed(() => undefined),\n Effect.flatMap((body) =>\n Effect.fail(\n new HttpClientError.HttpClientError({\n reason: new HttpClientError.StatusCodeError({\n request,\n response: httpResponse,\n cause: new UsageQuotaExceededError({\n message: body?.error?.message,\n }),\n }),\n }),\n ),\n ),\n );\n }\n return Effect.succeed(httpResponse);\n }),\n );\n\n switch (request.body._tag) {\n case 'Raw':\n case 'Uint8Array':\n return send(request.body.body as any);\n case 'FormData':\n return send(request.body.formData);\n case 'Stream':\n return Stream.toReadableStreamEffect(request.body.stream).pipe(\n Effect.flatMap((readable) => readStreamBody(readable)),\n Effect.flatMap((text) => send(text)),\n );\n }\n\n return send(undefined);\n });\n\n static layer = (getClient: GetEdgeHttpClient, options?: EdgeAiHttpClientOptions) =>\n Layer.succeed(HttpClient.HttpClient, EdgeAiHttpClient.make(getClient, options));\n}\n","//\n// Copyright 2024 DXOS.org\n//\n\nimport { type Context } from '@dxos/context';\nimport {\n type CheckEmailExistsResponse,\n type GetAccountResponse,\n type GetProfileUsageResponse,\n type IssueInvitationResponse,\n type ListAccountInvitationsResponse,\n type LoginRequest,\n type LoginResponse,\n type RedeemInvitationCodeRequest,\n type RedeemInvitationCodeResponse,\n type RequestAccessRequest,\n type RequestAccessResponse,\n type ResendVerificationEmailResponse,\n type ValidateInvitationCodeResponse,\n} from '@dxos/protocols';\nimport { createUrl } from '@dxos/util';\n\nimport { BaseHttpClient, type BaseHttpClientOptions, type EdgeHttpCallArgs } from './base-http-client.ts';\n\n/**\n * HTTP client for the hub-service API (accounts, invitations, email verification).\n *\n * Hub-service and the edge worker are separate Cloudflare Workers deployed at different\n * URLs (`DX_HUB_URL` vs `DX_EDGE_URL`). This client is never used to talk to the edge\n * worker, and vice versa — keep them separate.\n *\n * NOTE: Do NOT set `auth: true` on any call here. Hub-service has no `/auth` VP-challenge\n * endpoint (it has an admin login page that 302s and is not CORS-enabled). Auth is handled\n * via the regular request → 401 → WWW-Authenticate challenge → retry path.\n */\nexport class HubHttpClient extends BaseHttpClient {\n constructor(hubUrl: string, options?: BaseHttpClientOptions) {\n super(hubUrl, options);\n }\n\n //\n // Public (unauthenticated) endpoints\n //\n\n public async checkEmailExists(\n ctx: Context,\n body: { email: string },\n args?: EdgeHttpCallArgs,\n ): Promise<CheckEmailExistsResponse> {\n return this._call(ctx, new URL('account/email/exists', this.baseUrl), { ...args, body, method: 'POST' });\n }\n\n public async validateInvitationCode(\n ctx: Context,\n body: { code: string },\n args?: EdgeHttpCallArgs,\n ): Promise<ValidateInvitationCodeResponse> {\n return this._call(ctx, new URL('account/invitation-code/validate', this.baseUrl), {\n ...args,\n body,\n method: 'POST',\n });\n }\n\n public async redeemInvitationCode(\n ctx: Context,\n body: RedeemInvitationCodeRequest,\n args?: EdgeHttpCallArgs,\n ): Promise<RedeemInvitationCodeResponse> {\n return this._call(ctx, new URL('account/invitation-code/redeem', this.baseUrl), {\n ...args,\n body,\n method: 'POST',\n });\n }\n\n /**\n * Existing-account email recovery. The link is delivered out of band — the response never carries\n * a token. Test emails in dev-like environments short-circuit instead with `needsIdentity` /\n * `admitted` before any token exists. Enumeration-safe: the response is identical for unknown\n * emails. Account creation goes through {@link redeemInvitationCode}.\n */\n public async login(ctx: Context, body: LoginRequest, args?: EdgeHttpCallArgs): Promise<LoginResponse> {\n return this._call(ctx, new URL('account/login', this.baseUrl), { ...args, body, method: 'POST' });\n }\n\n public async requestAccess(\n ctx: Context,\n body: RequestAccessRequest,\n args?: EdgeHttpCallArgs,\n ): Promise<RequestAccessResponse> {\n return this._call(ctx, new URL('account/request-access', this.baseUrl), { ...args, body, method: 'POST' });\n }\n\n //\n // Authenticated (VP) endpoints\n //\n\n public async getAccount(ctx: Context, args?: EdgeHttpCallArgs): Promise<GetAccountResponse> {\n return this._call(ctx, new URL('account/me', this.baseUrl), { ...args, method: 'GET' });\n }\n\n public async deleteAccount(ctx: Context, args?: EdgeHttpCallArgs): Promise<{ deleted: boolean }> {\n return this._call(ctx, new URL('account/me', this.baseUrl), { ...args, method: 'DELETE' });\n }\n\n public async listAccountInvitations(ctx: Context, args?: EdgeHttpCallArgs): Promise<ListAccountInvitationsResponse> {\n return this._call(ctx, new URL('account/invitation', this.baseUrl), { ...args, method: 'GET' });\n }\n\n public async issueAccountInvitation(ctx: Context, args?: EdgeHttpCallArgs): Promise<IssueInvitationResponse> {\n return this._call(ctx, new URL('account/invitation/issue', this.baseUrl), { ...args, method: 'POST' });\n }\n\n public async resendVerificationEmail(\n ctx: Context,\n args?: EdgeHttpCallArgs,\n ): Promise<ResendVerificationEmailResponse> {\n return this._call(ctx, new URL('account/email/resend-verification', this.baseUrl), { ...args, method: 'POST' });\n }\n\n /**\n * Rolling-window usage and effective limits for the authenticated identity.\n * Served from the per-user metering DO; optional `windowSeconds` defaults to the largest limit window.\n */\n public async getProfileUsage(\n ctx: Context,\n query?: { windowSeconds?: number },\n args?: EdgeHttpCallArgs,\n ): Promise<GetProfileUsageResponse> {\n return this._call(\n ctx,\n createUrl(new URL('api/metering/profile/usage', this.baseUrl), {\n windowSeconds: query?.windowSeconds,\n }),\n { ...args, method: 'GET' },\n );\n }\n}\n","//\n// Copyright 2026 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\n\n/** Request body for EDGE `/ai/browser-rendering/markdown` (ai-service Browser Run markdown quick action). */\nexport const MarkdownRequest = Schema.Struct({\n url: Schema.optional(Schema.String),\n html: Schema.optional(Schema.String),\n gotoOptions: Schema.optional(\n Schema.Struct({\n waitUntil: Schema.optional(Schema.Literals(['load', 'domcontentloaded', 'networkidle0', 'networkidle2'])),\n timeout: Schema.optional(Schema.Number),\n }),\n ),\n rejectRequestPattern: Schema.optional(Schema.Array(Schema.String)),\n userAgent: Schema.optional(Schema.String),\n waitForSelector: Schema.optional(Schema.String),\n});\n\nexport type MarkdownRequest = Schema.Schema.Type<typeof MarkdownRequest>;\n\n/** JSON body returned by Cloudflare Browser Run markdown quick action. */\nexport const MarkdownResponse = Schema.Struct({\n success: Schema.Boolean,\n result: Schema.String,\n});\n\nexport type MarkdownResponse = Schema.Schema.Type<typeof MarkdownResponse>;\n"],"mappings":"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"}
@@ -46,7 +46,8 @@ export type AuthChallengeInfo = {
46
46
  * console and records a routine auth failure server-side on each client boot.
47
47
  *
48
48
  * Returns undefined if the endpoint is unreachable or answers in neither known shape; callers fall
49
- * back to the 401 path, which still works against every server.
49
+ * back to the 401 path, which still works against every server. Throws {@link EdgeClientTooOldError} when EDGE refuses
50
+ * this SDK, which no fallback can get past.
50
51
  */
51
52
  export declare const fetchAuthChallengeInfo: (baseHttpUrl: string | URL) => Promise<AuthChallengeInfo | undefined>;
52
53
  /** The challenge alone; see {@link fetchAuthChallengeInfo}. */
@@ -1 +1 @@
1
- {"version":3,"file":"auth-challenge.d.ts","sourceRoot":"","sources":["../../../src/auth-challenge.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAiBvD;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,oBAAoB,WAAY,MAAM,GAAG,IAAI,GAAG,SAAS,KAAG,MAAM,GAAG,SA8BjF,CAAC;AA6CF;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB,aAAoB,QAAQ,KAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAgBtF,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,8BAA8B;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,sBAAsB,gBAAuB,MAAM,GAAG,GAAG,KAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAsB7G,CAAC;AAEF,+DAA+D;AAC/D,eAAO,MAAM,kBAAkB,gBAAuB,MAAM,GAAG,GAAG,KAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CACvC,CAAC;AAEzD;;;;;GAKG;AACH,eAAO,MAAM,8BAA8B,aAC/B,YAAY,aACX,MAAM,KAChB,OAAO,CAAC,UAAU,CAGpB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,2DAA2D;IAC3D,YAAY,EAAE,UAAU,CAAC;IACzB,yEAAyE;IACzE,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,gCAAgC,gBAC9B,MAAM,GAAG,GAAG,YACf,YAAY,KACrB,OAAO,CAAC,uBAAuB,GAAG,SAAS,CAS7C,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,mBAA0B,QAAQ,YAAY,YAAY,KAAG,OAAO,CAAC,UAAU,CAI9G,CAAC"}
1
+ {"version":3,"file":"auth-challenge.d.ts","sourceRoot":"","sources":["../../../src/auth-challenge.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAiBvD;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,oBAAoB,WAAY,MAAM,GAAG,IAAI,GAAG,SAAS,KAAG,MAAM,GAAG,SA8BjF,CAAC;AA6CF;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB,aAAoB,QAAQ,KAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAgBtF,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,8BAA8B;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,sBAAsB,gBAAuB,MAAM,GAAG,GAAG,KAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CA0B7G,CAAC;AAEF,+DAA+D;AAC/D,eAAO,MAAM,kBAAkB,gBAAuB,MAAM,GAAG,GAAG,KAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CACvC,CAAC;AAEzD;;;;;GAKG;AACH,eAAO,MAAM,8BAA8B,aAC/B,YAAY,aACX,MAAM,KAChB,OAAO,CAAC,UAAU,CAGpB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,2DAA2D;IAC3D,YAAY,EAAE,UAAU,CAAC;IACzB,yEAAyE;IACzE,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,gCAAgC,gBAC9B,MAAM,GAAG,GAAG,YACf,YAAY,KACrB,OAAO,CAAC,uBAAuB,GAAG,SAAS,CAS7C,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,mBAA0B,QAAQ,YAAY,YAAY,KAAG,OAAO,CAAC,UAAU,CAI9G,CAAC"}
@@ -94,7 +94,7 @@ export declare abstract class BaseHttpClient {
94
94
  * device with no HALO chain (mid-invitation), and without this the rejection would surface from
95
95
  * `_call` as a failed request — turning a call that used to succeed unauthenticated into an error.
96
96
  */
97
- private _prefetchAuthHeader;
97
+ protected _prefetchAuthHeader(): Promise<void>;
98
98
  private _prefetchAuthHeaderOnce;
99
99
  /** Stale means past the proactive-refresh point, not necessarily rejected yet. */
100
100
  private _authHeaderIsStale;
@@ -1 +1 @@
1
- {"version":3,"file":"base-http-client.d.ts","sourceRoot":"","sources":["../../../src/base-http-client.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAA+C,MAAM,eAAe,CAAC;AAMrF,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AASvD,MAAM,MAAM,WAAW,GAAG;IACxB,2DAA2D;IAC3D,KAAK,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB;;;;OAIG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,KAAK,eAAe,GAAG;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,oBAAoB;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,8BAAsB,cAAc;IAClC,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IACpC,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAClD,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/C,SAAS,CAAC,aAAa,EAAE,YAAY,GAAG,SAAS,CAAC;IAClD,8FAA8F;IAC9F,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,kGAAkG;IAClG,OAAO,CAAC,eAAe,CAAqB;IAC5C,uFAAuF;IACvF,OAAO,CAAC,UAAU,CAAqB;IACvC,mGAAmG;IACnG,OAAO,CAAC,aAAa,CAA4B;IAEjD,YAAY,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,EAO3D;IAED,IAAI,OAAO,WAEV;IAED;;;;;;;;OAQG;IACG,aAAa,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAejD;IAED,WAAW,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CASxC;IAED,UAAgB,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,CAAC,CAAC,CAiFlF;IAED;;;;;;;;;OASG;IACH,UAAgB,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAuD5F;IAED;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,mBAAmB;YAoBb,uBAAuB;IAerC,kFAAkF;IAClF,OAAO,CAAC,kBAAkB;IAS1B;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;IAK3B,UAAgB,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAavE;CACF"}
1
+ {"version":3,"file":"base-http-client.d.ts","sourceRoot":"","sources":["../../../src/base-http-client.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAA+C,MAAM,eAAe,CAAC;AAarF,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AASvD,MAAM,MAAM,WAAW,GAAG;IACxB,2DAA2D;IAC3D,KAAK,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB;;;;OAIG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,KAAK,eAAe,GAAG;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,oBAAoB;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,8BAAsB,cAAc;IAClC,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IACpC,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAClD,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/C,SAAS,CAAC,aAAa,EAAE,YAAY,GAAG,SAAS,CAAC;IAClD,8FAA8F;IAC9F,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,kGAAkG;IAClG,OAAO,CAAC,eAAe,CAAqB;IAC5C,uFAAuF;IACvF,OAAO,CAAC,UAAU,CAAqB;IACvC,mGAAmG;IACnG,OAAO,CAAC,aAAa,CAA4B;IAEjD,YAAY,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,EAO3D;IAED,IAAI,OAAO,WAEV;IAED;;;;;;;;OAQG;IACG,aAAa,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAejD;IAED,WAAW,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CASxC;IAED,UAAgB,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,CAAC,CAAC,CAmFlF;IAED;;;;;;;;;OASG;IACH,UAAgB,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAuD5F;IAED;;;;;;;;;;;OAWG;IACH,SAAS,CAAC,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAsB7C;YAEa,uBAAuB;IAerC,kFAAkF;IAClF,OAAO,CAAC,kBAAkB;IAS1B;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;IAK3B,UAAgB,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAavE;CACF"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * This SDK's version, which EDGE checks against the oldest it serves. It releases in lockstep with the rest of the
3
+ * SDK, and Vite tree-shakes the import to this one field.
4
+ */
5
+ export declare const CLIENT_SDK_VERSION: string;
6
+ /** Headers advertising {@link CLIENT_SDK_VERSION} on a request of the EDGE connect flow (`/auth` and its fallback). */
7
+ export declare const clientVersionHeaders: () => Record<string, string>;
8
+ /** The same advertisement for the WebSocket upgrade, where a browser can set no header but the subprotocol list. */
9
+ export declare const clientVersionProtocol: () => string;
10
+ /**
11
+ * Throws {@link EdgeClientTooOldError} when `response` is EDGE's failure envelope refusing this SDK. Matched on the
12
+ * envelope's `data.type`, as any WebSocket endpoint answers a plain GET with a bare 426 "Upgrade Required".
13
+ */
14
+ export declare const assertClientSupported: (response: Response) => Promise<void>;
15
+ //# sourceMappingURL=client-version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-version.d.ts","sourceRoot":"","sources":["../../../src/client-version.ts"],"names":[],"mappings":"AAcA;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,MAAgB,CAAC;AAElD,uHAAuH;AACvH,eAAO,MAAM,oBAAoB,QAAO,MAAM,CAAC,MAAM,EAAE,MAAM,CAE3D,CAAC;AAEH,oHAAoH;AACpH,eAAO,MAAM,qBAAqB,QAAO,MAAuE,CAAC;AAEjH;;;GAGG;AACH,eAAO,MAAM,qBAAqB,aAAoB,QAAQ,KAAG,OAAO,CAAC,IAAI,CAW5E,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"edge-client.d.ts","sourceRoot":"","sources":["../../../src/edge-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"edge-client.d.ts","sourceRoot":"","sources":["../../../src/edge-client.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"edge-http-client.d.ts","sourceRoot":"","sources":["../../../src/edge-http-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"edge-http-client.d.ts","sourceRoot":"","sources":["../../../src/edge-http-client.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"edge-ws-connection.d.ts","sourceRoot":"","sources":["../../../src/edge-ws-connection.ts"],"names":[],"mappings":"AAOA,OAAO,EAAW,QAAQ,EAAE,MAAM,eAAe,CAAC;AAKlD,OAAO,EAAE,KAAK,OAAO,EAAiB,MAAM,4CAA4C,CAAC;AAIzF,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGvD,OAAO,EAAE,KAAK,eAAe,EAAoD,MAAM,uBAAuB,CAAC;AA2B/G,MAAM,MAAM,yBAAyB,GAAG;IACtC,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,SAAS,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,iBAAiB,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,CAAC;CACtD,CAAC;AAEF,qBAAa,gBAAiB,SAAQ,QAAQ;IA8C1C,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU;IA/C7B,OAAO,CAAC,qBAAqB,CAAsB;IACnD,OAAO,CAAC,GAAG,CAAwB;IACnC,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,6BAA6B,CAAc;IAEnD,OAAO,CAAC,cAAc,CAAqB;IAG3C,OAAO,CAAC,cAAc,CAAqB;IAC3C,OAAO,CAAC,sBAAsB,CAAK;IACnC;;;OAGG;IACH,OAAO,CAAC,cAAc,CAAqB;IAC3C,iEAAiE;IACjE,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,IAAI,CAAK;IAGjB,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAQ;IAC5C,OAAO,CAAC,aAAa,CAAoE;IAEzF,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,iBAAiB,CAAK;IAE9B;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAe;IAE7C;;;OAGG;IACH,OAAO,CAAC,gBAAgB,CAAiB;IAEzC,YACmB,SAAS,EAAE,YAAY,EACvB,eAAe,EAAE;QAAE,GAAG,EAAE,GAAG,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,EACxF,UAAU,EAAE,yBAAyB,EAGvD;IAED,IACW,IAAI;QAEX,IAAI;QACJ,QAAQ;QACR,MAAM;MAET;IAED,IAAW,GAAG,IAAI,MAAM,CAEvB;IAED,qEAAqE;IACrE,IAAW,MAAM,IAAI,MAAM,CAE1B;IAED,IAAW,UAAU,IAAI,MAAM,CAE9B;IAED,IAAW,YAAY,IAAI,MAAM,CAEhC;IAED,IAAW,YAAY,IAAI,MAAM,CAEhC;IAED,IAAW,gBAAgB,IAAI,MAAM,CAEpC;IAEM,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyClC;IAED,UAAyB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAuE9C;IAED,2EAA2E;IAC3E,OAAO,CAAC,qBAAqB;YAQf,eAAe;IAuB7B,UAAyB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAe/C;IAED,OAAO,CAAC,mBAAmB;IAe3B,OAAO,CAAC,SAAS;IAgBjB;;;;;;;;;OASG;IACH,OAAO,CAAC,2BAA2B;IAuDnC,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,wBAAwB;IAYhC,OAAO,CAAC,eAAe;CA4BxB"}
1
+ {"version":3,"file":"edge-ws-connection.d.ts","sourceRoot":"","sources":["../../../src/edge-ws-connection.ts"],"names":[],"mappings":"AAOA,OAAO,EAAW,QAAQ,EAAE,MAAM,eAAe,CAAC;AAKlD,OAAO,EAAE,KAAK,OAAO,EAAiB,MAAM,4CAA4C,CAAC;AAIzF,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGvD,OAAO,EAAE,KAAK,eAAe,EAAoD,MAAM,uBAAuB,CAAC;AA2B/G,MAAM,MAAM,yBAAyB,GAAG;IACtC,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,SAAS,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,iBAAiB,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,CAAC;CACtD,CAAC;AAEF,qBAAa,gBAAiB,SAAQ,QAAQ;IA8C1C,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU;IA/C7B,OAAO,CAAC,qBAAqB,CAAsB;IACnD,OAAO,CAAC,GAAG,CAAwB;IACnC,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,6BAA6B,CAAc;IAEnD,OAAO,CAAC,cAAc,CAAqB;IAG3C,OAAO,CAAC,cAAc,CAAqB;IAC3C,OAAO,CAAC,sBAAsB,CAAK;IACnC;;;OAGG;IACH,OAAO,CAAC,cAAc,CAAqB;IAC3C,iEAAiE;IACjE,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,IAAI,CAAK;IAGjB,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAQ;IAC5C,OAAO,CAAC,aAAa,CAAoE;IAEzF,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,iBAAiB,CAAK;IAE9B;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAe;IAE7C;;;OAGG;IACH,OAAO,CAAC,gBAAgB,CAAiB;IAEzC,YACmB,SAAS,EAAE,YAAY,EACvB,eAAe,EAAE;QAAE,GAAG,EAAE,GAAG,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,EACxF,UAAU,EAAE,yBAAyB,EAGvD;IAED,IACW,IAAI;QAEX,IAAI;QACJ,QAAQ;QACR,MAAM;MAET;IAED,IAAW,GAAG,IAAI,MAAM,CAEvB;IAED,qEAAqE;IACrE,IAAW,MAAM,IAAI,MAAM,CAE1B;IAED,IAAW,UAAU,IAAI,MAAM,CAE9B;IAED,IAAW,YAAY,IAAI,MAAM,CAEhC;IAED,IAAW,YAAY,IAAI,MAAM,CAEhC;IAED,IAAW,gBAAgB,IAAI,MAAM,CAEpC;IAEM,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyClC;IAED,UAAyB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAsE9C;IAED,2EAA2E;IAC3E,OAAO,CAAC,qBAAqB;YAQf,eAAe;IAuB7B,UAAyB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAe/C;IAED,OAAO,CAAC,mBAAmB;IAe3B,OAAO,CAAC,SAAS;IAgBjB;;;;;;;;;OASG;IACH,OAAO,CAAC,2BAA2B;IAuDnC,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,wBAAwB;IAYhC,OAAO,CAAC,eAAe;CA4BxB"}