@cortexkit/subc-client
Advanced tools
| /** | ||
| * Immutable identity for one route binding on one live socket. Only channel and | ||
| * epoch cross the wire; the connection token remains private to this SDK. | ||
| */ | ||
| export declare class RouteHandle { | ||
| readonly channel: number; | ||
| readonly epoch: number; | ||
| private constructor(); | ||
| private static create; | ||
| } | ||
| /** @internal SDK factory; not re-exported from the package surface. */ | ||
| export declare function createRouteHandle(channel: number, epoch: number, token: object): RouteHandle; | ||
| /** A route handle belongs to another connection or is no longer installed. */ | ||
| export declare class StaleRouteHandleError extends Error { | ||
| readonly handle: RouteHandle; | ||
| readonly code = "stale_route_handle"; | ||
| constructor(handle: RouteHandle); | ||
| } | ||
| /** @internal */ | ||
| export declare function newConnectionToken(): object; | ||
| /** @internal */ | ||
| export declare function belongsToConnection(handle: RouteHandle, token: object): boolean; | ||
| /** @internal */ | ||
| export declare function sameRouteHandle(left: RouteHandle, right: RouteHandle): boolean; | ||
| //# sourceMappingURL=route-handle.d.ts.map |
| {"version":3,"file":"route-handle.d.ts","sourceRoot":"","sources":["../src/route-handle.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,qBAAa,WAAW;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEvB,OAAO;IAaP,OAAO,CAAC,MAAM,CAAC,MAAM;CAGtB;AAED,uEAAuE;AACvE,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,WAAW,CAK5F;AAED,8EAA8E;AAC9E,qBAAa,qBAAsB,SAAQ,KAAK;IAGlC,QAAQ,CAAC,MAAM,EAAE,WAAW;IAFxC,QAAQ,CAAC,IAAI,wBAAwB;gBAEhB,MAAM,EAAE,WAAW;CAIzC;AAED,gBAAgB;AAChB,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,gBAAgB;AAChB,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAE/E;AAED,gBAAgB;AAChB,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAE9E"} |
| const connectionToken = new WeakMap(); | ||
| /** | ||
| * Immutable identity for one route binding on one live socket. Only channel and | ||
| * epoch cross the wire; the connection token remains private to this SDK. | ||
| */ | ||
| export class RouteHandle { | ||
| channel; | ||
| epoch; | ||
| constructor(channel, epoch, token) { | ||
| if (!Number.isInteger(channel) || channel <= 0 || channel > 0xffff) { | ||
| throw new RangeError(`route channel must be an integer in 1..65535, got ${channel}`); | ||
| } | ||
| if (!Number.isInteger(epoch) || epoch <= 0 || epoch > 0xffff_ffff) { | ||
| throw new RangeError(`route epoch must be an integer in 1..4294967295, got ${epoch}`); | ||
| } | ||
| this.channel = channel; | ||
| this.epoch = epoch; | ||
| connectionToken.set(this, token); | ||
| Object.freeze(this); | ||
| } | ||
| static create(channel, epoch, token) { | ||
| return new RouteHandle(channel, epoch, token); | ||
| } | ||
| } | ||
| /** @internal SDK factory; not re-exported from the package surface. */ | ||
| export function createRouteHandle(channel, epoch, token) { | ||
| const factory = RouteHandle; | ||
| return factory.create(channel, epoch, token); | ||
| } | ||
| /** A route handle belongs to another connection or is no longer installed. */ | ||
| export class StaleRouteHandleError extends Error { | ||
| handle; | ||
| code = "stale_route_handle"; | ||
| constructor(handle) { | ||
| super(`route handle (${handle.channel}, ${handle.epoch}) is not live on the current connection`); | ||
| this.handle = handle; | ||
| this.name = "StaleRouteHandleError"; | ||
| } | ||
| } | ||
| /** @internal */ | ||
| export function newConnectionToken() { | ||
| return Object.freeze({}); | ||
| } | ||
| /** @internal */ | ||
| export function belongsToConnection(handle, token) { | ||
| return connectionToken.get(handle) === token; | ||
| } | ||
| /** @internal */ | ||
| export function sameRouteHandle(left, right) { | ||
| return left === right; | ||
| } | ||
| //# sourceMappingURL=route-handle.js.map |
| {"version":3,"file":"route-handle.js","sourceRoot":"","sources":["../src/route-handle.ts"],"names":[],"mappings":"AAAA,MAAM,eAAe,GAAG,IAAI,OAAO,EAAuB,CAAC;AAE3D;;;GAGG;AACH,MAAM,OAAO,WAAW;IACb,OAAO,CAAS;IAChB,KAAK,CAAS;IAEvB,YAAoB,OAAe,EAAE,KAAa,EAAE,KAAa;QAC/D,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC,IAAI,OAAO,GAAG,MAAM,EAAE,CAAC;YACnE,MAAM,IAAI,UAAU,CAAC,qDAAqD,OAAO,EAAE,CAAC,CAAC;QACvF,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,GAAG,WAAW,EAAE,CAAC;YAClE,MAAM,IAAI,UAAU,CAAC,wDAAwD,KAAK,EAAE,CAAC,CAAC;QACxF,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IAEO,MAAM,CAAC,MAAM,CAAC,OAAe,EAAE,KAAa,EAAE,KAAa;QACjE,OAAO,IAAI,WAAW,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAChD,CAAC;CACF;AAED,uEAAuE;AACvE,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,KAAa,EAAE,KAAa;IAC7E,MAAM,OAAO,GAAG,WAEf,CAAC;IACF,OAAO,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AAC/C,CAAC;AAED,8EAA8E;AAC9E,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAGzB;IAFZ,IAAI,GAAG,oBAAoB,CAAC;IAErC,YAAqB,MAAmB;QACtC,KAAK,CAAC,iBAAiB,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC,KAAK,yCAAyC,CAAC,CAAC;QAD9E,WAAM,GAAN,MAAM,CAAa;QAEtC,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AAED,gBAAgB;AAChB,MAAM,UAAU,kBAAkB;IAChC,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAC3B,CAAC;AAED,gBAAgB;AAChB,MAAM,UAAU,mBAAmB,CAAC,MAAmB,EAAE,KAAa;IACpE,OAAO,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,CAAC;AAC/C,CAAC;AAED,gBAAgB;AAChB,MAAM,UAAU,eAAe,CAAC,IAAiB,EAAE,KAAkB;IACnE,OAAO,IAAI,KAAK,KAAK,CAAC;AACxB,CAAC"} |
| const connectionToken = new WeakMap<RouteHandle, object>(); | ||
| /** | ||
| * Immutable identity for one route binding on one live socket. Only channel and | ||
| * epoch cross the wire; the connection token remains private to this SDK. | ||
| */ | ||
| export class RouteHandle { | ||
| readonly channel: number; | ||
| readonly epoch: number; | ||
| private constructor(channel: number, epoch: number, token: object) { | ||
| if (!Number.isInteger(channel) || channel <= 0 || channel > 0xffff) { | ||
| throw new RangeError(`route channel must be an integer in 1..65535, got ${channel}`); | ||
| } | ||
| if (!Number.isInteger(epoch) || epoch <= 0 || epoch > 0xffff_ffff) { | ||
| throw new RangeError(`route epoch must be an integer in 1..4294967295, got ${epoch}`); | ||
| } | ||
| this.channel = channel; | ||
| this.epoch = epoch; | ||
| connectionToken.set(this, token); | ||
| Object.freeze(this); | ||
| } | ||
| private static create(channel: number, epoch: number, token: object): RouteHandle { | ||
| return new RouteHandle(channel, epoch, token); | ||
| } | ||
| } | ||
| /** @internal SDK factory; not re-exported from the package surface. */ | ||
| export function createRouteHandle(channel: number, epoch: number, token: object): RouteHandle { | ||
| const factory = RouteHandle as unknown as { | ||
| create(channel: number, epoch: number, token: object): RouteHandle; | ||
| }; | ||
| return factory.create(channel, epoch, token); | ||
| } | ||
| /** A route handle belongs to another connection or is no longer installed. */ | ||
| export class StaleRouteHandleError extends Error { | ||
| readonly code = "stale_route_handle"; | ||
| constructor(readonly handle: RouteHandle) { | ||
| super(`route handle (${handle.channel}, ${handle.epoch}) is not live on the current connection`); | ||
| this.name = "StaleRouteHandleError"; | ||
| } | ||
| } | ||
| /** @internal */ | ||
| export function newConnectionToken(): object { | ||
| return Object.freeze({}); | ||
| } | ||
| /** @internal */ | ||
| export function belongsToConnection(handle: RouteHandle, token: object): boolean { | ||
| return connectionToken.get(handle) === token; | ||
| } | ||
| /** @internal */ | ||
| export function sameRouteHandle(left: RouteHandle, right: RouteHandle): boolean { | ||
| return left === right; | ||
| } |
+49
-54
| import { type ConnectionInfo } from "./connection-file.js"; | ||
| import { Priority } from "./envelope.js"; | ||
| import { AdmissionClass, Priority } from "./envelope.js"; | ||
| import { RouteHandle } from "./route-handle.js"; | ||
| export declare const SUBC_MODULE_ID_ENV = "SUBC_MODULE_ID"; | ||
@@ -29,2 +30,4 @@ export declare const SUBC_LAUNCH_NONCE_ENV = "SUBC_LAUNCH_NONCE"; | ||
| consumerIdentity?: ConsumerIdentity | null; | ||
| /** Optional consumer-declared reverse-request capabilities for this route.open. This is a declaration, not a verified privilege; providers must treat an omitted field as no reverse-request capability. Known MCP method-family values today are "elicitation", "sampling", and "roots". */ | ||
| consumerCapabilities?: string[]; | ||
| } | ||
@@ -38,2 +41,3 @@ export interface CatalogEntry { | ||
| priority?: Priority; | ||
| admissionClass?: AdmissionClass; | ||
| timeoutMs?: number; | ||
@@ -53,3 +57,11 @@ /** Called for each interim PUSH / StreamData frame before the terminal reply. */ | ||
| priority?: Priority; | ||
| admissionClass?: AdmissionClass; | ||
| } | ||
| export type RoutePollKind = "status" | "liveness"; | ||
| export interface RoutePollResult { | ||
| route_channel: number; | ||
| route_epoch: number; | ||
| status: string | null; | ||
| live: boolean | null; | ||
| } | ||
| export interface CloseRouteOptions { | ||
@@ -62,3 +74,5 @@ /** | ||
| drain?: boolean; | ||
| /** Consumer identity to use when looking up the route to close; only needed for routes opened with a non-default consumer identity. */ | ||
| } | ||
| export interface ManagedCloseRouteOptions extends CloseRouteOptions { | ||
| /** Consumer identity used by the cached managed route. */ | ||
| consumerIdentity?: ConsumerIdentity | null; | ||
@@ -142,3 +156,7 @@ } | ||
| private readonly pending; | ||
| private readonly lateResponses; | ||
| private readonly routes; | ||
| private readonly liveRoutes; | ||
| private connectionToken; | ||
| private ingressEpochDropCount; | ||
| private closedErr; | ||
@@ -155,6 +173,6 @@ private closeStarted; | ||
| catalogList(moduleId?: string): Promise<CatalogEntry[]>; | ||
| /** Open a route to a provider (channel-0 route.open); returns the route channel. */ | ||
| routeOpen(target: RouteTarget, identity: BindIdentity, opts?: RouteOpenOptions): Promise<number>; | ||
| /** Send a data-plane request on a route channel and await its terminal reply. */ | ||
| request(routeChannel: number, body: unknown, opts?: RequestOptions): Promise<unknown>; | ||
| /** Open a route and return its connection-bound immutable handle. */ | ||
| routeOpen(target: RouteTarget, identity: BindIdentity, opts?: RouteOpenOptions): Promise<RouteHandle>; | ||
| /** Send a data-plane request on exactly the supplied route generation. */ | ||
| request(handle: RouteHandle, body: unknown, opts?: RequestOptions): Promise<unknown>; | ||
| /** | ||
@@ -165,43 +183,18 @@ * Managed route + request convenience. Opens and caches a route for the module, | ||
| call<Response = unknown>(moduleId: string, method: string, params?: unknown, opts?: ManagedCallOptions): Promise<Response>; | ||
| /** | ||
| * Open a held-open event subscription on a route channel. Sends one Request the | ||
| * provider keeps open, delivering each interim StreamData frame to `onEvent`; the | ||
| * returned `closed` settles on the StreamEnd terminal (resolve) or an Error / route | ||
| * GOODBYE (reject). Events ride this held-open request's correlation id — they are | ||
| * never unsolicited, so they are not dropped. Call `unsubscribe()` to cancel. | ||
| */ | ||
| subscribe(routeChannel: number, body: unknown, onEvent: (event: Uint8Array) => void, opts?: SubscribeOptions): Subscription; | ||
| /** | ||
| * Tear down ONE managed route (a route opened via `call()`), keyed by its | ||
| * (target, identity). Idempotent and never throws — callers over-call on | ||
| * session-end. The teardown: | ||
| * - flips a tombstone on the cached route and removes it from the cache, so an | ||
| * in-flight `openCachedRoute` for the same key will NOT install its channel | ||
| * (the generation guard: close beats a racing reopen), and a later `call()` | ||
| * opens a fresh route (this is NOT a permanent tombstone); | ||
| * - settles in-flight requests on the channel as RouteClosed (managed requests | ||
| * keep their at-most-once classification: outcome_unknown if already sent, | ||
| * not_sent otherwise; subscriptions always abort); | ||
| * - sends a best-effort route GOODBYE so subc releases the route and notifies | ||
| * the module to free per-session resources. | ||
| * `opts.drain` waits for in-flight UNARY requests to settle before tearing down. | ||
| */ | ||
| closeRoute(target: Extract<RouteTarget, { | ||
| /** Open a held request on exactly one route generation. */ | ||
| subscribe(handle: RouteHandle, body: unknown, onEvent: (event: Uint8Array) => void, opts?: SubscribeOptions): Subscription; | ||
| /** Send a pure-header cancellation for an in-flight request. */ | ||
| cancel(handle: RouteHandle, corr: bigint, priority?: Priority): void; | ||
| /** Poll status or liveness for exactly the supplied route generation. */ | ||
| routePoll(handle: RouteHandle, kind: RoutePollKind): Promise<RoutePollResult>; | ||
| /** Tear down exactly the supplied route generation. */ | ||
| closeRoute(handle: RouteHandle, opts?: CloseRouteOptions): Promise<void>; | ||
| /** Close a cached managed route by its route-open identity tuple. */ | ||
| closeManagedRoute(target: Extract<RouteTarget, { | ||
| kind: ManagedRouteKind; | ||
| }>, identity: BindIdentity, opts?: CloseRouteOptions): Promise<void>; | ||
| /** | ||
| * Tear down ONE route by its channel number — the primitive for callers that | ||
| * opened a route with `routeOpen` directly (e.g. a tool route carrying raw | ||
| * {name, arguments}) and hold the channel themselves. Idempotent, never throws. | ||
| * Settles in-flight requests on the channel as RouteClosed and sends a best-effort | ||
| * route GOODBYE. `opts.drain` awaits in-flight UNARY requests first; subscriptions | ||
| * are always aborted (a held-open stream cannot be drained). | ||
| */ | ||
| closeRouteChannel(channel: number, opts?: CloseRouteOptions): Promise<void>; | ||
| }>, identity: BindIdentity, opts?: ManagedCloseRouteOptions): Promise<void>; | ||
| /** Alias retained for callers that name the operation by protocol channel; it still requires a full handle. */ | ||
| closeRouteChannel(handle: RouteHandle, opts?: CloseRouteOptions): Promise<void>; | ||
| close(): void; | ||
| /** Resolve once every in-flight UNARY request on the channel (snapshot at call | ||
| * time) has settled. Subscriptions are excluded — they are aborted, not drained. */ | ||
| private drainUnaryOnChannel; | ||
| /** Send a best-effort header-only route GOODBYE for `channel`. One-way: the daemon | ||
| * releases the route and relays a route-gone GOODBYE to the module; no ack. */ | ||
| private drainUnaryOnHandle; | ||
| private sendRouteGoodbye; | ||
@@ -224,3 +217,3 @@ private static openConnection; | ||
| private sendManaged; | ||
| private cachedRouteChannel; | ||
| private cachedRouteHandle; | ||
| private openCachedRoute; | ||
@@ -249,10 +242,4 @@ private ensureConnectedForManaged; | ||
| private errorFromFrame; | ||
| /** | ||
| * Drop a dead channel from the managed-route cache so the next call re-opens. | ||
| * Only clears entries still pointing at THIS channel in the CURRENT socket | ||
| * generation; a route already re-opened (new channel) or re-created after a | ||
| * reconnect (new generation) is left alone. | ||
| */ | ||
| private evictRouteChannel; | ||
| private failChannel; | ||
| private evictRouteHandle; | ||
| private failHandle; | ||
| private fail; | ||
@@ -263,2 +250,10 @@ private notSentCallError; | ||
| private notSentRecoveryError; | ||
| /** Number of nonzero-channel ingress frames dropped by endpoint epoch validation. */ | ||
| get droppedIngressFrames(): number; | ||
| private installRoute; | ||
| private isLiveHandle; | ||
| private assertLiveConnection; | ||
| private assertLiveHandle; | ||
| private allocateCorr; | ||
| private closeConnectionAfterCleanupFailure; | ||
| private encode; | ||
@@ -265,0 +260,0 @@ private parseJson; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"} |
+302
-261
@@ -15,3 +15,4 @@ // The consumer-facing subc client. Mirrors the canonical pure consumer | ||
| import { ConnectionFileError, readConnectionFile } from "./connection-file.js"; | ||
| import { buildFrame, buildFlags, decodeHeader, encodeFrame, FrameType, HEADER_LEN, Priority, } from "./envelope.js"; | ||
| import { AdmissionClass, buildFrame, buildFlags, encodeFrame, FrameType, Priority, } from "./envelope.js"; | ||
| import { belongsToConnection, createRouteHandle, newConnectionToken, sameRouteHandle, StaleRouteHandleError, } from "./route-handle.js"; | ||
| import { SocketClosedError, SocketTimeoutError, SocketWriteNotQueuedError, SocketWriteQueuedError, SubcSocket, } from "./socket.js"; | ||
@@ -105,3 +106,7 @@ const debug = debuglog("subc-client"); | ||
| pending = new Map(); | ||
| lateResponses = new Map(); | ||
| routes = new Map(); | ||
| liveRoutes = new Map(); | ||
| connectionToken = newConnectionToken(); | ||
| ingressEpochDropCount = 0; | ||
| closedErr = null; | ||
@@ -138,5 +143,6 @@ closeStarted = false; | ||
| } | ||
| /** Open a route to a provider (channel-0 route.open); returns the route channel. */ | ||
| /** Open a route and return its connection-bound immutable handle. */ | ||
| async routeOpen(target, identity, opts = {}) { | ||
| const consumerIdentity = routeOpenConsumerIdentity(opts); | ||
| const consumerCapabilities = opts.consumerCapabilities; | ||
| const body = this.encode({ | ||
@@ -147,15 +153,43 @@ op: "route.open", | ||
| ...(consumerIdentity ? { consumer_identity: consumerIdentity } : {}), | ||
| ...(consumerCapabilities !== undefined ? { consumer_capabilities: consumerCapabilities } : {}), | ||
| }); | ||
| const reply = await this.controlRpc(body); | ||
| const parsed = this.parseJson(reply); | ||
| if (typeof parsed.route_channel !== "number") { | ||
| throw new SubcError(`route.open returned no route_channel: ${JSON.stringify(parsed)}`); | ||
| } | ||
| return parsed.route_channel; | ||
| let installed = null; | ||
| const install = (frame) => { | ||
| if (frame.header.ty !== FrameType.Response) | ||
| return true; | ||
| const parsed = this.parseJson(frame); | ||
| if (typeof parsed.route_channel !== "number" || typeof parsed.route_epoch !== "number") { | ||
| throw new SubcError(`route.open returned no route handle: ${JSON.stringify(parsed)}`); | ||
| } | ||
| installed = this.installRoute(parsed.route_channel, parsed.route_epoch); | ||
| return true; | ||
| }; | ||
| const closeLateRoute = (frame) => { | ||
| if (frame.header.ty !== FrameType.Response) | ||
| return; | ||
| try { | ||
| const parsed = this.parseJson(frame); | ||
| if (typeof parsed.route_channel !== "number" || typeof parsed.route_epoch !== "number") | ||
| return; | ||
| const lateHandle = this.installRoute(parsed.route_channel, parsed.route_epoch); | ||
| this.failHandle(lateHandle, new SubcError("late route.open was closed", "route_closed")); | ||
| this.liveRoutes.delete(lateHandle.channel); | ||
| this.sendRouteGoodbye(lateHandle, true); | ||
| } | ||
| catch { | ||
| this.closeConnectionAfterCleanupFailure(); | ||
| } | ||
| }; | ||
| await this.controlRpc(body, install, closeLateRoute); | ||
| if (!installed) | ||
| throw new SubcError("route.open response was not installed"); | ||
| return installed; | ||
| } | ||
| /** Send a data-plane request on a route channel and await its terminal reply. */ | ||
| async request(routeChannel, body, opts = {}) { | ||
| /** Send a data-plane request on exactly the supplied route generation. */ | ||
| async request(handle, body, opts = {}) { | ||
| this.assertLiveHandle(handle); | ||
| const bytes = body instanceof Uint8Array ? body : this.encode(body); | ||
| const priority = opts.priority ?? Priority.Interactive; | ||
| const reply = await this.send(routeChannel, bytes, priority, opts.timeoutMs, opts.onProgress); | ||
| const admission = opts.admissionClass ?? AdmissionClass.Normal; | ||
| const reply = await this.send(handle, bytes, priority, admission, opts.timeoutMs, opts.onProgress); | ||
| return this.parseJson(reply); | ||
@@ -171,5 +205,5 @@ } | ||
| for (;;) { | ||
| const routeChannel = await this.cachedRouteChannel(moduleId, opts); | ||
| const routeHandle = await this.cachedRouteHandle(moduleId, opts); | ||
| try { | ||
| return (await this.managedRequest(routeChannel, body, opts)); | ||
| return (await this.managedRequest(routeHandle, body, opts)); | ||
| } | ||
@@ -186,3 +220,3 @@ catch (err) { | ||
| retriedUnknownChannel = true; | ||
| this.evictRouteChannel(routeChannel); | ||
| this.evictRouteHandle(routeHandle); | ||
| continue; | ||
@@ -210,14 +244,10 @@ } | ||
| } | ||
| /** | ||
| * Open a held-open event subscription on a route channel. Sends one Request the | ||
| * provider keeps open, delivering each interim StreamData frame to `onEvent`; the | ||
| * returned `closed` settles on the StreamEnd terminal (resolve) or an Error / route | ||
| * GOODBYE (reject). Events ride this held-open request's correlation id — they are | ||
| * never unsolicited, so they are not dropped. Call `unsubscribe()` to cancel. | ||
| */ | ||
| subscribe(routeChannel, body, onEvent, opts = {}) { | ||
| /** Open a held request on exactly one route generation. */ | ||
| subscribe(handle, body, onEvent, opts = {}) { | ||
| this.assertLiveHandle(handle); | ||
| const bytes = body instanceof Uint8Array ? body : this.encode(body); | ||
| const priority = opts.priority ?? Priority.Interactive; | ||
| const corr = this.nextCorr++; | ||
| const key = `${routeChannel}:${corr}`; | ||
| const admission = opts.admissionClass ?? AdmissionClass.Normal; | ||
| const corr = this.allocateCorr(); | ||
| const key = pendingKey(handle, corr); | ||
| const closed = new Promise((resolve, reject) => { | ||
@@ -228,6 +258,4 @@ if (this.closedErr) { | ||
| } | ||
| // No timeout: a subscription stays open indefinitely until StreamEnd, Error, | ||
| // route GOODBYE, or unsubscribe. | ||
| this.pending.set(key, { | ||
| channel: routeChannel, | ||
| handle, | ||
| resolve: () => resolve(), | ||
@@ -239,7 +267,7 @@ reject, | ||
| }); | ||
| const frame = buildFrame(FrameType.Request, buildFlags(false, priority, false), routeChannel, corr, bytes); | ||
| const frame = buildFrame(FrameType.Request, buildFlags(false, priority, false, admission), handle.channel, handle.epoch, corr, bytes); | ||
| this.sock.write(encodeFrame(frame), Date.now() + DEFAULT_REQUEST_TIMEOUT_MS).catch((err) => { | ||
| const p = this.pending.get(key); | ||
| if (p) | ||
| this.rejectPending(key, p, err instanceof Error ? err : new SubcError(String(err))); | ||
| const pending = this.pending.get(key); | ||
| if (pending) | ||
| this.rejectPending(key, pending, err instanceof Error ? err : new SubcError(String(err))); | ||
| }); | ||
@@ -252,69 +280,62 @@ }); | ||
| cancelled = true; | ||
| // Pure-header Cancel on the held-open (channel, corr): the provider aborts its | ||
| // handler and ends with StreamEnd, which settles `closed`. | ||
| const cancel = buildFrame(FrameType.Cancel, buildFlags(false, priority, false), routeChannel, corr, EMPTY_BODY); | ||
| this.sock.write(encodeFrame(cancel), Date.now() + DEFAULT_REQUEST_TIMEOUT_MS).catch(() => { | ||
| // Best-effort: if the socket is already gone, the read loop fails the | ||
| // pending waiter and `closed` rejects on its own. | ||
| }); | ||
| this.cancel(handle, corr, priority); | ||
| }; | ||
| return { unsubscribe, closed }; | ||
| } | ||
| /** | ||
| * Tear down ONE managed route (a route opened via `call()`), keyed by its | ||
| * (target, identity). Idempotent and never throws — callers over-call on | ||
| * session-end. The teardown: | ||
| * - flips a tombstone on the cached route and removes it from the cache, so an | ||
| * in-flight `openCachedRoute` for the same key will NOT install its channel | ||
| * (the generation guard: close beats a racing reopen), and a later `call()` | ||
| * opens a fresh route (this is NOT a permanent tombstone); | ||
| * - settles in-flight requests on the channel as RouteClosed (managed requests | ||
| * keep their at-most-once classification: outcome_unknown if already sent, | ||
| * not_sent otherwise; subscriptions always abort); | ||
| * - sends a best-effort route GOODBYE so subc releases the route and notifies | ||
| * the module to free per-session resources. | ||
| * `opts.drain` waits for in-flight UNARY requests to settle before tearing down. | ||
| */ | ||
| async closeRoute(target, identity, opts = {}) { | ||
| /** Send a pure-header cancellation for an in-flight request. */ | ||
| cancel(handle, corr, priority = Priority.Interactive) { | ||
| this.assertLiveHandle(handle); | ||
| const cancel = buildFrame(FrameType.Cancel, buildFlags(false, priority, false), handle.channel, handle.epoch, corr, EMPTY_BODY); | ||
| this.sock.write(encodeFrame(cancel), Date.now() + DEFAULT_REQUEST_TIMEOUT_MS).catch(() => undefined); | ||
| } | ||
| /** Poll status or liveness for exactly the supplied route generation. */ | ||
| async routePoll(handle, kind) { | ||
| this.assertLiveHandle(handle); | ||
| const body = this.encode({ | ||
| op: "route.poll", | ||
| route_channel: handle.channel, | ||
| route_epoch: handle.epoch, | ||
| kind, | ||
| }); | ||
| const reply = await this.controlRpc(body, (frame) => { | ||
| if (frame.header.ty !== FrameType.Response) | ||
| return true; | ||
| const parsed = this.parseJson(frame); | ||
| return parsed.route_channel === handle.channel && parsed.route_epoch === handle.epoch; | ||
| }); | ||
| return this.parseJson(reply); | ||
| } | ||
| /** Tear down exactly the supplied route generation. */ | ||
| async closeRoute(handle, opts = {}) { | ||
| this.assertLiveHandle(handle); | ||
| for (const [key, cached] of this.routes) { | ||
| if (cached.handle && sameRouteHandle(cached.handle, handle)) { | ||
| cached.closed = true; | ||
| cached.handle = null; | ||
| this.routes.delete(key); | ||
| } | ||
| } | ||
| if (opts.drain) | ||
| await this.drainUnaryOnHandle(handle); | ||
| this.failHandle(handle, new SubcError("route closed by closeRoute", "route_closed")); | ||
| if (this.liveRoutes.get(handle.channel) === handle) | ||
| this.liveRoutes.delete(handle.channel); | ||
| this.sendRouteGoodbye(handle); | ||
| } | ||
| /** Close a cached managed route by its route-open identity tuple. */ | ||
| async closeManagedRoute(target, identity, opts = {}) { | ||
| const key = routeCacheKey(target, identity, routeOpenConsumerIdentity(opts)); | ||
| const cached = this.routes.get(key); | ||
| if (!cached) | ||
| return; // never opened / already closed — idempotent no-op. | ||
| // Generation guard: an in-flight openCachedRoute holds this same object and | ||
| // re-checks `closed` before installing its channel, so flipping it here makes | ||
| // close win over a racing reopen. Removing the map entry lets a later call() | ||
| // create a fresh route for the key (not a permanent tombstone). | ||
| return; | ||
| cached.closed = true; | ||
| this.routes.delete(key); | ||
| const channel = cached.channel; | ||
| cached.channel = null; | ||
| // channel === null means the route was still opening (no channel installed yet); | ||
| // the racing open will see closed=true and GOODBYE whatever it opens, so there is | ||
| // nothing local to tear down here. | ||
| if (channel !== null) | ||
| await this.closeRouteChannel(channel, opts); | ||
| const handle = cached.handle; | ||
| cached.handle = null; | ||
| if (handle) | ||
| await this.closeRoute(handle, opts); | ||
| } | ||
| /** | ||
| * Tear down ONE route by its channel number — the primitive for callers that | ||
| * opened a route with `routeOpen` directly (e.g. a tool route carrying raw | ||
| * {name, arguments}) and hold the channel themselves. Idempotent, never throws. | ||
| * Settles in-flight requests on the channel as RouteClosed and sends a best-effort | ||
| * route GOODBYE. `opts.drain` awaits in-flight UNARY requests first; subscriptions | ||
| * are always aborted (a held-open stream cannot be drained). | ||
| */ | ||
| async closeRouteChannel(channel, opts = {}) { | ||
| if (channel === 0) | ||
| return; // channel 0 is the control plane, never a route. | ||
| if (opts.drain) { | ||
| // Wait only for in-flight UNARY requests on this channel; subscriptions are | ||
| // aborted below (a held-open stream has no natural completion to drain to). | ||
| await this.drainUnaryOnChannel(channel); | ||
| } | ||
| // Settle anything still in flight on the channel (all of it in abort mode; only | ||
| // subscriptions + late stragglers after a drain). Managed requests are classified | ||
| // at-most-once via their classifyFailure; raw requests/subscriptions get a plain | ||
| // RouteClosed error. | ||
| this.failChannel(channel, new SubcError("route closed by closeRoute", "route_closed")); | ||
| // Best-effort GOODBYE: releases the route on the daemon and notifies the module. | ||
| this.sendRouteGoodbye(channel); | ||
| /** Alias retained for callers that name the operation by protocol channel; it still requires a full handle. */ | ||
| async closeRouteChannel(handle, opts = {}) { | ||
| await this.closeRoute(handle, opts); | ||
| } | ||
@@ -326,12 +347,10 @@ close() { | ||
| } | ||
| /** Resolve once every in-flight UNARY request on the channel (snapshot at call | ||
| * time) has settled. Subscriptions are excluded — they are aborted, not drained. */ | ||
| drainUnaryOnChannel(channel) { | ||
| drainUnaryOnHandle(handle) { | ||
| const waiters = []; | ||
| for (const pending of this.pending.values()) { | ||
| if (pending.channel === channel && !pending.subscription) { | ||
| if (pending.handle === handle && !pending.subscription) { | ||
| waiters.push(new Promise((resolve) => { | ||
| const prev = pending.onSettle; | ||
| const previous = pending.onSettle; | ||
| pending.onSettle = () => { | ||
| prev?.(); | ||
| previous?.(); | ||
| resolve(); | ||
@@ -344,10 +363,16 @@ }; | ||
| } | ||
| /** Send a best-effort header-only route GOODBYE for `channel`. One-way: the daemon | ||
| * releases the route and relays a route-gone GOODBYE to the module; no ack. */ | ||
| sendRouteGoodbye(channel) { | ||
| if (this.closedErr) | ||
| return; // connection already gone — the route died with it. | ||
| const goodbye = buildFrame(FrameType.Goodbye, buildFlags(false, Priority.Interactive, false), channel, 0n, EMPTY_BODY); | ||
| this.sock.write(encodeFrame(goodbye), Date.now() + DEFAULT_REQUEST_TIMEOUT_MS).catch(() => { | ||
| // Best-effort: if the socket is already gone, the route is torn down anyway. | ||
| sendRouteGoodbye(handle, closeOnQueueFailure = false) { | ||
| this.assertLiveConnection(handle); | ||
| if (this.closedErr) { | ||
| if (closeOnQueueFailure) | ||
| this.closeConnectionAfterCleanupFailure(); | ||
| return; | ||
| } | ||
| const goodbye = buildFrame(FrameType.Goodbye, buildFlags(false, Priority.Interactive, false), handle.channel, handle.epoch, 0n, EMPTY_BODY); | ||
| const write = this.sock.writeTracked(encodeFrame(goodbye), Date.now() + DEFAULT_REQUEST_TIMEOUT_MS); | ||
| if (!write.queued && closeOnQueueFailure) | ||
| this.closeConnectionAfterCleanupFailure(); | ||
| write.completed.catch(() => { | ||
| if (closeOnQueueFailure && !write.queued) | ||
| this.closeConnectionAfterCleanupFailure(); | ||
| }); | ||
@@ -369,16 +394,25 @@ } | ||
| } | ||
| async controlRpc(body) { | ||
| // Match the canonical probe: control requests go out Interactive on channel 0. | ||
| return this.send(0, body, Priority.Interactive, undefined, undefined); | ||
| async controlRpc(body, acceptFrame, onLateResponse) { | ||
| return this.send(null, body, Priority.Interactive, AdmissionClass.Normal, undefined, undefined, acceptFrame, onLateResponse); | ||
| } | ||
| send(channel, body, priority, timeoutMs, onProgress) { | ||
| send(handle, body, priority, admission, timeoutMs, onProgress, acceptFrame, onLateResponse) { | ||
| if (handle) | ||
| this.assertLiveHandle(handle); | ||
| if (this.closedErr) | ||
| return Promise.reject(this.closedErr); | ||
| const corr = this.nextCorr++; | ||
| const key = `${channel}:${corr}`; | ||
| const frame = buildFrame(FrameType.Request, buildFlags(false, priority, false), channel, corr, body); | ||
| let corr; | ||
| try { | ||
| corr = this.allocateCorr(); | ||
| } | ||
| catch (error) { | ||
| return Promise.reject(error); | ||
| } | ||
| const key = pendingKey(handle, corr); | ||
| const channel = handle?.channel ?? 0; | ||
| const epoch = handle?.epoch ?? 0; | ||
| const frame = buildFrame(FrameType.Request, buildFlags(false, priority, false, admission), channel, epoch, corr, body); | ||
| return new Promise((resolve, reject) => { | ||
| const ms = timeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS; | ||
| const pending = { | ||
| channel, | ||
| handle, | ||
| resolve, | ||
@@ -388,11 +422,11 @@ reject, | ||
| timer: null, | ||
| acceptFrame, | ||
| onLateResponse, | ||
| }; | ||
| pending.timer = setTimeout(() => { | ||
| this.arbitrateTimeout(key, pending, channel, corr, ms); | ||
| }, ms); | ||
| pending.timer = setTimeout(() => this.arbitrateTimeout(key, pending, channel, corr, ms), ms); | ||
| this.pending.set(key, pending); | ||
| this.sock.write(encodeFrame(frame), Date.now() + ms).catch((err) => { | ||
| const p = this.pending.get(key); | ||
| if (p) | ||
| this.rejectPending(key, p, err instanceof Error ? err : new SubcError(String(err))); | ||
| this.sock.write(encodeFrame(frame), Date.now() + ms).catch((error) => { | ||
| const current = this.pending.get(key); | ||
| if (current) | ||
| this.rejectPending(key, current, error instanceof Error ? error : new SubcError(String(error))); | ||
| }); | ||
@@ -413,2 +447,4 @@ }); | ||
| const settleAsTimeout = () => { | ||
| if (pending.onLateResponse) | ||
| this.lateResponses.set(key, pending.onLateResponse); | ||
| this.rejectPending(key, pending, new SubcError(this.timeoutMessage(channel, corr, ms), REQUEST_DEADLINE_MARKER)); | ||
@@ -434,40 +470,43 @@ }; | ||
| } | ||
| async managedRequest(routeChannel, body, opts) { | ||
| async managedRequest(handle, body, opts) { | ||
| const bytes = body instanceof Uint8Array ? body : this.encode(body); | ||
| const priority = opts.priority ?? Priority.Interactive; | ||
| const admission = opts.admissionClass ?? AdmissionClass.Normal; | ||
| try { | ||
| const reply = await this.sendManaged(routeChannel, bytes, priority, opts.timeoutMs, opts.onProgress); | ||
| const reply = await this.sendManaged(handle, bytes, priority, admission, opts.timeoutMs, opts.onProgress); | ||
| return this.parseJson(reply); | ||
| } | ||
| catch (err) { | ||
| if (err instanceof SubcCallError) | ||
| throw err; | ||
| throw this.terminalCallError("managed call failed", err); | ||
| catch (error) { | ||
| if (error instanceof SubcCallError) | ||
| throw error; | ||
| throw this.terminalCallError("managed call failed", error); | ||
| } | ||
| } | ||
| sendManaged(channel, body, priority, timeoutMs, onProgress) { | ||
| sendManaged(handle, body, priority, admission, timeoutMs, onProgress) { | ||
| try { | ||
| this.assertLiveHandle(handle); | ||
| } | ||
| catch (error) { | ||
| return Promise.reject(this.notSentCallError("request used a stale route handle", error)); | ||
| } | ||
| if (this.closedErr) { | ||
| return Promise.reject(this.notSentCallError("request was not sent because the subc connection was already closed", this.closedErr)); | ||
| } | ||
| const corr = this.nextCorr++; | ||
| const key = `${channel}:${corr}`; | ||
| const frame = buildFrame(FrameType.Request, buildFlags(false, priority, false), channel, corr, body); | ||
| let corr; | ||
| try { | ||
| corr = this.allocateCorr(); | ||
| } | ||
| catch (error) { | ||
| return Promise.reject(this.notSentCallError("request correlation allocator was exhausted", error)); | ||
| } | ||
| const key = pendingKey(handle, corr); | ||
| const frame = buildFrame(FrameType.Request, buildFlags(false, priority, false, admission), handle.channel, handle.epoch, corr, body); | ||
| let handedToSocket = false; | ||
| const classifyFailure = (err) => { | ||
| // This is the load-bearing asymmetry: only the pre-write paths are NotSent. | ||
| // As soon as writeTracked reports that bytes were queued to Node's socket, | ||
| // those bytes may already be in the OS buffer or at the daemon. Any later | ||
| // close, write callback error, route GOODBYE, or timeout before a response is | ||
| // therefore OutcomeUnknown to avoid an unsafe double-mutation retry. | ||
| if (!handedToSocket) { | ||
| return this.notSentCallError("request bytes were not queued to the subc socket", err); | ||
| const classifyFailure = (error) => { | ||
| if (!handedToSocket) | ||
| return this.notSentCallError("request bytes were not queued to the subc socket", error); | ||
| if (error instanceof SubcError && error.code === REQUEST_DEADLINE_MARKER) { | ||
| return new SubcCallError("outcome_unknown", `managed call deadline exceeded after request bytes were queued to the local socket; no terminal response was observed; outcome unknown${causeMessage(error)}`, DEADLINE_NO_DROP_CODE, error); | ||
| } | ||
| // A request-deadline timeout (arbitration expired without observing a drop) | ||
| // is refined from a real connection drop: the socket was NOT seen to fail, so | ||
| // the caller can skip a was-it-even-sent recovery path. Still outcome_unknown | ||
| // — queued-to-local-socket is not proof the daemon received or ran it. | ||
| if (err instanceof SubcError && err.code === REQUEST_DEADLINE_MARKER) { | ||
| return new SubcCallError("outcome_unknown", `managed call deadline exceeded after request bytes were queued to the local socket; no terminal response was observed; outcome unknown${causeMessage(err)}`, DEADLINE_NO_DROP_CODE, err); | ||
| } | ||
| return this.outcomeUnknownCallError("connection dropped before the managed call returned a response", err); | ||
| return this.outcomeUnknownCallError("connection dropped before the managed call returned a response", error); | ||
| }; | ||
@@ -477,3 +516,3 @@ return new Promise((resolve, reject) => { | ||
| const pending = { | ||
| channel, | ||
| handle, | ||
| resolve, | ||
@@ -485,16 +524,14 @@ reject, | ||
| }; | ||
| pending.timer = setTimeout(() => { | ||
| this.arbitrateTimeout(key, pending, channel, corr, ms); | ||
| }, ms); | ||
| pending.timer = setTimeout(() => this.arbitrateTimeout(key, pending, handle.channel, corr, ms), ms); | ||
| this.pending.set(key, pending); | ||
| const write = this.sock.writeTracked(encodeFrame(frame), Date.now() + ms); | ||
| handedToSocket = write.queued; | ||
| write.completed.catch((err) => { | ||
| const p = this.pending.get(key); | ||
| if (p) | ||
| this.rejectPending(key, p, err instanceof Error ? err : new SubcError(String(err))); | ||
| write.completed.catch((error) => { | ||
| const current = this.pending.get(key); | ||
| if (current) | ||
| this.rejectPending(key, current, error instanceof Error ? error : new SubcError(String(error))); | ||
| }); | ||
| }); | ||
| } | ||
| async cachedRouteChannel(moduleId, opts) { | ||
| async cachedRouteHandle(moduleId, opts) { | ||
| const identity = opts.identity ?? this.opts.identity; | ||
@@ -515,4 +552,3 @@ if (!identity) { | ||
| consumerIdentity, | ||
| channel: null, | ||
| generation: 0, | ||
| handle: null, | ||
| opening: null, | ||
@@ -522,5 +558,4 @@ }; | ||
| } | ||
| if (cached.channel !== null && cached.generation === this.generation && !this.closedErr) { | ||
| return cached.channel; | ||
| } | ||
| if (cached.handle && this.isLiveHandle(cached.handle)) | ||
| return cached.handle; | ||
| if (!cached.opening) { | ||
@@ -543,44 +578,32 @@ cached.opening = this.openCachedRoute(cached).finally(() => { | ||
| } | ||
| catch (err) { | ||
| throw this.notSentRecoveryError("route.open could not run because reconnect failed", err); | ||
| catch (error) { | ||
| throw this.notSentRecoveryError("route.open could not run because reconnect failed", error); | ||
| } | ||
| if (cached.channel !== null && cached.generation === this.generation && !this.closedErr) { | ||
| return cached.channel; | ||
| } | ||
| if (cached.handle && this.isLiveHandle(cached.handle)) | ||
| return cached.handle; | ||
| try { | ||
| const channel = await this.routeOpen(cached.target, cached.identity, { | ||
| const handle = await this.routeOpen(cached.target, cached.identity, { | ||
| consumerIdentity: cached.consumerIdentity ?? null, | ||
| }); | ||
| // Generation guard: a closeRoute may have flipped the tombstone WHILE this | ||
| // route.open was in flight. If so, close wins — do NOT install the channel | ||
| // into the (already-removed) cache entry; GOODBYE the channel we just opened | ||
| // so the daemon/module don't leak it, and fail as RouteClosed. | ||
| if (cached.closed) { | ||
| this.sendRouteGoodbye(channel); | ||
| this.liveRoutes.delete(handle.channel); | ||
| this.sendRouteGoodbye(handle); | ||
| throw this.routeClosedDuringOpen(); | ||
| } | ||
| cached.channel = channel; | ||
| cached.generation = this.generation; | ||
| return channel; | ||
| cached.handle = handle; | ||
| return handle; | ||
| } | ||
| catch (err) { | ||
| if (err instanceof SubcCallError && err.code === "route_closed") | ||
| throw err; | ||
| if (!this.closeStarted && isConsumerReconnectTransient(err)) { | ||
| catch (error) { | ||
| if (error instanceof SubcCallError && error.code === "route_closed") | ||
| throw error; | ||
| if (!this.closeStarted && isConsumerReconnectTransient(error)) { | ||
| try { | ||
| await this.reconnectAfterDrop(err); | ||
| await this.reconnectAfterDrop(error); | ||
| } | ||
| catch (reconnectErr) { | ||
| throw this.notSentRecoveryError("route.open was not sent and reconnect failed", reconnectErr); | ||
| catch (reconnectError) { | ||
| throw this.notSentRecoveryError("route.open was not sent and reconnect failed", reconnectError); | ||
| } | ||
| continue; | ||
| } | ||
| // A daemon-rejected route.open with a RETRYABLE code (target booting / | ||
| // reloading / momentarily absent) is retried IN-PLACE against the same live | ||
| // connection — never a socket reconnect, which would needlessly disrupt this | ||
| // connection's other routes — until the route-retry deadline. Past the | ||
| // deadline it surfaces as not_sent: provably pre-send (no data frame ever | ||
| // left the client) AND still transient, so the caller's own retry policy may | ||
| // safely re-attempt later. Reason and set kept in parity with subc-client-rs. | ||
| if (!this.closeStarted && err instanceof SubcError && isRetryableRouteOpenCode(err.code)) { | ||
| if (!this.closeStarted && error instanceof SubcError && isRetryableRouteOpenCode(error.code)) { | ||
| routeRetryAttempt += 1; | ||
@@ -592,9 +615,5 @@ if (routeRetryAttempt < this.opts.reconnectBackoff.maxAttempts && Date.now() < routeRetryDeadline) { | ||
| } | ||
| throw this.notSentCallError(`route.open failed for module ${cached.moduleId}: ${err.code} (retry budget exhausted)`, err); | ||
| throw this.notSentCallError(`route.open failed for module ${cached.moduleId}: ${error.code} (retry budget exhausted)`, error); | ||
| } | ||
| // A permanent route.open rejection (bad_consumer_identity, config_divergence, | ||
| // unknown_target, ...) is pre-send but would never succeed on retry, so it | ||
| // stays terminal — a not_sent class here would invite a retry storm against a | ||
| // request the daemon will always reject. | ||
| throw this.terminalCallError(`route.open failed for module ${cached.moduleId}`, err); | ||
| throw this.terminalCallError(`route.open failed for module ${cached.moduleId}`, error); | ||
| } | ||
@@ -674,29 +693,23 @@ } | ||
| this.generation += 1; | ||
| this.connectionToken = newConnectionToken(); | ||
| this.liveRoutes.clear(); | ||
| this.lateResponses.clear(); | ||
| this.nextCorr = 1n; | ||
| void this.readLoop(opened.sock, this.generation); | ||
| } | ||
| async reopenCachedRoutes() { | ||
| for (const cached of this.routes.values()) | ||
| cached.handle = null; | ||
| for (const cached of this.routes.values()) { | ||
| cached.channel = null; | ||
| cached.generation = 0; | ||
| } | ||
| for (const cached of this.routes.values()) { | ||
| if (cached.closed) | ||
| continue; // closed concurrently with reconnect — don't reopen. | ||
| // Thread the route's consumer identity through the reopen, exactly as the | ||
| // lazy per-call path (openCachedRoute) does. Dropping it here would make a | ||
| // route reopened after a reconnect send route.open with no consumer_identity, | ||
| // so the daemon would re-stamp it with a different (weaker) principal than the | ||
| // one it was originally bound under — a silent post-reconnect trust downgrade. | ||
| const channel = await this.routeOpen(cached.target, cached.identity, { | ||
| continue; | ||
| const handle = await this.routeOpen(cached.target, cached.identity, { | ||
| consumerIdentity: cached.consumerIdentity ?? null, | ||
| }); | ||
| // A closeRoute may have raced this reopen (flipping the tombstone during the | ||
| // route.open await). If so, GOODBYE the channel instead of installing it, so the | ||
| // closed route isn't silently re-established on the new connection. | ||
| if (cached.closed) { | ||
| this.sendRouteGoodbye(channel); | ||
| this.liveRoutes.delete(handle.channel); | ||
| this.sendRouteGoodbye(handle); | ||
| continue; | ||
| } | ||
| cached.channel = channel; | ||
| cached.generation = this.generation; | ||
| cached.handle = handle; | ||
| } | ||
@@ -719,21 +732,9 @@ } | ||
| for (;;) { | ||
| // Header read waits indefinitely — idle time between frames is normal, and | ||
| // the reader is NOT "active" while parked here (a racing timeout must not | ||
| // grant grace just because the connection is idle between frames). | ||
| const headerBytes = await sock.readExact(HEADER_LEN, Number.POSITIVE_INFINITY); | ||
| // A frame is now arriving. Mark the reader active THROUGH dispatch so a | ||
| // timeout that fires mid-arrival grants the reply its bounded grace window | ||
| // instead of settling as a spurious timeout. | ||
| this.readerActive = true; | ||
| this.readerActive = false; | ||
| const frame = await sock.readFrame(Number.POSITIVE_INFINITY, Date.now() + BODY_READ_TIMEOUT_MS, () => { | ||
| this.readerActive = true; | ||
| }); | ||
| try { | ||
| const header = decodeHeader(headerBytes); | ||
| const body = header.len === 0 | ||
| ? new Uint8Array(0) | ||
| : await sock.readExact(header.len, Date.now() + BODY_READ_TIMEOUT_MS); | ||
| // Drop a frame read off a socket this client has already replaced | ||
| // (reconnect): its pendings were settled by fail(), and dispatching it | ||
| // against the current pending map could match a re-used (channel, corr). | ||
| if (this.sock === sock && this.generation === generation) { | ||
| this.dispatch({ header, body }); | ||
| } | ||
| if (this.sock === sock && this.generation === generation) | ||
| this.dispatch(frame); | ||
| } | ||
@@ -745,5 +746,5 @@ finally { | ||
| } | ||
| catch (err) { | ||
| catch (error) { | ||
| if (this.sock === sock && this.generation === generation) { | ||
| this.fail(err instanceof Error ? err : new SubcError(String(err))); | ||
| this.fail(error instanceof Error ? error : new SubcError(String(error))); | ||
| } | ||
@@ -753,5 +754,15 @@ } | ||
| dispatch(frame) { | ||
| const key = `${frame.header.channel}:${frame.header.corr}`; | ||
| let handle = null; | ||
| if (frame.header.channel !== 0) { | ||
| handle = this.liveRoutes.get(frame.header.channel) ?? null; | ||
| if (!handle || handle.epoch !== frame.header.epoch) { | ||
| this.ingressEpochDropCount += 1; | ||
| return; | ||
| } | ||
| } | ||
| const key = pendingKey(handle, frame.header.corr); | ||
| const pending = this.pending.get(key); | ||
| if (pending) { | ||
| if (pending.acceptFrame && !pending.acceptFrame(frame)) | ||
| return; | ||
| switch (frame.header.ty) { | ||
@@ -773,24 +784,20 @@ case FrameType.Push: | ||
| } | ||
| if (frame.header.ty === FrameType.Goodbye) { | ||
| this.failChannel(frame.header.channel, new SubcError("route closed by subc (GOODBYE)")); | ||
| // The route is gone daemon-side (module restart, drain, or provider close). | ||
| // Evict the cached bind so the NEXT managed call re-opens instead of | ||
| // resending into the dead channel and dying on a terminal unknown_channel. | ||
| this.evictRouteChannel(frame.header.channel); | ||
| const late = this.lateResponses.get(key); | ||
| if (late && (frame.header.ty === FrameType.Response || frame.header.ty === FrameType.Error)) { | ||
| this.lateResponses.delete(key); | ||
| late(frame); | ||
| return; | ||
| } | ||
| // A terminal frame (Response/Error/StreamEnd) with no waiter is almost always | ||
| // a reply that arrived AFTER its request already settled — the fingerprint of a | ||
| // premature timeout under event-loop starvation (the reply raced the deadline | ||
| // and lost). Metadata-only debug log (never the body) so every future | ||
| // occurrence is a one-line diagnosis instead of an invisible drop. Enable with | ||
| // NODE_DEBUG=subc-client. | ||
| if (frame.header.ty === FrameType.Goodbye && handle) { | ||
| this.failHandle(handle, new SubcError("route closed by subc (GOODBYE)")); | ||
| if (this.liveRoutes.get(handle.channel) === handle) | ||
| this.liveRoutes.delete(handle.channel); | ||
| this.evictRouteHandle(handle); | ||
| return; | ||
| } | ||
| if (frame.header.ty === FrameType.Response || | ||
| frame.header.ty === FrameType.Error || | ||
| frame.header.ty === FrameType.StreamEnd) { | ||
| debug("dropped terminal frame with no waiter: type=%d channel=%d corr=%s port=%s", frame.header.ty, frame.header.channel, frame.header.corr, this.sock.localPort() ?? "?"); | ||
| return; | ||
| debug("dropped terminal frame with no waiter: type=%d channel=%d epoch=%d corr=%s port=%s", frame.header.ty, frame.header.channel, frame.header.epoch, frame.header.corr, this.sock.localPort() ?? "?"); | ||
| } | ||
| // Unmatched Push or stray frame: no registered waiter. Drop it — v1 has no | ||
| // unsolicited-push consumers. | ||
| } | ||
@@ -828,20 +835,12 @@ /** | ||
| } | ||
| /** | ||
| * Drop a dead channel from the managed-route cache so the next call re-opens. | ||
| * Only clears entries still pointing at THIS channel in the CURRENT socket | ||
| * generation; a route already re-opened (new channel) or re-created after a | ||
| * reconnect (new generation) is left alone. | ||
| */ | ||
| evictRouteChannel(channel) { | ||
| evictRouteHandle(handle) { | ||
| for (const cached of this.routes.values()) { | ||
| if (cached.channel === channel && cached.generation === this.generation) { | ||
| cached.channel = null; | ||
| } | ||
| if (cached.handle && sameRouteHandle(cached.handle, handle)) | ||
| cached.handle = null; | ||
| } | ||
| } | ||
| failChannel(channel, err) { | ||
| failHandle(handle, error) { | ||
| for (const [key, pending] of this.pending) { | ||
| if (pending.channel === channel) { | ||
| this.rejectPending(key, pending, err); | ||
| } | ||
| if (pending.handle && sameRouteHandle(pending.handle, handle)) | ||
| this.rejectPending(key, pending, error); | ||
| } | ||
@@ -874,2 +873,41 @@ } | ||
| } | ||
| /** Number of nonzero-channel ingress frames dropped by endpoint epoch validation. */ | ||
| get droppedIngressFrames() { | ||
| return this.ingressEpochDropCount; | ||
| } | ||
| installRoute(channel, epoch) { | ||
| const handle = createRouteHandle(channel, epoch, this.connectionToken); | ||
| this.liveRoutes.set(channel, handle); | ||
| return handle; | ||
| } | ||
| isLiveHandle(handle) { | ||
| return belongsToConnection(handle, this.connectionToken) && this.liveRoutes.get(handle.channel) === handle; | ||
| } | ||
| assertLiveConnection(handle) { | ||
| if (!belongsToConnection(handle, this.connectionToken)) | ||
| throw new StaleRouteHandleError(handle); | ||
| } | ||
| assertLiveHandle(handle) { | ||
| if (!this.isLiveHandle(handle)) | ||
| throw new StaleRouteHandleError(handle); | ||
| } | ||
| allocateCorr() { | ||
| const maximum = 0xffffffffffffffffn; | ||
| if (this.nextCorr > maximum) { | ||
| const error = new SubcError("channel-0 correlation id allocator exhausted", "corr_exhausted"); | ||
| this.fail(error); | ||
| this.sock.close(); | ||
| this.scheduleReconnectAfterDrop(error); | ||
| throw error; | ||
| } | ||
| const corr = this.nextCorr; | ||
| this.nextCorr += 1n; | ||
| return corr; | ||
| } | ||
| closeConnectionAfterCleanupFailure() { | ||
| const error = new SubcError("late route cleanup could not be queued", "late_route_cleanup_failed"); | ||
| this.fail(error); | ||
| this.sock.close(); | ||
| this.scheduleReconnectAfterDrop(error); | ||
| } | ||
| encode(value) { | ||
@@ -971,2 +1009,5 @@ return new Uint8Array(Buffer.from(JSON.stringify(value), "utf8")); | ||
| } | ||
| function pendingKey(handle, corr) { | ||
| return handle ? `${handle.channel}:${handle.epoch}:${corr}` : `0:0:${corr}`; | ||
| } | ||
| //# sourceMappingURL=client.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"} |
+24
-17
@@ -1,3 +0,3 @@ | ||
| export declare const PROTOCOL_VERSION = 1; | ||
| export declare const HEADER_LEN = 17; | ||
| export declare const PROTOCOL_VERSION = 2; | ||
| export declare const HEADER_LEN = 21; | ||
| export declare const FROZEN_PREFIX_LEN = 5; | ||
@@ -28,4 +28,11 @@ export declare const MAX_FRAME_BODY_LEN: number; | ||
| } | ||
| /** Build the flags byte from typed components (mirrors Flags::new). */ | ||
| export declare function buildFlags(binary: boolean, priority: Priority, last: boolean): number; | ||
| /** Admission behavior carried in flags bits 4-5. */ | ||
| export declare enum AdmissionClass { | ||
| Normal = 0, | ||
| Expedite = 1, | ||
| Sheddable = 2 | ||
| } | ||
| /** Build flags from typed components. Admission defaults to NORMAL. */ | ||
| export declare function buildFlags(binary: boolean, priority: Priority, last: boolean, admissionClass?: AdmissionClass): number; | ||
| export declare function admissionClass(flags: number): AdmissionClass; | ||
| export interface EnvelopeHeader { | ||
@@ -37,2 +44,3 @@ len: number; | ||
| channel: number; | ||
| epoch: number; | ||
| corr: bigint; | ||
@@ -44,19 +52,18 @@ } | ||
| } | ||
| /** Serialize a header to its fixed 17-byte little-endian form. */ | ||
| export declare function encodeHeader(h: EnvelopeHeader): Uint8Array; | ||
| /** Serialize a header to its fixed 21-byte little-endian form. */ | ||
| export declare function encodeHeader(header: EnvelopeHeader): Uint8Array; | ||
| export type DecodeErrorCode = "too_short_for_prefix" | "unsupported_version" | "too_short_for_header" | "unknown_frame_type" | "reserved_flag_bits" | "reserved_priority_bits" | "reserved_admission_class" | "sheddable_illegal_frame_type" | "nonzero_epoch_on_control_channel" | "pure_header_frame_with_body" | "frame_body_too_large" | "frame_length_mismatch"; | ||
| /** Typed envelope decode failure mirroring the Rust wire taxonomy. */ | ||
| export declare class DecodeError extends Error { | ||
| readonly code: DecodeErrorCode; | ||
| constructor(message: string, code: DecodeErrorCode); | ||
| } | ||
| /** | ||
| * Decode a header from the front of `bytes`, following the frozen-prefix | ||
| * discipline: need 5 bytes for len+ver, dispatch full header length on ver, | ||
| * then validate. Mirrors decode_header — never throws on a structurally short | ||
| * buffer beyond the typed DecodeError. | ||
| */ | ||
| /** Decode and validate a header from the front of `bytes`. */ | ||
| export declare function decodeHeader(bytes: Uint8Array): EnvelopeHeader; | ||
| /** Build a full current-version frame, enforcing the body-length cap and the pure-header rule. */ | ||
| export declare function buildFrame(ty: FrameType, flags: number, channel: number, corr: bigint, body: Uint8Array): Frame; | ||
| /** Build a full frame while preserving a peer-negotiated envelope version. */ | ||
| export declare function buildFrameWithVersion(ver: number, ty: FrameType, flags: number, channel: number, corr: bigint, body: Uint8Array): Frame; | ||
| /** Encode a frame to wire bytes: 17-byte header followed by `len` body bytes. */ | ||
| /** Build a current-version frame and validate its complete header. */ | ||
| export declare function buildFrame(ty: FrameType, flags: number, channel: number, epoch: number, corr: bigint, body: Uint8Array): Frame; | ||
| /** Build a frame while preserving the peer's exact supported version. */ | ||
| export declare function buildFrameWithVersion(ver: number, ty: FrameType, flags: number, channel: number, epoch: number, corr: bigint, body: Uint8Array): Frame; | ||
| /** Encode a frame to wire bytes: header followed by exactly `len` body bytes. */ | ||
| export declare function encodeFrame(frame: Frame): Uint8Array; | ||
| //# sourceMappingURL=envelope.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"envelope.d.ts","sourceRoot":"","sources":["../src/envelope.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAClC,eAAO,MAAM,UAAU,KAAK,CAAC;AAC7B,eAAO,MAAM,iBAAiB,IAAI,CAAC;AACnC,eAAO,MAAM,kBAAkB,QAAmB,CAAC;AAEnD,+BAA+B;AAC/B,oBAAY,SAAS;IACnB,OAAO,IAAI;IACX,QAAQ,IAAI;IACZ,IAAI,IAAI;IACR,UAAU,IAAI;IACd,SAAS,IAAI;IACb,KAAK,IAAI;IACT,MAAM,IAAI;IACV,IAAI,IAAI;IACR,IAAI,IAAI;IACR,KAAK,IAAI;IACT,QAAQ,KAAK;IACb,OAAO,KAAK;CACb;AAID,sEAAsE;AACtE,wBAAgB,YAAY,CAAC,EAAE,EAAE,SAAS,GAAG,OAAO,CAOnD;AAED,qDAAqD;AACrD,oBAAY,QAAQ;IAClB,OAAO,IAAI;IACX,WAAW,IAAI;IACf,UAAU,IAAI;CACf;AAQD,uEAAuE;AACvE,wBAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,CAMrF;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,SAAS,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,KAAK;IACpB,MAAM,EAAE,cAAc,CAAC;IACvB,IAAI,EAAE,UAAU,CAAC;CAClB;AAED,kEAAkE;AAClE,wBAAgB,YAAY,CAAC,CAAC,EAAE,cAAc,GAAG,UAAU,CAU1D;AAED,qBAAa,WAAY,SAAQ,KAAK;CAAG;AAEzC;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,cAAc,CA+B9D;AAED,kGAAkG;AAClG,wBAAgB,UAAU,CACxB,EAAE,EAAE,SAAS,EACb,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,UAAU,GACf,KAAK,CAEP;AAED,8EAA8E;AAC9E,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,MAAM,EACX,EAAE,EAAE,SAAS,EACb,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,UAAU,GACf,KAAK,CAWP;AAED,iFAAiF;AACjF,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,UAAU,CAMpD"} | ||
| {"version":3,"file":"envelope.d.ts","sourceRoot":"","sources":["../src/envelope.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAClC,eAAO,MAAM,UAAU,KAAK,CAAC;AAC7B,eAAO,MAAM,iBAAiB,IAAI,CAAC;AACnC,eAAO,MAAM,kBAAkB,QAAmB,CAAC;AAEnD,+BAA+B;AAC/B,oBAAY,SAAS;IACnB,OAAO,IAAI;IACX,QAAQ,IAAI;IACZ,IAAI,IAAI;IACR,UAAU,IAAI;IACd,SAAS,IAAI;IACb,KAAK,IAAI;IACT,MAAM,IAAI;IACV,IAAI,IAAI;IACR,IAAI,IAAI;IACR,KAAK,IAAI;IACT,QAAQ,KAAK;IACb,OAAO,KAAK;CACb;AAID,sEAAsE;AACtE,wBAAgB,YAAY,CAAC,EAAE,EAAE,SAAS,GAAG,OAAO,CAEnD;AAED,qDAAqD;AACrD,oBAAY,QAAQ;IAClB,OAAO,IAAI;IACX,WAAW,IAAI;IACf,UAAU,IAAI;CACf;AAED,oDAAoD;AACpD,oBAAY,cAAc;IACxB,MAAM,IAAI;IACV,QAAQ,IAAI;IACZ,SAAS,IAAI;CACd;AAUD,uEAAuE;AACvE,wBAAgB,UAAU,CACxB,MAAM,EAAE,OAAO,EACf,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,OAAO,EACb,cAAc,GAAE,cAAsC,GACrD,MAAM,CAOR;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,CAE5D;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,SAAS,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,KAAK;IACpB,MAAM,EAAE,cAAc,CAAC;IACvB,IAAI,EAAE,UAAU,CAAC;CAClB;AAED,kEAAkE;AAClE,wBAAgB,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,UAAU,CAW/D;AAED,MAAM,MAAM,eAAe,GACvB,sBAAsB,GACtB,qBAAqB,GACrB,sBAAsB,GACtB,oBAAoB,GACpB,oBAAoB,GACpB,wBAAwB,GACxB,0BAA0B,GAC1B,8BAA8B,GAC9B,kCAAkC,GAClC,6BAA6B,GAC7B,sBAAsB,GACtB,uBAAuB,CAAC;AAE5B,sEAAsE;AACtE,qBAAa,WAAY,SAAQ,KAAK;IACP,QAAQ,CAAC,IAAI,EAAE,eAAe;gBAA/C,OAAO,EAAE,MAAM,EAAW,IAAI,EAAE,eAAe;CAI5D;AAED,8DAA8D;AAC9D,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,cAAc,CA2D9D;AAED,sEAAsE;AACtE,wBAAgB,UAAU,CACxB,EAAE,EAAE,SAAS,EACb,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,UAAU,GACf,KAAK,CAEP;AAED,yEAAyE;AACzE,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,MAAM,EACX,EAAE,EAAE,SAAS,EACb,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,UAAU,GACf,KAAK,CAOP;AAED,iFAAiF;AACjF,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,UAAU,CAYpD"} |
+91
-72
@@ -1,7 +0,6 @@ | ||
| // Byte-for-byte port of subc-protocol's 17-byte envelope header. | ||
| // Source of truth: crates/subc-protocol/src/lib.rs. Keep field offsets, the | ||
| // little-endian encoding, and the frame-type/flag numbering in lock-step with | ||
| // the Rust; a one-byte drift here desynchronizes every frame on the wire. | ||
| export const PROTOCOL_VERSION = 1; | ||
| export const HEADER_LEN = 17; | ||
| // Byte-for-byte port of subc-protocol's fixed envelope header. | ||
| // Source of truth: crates/subc-protocol/src/lib.rs. Keep field offsets, little- | ||
| // endian encoding, and frame/flag numbering in lock-step with Rust. | ||
| export const PROTOCOL_VERSION = 2; | ||
| export const HEADER_LEN = 21; | ||
| export const FROZEN_PREFIX_LEN = 5; | ||
@@ -28,6 +27,3 @@ export const MAX_FRAME_BODY_LEN = 64 * 1024 * 1024; | ||
| export function isPureHeader(ty) { | ||
| return (ty === FrameType.Cancel || | ||
| ty === FrameType.Ping || | ||
| ty === FrameType.Pong || | ||
| ty === FrameType.Goodbye); | ||
| return ty === FrameType.Cancel || ty === FrameType.Ping || ty === FrameType.Pong || ty === FrameType.Goodbye; | ||
| } | ||
@@ -41,94 +37,117 @@ /** Scheduling priority carried in flags bits 1-2. */ | ||
| })(Priority || (Priority = {})); | ||
| const FLAG_BINARY = 0b0000_0001; // bit 0 | ||
| const FLAG_PRIORITY_MASK = 0b0000_0110; // bits 1-2 | ||
| /** Admission behavior carried in flags bits 4-5. */ | ||
| export var AdmissionClass; | ||
| (function (AdmissionClass) { | ||
| AdmissionClass[AdmissionClass["Normal"] = 0] = "Normal"; | ||
| AdmissionClass[AdmissionClass["Expedite"] = 1] = "Expedite"; | ||
| AdmissionClass[AdmissionClass["Sheddable"] = 2] = "Sheddable"; | ||
| })(AdmissionClass || (AdmissionClass = {})); | ||
| const FLAG_BINARY = 0b0000_0001; | ||
| const FLAG_PRIORITY_MASK = 0b0000_0110; | ||
| const FLAG_PRIORITY_SHIFT = 1; | ||
| const FLAG_LAST = 0b0000_1000; // bit 3 | ||
| const FLAG_RESERVED_MASK = 0b1111_0000; // bits 4-7 must be zero | ||
| /** Build the flags byte from typed components (mirrors Flags::new). */ | ||
| export function buildFlags(binary, priority, last) { | ||
| let b = 0; | ||
| const FLAG_LAST = 0b0000_1000; | ||
| const FLAG_ADMISSION_MASK = 0b0011_0000; | ||
| const FLAG_ADMISSION_SHIFT = 4; | ||
| const FLAG_RESERVED_MASK = 0b1100_0000; | ||
| /** Build flags from typed components. Admission defaults to NORMAL. */ | ||
| export function buildFlags(binary, priority, last, admissionClass = AdmissionClass.Normal) { | ||
| let flags = 0; | ||
| if (binary) | ||
| b |= FLAG_BINARY; | ||
| b |= priority << FLAG_PRIORITY_SHIFT; | ||
| flags |= FLAG_BINARY; | ||
| flags |= priority << FLAG_PRIORITY_SHIFT; | ||
| if (last) | ||
| b |= FLAG_LAST; | ||
| return b; | ||
| flags |= FLAG_LAST; | ||
| flags |= admissionClass << FLAG_ADMISSION_SHIFT; | ||
| return flags; | ||
| } | ||
| /** Serialize a header to its fixed 17-byte little-endian form. */ | ||
| export function encodeHeader(h) { | ||
| const buf = new Uint8Array(HEADER_LEN); | ||
| const view = new DataView(buf.buffer); | ||
| view.setUint32(0, h.len, true); | ||
| buf[4] = h.ver; | ||
| buf[5] = h.ty; | ||
| buf[6] = h.flags; | ||
| view.setUint16(7, h.channel, true); | ||
| view.setBigUint64(9, h.corr, true); | ||
| return buf; | ||
| export function admissionClass(flags) { | ||
| return ((flags & FLAG_ADMISSION_MASK) >> FLAG_ADMISSION_SHIFT); | ||
| } | ||
| /** Serialize a header to its fixed 21-byte little-endian form. */ | ||
| export function encodeHeader(header) { | ||
| const buffer = new Uint8Array(HEADER_LEN); | ||
| const view = new DataView(buffer.buffer); | ||
| view.setUint32(0, header.len, true); | ||
| buffer[4] = header.ver; | ||
| buffer[5] = header.ty; | ||
| buffer[6] = header.flags; | ||
| view.setUint16(7, header.channel, true); | ||
| view.setUint32(9, header.epoch, true); | ||
| view.setBigUint64(13, header.corr, true); | ||
| return buffer; | ||
| } | ||
| /** Typed envelope decode failure mirroring the Rust wire taxonomy. */ | ||
| export class DecodeError extends Error { | ||
| code; | ||
| constructor(message, code) { | ||
| super(message); | ||
| this.code = code; | ||
| this.name = "DecodeError"; | ||
| } | ||
| } | ||
| /** | ||
| * Decode a header from the front of `bytes`, following the frozen-prefix | ||
| * discipline: need 5 bytes for len+ver, dispatch full header length on ver, | ||
| * then validate. Mirrors decode_header — never throws on a structurally short | ||
| * buffer beyond the typed DecodeError. | ||
| */ | ||
| /** Decode and validate a header from the front of `bytes`. */ | ||
| export function decodeHeader(bytes) { | ||
| if (bytes.length < FROZEN_PREFIX_LEN) { | ||
| throw new DecodeError(`header shorter than frozen prefix: have ${bytes.length} bytes`); | ||
| throw new DecodeError(`header shorter than frozen prefix: have ${bytes.length} bytes`, "too_short_for_prefix"); | ||
| } | ||
| const ver = bytes[4]; | ||
| if (ver !== PROTOCOL_VERSION) { | ||
| throw new DecodeError(`unsupported envelope version ${ver}`); | ||
| } | ||
| if (ver !== PROTOCOL_VERSION) | ||
| throw new DecodeError(`unsupported envelope version ${ver}`, "unsupported_version"); | ||
| if (bytes.length < HEADER_LEN) { | ||
| throw new DecodeError(`header too short for version: have ${bytes.length} bytes, need ${HEADER_LEN}`); | ||
| throw new DecodeError(`header too short for version: have ${bytes.length} bytes, need ${HEADER_LEN}`, "too_short_for_header"); | ||
| } | ||
| const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength); | ||
| const len = view.getUint32(0, true); | ||
| const tyByte = bytes[5]; | ||
| if (tyByte > FRAME_TYPE_MAX) { | ||
| throw new DecodeError(`unknown frame type byte ${tyByte}`); | ||
| } | ||
| const ty = tyByte; | ||
| const typeByte = bytes[5]; | ||
| if (typeByte > FRAME_TYPE_MAX) | ||
| throw new DecodeError(`unknown frame type byte ${typeByte}`, "unknown_frame_type"); | ||
| const ty = typeByte; | ||
| const flags = bytes[6]; | ||
| if ((flags & FLAG_RESERVED_MASK) !== 0) { | ||
| throw new DecodeError(`reserved flag bits set in flags 0b${flags.toString(2)}`); | ||
| throw new DecodeError(`reserved flag bits set in flags 0b${flags.toString(2).padStart(8, "0")}`, "reserved_flag_bits"); | ||
| } | ||
| if (((flags & FLAG_PRIORITY_MASK) >> FLAG_PRIORITY_SHIFT) === 0b11) { | ||
| throw new DecodeError(`reserved priority bits set in flags 0b${flags.toString(2)}`); | ||
| throw new DecodeError(`reserved priority bits set in flags 0b${flags.toString(2).padStart(8, "0")}`, "reserved_priority_bits"); | ||
| } | ||
| const admission = (flags & FLAG_ADMISSION_MASK) >> FLAG_ADMISSION_SHIFT; | ||
| if (admission === 0b11) { | ||
| throw new DecodeError(`reserved admission class set in flags 0b${flags.toString(2).padStart(8, "0")}`, "reserved_admission_class"); | ||
| } | ||
| if (admission === AdmissionClass.Sheddable && ty !== FrameType.Push && ty !== FrameType.StreamData) { | ||
| throw new DecodeError(`SHEDDABLE admission class is illegal on ${FrameType[ty]} in flags 0b${flags.toString(2).padStart(8, "0")}`, "sheddable_illegal_frame_type"); | ||
| } | ||
| const channel = view.getUint16(7, true); | ||
| const epoch = view.getUint32(9, true); | ||
| if (channel === 0 && epoch !== 0) { | ||
| throw new DecodeError(`control channel carried nonzero epoch ${epoch}`, "nonzero_epoch_on_control_channel"); | ||
| } | ||
| if (isPureHeader(ty) && len !== 0) { | ||
| throw new DecodeError(`pure-header frame ${FrameType[ty]} declared non-zero body length ${len}`); | ||
| throw new DecodeError(`pure-header frame ${FrameType[ty]} declared non-zero body length ${len}`, "pure_header_frame_with_body"); | ||
| } | ||
| const channel = view.getUint16(7, true); | ||
| const corr = view.getBigUint64(9, true); | ||
| return { len, ver, ty, flags, channel, corr }; | ||
| return { len, ver, ty, flags, channel, epoch, corr: view.getBigUint64(13, true) }; | ||
| } | ||
| /** Build a full current-version frame, enforcing the body-length cap and the pure-header rule. */ | ||
| export function buildFrame(ty, flags, channel, corr, body) { | ||
| return buildFrameWithVersion(PROTOCOL_VERSION, ty, flags, channel, corr, body); | ||
| /** Build a current-version frame and validate its complete header. */ | ||
| export function buildFrame(ty, flags, channel, epoch, corr, body) { | ||
| return buildFrameWithVersion(PROTOCOL_VERSION, ty, flags, channel, epoch, corr, body); | ||
| } | ||
| /** Build a full frame while preserving a peer-negotiated envelope version. */ | ||
| export function buildFrameWithVersion(ver, ty, flags, channel, corr, body) { | ||
| /** Build a frame while preserving the peer's exact supported version. */ | ||
| export function buildFrameWithVersion(ver, ty, flags, channel, epoch, corr, body) { | ||
| if (body.length > MAX_FRAME_BODY_LEN) { | ||
| throw new DecodeError(`frame body ${body.length} exceeds max ${MAX_FRAME_BODY_LEN}`); | ||
| throw new DecodeError(`frame body ${body.length} exceeds max ${MAX_FRAME_BODY_LEN}`, "frame_body_too_large"); | ||
| } | ||
| if (isPureHeader(ty) && body.length !== 0) { | ||
| throw new DecodeError(`pure-header frame ${FrameType[ty]} cannot carry a body`); | ||
| } | ||
| return { | ||
| header: { len: body.length, ver, ty, flags, channel, corr }, | ||
| body, | ||
| }; | ||
| const header = { len: body.length, ver, ty, flags, channel, epoch, corr }; | ||
| decodeHeader(encodeHeader(header)); | ||
| return { header, body }; | ||
| } | ||
| /** Encode a frame to wire bytes: 17-byte header followed by `len` body bytes. */ | ||
| /** Encode a frame to wire bytes: header followed by exactly `len` body bytes. */ | ||
| export function encodeFrame(frame) { | ||
| if (frame.header.len !== frame.body.length) { | ||
| throw new DecodeError(`frame header length ${frame.header.len} does not match body length ${frame.body.length}`, "frame_length_mismatch"); | ||
| } | ||
| const header = encodeHeader(frame.header); | ||
| const out = new Uint8Array(header.length + frame.body.length); | ||
| out.set(header, 0); | ||
| out.set(frame.body, header.length); | ||
| return out; | ||
| const output = new Uint8Array(header.length + frame.body.length); | ||
| output.set(header, 0); | ||
| output.set(frame.body, header.length); | ||
| return output; | ||
| } | ||
| //# sourceMappingURL=envelope.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"envelope.js","sourceRoot":"","sources":["../src/envelope.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"envelope.js","sourceRoot":"","sources":["../src/envelope.ts"],"names":[],"mappings":"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"} |
+4
-3
@@ -1,7 +0,8 @@ | ||
| export { SubcClient, SubcError, SubcCallError, DEFAULT_RECONNECT_BACKOFF, SUBC_MODULE_ID_ENV, SUBC_LAUNCH_NONCE_ENV, isConsumerReconnectTransient, connectionFileExists, type BindIdentity, type RouteTarget, type ManagedRouteKind, type ConsumerIdentity, type RouteOpenOptions, type CatalogEntry, type RequestOptions, type ManagedCallOptions, type ConnectOptions, type ReconnectBackoff, type SubcCallErrorKind, type SubscribeOptions, type Subscription, type CloseRouteOptions, } from "./client.js"; | ||
| export { SubcClient, SubcError, SubcCallError, DEFAULT_RECONNECT_BACKOFF, SUBC_MODULE_ID_ENV, SUBC_LAUNCH_NONCE_ENV, isConsumerReconnectTransient, connectionFileExists, type BindIdentity, type RouteTarget, type ManagedRouteKind, type ConsumerIdentity, type RouteOpenOptions, type CatalogEntry, type RequestOptions, type ManagedCallOptions, type ConnectOptions, type ReconnectBackoff, type SubcCallErrorKind, type SubscribeOptions, type Subscription, type CloseRouteOptions, type ManagedCloseRouteOptions, type RoutePollKind, type RoutePollResult, } from "./client.js"; | ||
| export { RouteHandle, StaleRouteHandleError } from "./route-handle.js"; | ||
| export { readConnectionFile, ConnectionFileError, type ConnectionInfo, type Endpoint, } from "./connection-file.js"; | ||
| export { FrameType, Priority, PROTOCOL_VERSION, HEADER_LEN, buildFrame, buildFrameWithVersion, buildFlags, encodeFrame, decodeHeader, encodeHeader, DecodeError, type Frame, type EnvelopeHeader, } from "./envelope.js"; | ||
| export { FrameType, Priority, AdmissionClass, PROTOCOL_VERSION, HEADER_LEN, buildFrame, buildFrameWithVersion, buildFlags, encodeFrame, decodeHeader, encodeHeader, DecodeError, type DecodeErrorCode, type Frame, type EnvelopeHeader, } from "./envelope.js"; | ||
| export { authenticateClient, computeProof, AuthError, NONCE_LEN, PROOF_LEN, SERVER_PROOF_DOMAIN, CLIENT_AUTH_DOMAIN, } from "./auth.js"; | ||
| export { SubcSocket, SocketClosedError, SocketTimeoutError } from "./socket.js"; | ||
| export { SubcProvider, SubcProviderError, HELLO_CORR, managementSurfaceManifest, jsonProviderHandler, type ProviderRequestContext, type BindDecision, type Principal, type BindingsInput, type CircuitBreakerInput, type Concurrency, type ConsumerRoleInput, type ExecutionMode, type IdentityBindingInput, type IdentityScope, type InternalTransport, type LeaseScope, type ManagementOperationInput, type ManagementOperationKind, type ManagementSurfaceManifestOptions, type ManifestInput, type ModelPolicyInput, type ModuleHelloAckBody, type ObservabilityKind, type ObservabilitySurfaceInput, type PipelineAppliesToInput, type PipelineStageKind, type ProviderConnectionState, type HealthReport, type HealthStatus, type ProviderHandler, type ProviderHealthHandler, type ProviderRoleInput, type RouteBindRequest, type ScheduledTaskInput, type StorageBindingInput, type StorageKind, type StorageScope, type SubcProviderConnectOptions, type TaskEligibilityInput, type ToolInput, type TrustTier, type VaultGrantInput, } from "./provider.js"; | ||
| export { SubcProvider, SubcProviderError, HELLO_CORR, managementSurfaceManifest, jsonProviderHandler, type ProviderRequestContext, type ProviderEmitOptions, type BindDecision, type Principal, type BindingsInput, type CircuitBreakerInput, type Concurrency, type ConsumerRoleInput, type ExecutionMode, type IdentityBindingInput, type IdentityScope, type InternalTransport, type LeaseScope, type ManagementOperationInput, type ManagementOperationKind, type ManagementSurfaceManifestOptions, type ManifestInput, type ModelPolicyInput, type ModuleHelloAckBody, type ObservabilityKind, type ObservabilitySurfaceInput, type PipelineAppliesToInput, type PipelineStageKind, type ProviderConnectionState, type HealthReport, type HealthStatus, type ProviderHandler, type ProviderHealthHandler, type ProviderRoleInput, type RouteBindRequest, type ScheduledTaskInput, type StorageBindingInput, type StorageKind, type StorageScope, type SubcProviderConnectOptions, type TaskEligibilityInput, type ToolInput, type TrustTier, type VaultGrantInput, } from "./provider.js"; | ||
| //# sourceMappingURL=index.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,SAAS,EACT,aAAa,EACb,yBAAyB,EACzB,kBAAkB,EAClB,qBAAqB,EACrB,4BAA4B,EAC5B,oBAAoB,EACpB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,iBAAiB,GACvB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,KAAK,cAAc,EACnB,KAAK,QAAQ,GACd,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,SAAS,EACT,QAAQ,EACR,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,qBAAqB,EACrB,UAAU,EACV,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,KAAK,KAAK,EACV,KAAK,cAAc,GACpB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,SAAS,EACT,SAAS,EACT,SAAS,EACT,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,UAAU,EACV,yBAAyB,EACzB,mBAAmB,EACnB,KAAK,sBAAsB,EAC3B,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,oBAAoB,EACzB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,UAAU,EACf,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC5B,KAAK,gCAAgC,EACrC,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,yBAAyB,EAC9B,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACtB,KAAK,uBAAuB,EAC5B,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,0BAA0B,EAC/B,KAAK,oBAAoB,EACzB,KAAK,SAAS,EACd,KAAK,SAAS,EACd,KAAK,eAAe,GACrB,MAAM,eAAe,CAAC"} | ||
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,SAAS,EACT,aAAa,EACb,yBAAyB,EACzB,kBAAkB,EAClB,qBAAqB,EACrB,4BAA4B,EAC5B,oBAAoB,EACpB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,EAC7B,KAAK,aAAa,EAClB,KAAK,eAAe,GACrB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,KAAK,cAAc,EACnB,KAAK,QAAQ,GACd,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,SAAS,EACT,QAAQ,EACR,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,qBAAqB,EACrB,UAAU,EACV,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,KAAK,eAAe,EACpB,KAAK,KAAK,EACV,KAAK,cAAc,GACpB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,SAAS,EACT,SAAS,EACT,SAAS,EACT,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,UAAU,EACV,yBAAyB,EACzB,mBAAmB,EACnB,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACxB,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,oBAAoB,EACzB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,UAAU,EACf,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC5B,KAAK,gCAAgC,EACrC,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,yBAAyB,EAC9B,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACtB,KAAK,uBAAuB,EAC5B,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,0BAA0B,EAC/B,KAAK,oBAAoB,EACzB,KAAK,SAAS,EACd,KAAK,SAAS,EACd,KAAK,eAAe,GACrB,MAAM,eAAe,CAAC"} |
+2
-1
| export { SubcClient, SubcError, SubcCallError, DEFAULT_RECONNECT_BACKOFF, SUBC_MODULE_ID_ENV, SUBC_LAUNCH_NONCE_ENV, isConsumerReconnectTransient, connectionFileExists, } from "./client.js"; | ||
| export { RouteHandle, StaleRouteHandleError } from "./route-handle.js"; | ||
| export { readConnectionFile, ConnectionFileError, } from "./connection-file.js"; | ||
| export { FrameType, Priority, PROTOCOL_VERSION, HEADER_LEN, buildFrame, buildFrameWithVersion, buildFlags, encodeFrame, decodeHeader, encodeHeader, DecodeError, } from "./envelope.js"; | ||
| export { FrameType, Priority, AdmissionClass, PROTOCOL_VERSION, HEADER_LEN, buildFrame, buildFrameWithVersion, buildFlags, encodeFrame, decodeHeader, encodeHeader, DecodeError, } from "./envelope.js"; | ||
| export { authenticateClient, computeProof, AuthError, NONCE_LEN, PROOF_LEN, SERVER_PROOF_DOMAIN, CLIENT_AUTH_DOMAIN, } from "./auth.js"; | ||
@@ -5,0 +6,0 @@ export { SubcSocket, SocketClosedError, SocketTimeoutError } from "./socket.js"; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,SAAS,EACT,aAAa,EACb,yBAAyB,EACzB,kBAAkB,EAClB,qBAAqB,EACrB,4BAA4B,EAC5B,oBAAoB,GAerB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,kBAAkB,EAClB,mBAAmB,GAGpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,SAAS,EACT,QAAQ,EACR,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,qBAAqB,EACrB,UAAU,EACV,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,WAAW,GAGZ,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,SAAS,EACT,SAAS,EACT,SAAS,EACT,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,UAAU,EACV,yBAAyB,EACzB,mBAAmB,GAuCpB,MAAM,eAAe,CAAC"} | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,SAAS,EACT,aAAa,EACb,yBAAyB,EACzB,kBAAkB,EAClB,qBAAqB,EACrB,4BAA4B,EAC5B,oBAAoB,GAkBrB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EACL,kBAAkB,EAClB,mBAAmB,GAGpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,SAAS,EACT,QAAQ,EACR,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,qBAAqB,EACrB,UAAU,EACV,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,WAAW,GAIZ,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,SAAS,EACT,SAAS,EACT,SAAS,EACT,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,UAAU,EACV,yBAAyB,EACzB,mBAAmB,GAwCpB,MAAM,eAAe,CAAC"} |
+35
-8
@@ -1,3 +0,5 @@ | ||
| import { type BindIdentity, type ReconnectBackoff, type RouteTarget } from "./client.js"; | ||
| import { type BindIdentity, type ReconnectBackoff, type RequestOptions, type RouteTarget } from "./client.js"; | ||
| import { type ConnectionInfo } from "./connection-file.js"; | ||
| import { AdmissionClass, Priority } from "./envelope.js"; | ||
| import { RouteHandle } from "./route-handle.js"; | ||
| export declare const HELLO_CORR = 1n; | ||
@@ -138,2 +140,4 @@ export type TrustTier = "first_party" | "reviewed" | "untrusted"; | ||
| export interface ProviderRequestContext { | ||
| /** The immutable route generation that received this request. */ | ||
| readonly handle: RouteHandle; | ||
| /** | ||
@@ -144,3 +148,3 @@ * Emit an interim event as a StreamData frame on this request's (channel, corr). | ||
| */ | ||
| emit(body: Uint8Array): Promise<void>; | ||
| emit(body: Uint8Array, opts?: ProviderEmitOptions): Promise<void>; | ||
| /** Aborts when the consumer sends Cancel for this request, or the route is torn down. */ | ||
@@ -164,3 +168,3 @@ signal: AbortSignal; | ||
| */ | ||
| export type ProviderHandler = (routeChannel: number, body: Uint8Array, ctx: ProviderRequestContext) => Promise<Uint8Array | void> | Uint8Array | void; | ||
| export type ProviderHandler = (handle: RouteHandle, body: Uint8Array, ctx: ProviderRequestContext) => Promise<Uint8Array | void> | Uint8Array | void; | ||
| export type ProviderHealthHandler = () => Promise<HealthReport> | HealthReport; | ||
@@ -176,7 +180,13 @@ export type Principal = { | ||
| export interface RouteBindRequest { | ||
| route_channel: number; | ||
| handle: RouteHandle; | ||
| target: RouteTarget; | ||
| identity: BindIdentity; | ||
| principal?: Principal; | ||
| /** Consumer-declared reverse-request capabilities for this bind. This is a declaration, not a verified privilege; providers must treat an omitted field as no reverse-request capability. Known MCP method-family values today are "elicitation", "sampling", and "roots". */ | ||
| consumer_capabilities?: string[]; | ||
| } | ||
| export interface ProviderEmitOptions { | ||
| priority?: Priority; | ||
| admissionClass?: AdmissionClass; | ||
| } | ||
| export type BindDecision = boolean | { | ||
@@ -208,3 +218,5 @@ accept: boolean; | ||
| onBind?: (request: RouteBindRequest) => Promise<BindDecision> | BindDecision; | ||
| onRouteGone?: (routeChannel: number) => void | Promise<void>; | ||
| /** Runs only after an accepted bind ack is queued and the handle is installed. */ | ||
| onBound?: (handle: RouteHandle) => void | Promise<void>; | ||
| onRouteGone?: (handle: RouteHandle) => void | Promise<void>; | ||
| /** Backoff for provider reconnect after an unexpected socket drop. */ | ||
@@ -242,3 +254,3 @@ reconnectBackoff?: ReconnectBackoff; | ||
| export declare function managementSurfaceManifest(opts: ManagementSurfaceManifestOptions): ManifestInput; | ||
| export declare function jsonProviderHandler<Request = unknown, Response = unknown>(handler: (routeChannel: number, request: Request) => Promise<Response> | Response): ProviderHandler; | ||
| export declare function jsonProviderHandler<Request = unknown, Response = unknown>(handler: (handle: RouteHandle, request: Request) => Promise<Response> | Response): ProviderHandler; | ||
| export declare class SubcProvider { | ||
@@ -253,2 +265,7 @@ private sock; | ||
| private readonly inflight; | ||
| private readonly pending; | ||
| private readonly liveRoutes; | ||
| private connectionToken; | ||
| private nextCorr; | ||
| private ingressEpochDropCount; | ||
| private readonly requestGate; | ||
@@ -268,4 +285,12 @@ private reconnecting; | ||
| private constructor(); | ||
| /** Number of nonzero-channel ingress frames rejected by endpoint validation. */ | ||
| get droppedIngressFrames(): number; | ||
| get conn(): ConnectionInfo; | ||
| currentEpoch(): number; | ||
| /** Send a reverse request on exactly one installed route generation. */ | ||
| request(handle: RouteHandle, body: Uint8Array, opts?: RequestOptions): Promise<Uint8Array>; | ||
| /** Emit an unsolicited Push after onBound has published the route. */ | ||
| push(handle: RouteHandle, body: Uint8Array, opts?: ProviderEmitOptions): Promise<void>; | ||
| cancel(handle: RouteHandle, corr: bigint): void; | ||
| closeRoute(handle: RouteHandle): void; | ||
| /** Read the connection file, authenticate as a client, register the manifest with HELLO, and serve frames. */ | ||
@@ -277,4 +302,3 @@ static connect(opts: SubcProviderConnectOptions): Promise<SubcProvider>; | ||
| private dispatch; | ||
| /** Abort every in-flight request on a route channel for the current socket generation. */ | ||
| private abortChannel; | ||
| private abortHandle; | ||
| private abortGeneration; | ||
@@ -295,2 +319,5 @@ private abortAllInflight; | ||
| private drainConnectionStateQueue; | ||
| private isLiveHandle; | ||
| private assertLiveHandle; | ||
| private allocateCorr; | ||
| private failFatal; | ||
@@ -297,0 +324,0 @@ private finishClosed; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"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"} |
+221
-71
| import { Buffer } from "node:buffer"; | ||
| import { AuthError, authenticateClient } from "./auth.js"; | ||
| import { DEFAULT_RECONNECT_BACKOFF } from "./client.js"; | ||
| import { DEFAULT_RECONNECT_BACKOFF, } from "./client.js"; | ||
| import { ConnectionFileError, readConnectionFile } from "./connection-file.js"; | ||
| import { buildFlags, buildFrame, buildFrameWithVersion, decodeHeader, encodeFrame, FrameType, HEADER_LEN, Priority, PROTOCOL_VERSION, } from "./envelope.js"; | ||
| import { AdmissionClass, buildFlags, buildFrame, buildFrameWithVersion, encodeFrame, FrameType, Priority, PROTOCOL_VERSION, } from "./envelope.js"; | ||
| import { belongsToConnection, createRouteHandle, newConnectionToken, StaleRouteHandleError, } from "./route-handle.js"; | ||
| import { SocketClosedError, SocketTimeoutError, SocketWriteNotQueuedError, SocketWriteQueuedError, SubcSocket, } from "./socket.js"; | ||
@@ -91,5 +92,5 @@ const DEFAULT_HANDSHAKE_TIMEOUT_MS = 10_000; | ||
| export function jsonProviderHandler(handler) { | ||
| return async (routeChannel, body) => { | ||
| return async (handle, body) => { | ||
| const request = JSON.parse(Buffer.from(body).toString("utf8")); | ||
| const response = await handler(routeChannel, request); | ||
| const response = await handler(handle, request); | ||
| return encodeJson(response); | ||
@@ -110,2 +111,7 @@ }; | ||
| inflight = new Map(); | ||
| pending = new Map(); | ||
| liveRoutes = new Map(); | ||
| connectionToken = newConnectionToken(); | ||
| nextCorr = 1n; | ||
| ingressEpochDropCount = 0; | ||
| requestGate = new AsyncPermitPool(DEFAULT_PROVIDER_HANDLER_CAPACITY); | ||
@@ -135,2 +141,6 @@ reconnecting = null; | ||
| } | ||
| /** Number of nonzero-channel ingress frames rejected by endpoint validation. */ | ||
| get droppedIngressFrames() { | ||
| return this.ingressEpochDropCount; | ||
| } | ||
| get conn() { | ||
@@ -142,2 +152,44 @@ return this.currentConn; | ||
| } | ||
| /** Send a reverse request on exactly one installed route generation. */ | ||
| async request(handle, body, opts = {}) { | ||
| this.assertLiveHandle(handle); | ||
| const corr = this.allocateCorr(); | ||
| const key = routeKey(handle, corr); | ||
| const timeoutMs = opts.timeoutMs ?? WRITE_TIMEOUT_MS; | ||
| const frame = buildFrame(FrameType.Request, buildFlags(false, opts.priority ?? Priority.Interactive, false, opts.admissionClass ?? AdmissionClass.Normal), handle.channel, handle.epoch, corr, body); | ||
| return await new Promise((resolve, reject) => { | ||
| const timer = setTimeout(() => { | ||
| if (this.pending.delete(key)) | ||
| reject(new SubcProviderError("reverse request timed out", "request_timeout")); | ||
| }, timeoutMs); | ||
| this.pending.set(key, { | ||
| resolve: (response) => resolve(response.body), | ||
| reject, | ||
| timer, | ||
| }); | ||
| this.sendOn(this.sock, this.generation, frame).catch((error) => { | ||
| const pending = this.pending.get(key); | ||
| if (!pending) | ||
| return; | ||
| this.pending.delete(key); | ||
| clearTimeout(pending.timer); | ||
| reject(error instanceof Error ? error : new SubcProviderError(String(error))); | ||
| }); | ||
| }); | ||
| } | ||
| /** Emit an unsolicited Push after onBound has published the route. */ | ||
| async push(handle, body, opts = {}) { | ||
| this.assertLiveHandle(handle); | ||
| await this.sendOn(this.sock, this.generation, buildFrame(FrameType.Push, buildFlags(false, opts.priority ?? Priority.Interactive, false, opts.admissionClass ?? AdmissionClass.Normal), handle.channel, handle.epoch, 0n, body)); | ||
| } | ||
| cancel(handle, corr) { | ||
| this.assertLiveHandle(handle); | ||
| void this.sendOn(this.sock, this.generation, buildFrame(FrameType.Cancel, controlFlags(), handle.channel, handle.epoch, corr, new Uint8Array(0))); | ||
| } | ||
| closeRoute(handle) { | ||
| this.assertLiveHandle(handle); | ||
| this.liveRoutes.delete(handle.channel); | ||
| this.abortHandle(handle); | ||
| void this.sendOn(this.sock, this.generation, buildFrame(FrameType.Goodbye, controlFlags(), handle.channel, handle.epoch, 0n, new Uint8Array(0))); | ||
| } | ||
| /** Read the connection file, authenticate as a client, register the manifest with HELLO, and serve frames. */ | ||
@@ -158,3 +210,3 @@ static async connect(opts) { | ||
| try { | ||
| await sendFrame(sock, buildFrame(FrameType.Goodbye, controlFlags(), 0, 0n, new Uint8Array(0))); | ||
| await sendFrame(sock, buildFrame(FrameType.Goodbye, controlFlags(), 0, 0, 0n, new Uint8Array(0))); | ||
| } | ||
@@ -190,9 +242,4 @@ catch { | ||
| for (;;) { | ||
| // Header read waits indefinitely — idle time between frames is normal. | ||
| const headerBytes = await sock.readExact(HEADER_LEN, Number.POSITIVE_INFINITY); | ||
| const header = decodeHeader(headerBytes); | ||
| const body = header.len === 0 | ||
| ? new Uint8Array(0) | ||
| : await sock.readExact(header.len, Date.now() + BODY_READ_TIMEOUT_MS); | ||
| const keepGoing = await this.dispatch({ header, body }, sock, generation); | ||
| const frame = await sock.readFrame(Number.POSITIVE_INFINITY, Date.now() + BODY_READ_TIMEOUT_MS); | ||
| const keepGoing = await this.dispatch(frame, sock, generation); | ||
| if (!keepGoing) { | ||
@@ -205,5 +252,5 @@ if (this.sock === sock && this.generation === generation) | ||
| } | ||
| catch (err) { | ||
| catch (error) { | ||
| if (this.sock === sock && this.generation === generation && !this.closeStarted) { | ||
| this.handleUnexpectedDrop(sock, generation, err instanceof Error ? err : new SubcProviderError(String(err))); | ||
| this.handleUnexpectedDrop(sock, generation, error instanceof Error ? error : new SubcProviderError(String(error))); | ||
| return; | ||
@@ -221,20 +268,46 @@ } | ||
| async dispatch(frame, sock, generation) { | ||
| let handle = null; | ||
| if (frame.header.channel !== 0) { | ||
| handle = this.liveRoutes.get(frame.header.channel) ?? null; | ||
| if (!handle || handle.epoch !== frame.header.epoch) { | ||
| this.ingressEpochDropCount += 1; | ||
| return true; | ||
| } | ||
| } | ||
| if (handle) { | ||
| const pendingKey = routeKey(handle, frame.header.corr); | ||
| const pending = this.pending.get(pendingKey); | ||
| if (pending) { | ||
| if (frame.header.ty === FrameType.Push || frame.header.ty === FrameType.StreamData) | ||
| return true; | ||
| if (frame.header.ty === FrameType.Response || frame.header.ty === FrameType.StreamEnd) { | ||
| this.pending.delete(pendingKey); | ||
| clearTimeout(pending.timer); | ||
| pending.resolve(frame); | ||
| return true; | ||
| } | ||
| if (frame.header.ty === FrameType.Error) { | ||
| this.pending.delete(pendingKey); | ||
| clearTimeout(pending.timer); | ||
| pending.reject(providerErrorFromFrame(frame)); | ||
| return true; | ||
| } | ||
| } | ||
| } | ||
| switch (frame.header.ty) { | ||
| case FrameType.Ping: | ||
| if (frame.header.channel === 0) { | ||
| await this.sendOn(sock, generation, buildFrameWithVersion(frame.header.ver, FrameType.Pong, frame.header.flags, 0, frame.header.corr, new Uint8Array(0))); | ||
| await this.sendOn(sock, generation, buildFrameWithVersion(frame.header.ver, FrameType.Pong, frame.header.flags, 0, 0, frame.header.corr, new Uint8Array(0))); | ||
| } | ||
| return true; | ||
| case FrameType.Goodbye: | ||
| if (frame.header.channel === 0) | ||
| if (!handle) | ||
| return false; | ||
| // The route is gone: abort in-flight requests on that route so streaming | ||
| // handlers unwind, then notify the provider owner. | ||
| this.abortChannel(generation, frame.header.channel); | ||
| await this.opts.onRouteGone?.(frame.header.channel); | ||
| this.liveRoutes.delete(handle.channel); | ||
| this.abortHandle(handle); | ||
| await this.opts.onRouteGone?.(handle); | ||
| return true; | ||
| case FrameType.Cancel: | ||
| // The consumer cancelled one request: abort the matching handler. Its | ||
| // streaming handler observes ctx.signal and ends with a StreamEnd terminal. | ||
| this.inflight.get(routeKey(generation, frame.header.channel, frame.header.corr))?.abort(); | ||
| if (handle) | ||
| this.inflight.get(routeKey(handle, frame.header.corr))?.abort(); | ||
| return true; | ||
@@ -245,6 +318,6 @@ case FrameType.Request: | ||
| } | ||
| else { | ||
| void this.handleDataRequest(frame, sock, generation).catch((err) => { | ||
| else if (handle) { | ||
| void this.handleDataRequest(frame, handle, sock, generation).catch((error) => { | ||
| if (!this.closeStarted && this.sock === sock && this.generation === generation) { | ||
| console.warn("SubcProvider handler failed after its request was dispatched", err); | ||
| console.warn("SubcProvider handler failed after its request was dispatched", error); | ||
| } | ||
@@ -258,5 +331,4 @@ }); | ||
| } | ||
| /** Abort every in-flight request on a route channel for the current socket generation. */ | ||
| abortChannel(generation, channel) { | ||
| const prefix = `${generation}:${channel}:`; | ||
| abortHandle(handle) { | ||
| const prefix = `${handle.channel}:${handle.epoch}:`; | ||
| for (const [key, controller] of this.inflight) { | ||
@@ -266,9 +338,18 @@ if (key.startsWith(prefix)) | ||
| } | ||
| for (const [key, pending] of this.pending) { | ||
| if (!key.startsWith(prefix)) | ||
| continue; | ||
| this.pending.delete(key); | ||
| clearTimeout(pending.timer); | ||
| pending.reject(new StaleRouteHandleError(handle)); | ||
| } | ||
| } | ||
| abortGeneration(generation) { | ||
| const prefix = `${generation}:`; | ||
| for (const [key, controller] of this.inflight) { | ||
| if (key.startsWith(prefix)) | ||
| controller.abort(); | ||
| abortGeneration(_generation) { | ||
| this.abortAllInflight(); | ||
| for (const [key, pending] of this.pending) { | ||
| this.pending.delete(key); | ||
| clearTimeout(pending.timer); | ||
| pending.reject(new SubcProviderError("provider connection dropped", "connection_dropped")); | ||
| } | ||
| this.liveRoutes.clear(); | ||
| } | ||
@@ -282,5 +363,5 @@ abortAllInflight() { | ||
| if (request.op === HEALTH_CHECK_OP) { | ||
| void this.handleHealthRequest(frame, sock, generation).catch((err) => { | ||
| void this.handleHealthRequest(frame, sock, generation).catch((error) => { | ||
| if (!this.closeStarted && this.sock === sock && this.generation === generation) { | ||
| console.warn("SubcProvider health handler failed after its request was dispatched", err); | ||
| console.warn("SubcProvider health handler failed after its request was dispatched", error); | ||
| } | ||
@@ -293,42 +374,75 @@ }); | ||
| } | ||
| const tentative = createRouteHandle(numberField(request.route_channel, "route_channel"), numberField(request.epoch, "epoch"), this.connectionToken); | ||
| const bindRequest = { | ||
| route_channel: numberField(request.route_channel, "route_channel"), | ||
| handle: tentative, | ||
| target: request.target, | ||
| identity: request.identity, | ||
| principal: request.principal, | ||
| consumer_capabilities: request.consumer_capabilities, | ||
| }; | ||
| const decision = await this.opts.onBind?.(bindRequest); | ||
| let decision; | ||
| try { | ||
| decision = await this.opts.onBind?.(bindRequest); | ||
| } | ||
| catch (error) { | ||
| try { | ||
| await this.sendError(frame, "route_rejected", error instanceof Error ? error.message : String(error), controlFlags(), sock, generation); | ||
| } | ||
| finally { | ||
| await this.opts.onRouteGone?.(tentative); | ||
| } | ||
| return; | ||
| } | ||
| const rejection = bindRejection(decision); | ||
| if (rejection) { | ||
| await this.sendError(frame, rejection.code, rejection.message, controlFlags(), sock, generation); | ||
| try { | ||
| await this.sendError(frame, rejection.code, rejection.message, controlFlags(), sock, generation); | ||
| } | ||
| finally { | ||
| await this.opts.onRouteGone?.(tentative); | ||
| } | ||
| return; | ||
| } | ||
| await this.sendOn(sock, generation, buildFrameWithVersion(frame.header.ver, FrameType.Response, controlFlags(), 0, frame.header.corr, encodeJson({ op: "route.bind" }))); | ||
| try { | ||
| await this.sendOn(sock, generation, buildFrameWithVersion(frame.header.ver, FrameType.Response, controlFlags(), 0, 0, frame.header.corr, encodeJson({ op: "route.bind" }))); | ||
| } | ||
| catch (error) { | ||
| await this.opts.onRouteGone?.(tentative); | ||
| throw error; | ||
| } | ||
| if (this.sock !== sock || this.generation !== generation || this.closeStarted || this.closedErr) { | ||
| await this.opts.onRouteGone?.(tentative); | ||
| return; | ||
| } | ||
| this.liveRoutes.set(tentative.channel, tentative); | ||
| await this.opts.onBound?.(tentative); | ||
| } | ||
| async handleDataRequest(frame, sock, generation) { | ||
| const { channel, corr, ver } = frame.header; | ||
| const key = routeKey(generation, channel, corr); | ||
| async handleDataRequest(frame, handle, sock, generation) { | ||
| const { corr, ver } = frame.header; | ||
| const key = routeKey(handle, corr); | ||
| const controller = new AbortController(); | ||
| this.inflight.set(key, controller); | ||
| const dataFlags = buildFlags(false, Priority.Interactive, false); | ||
| const ctx = { | ||
| const context = { | ||
| handle, | ||
| signal: controller.signal, | ||
| currentEpoch: () => this.connectionEpoch, | ||
| emit: async (eventBody) => { | ||
| // Once aborted (cancel / route-gone / socket drop), drop further events silently. | ||
| emit: async (eventBody, options = {}) => { | ||
| this.assertLiveHandle(handle); | ||
| if (controller.signal.aborted) | ||
| return; | ||
| await this.sendOn(sock, generation, buildFrameWithVersion(ver, FrameType.StreamData, dataFlags, channel, corr, eventBody)); | ||
| await this.sendOn(sock, generation, buildFrameWithVersion(ver, FrameType.StreamData, buildFlags(false, options.priority ?? Priority.Interactive, false, options.admissionClass ?? AdmissionClass.Normal), handle.channel, handle.epoch, corr, eventBody)); | ||
| }, | ||
| }; | ||
| const releasePermit = await (this.requestGate ?? new AsyncPermitPool(DEFAULT_PROVIDER_HANDLER_CAPACITY)).acquire(); | ||
| const dataFlags = buildFlags(false, Priority.Interactive, false); | ||
| try { | ||
| const body = await this.opts.handler(channel, frame.body, ctx); | ||
| const body = await this.opts.handler(handle, frame.body, context); | ||
| if (controller.signal.aborted) | ||
| return; | ||
| this.assertLiveHandle(handle); | ||
| if (body === undefined) { | ||
| // A streaming handler that ended: close the held-open request with a | ||
| // StreamEnd terminal (the consumer's subscription resolves). | ||
| await this.sendOn(sock, generation, buildFrameWithVersion(ver, FrameType.StreamEnd, dataFlags, channel, corr, new Uint8Array(0))); | ||
| await this.sendOn(sock, generation, buildFrameWithVersion(ver, FrameType.StreamEnd, dataFlags, handle.channel, handle.epoch, corr, new Uint8Array(0))); | ||
| } | ||
| else if (body instanceof Uint8Array) { | ||
| await this.sendOn(sock, generation, buildFrameWithVersion(ver, FrameType.Response, dataFlags, channel, corr, body)); | ||
| await this.sendOn(sock, generation, buildFrameWithVersion(ver, FrameType.Response, dataFlags, handle.channel, handle.epoch, corr, body)); | ||
| } | ||
@@ -339,4 +453,6 @@ else { | ||
| } | ||
| catch (err) { | ||
| await this.sendError(frame, err instanceof SubcProviderError && err.code ? err.code : "handler_error", err instanceof Error ? err.message : String(err), dataFlags, sock, generation); | ||
| catch (error) { | ||
| if (error instanceof StaleRouteHandleError || controller.signal.aborted) | ||
| return; | ||
| await this.sendError(frame, error instanceof SubcProviderError && error.code ? error.code : "handler_error", error instanceof Error ? error.message : String(error), dataFlags, sock, generation); | ||
| } | ||
@@ -350,4 +466,4 @@ finally { | ||
| async handleHealthRequest(frame, sock, generation) { | ||
| const { channel, corr, ver } = frame.header; | ||
| const key = routeKey(generation, channel, corr); | ||
| const { corr, ver } = frame.header; | ||
| const key = `control:${generation}:${corr}`; | ||
| const controller = new AbortController(); | ||
@@ -360,3 +476,3 @@ this.inflight.set(key, controller); | ||
| const report = await this.opts.health(); | ||
| await this.sendOn(sock, generation, buildFrameWithVersion(ver, FrameType.Response, controlFlags(), channel, corr, encodeJson({ | ||
| await this.sendOn(sock, generation, buildFrameWithVersion(ver, FrameType.Response, controlFlags(), 0, 0, corr, encodeJson({ | ||
| op: HEALTH_CHECK_OP, | ||
@@ -368,4 +484,4 @@ status: report.status, | ||
| } | ||
| catch (err) { | ||
| await this.sendError(frame, err instanceof SubcProviderError && err.code ? err.code : "health_error", err instanceof Error ? err.message : String(err), controlFlags(), sock, generation); | ||
| catch (error) { | ||
| await this.sendError(frame, error instanceof SubcProviderError && error.code ? error.code : "health_error", error instanceof Error ? error.message : String(error), controlFlags(), sock, generation); | ||
| } | ||
@@ -379,3 +495,3 @@ finally { | ||
| async sendError(frame, code, message, flags, sock, generation) { | ||
| await this.sendOn(sock, generation, buildFrameWithVersion(frame.header.ver, FrameType.Error, flags, frame.header.channel, frame.header.corr, encodeJson({ code, message }))); | ||
| await this.sendOn(sock, generation, buildFrameWithVersion(frame.header.ver, FrameType.Error, flags, frame.header.channel, frame.header.epoch, frame.header.corr, encodeJson({ code, message }))); | ||
| } | ||
@@ -447,2 +563,5 @@ async sendOn(sock, generation, frame) { | ||
| this.connectionEpoch += 1; | ||
| this.connectionToken = newConnectionToken(); | ||
| this.liveRoutes.clear(); | ||
| this.nextCorr = 1n; | ||
| const generation = this.generation; | ||
@@ -511,2 +630,20 @@ void this.readLoop(opened.sock, generation); | ||
| } | ||
| isLiveHandle(handle) { | ||
| return belongsToConnection(handle, this.connectionToken) && this.liveRoutes.get(handle.channel) === handle; | ||
| } | ||
| assertLiveHandle(handle) { | ||
| if (!this.isLiveHandle(handle)) | ||
| throw new StaleRouteHandleError(handle); | ||
| } | ||
| allocateCorr() { | ||
| const maximum = 0xffffffffffffffffn; | ||
| if (this.nextCorr > maximum) { | ||
| const error = new SubcProviderError("channel-0 correlation id allocator exhausted", "corr_exhausted"); | ||
| this.handleUnexpectedDrop(this.sock, this.generation, error); | ||
| throw error; | ||
| } | ||
| const corr = this.nextCorr; | ||
| this.nextCorr += 1n; | ||
| return corr; | ||
| } | ||
| failFatal(err) { | ||
@@ -525,5 +662,14 @@ if (!this.closedErr) | ||
| } | ||
| function routeKey(generation, channel, corr) { | ||
| return `${generation}:${channel}:${corr}`; | ||
| function routeKey(handle, corr) { | ||
| return `${handle.channel}:${handle.epoch}:${corr}`; | ||
| } | ||
| function providerErrorFromFrame(frame) { | ||
| try { | ||
| const body = parseJson(frame.body); | ||
| return new SubcProviderError(body.message ?? "subc error", body.code); | ||
| } | ||
| catch { | ||
| return new SubcProviderError(Buffer.from(frame.body).toString("utf8") || "subc error"); | ||
| } | ||
| } | ||
| function launchNonce(opts) { | ||
@@ -543,2 +689,3 @@ const nonce = opts.launchNonce ?? process.env[SUBC_LAUNCH_NONCE_ENV]; | ||
| onBind: opts.onBind, | ||
| onBound: opts.onBound, | ||
| onRouteGone: opts.onRouteGone, | ||
@@ -561,3 +708,3 @@ reconnectBackoff: opts.reconnectBackoff ?? DEFAULT_RECONNECT_BACKOFF, | ||
| const nonce = launchNonce(opts); | ||
| return buildFrame(FrameType.Hello, controlFlags(), 0, HELLO_CORR, encodeJson({ | ||
| return buildFrame(FrameType.Hello, controlFlags(), 0, 0, HELLO_CORR, encodeJson({ | ||
| manifest: normalizeManifest(opts.manifest), | ||
@@ -610,10 +757,13 @@ protocol_ver: PROTOCOL_VERSION, | ||
| async function expectHelloAck(sock, deadline) { | ||
| const header = decodeHeader(await sock.readExact(HEADER_LEN, deadline)); | ||
| const body = header.len === 0 ? new Uint8Array(0) : await sock.readExact(header.len, deadline); | ||
| const frame = { header, body }; | ||
| switch (header.ty) { | ||
| case FrameType.HelloAck: | ||
| return parseJson(body); | ||
| const frame = await sock.readFrame(deadline, deadline); | ||
| switch (frame.header.ty) { | ||
| case FrameType.HelloAck: { | ||
| const ack = parseJson(frame.body); | ||
| if (ack.negotiated_ver !== PROTOCOL_VERSION) { | ||
| throw new SubcProviderError(`subc negotiated protocol ${ack.negotiated_ver}; expected exactly ${PROTOCOL_VERSION}`, "unsupported_version"); | ||
| } | ||
| return ack; | ||
| } | ||
| case FrameType.Error: { | ||
| const error = parseJson(body); | ||
| const error = parseJson(frame.body); | ||
| throw new SubcProviderError(`subc rejected HELLO: ${error.code ?? "unknown"} — ${error.message ?? "subc error"}`, error.code); | ||
@@ -620,0 +770,0 @@ } |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"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"} |
+7
-0
@@ -0,1 +1,2 @@ | ||
| import { type Frame } from "./envelope.js"; | ||
| export declare class SocketClosedError extends Error { | ||
@@ -37,2 +38,8 @@ } | ||
| static connect(host: string, port: number, deadlineMs: number): Promise<SubcSocket>; | ||
| /** | ||
| * Read one envelope frame. The frozen five-byte prefix is validated before | ||
| * waiting for the rest of the header, so a stale 17-byte v1 sender fails | ||
| * promptly instead of leaving this reader blocked for four bytes. | ||
| */ | ||
| readFrame(headerDeadlineMs: number, bodyDeadlineMs: number, onHeader?: () => void): Promise<Frame>; | ||
| /** Read exactly `n` bytes, rejecting if `deadlineMs` (epoch ms) passes first. */ | ||
@@ -39,0 +46,0 @@ readExact(n: number, deadlineMs: number): Promise<Uint8Array>; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../src/socket.ts"],"names":[],"mappings":"AAQA,qBAAa,iBAAkB,SAAQ,KAAK;CAAG;AAC/C,qBAAa,kBAAmB,SAAQ,KAAK;CAAG;AAEhD,qBAAa,yBAA0B,SAAQ,KAAK;IAGhD,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK;gBADtB,OAAO,EAAE,MAAM,EACN,KAAK,CAAC,EAAE,KAAK,YAAA;CAIzB;AAED,qBAAa,sBAAuB,SAAQ,KAAK;IAG7C,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK;gBADtB,OAAO,EAAE,MAAM,EACN,KAAK,CAAC,EAAE,KAAK,YAAA;CAIzB;AAED,MAAM,WAAW,iBAAiB;IAChC,gGAAgG;IAChG,MAAM,EAAE,OAAO,CAAC;IAChB,4FAA4F;IAC5F,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AASD,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,SAAS,CAAsB;IAEvC;;gDAE4C;IAC5C,aAAa,IAAI,MAAM;IAIvB,OAAO;IAgBP;;;;OAIG;IACH,SAAS,IAAI,MAAM,GAAG,IAAI;IAI1B,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAmBnF,iFAAiF;IACjF,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAyBvD,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWjE,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,iBAAiB;IA4EtE,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,QAAQ;IAiBhB,OAAO,CAAC,IAAI;CAmBb"} | ||
| {"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../src/socket.ts"],"names":[],"mappings":"AAQA,OAAO,EAOL,KAAK,KAAK,EACX,MAAM,eAAe,CAAC;AAEvB,qBAAa,iBAAkB,SAAQ,KAAK;CAAG;AAC/C,qBAAa,kBAAmB,SAAQ,KAAK;CAAG;AAEhD,qBAAa,yBAA0B,SAAQ,KAAK;IAGhD,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK;gBADtB,OAAO,EAAE,MAAM,EACN,KAAK,CAAC,EAAE,KAAK,YAAA;CAIzB;AAED,qBAAa,sBAAuB,SAAQ,KAAK;IAG7C,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK;gBADtB,OAAO,EAAE,MAAM,EACN,KAAK,CAAC,EAAE,KAAK,YAAA;CAIzB;AAED,MAAM,WAAW,iBAAiB;IAChC,gGAAgG;IAChG,MAAM,EAAE,OAAO,CAAC;IAChB,4FAA4F;IAC5F,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AASD,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,SAAS,CAAsB;IAEvC;;gDAE4C;IAC5C,aAAa,IAAI,MAAM;IAIvB,OAAO;IAgBP;;;;OAIG;IACH,SAAS,IAAI,MAAM,GAAG,IAAI;IAI1B,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAmBnF;;;;OAIG;IACG,SAAS,CACb,gBAAgB,EAAE,MAAM,EACxB,cAAc,EAAE,MAAM,EACtB,QAAQ,CAAC,EAAE,MAAM,IAAI,GACpB,OAAO,CAAC,KAAK,CAAC;IAkBjB,iFAAiF;IACjF,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAyBvD,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWjE,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,iBAAiB;IA4EtE,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,QAAQ;IAiBhB,OAAO,CAAC,IAAI;CAmBb"} |
+23
-0
@@ -7,2 +7,3 @@ // A pull-based buffered wrapper over a node TCP socket. Node sockets are | ||
| import net from "node:net"; | ||
| import { decodeHeader, DecodeError, FROZEN_PREFIX_LEN, HEADER_LEN, MAX_FRAME_BODY_LEN, PROTOCOL_VERSION, } from "./envelope.js"; | ||
| export class SocketClosedError extends Error { | ||
@@ -80,2 +81,24 @@ } | ||
| } | ||
| /** | ||
| * Read one envelope frame. The frozen five-byte prefix is validated before | ||
| * waiting for the rest of the header, so a stale 17-byte v1 sender fails | ||
| * promptly instead of leaving this reader blocked for four bytes. | ||
| */ | ||
| async readFrame(headerDeadlineMs, bodyDeadlineMs, onHeader) { | ||
| const prefix = await this.readExact(FROZEN_PREFIX_LEN, headerDeadlineMs); | ||
| const version = prefix[4]; | ||
| if (version !== PROTOCOL_VERSION) | ||
| throw new DecodeError(`unsupported envelope version ${version}`, "unsupported_version"); | ||
| const remainder = await this.readExact(HEADER_LEN - FROZEN_PREFIX_LEN, headerDeadlineMs); | ||
| const headerBytes = new Uint8Array(HEADER_LEN); | ||
| headerBytes.set(prefix); | ||
| headerBytes.set(remainder, FROZEN_PREFIX_LEN); | ||
| const header = decodeHeader(headerBytes); | ||
| if (header.len > MAX_FRAME_BODY_LEN) { | ||
| throw new DecodeError(`frame body ${header.len} exceeds max ${MAX_FRAME_BODY_LEN}`, "frame_body_too_large"); | ||
| } | ||
| onHeader?.(); | ||
| const body = header.len === 0 ? new Uint8Array(0) : await this.readExact(header.len, bodyDeadlineMs); | ||
| return { header, body }; | ||
| } | ||
| /** Read exactly `n` bytes, rejecting if `deadlineMs` (epoch ms) passes first. */ | ||
@@ -82,0 +105,0 @@ readExact(n, deadlineMs) { |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"socket.js","sourceRoot":"","sources":["../src/socket.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"socket.js","sourceRoot":"","sources":["../src/socket.ts"],"names":[],"mappings":"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"} |
+1
-1
| { | ||
| "name": "@cortexkit/subc-client", | ||
| "version": "0.3.4", | ||
| "version": "0.4.0", | ||
| "description": "TypeScript client for the subc daemon. Wire-compatible (byte-for-byte) with the Rust subc-transport handshake and subc-protocol envelope.", | ||
@@ -5,0 +5,0 @@ "type": "module", |
+27
-13
@@ -6,3 +6,3 @@ # @cortexkit/subc-client | ||
| wire-compatible **byte-for-byte** with `subc-transport` (the HMAC-SHA256 | ||
| handshake) and `subc-protocol` (the 17-byte envelope and channel-0 control RPCs). | ||
| handshake) and `subc-protocol` (the 21-byte v2 envelope and channel-0 control RPCs). | ||
@@ -25,3 +25,3 @@ Use it when a TypeScript/JavaScript process needs to reach a subc-routed module | ||
| A consumer authenticates, optionally lists the catalog, opens a route to a | ||
| target module, then issues requests on the returned route channel. There is no | ||
| target module, then issues requests using the returned immutable route handle. There is no | ||
| client `HELLO` — `HELLO` is module-registration only. | ||
@@ -39,3 +39,3 @@ | ||
| // Open a route to a management-surface module and call it. | ||
| const routeChannel = await client.routeOpen( | ||
| const route = await client.routeOpen( | ||
| { kind: "management_surface", module_id: "ai-provider-quota" }, | ||
@@ -48,8 +48,19 @@ { project_root: process.cwd(), harness: "my-harness", session: "session-1" }, | ||
| // wraps its array under `result`, so read `body.result`. | ||
| const body = await client.request(routeChannel, { method: "usage.get", params: {} }); | ||
| const body = await client.request(route, { method: "usage.get", params: {} }); | ||
| const usage = body.result; // ProviderUsage[] for the ai-provider-quota module | ||
| await client.closeRoute(route); | ||
| client.close(); | ||
| ``` | ||
| ### v2 route-handle migration | ||
| Route identity is now an immutable `RouteHandle { channel, epoch }` bound to the | ||
| connection that opened it. `routeOpen()` returns a handle, and `request()`, | ||
| `subscribe()`, `routePoll()`, `cancel()`, `closeRoute()`, and | ||
| `closeRouteChannel()` all require that handle. A handle retained across reconnect | ||
| fails locally with `StaleRouteHandleError` and emits no frame. The former | ||
| `closeRoute(target, identity)` managed-cache operation is now | ||
| `closeManagedRoute(target, identity)`; no public operation accepts a bare channel. | ||
| `connect()` runs the full handshake before resolving: `ClientHello` → | ||
@@ -63,6 +74,6 @@ verify the server's proof **and** the daemon id from the connection file → | ||
| - **Correlation, not order.** Every request carries a correlation id; replies are | ||
| matched by `(channel, corr)`, never by arrival order. subc may interleave a | ||
| matched by `(channel, epoch, corr)`, never by arrival order. subc may interleave a | ||
| control reply ahead of another exchange's response on the same connection. | ||
| - **Priority.** Channel-0 control RPCs and data-plane requests are sent | ||
| `Interactive`. `request()` accepts `{ priority, timeoutMs, onProgress }`; | ||
| `Interactive`. `request()` accepts `{ priority, admissionClass, timeoutMs, onProgress }`; | ||
| `onProgress` receives interim `Push`/`StreamData` frame bodies before the | ||
@@ -78,9 +89,10 @@ terminal reply. | ||
| ```sh | ||
| bun test # 23 unit + 2 live-handshake | ||
| bun test # 75 unit/mock tests + 17 RUN_SUBC_LIVE-gated tests | ||
| ``` | ||
| The live-handshake tests boot the real `subc-core` binary | ||
| (`target/debug/subc-core`) and complete the handshake against it — the | ||
| The live-handshake tests boot the real daemon binary | ||
| (`target/debug/ck-subc`) and complete the handshake against it — the | ||
| byte-identity authority for this client. They skip automatically when the binary | ||
| is not built; run `cargo build -p subc-core` first (the CI lane does this). | ||
| is not built; run `cargo build -p subc-core` first (the CI lane does this; the | ||
| package builds the `ck-subc` executable). | ||
@@ -91,6 +103,8 @@ ## Layout | ||
| | --- | --- | | ||
| | `src/envelope.ts` | 17-byte header codec, frame types, flags, priority | | ||
| | `src/envelope.ts` | 21-byte header codec, frame types, flags, priority, admission class | | ||
| | `src/connection-file.ts` | read + validate the daemon connection file (owner-only gate) | | ||
| | `src/socket.ts` | buffered TCP socket with deadline-bounded `readExact` | | ||
| | `src/socket.ts` | prefix-first envelope reader and deadline-bounded buffered TCP I/O | | ||
| | `src/auth.ts` | HMAC-SHA256 handshake (`computeProof`, constant-time verify) | | ||
| | `src/client.ts` | `SubcClient`: handshake, channel-0 RPCs, `request()` corr-mux | | ||
| | `src/route-handle.ts` | immutable connection-bound `(channel, epoch)` route identity | | ||
| | `src/client.ts` | `SubcClient`: route handles, channel-0 RPCs, epoch-aware corr-mux | | ||
| | `src/provider.ts` | provider bind publication, epoch validation, and routed serving | |
+374
-277
@@ -18,8 +18,7 @@ // The consumer-facing subc client. Mirrors the canonical pure consumer | ||
| import { | ||
| AdmissionClass, | ||
| buildFrame, | ||
| buildFlags, | ||
| decodeHeader, | ||
| encodeFrame, | ||
| FrameType, | ||
| HEADER_LEN, | ||
| Priority, | ||
@@ -29,2 +28,10 @@ type Frame, | ||
| import { | ||
| belongsToConnection, | ||
| createRouteHandle, | ||
| newConnectionToken, | ||
| RouteHandle, | ||
| sameRouteHandle, | ||
| StaleRouteHandleError, | ||
| } from "./route-handle.js"; | ||
| import { | ||
| SocketClosedError, | ||
@@ -103,2 +110,4 @@ SocketTimeoutError, | ||
| consumerIdentity?: ConsumerIdentity | null; | ||
| /** Optional consumer-declared reverse-request capabilities for this route.open. This is a declaration, not a verified privilege; providers must treat an omitted field as no reverse-request capability. Known MCP method-family values today are "elicitation", "sampling", and "roots". */ | ||
| consumerCapabilities?: string[]; | ||
| } | ||
@@ -114,2 +123,3 @@ | ||
| priority?: Priority; | ||
| admissionClass?: AdmissionClass; | ||
| timeoutMs?: number; | ||
@@ -131,4 +141,14 @@ /** Called for each interim PUSH / StreamData frame before the terminal reply. */ | ||
| priority?: Priority; | ||
| admissionClass?: AdmissionClass; | ||
| } | ||
| export type RoutePollKind = "status" | "liveness"; | ||
| export interface RoutePollResult { | ||
| route_channel: number; | ||
| route_epoch: number; | ||
| status: string | null; | ||
| live: boolean | null; | ||
| } | ||
| export interface CloseRouteOptions { | ||
@@ -141,3 +161,6 @@ /** | ||
| drain?: boolean; | ||
| /** Consumer identity to use when looking up the route to close; only needed for routes opened with a non-default consumer identity. */ | ||
| } | ||
| export interface ManagedCloseRouteOptions extends CloseRouteOptions { | ||
| /** Consumer identity used by the cached managed route. */ | ||
| consumerIdentity?: ConsumerIdentity | null; | ||
@@ -216,3 +239,3 @@ } | ||
| interface Pending { | ||
| channel: number; | ||
| handle: RouteHandle | null; | ||
| resolve: (frame: Frame) => void; | ||
@@ -227,2 +250,6 @@ reject: (err: Error) => void; | ||
| onSettle?: () => void; | ||
| /** Runs synchronously in dispatch before the response can settle its caller. */ | ||
| acceptFrame?: (frame: Frame) => boolean; | ||
| /** Retained only when a local route.open deadline wins. */ | ||
| onLateResponse?: (frame: Frame) => void; | ||
| } | ||
@@ -272,8 +299,7 @@ | ||
| consumerIdentity?: ConsumerIdentity; | ||
| channel: number | null; | ||
| generation: number; | ||
| opening: Promise<number> | null; | ||
| handle: RouteHandle | null; | ||
| opening: Promise<RouteHandle> | null; | ||
| /** | ||
| * Tombstone set by closeRoute. An in-flight openCachedRoute holds this exact | ||
| * object across its routeOpen await; if closeRoute flips this while the open is in | ||
| * Tombstone set by closeManagedRoute. An in-flight openCachedRoute holds this exact | ||
| * object across its routeOpen await; if closeManagedRoute flips this while the open is in | ||
| * flight, the open must NOT install its channel (it GOODBYEs the channel it opened | ||
@@ -290,3 +316,7 @@ * and yields RouteClosed) — so a close can never be resurrected by a racing reopen. | ||
| private readonly pending = new Map<string, Pending>(); | ||
| private readonly lateResponses = new Map<string, (frame: Frame) => void>(); | ||
| private readonly routes = new Map<string, CachedRoute>(); | ||
| private readonly liveRoutes = new Map<number, RouteHandle>(); | ||
| private connectionToken = newConnectionToken(); | ||
| private ingressEpochDropCount = 0; | ||
| private closedErr: Error | null = null; | ||
@@ -331,5 +361,6 @@ private closeStarted = false; | ||
| /** Open a route to a provider (channel-0 route.open); returns the route channel. */ | ||
| async routeOpen(target: RouteTarget, identity: BindIdentity, opts: RouteOpenOptions = {}): Promise<number> { | ||
| /** Open a route and return its connection-bound immutable handle. */ | ||
| async routeOpen(target: RouteTarget, identity: BindIdentity, opts: RouteOpenOptions = {}): Promise<RouteHandle> { | ||
| const consumerIdentity = routeOpenConsumerIdentity(opts); | ||
| const consumerCapabilities = opts.consumerCapabilities; | ||
| const body = this.encode({ | ||
@@ -340,16 +371,41 @@ op: "route.open", | ||
| ...(consumerIdentity ? { consumer_identity: consumerIdentity } : {}), | ||
| ...(consumerCapabilities !== undefined ? { consumer_capabilities: consumerCapabilities } : {}), | ||
| }); | ||
| const reply = await this.controlRpc(body); | ||
| const parsed = this.parseJson(reply) as { op: string; route_channel?: number }; | ||
| if (typeof parsed.route_channel !== "number") { | ||
| throw new SubcError(`route.open returned no route_channel: ${JSON.stringify(parsed)}`); | ||
| } | ||
| return parsed.route_channel; | ||
| let installed: RouteHandle | null = null; | ||
| const install = (frame: Frame): boolean => { | ||
| if (frame.header.ty !== FrameType.Response) return true; | ||
| const parsed = this.parseJson(frame) as { route_channel?: number; route_epoch?: number }; | ||
| if (typeof parsed.route_channel !== "number" || typeof parsed.route_epoch !== "number") { | ||
| throw new SubcError(`route.open returned no route handle: ${JSON.stringify(parsed)}`); | ||
| } | ||
| installed = this.installRoute(parsed.route_channel, parsed.route_epoch); | ||
| return true; | ||
| }; | ||
| const closeLateRoute = (frame: Frame): void => { | ||
| if (frame.header.ty !== FrameType.Response) return; | ||
| try { | ||
| const parsed = this.parseJson(frame) as { route_channel?: number; route_epoch?: number }; | ||
| if (typeof parsed.route_channel !== "number" || typeof parsed.route_epoch !== "number") return; | ||
| const lateHandle = this.installRoute(parsed.route_channel, parsed.route_epoch); | ||
| this.failHandle(lateHandle, new SubcError("late route.open was closed", "route_closed")); | ||
| this.liveRoutes.delete(lateHandle.channel); | ||
| this.sendRouteGoodbye(lateHandle, true); | ||
| } catch { | ||
| this.closeConnectionAfterCleanupFailure(); | ||
| } | ||
| }; | ||
| await this.controlRpc(body, install, closeLateRoute); | ||
| if (!installed) throw new SubcError("route.open response was not installed"); | ||
| return installed; | ||
| } | ||
| /** Send a data-plane request on a route channel and await its terminal reply. */ | ||
| async request(routeChannel: number, body: unknown, opts: RequestOptions = {}): Promise<unknown> { | ||
| /** Send a data-plane request on exactly the supplied route generation. */ | ||
| async request(handle: RouteHandle, body: unknown, opts: RequestOptions = {}): Promise<unknown> { | ||
| this.assertLiveHandle(handle); | ||
| const bytes = body instanceof Uint8Array ? body : this.encode(body); | ||
| const priority = opts.priority ?? Priority.Interactive; | ||
| const reply = await this.send(routeChannel, bytes, priority, opts.timeoutMs, opts.onProgress); | ||
| const admission = opts.admissionClass ?? AdmissionClass.Normal; | ||
| const reply = await this.send(handle, bytes, priority, admission, opts.timeoutMs, opts.onProgress); | ||
| return this.parseJson(reply); | ||
@@ -372,5 +428,5 @@ } | ||
| for (;;) { | ||
| const routeChannel = await this.cachedRouteChannel(moduleId, opts); | ||
| const routeHandle = await this.cachedRouteHandle(moduleId, opts); | ||
| try { | ||
| return (await this.managedRequest(routeChannel, body, opts)) as Response; | ||
| return (await this.managedRequest(routeHandle, body, opts)) as Response; | ||
| } catch (err) { | ||
@@ -385,3 +441,3 @@ if (!(err instanceof SubcCallError)) throw this.terminalCallError("managed call failed", err); | ||
| retriedUnknownChannel = true; | ||
| this.evictRouteChannel(routeChannel); | ||
| this.evictRouteHandle(routeHandle); | ||
| continue; | ||
@@ -409,11 +465,5 @@ } | ||
| /** | ||
| * Open a held-open event subscription on a route channel. Sends one Request the | ||
| * provider keeps open, delivering each interim StreamData frame to `onEvent`; the | ||
| * returned `closed` settles on the StreamEnd terminal (resolve) or an Error / route | ||
| * GOODBYE (reject). Events ride this held-open request's correlation id — they are | ||
| * never unsolicited, so they are not dropped. Call `unsubscribe()` to cancel. | ||
| */ | ||
| /** Open a held request on exactly one route generation. */ | ||
| subscribe( | ||
| routeChannel: number, | ||
| handle: RouteHandle, | ||
| body: unknown, | ||
@@ -423,6 +473,8 @@ onEvent: (event: Uint8Array) => void, | ||
| ): Subscription { | ||
| this.assertLiveHandle(handle); | ||
| const bytes = body instanceof Uint8Array ? body : this.encode(body); | ||
| const priority = opts.priority ?? Priority.Interactive; | ||
| const corr = this.nextCorr++; | ||
| const key = `${routeChannel}:${corr}`; | ||
| const admission = opts.admissionClass ?? AdmissionClass.Normal; | ||
| const corr = this.allocateCorr(); | ||
| const key = pendingKey(handle, corr); | ||
@@ -434,6 +486,4 @@ const closed = new Promise<void>((resolve, reject) => { | ||
| } | ||
| // No timeout: a subscription stays open indefinitely until StreamEnd, Error, | ||
| // route GOODBYE, or unsubscribe. | ||
| this.pending.set(key, { | ||
| channel: routeChannel, | ||
| handle, | ||
| resolve: () => resolve(), | ||
@@ -445,6 +495,13 @@ reject, | ||
| }); | ||
| const frame = buildFrame(FrameType.Request, buildFlags(false, priority, false), routeChannel, corr, bytes); | ||
| const frame = buildFrame( | ||
| FrameType.Request, | ||
| buildFlags(false, priority, false, admission), | ||
| handle.channel, | ||
| handle.epoch, | ||
| corr, | ||
| bytes, | ||
| ); | ||
| this.sock.write(encodeFrame(frame), Date.now() + DEFAULT_REQUEST_TIMEOUT_MS).catch((err) => { | ||
| const p = this.pending.get(key); | ||
| if (p) this.rejectPending(key, p, err instanceof Error ? err : new SubcError(String(err))); | ||
| const pending = this.pending.get(key); | ||
| if (pending) this.rejectPending(key, pending, err instanceof Error ? err : new SubcError(String(err))); | ||
| }); | ||
@@ -457,73 +514,73 @@ }); | ||
| cancelled = true; | ||
| // Pure-header Cancel on the held-open (channel, corr): the provider aborts its | ||
| // handler and ends with StreamEnd, which settles `closed`. | ||
| const cancel = buildFrame(FrameType.Cancel, buildFlags(false, priority, false), routeChannel, corr, EMPTY_BODY); | ||
| this.sock.write(encodeFrame(cancel), Date.now() + DEFAULT_REQUEST_TIMEOUT_MS).catch(() => { | ||
| // Best-effort: if the socket is already gone, the read loop fails the | ||
| // pending waiter and `closed` rejects on its own. | ||
| }); | ||
| this.cancel(handle, corr, priority); | ||
| }; | ||
| return { unsubscribe, closed }; | ||
| } | ||
| /** | ||
| * Tear down ONE managed route (a route opened via `call()`), keyed by its | ||
| * (target, identity). Idempotent and never throws — callers over-call on | ||
| * session-end. The teardown: | ||
| * - flips a tombstone on the cached route and removes it from the cache, so an | ||
| * in-flight `openCachedRoute` for the same key will NOT install its channel | ||
| * (the generation guard: close beats a racing reopen), and a later `call()` | ||
| * opens a fresh route (this is NOT a permanent tombstone); | ||
| * - settles in-flight requests on the channel as RouteClosed (managed requests | ||
| * keep their at-most-once classification: outcome_unknown if already sent, | ||
| * not_sent otherwise; subscriptions always abort); | ||
| * - sends a best-effort route GOODBYE so subc releases the route and notifies | ||
| * the module to free per-session resources. | ||
| * `opts.drain` waits for in-flight UNARY requests to settle before tearing down. | ||
| */ | ||
| async closeRoute( | ||
| /** Send a pure-header cancellation for an in-flight request. */ | ||
| cancel(handle: RouteHandle, corr: bigint, priority: Priority = Priority.Interactive): void { | ||
| this.assertLiveHandle(handle); | ||
| const cancel = buildFrame( | ||
| FrameType.Cancel, | ||
| buildFlags(false, priority, false), | ||
| handle.channel, | ||
| handle.epoch, | ||
| corr, | ||
| EMPTY_BODY, | ||
| ); | ||
| this.sock.write(encodeFrame(cancel), Date.now() + DEFAULT_REQUEST_TIMEOUT_MS).catch(() => undefined); | ||
| } | ||
| /** Poll status or liveness for exactly the supplied route generation. */ | ||
| async routePoll(handle: RouteHandle, kind: RoutePollKind): Promise<RoutePollResult> { | ||
| this.assertLiveHandle(handle); | ||
| const body = this.encode({ | ||
| op: "route.poll", | ||
| route_channel: handle.channel, | ||
| route_epoch: handle.epoch, | ||
| kind, | ||
| }); | ||
| const reply = await this.controlRpc(body, (frame) => { | ||
| if (frame.header.ty !== FrameType.Response) return true; | ||
| const parsed = this.parseJson(frame) as Partial<RoutePollResult>; | ||
| return parsed.route_channel === handle.channel && parsed.route_epoch === handle.epoch; | ||
| }); | ||
| return this.parseJson(reply) as RoutePollResult; | ||
| } | ||
| /** Tear down exactly the supplied route generation. */ | ||
| async closeRoute(handle: RouteHandle, opts: CloseRouteOptions = {}): Promise<void> { | ||
| this.assertLiveHandle(handle); | ||
| for (const [key, cached] of this.routes) { | ||
| if (cached.handle && sameRouteHandle(cached.handle, handle)) { | ||
| cached.closed = true; | ||
| cached.handle = null; | ||
| this.routes.delete(key); | ||
| } | ||
| } | ||
| if (opts.drain) await this.drainUnaryOnHandle(handle); | ||
| this.failHandle(handle, new SubcError("route closed by closeRoute", "route_closed")); | ||
| if (this.liveRoutes.get(handle.channel) === handle) this.liveRoutes.delete(handle.channel); | ||
| this.sendRouteGoodbye(handle); | ||
| } | ||
| /** Close a cached managed route by its route-open identity tuple. */ | ||
| async closeManagedRoute( | ||
| target: Extract<RouteTarget, { kind: ManagedRouteKind }>, | ||
| identity: BindIdentity, | ||
| opts: CloseRouteOptions = {}, | ||
| opts: ManagedCloseRouteOptions = {}, | ||
| ): Promise<void> { | ||
| const key = routeCacheKey(target, identity, routeOpenConsumerIdentity(opts)); | ||
| const cached = this.routes.get(key); | ||
| if (!cached) return; // never opened / already closed — idempotent no-op. | ||
| // Generation guard: an in-flight openCachedRoute holds this same object and | ||
| // re-checks `closed` before installing its channel, so flipping it here makes | ||
| // close win over a racing reopen. Removing the map entry lets a later call() | ||
| // create a fresh route for the key (not a permanent tombstone). | ||
| if (!cached) return; | ||
| cached.closed = true; | ||
| this.routes.delete(key); | ||
| const channel = cached.channel; | ||
| cached.channel = null; | ||
| // channel === null means the route was still opening (no channel installed yet); | ||
| // the racing open will see closed=true and GOODBYE whatever it opens, so there is | ||
| // nothing local to tear down here. | ||
| if (channel !== null) await this.closeRouteChannel(channel, opts); | ||
| const handle = cached.handle; | ||
| cached.handle = null; | ||
| if (handle) await this.closeRoute(handle, opts); | ||
| } | ||
| /** | ||
| * Tear down ONE route by its channel number — the primitive for callers that | ||
| * opened a route with `routeOpen` directly (e.g. a tool route carrying raw | ||
| * {name, arguments}) and hold the channel themselves. Idempotent, never throws. | ||
| * Settles in-flight requests on the channel as RouteClosed and sends a best-effort | ||
| * route GOODBYE. `opts.drain` awaits in-flight UNARY requests first; subscriptions | ||
| * are always aborted (a held-open stream cannot be drained). | ||
| */ | ||
| async closeRouteChannel(channel: number, opts: CloseRouteOptions = {}): Promise<void> { | ||
| if (channel === 0) return; // channel 0 is the control plane, never a route. | ||
| if (opts.drain) { | ||
| // Wait only for in-flight UNARY requests on this channel; subscriptions are | ||
| // aborted below (a held-open stream has no natural completion to drain to). | ||
| await this.drainUnaryOnChannel(channel); | ||
| } | ||
| // Settle anything still in flight on the channel (all of it in abort mode; only | ||
| // subscriptions + late stragglers after a drain). Managed requests are classified | ||
| // at-most-once via their classifyFailure; raw requests/subscriptions get a plain | ||
| // RouteClosed error. | ||
| this.failChannel(channel, new SubcError("route closed by closeRoute", "route_closed")); | ||
| // Best-effort GOODBYE: releases the route on the daemon and notifies the module. | ||
| this.sendRouteGoodbye(channel); | ||
| /** Alias retained for callers that name the operation by protocol channel; it still requires a full handle. */ | ||
| async closeRouteChannel(handle: RouteHandle, opts: CloseRouteOptions = {}): Promise<void> { | ||
| await this.closeRoute(handle, opts); | ||
| } | ||
@@ -537,13 +594,11 @@ | ||
| /** Resolve once every in-flight UNARY request on the channel (snapshot at call | ||
| * time) has settled. Subscriptions are excluded — they are aborted, not drained. */ | ||
| private drainUnaryOnChannel(channel: number): Promise<void> { | ||
| private drainUnaryOnHandle(handle: RouteHandle): Promise<void> { | ||
| const waiters: Promise<void>[] = []; | ||
| for (const pending of this.pending.values()) { | ||
| if (pending.channel === channel && !pending.subscription) { | ||
| if (pending.handle === handle && !pending.subscription) { | ||
| waiters.push( | ||
| new Promise<void>((resolve) => { | ||
| const prev = pending.onSettle; | ||
| const previous = pending.onSettle; | ||
| pending.onSettle = () => { | ||
| prev?.(); | ||
| previous?.(); | ||
| resolve(); | ||
@@ -558,9 +613,20 @@ }; | ||
| /** Send a best-effort header-only route GOODBYE for `channel`. One-way: the daemon | ||
| * releases the route and relays a route-gone GOODBYE to the module; no ack. */ | ||
| private sendRouteGoodbye(channel: number): void { | ||
| if (this.closedErr) return; // connection already gone — the route died with it. | ||
| const goodbye = buildFrame(FrameType.Goodbye, buildFlags(false, Priority.Interactive, false), channel, 0n, EMPTY_BODY); | ||
| this.sock.write(encodeFrame(goodbye), Date.now() + DEFAULT_REQUEST_TIMEOUT_MS).catch(() => { | ||
| // Best-effort: if the socket is already gone, the route is torn down anyway. | ||
| private sendRouteGoodbye(handle: RouteHandle, closeOnQueueFailure = false): void { | ||
| this.assertLiveConnection(handle); | ||
| if (this.closedErr) { | ||
| if (closeOnQueueFailure) this.closeConnectionAfterCleanupFailure(); | ||
| return; | ||
| } | ||
| const goodbye = buildFrame( | ||
| FrameType.Goodbye, | ||
| buildFlags(false, Priority.Interactive, false), | ||
| handle.channel, | ||
| handle.epoch, | ||
| 0n, | ||
| EMPTY_BODY, | ||
| ); | ||
| const write = this.sock.writeTracked(encodeFrame(goodbye), Date.now() + DEFAULT_REQUEST_TIMEOUT_MS); | ||
| if (!write.queued && closeOnQueueFailure) this.closeConnectionAfterCleanupFailure(); | ||
| write.completed.catch(() => { | ||
| if (closeOnQueueFailure && !write.queued) this.closeConnectionAfterCleanupFailure(); | ||
| }); | ||
@@ -583,18 +649,39 @@ } | ||
| private async controlRpc(body: Uint8Array): Promise<Frame> { | ||
| // Match the canonical probe: control requests go out Interactive on channel 0. | ||
| return this.send(0, body, Priority.Interactive, undefined, undefined); | ||
| private async controlRpc( | ||
| body: Uint8Array, | ||
| acceptFrame?: (frame: Frame) => boolean, | ||
| onLateResponse?: (frame: Frame) => void, | ||
| ): Promise<Frame> { | ||
| return this.send(null, body, Priority.Interactive, AdmissionClass.Normal, undefined, undefined, acceptFrame, onLateResponse); | ||
| } | ||
| private send( | ||
| channel: number, | ||
| handle: RouteHandle | null, | ||
| body: Uint8Array, | ||
| priority: Priority, | ||
| admission: AdmissionClass, | ||
| timeoutMs: number | undefined, | ||
| onProgress: ((body: Uint8Array) => void) | undefined, | ||
| acceptFrame?: (frame: Frame) => boolean, | ||
| onLateResponse?: (frame: Frame) => void, | ||
| ): Promise<Frame> { | ||
| if (handle) this.assertLiveHandle(handle); | ||
| if (this.closedErr) return Promise.reject(this.closedErr); | ||
| const corr = this.nextCorr++; | ||
| const key = `${channel}:${corr}`; | ||
| const frame = buildFrame(FrameType.Request, buildFlags(false, priority, false), channel, corr, body); | ||
| let corr: bigint; | ||
| try { | ||
| corr = this.allocateCorr(); | ||
| } catch (error) { | ||
| return Promise.reject(error); | ||
| } | ||
| const key = pendingKey(handle, corr); | ||
| const channel = handle?.channel ?? 0; | ||
| const epoch = handle?.epoch ?? 0; | ||
| const frame = buildFrame( | ||
| FrameType.Request, | ||
| buildFlags(false, priority, false, admission), | ||
| channel, | ||
| epoch, | ||
| corr, | ||
| body, | ||
| ); | ||
@@ -604,3 +691,3 @@ return new Promise<Frame>((resolve, reject) => { | ||
| const pending: Pending = { | ||
| channel, | ||
| handle, | ||
| resolve, | ||
@@ -610,10 +697,10 @@ reject, | ||
| timer: null, | ||
| acceptFrame, | ||
| onLateResponse, | ||
| }; | ||
| pending.timer = setTimeout(() => { | ||
| this.arbitrateTimeout(key, pending, channel, corr, ms); | ||
| }, ms); | ||
| pending.timer = setTimeout(() => this.arbitrateTimeout(key, pending, channel, corr, ms), ms); | ||
| this.pending.set(key, pending); | ||
| this.sock.write(encodeFrame(frame), Date.now() + ms).catch((err) => { | ||
| const p = this.pending.get(key); | ||
| if (p) this.rejectPending(key, p, err instanceof Error ? err : new SubcError(String(err))); | ||
| this.sock.write(encodeFrame(frame), Date.now() + ms).catch((error) => { | ||
| const current = this.pending.get(key); | ||
| if (current) this.rejectPending(key, current, error instanceof Error ? error : new SubcError(String(error))); | ||
| }); | ||
@@ -635,2 +722,3 @@ }); | ||
| const settleAsTimeout = (): void => { | ||
| if (pending.onLateResponse) this.lateResponses.set(key, pending.onLateResponse); | ||
| this.rejectPending( | ||
@@ -660,15 +748,12 @@ key, | ||
| private async managedRequest( | ||
| routeChannel: number, | ||
| body: unknown, | ||
| opts: ManagedCallOptions, | ||
| ): Promise<unknown> { | ||
| private async managedRequest(handle: RouteHandle, body: unknown, opts: ManagedCallOptions): Promise<unknown> { | ||
| const bytes = body instanceof Uint8Array ? body : this.encode(body); | ||
| const priority = opts.priority ?? Priority.Interactive; | ||
| const admission = opts.admissionClass ?? AdmissionClass.Normal; | ||
| try { | ||
| const reply = await this.sendManaged(routeChannel, bytes, priority, opts.timeoutMs, opts.onProgress); | ||
| const reply = await this.sendManaged(handle, bytes, priority, admission, opts.timeoutMs, opts.onProgress); | ||
| return this.parseJson(reply); | ||
| } catch (err) { | ||
| if (err instanceof SubcCallError) throw err; | ||
| throw this.terminalCallError("managed call failed", err); | ||
| } catch (error) { | ||
| if (error instanceof SubcCallError) throw error; | ||
| throw this.terminalCallError("managed call failed", error); | ||
| } | ||
@@ -678,39 +763,48 @@ } | ||
| private sendManaged( | ||
| channel: number, | ||
| handle: RouteHandle, | ||
| body: Uint8Array, | ||
| priority: Priority, | ||
| admission: AdmissionClass, | ||
| timeoutMs: number | undefined, | ||
| onProgress: ((body: Uint8Array) => void) | undefined, | ||
| ): Promise<Frame> { | ||
| try { | ||
| this.assertLiveHandle(handle); | ||
| } catch (error) { | ||
| return Promise.reject(this.notSentCallError("request used a stale route handle", error)); | ||
| } | ||
| if (this.closedErr) { | ||
| return Promise.reject(this.notSentCallError("request was not sent because the subc connection was already closed", this.closedErr)); | ||
| return Promise.reject( | ||
| this.notSentCallError("request was not sent because the subc connection was already closed", this.closedErr), | ||
| ); | ||
| } | ||
| const corr = this.nextCorr++; | ||
| const key = `${channel}:${corr}`; | ||
| const frame = buildFrame(FrameType.Request, buildFlags(false, priority, false), channel, corr, body); | ||
| let corr: bigint; | ||
| try { | ||
| corr = this.allocateCorr(); | ||
| } catch (error) { | ||
| return Promise.reject(this.notSentCallError("request correlation allocator was exhausted", error)); | ||
| } | ||
| const key = pendingKey(handle, corr); | ||
| const frame = buildFrame( | ||
| FrameType.Request, | ||
| buildFlags(false, priority, false, admission), | ||
| handle.channel, | ||
| handle.epoch, | ||
| corr, | ||
| body, | ||
| ); | ||
| let handedToSocket = false; | ||
| const classifyFailure = (err: Error): SubcCallError => { | ||
| // This is the load-bearing asymmetry: only the pre-write paths are NotSent. | ||
| // As soon as writeTracked reports that bytes were queued to Node's socket, | ||
| // those bytes may already be in the OS buffer or at the daemon. Any later | ||
| // close, write callback error, route GOODBYE, or timeout before a response is | ||
| // therefore OutcomeUnknown to avoid an unsafe double-mutation retry. | ||
| if (!handedToSocket) { | ||
| return this.notSentCallError("request bytes were not queued to the subc socket", err); | ||
| } | ||
| // A request-deadline timeout (arbitration expired without observing a drop) | ||
| // is refined from a real connection drop: the socket was NOT seen to fail, so | ||
| // the caller can skip a was-it-even-sent recovery path. Still outcome_unknown | ||
| // — queued-to-local-socket is not proof the daemon received or ran it. | ||
| if (err instanceof SubcError && err.code === REQUEST_DEADLINE_MARKER) { | ||
| const classifyFailure = (error: Error): SubcCallError => { | ||
| if (!handedToSocket) return this.notSentCallError("request bytes were not queued to the subc socket", error); | ||
| if (error instanceof SubcError && error.code === REQUEST_DEADLINE_MARKER) { | ||
| return new SubcCallError( | ||
| "outcome_unknown", | ||
| `managed call deadline exceeded after request bytes were queued to the local socket; no terminal response was observed; outcome unknown${causeMessage(err)}`, | ||
| `managed call deadline exceeded after request bytes were queued to the local socket; no terminal response was observed; outcome unknown${causeMessage(error)}`, | ||
| DEADLINE_NO_DROP_CODE, | ||
| err, | ||
| error, | ||
| ); | ||
| } | ||
| return this.outcomeUnknownCallError("connection dropped before the managed call returned a response", err); | ||
| return this.outcomeUnknownCallError("connection dropped before the managed call returned a response", error); | ||
| }; | ||
@@ -721,3 +815,3 @@ | ||
| const pending: Pending = { | ||
| channel, | ||
| handle, | ||
| resolve, | ||
@@ -729,12 +823,9 @@ reject, | ||
| }; | ||
| pending.timer = setTimeout(() => { | ||
| this.arbitrateTimeout(key, pending, channel, corr, ms); | ||
| }, ms); | ||
| pending.timer = setTimeout(() => this.arbitrateTimeout(key, pending, handle.channel, corr, ms), ms); | ||
| this.pending.set(key, pending); | ||
| const write = this.sock.writeTracked(encodeFrame(frame), Date.now() + ms); | ||
| handedToSocket = write.queued; | ||
| write.completed.catch((err) => { | ||
| const p = this.pending.get(key); | ||
| if (p) this.rejectPending(key, p, err instanceof Error ? err : new SubcError(String(err))); | ||
| write.completed.catch((error) => { | ||
| const current = this.pending.get(key); | ||
| if (current) this.rejectPending(key, current, error instanceof Error ? error : new SubcError(String(error))); | ||
| }); | ||
@@ -744,3 +835,3 @@ }); | ||
| private async cachedRouteChannel(moduleId: string, opts: ManagedCallOptions): Promise<number> { | ||
| private async cachedRouteHandle(moduleId: string, opts: ManagedCallOptions): Promise<RouteHandle> { | ||
| const identity = opts.identity ?? this.opts.identity; | ||
@@ -754,3 +845,2 @@ if (!identity) { | ||
| } | ||
| const target = { kind: opts.targetKind ?? this.opts.targetKind, module_id: moduleId } as Extract< | ||
@@ -770,4 +860,3 @@ RouteTarget, | ||
| consumerIdentity, | ||
| channel: null, | ||
| generation: 0, | ||
| handle: null, | ||
| opening: null, | ||
@@ -777,6 +866,3 @@ }; | ||
| } | ||
| if (cached.channel !== null && cached.generation === this.generation && !this.closedErr) { | ||
| return cached.channel; | ||
| } | ||
| if (cached.handle && this.isLiveHandle(cached.handle)) return cached.handle; | ||
| if (!cached.opening) { | ||
@@ -790,3 +876,3 @@ cached.opening = this.openCachedRoute(cached).finally(() => { | ||
| private async openCachedRoute(cached: CachedRoute): Promise<number> { | ||
| private async openCachedRoute(cached: CachedRoute): Promise<RouteHandle> { | ||
| const routeRetryDeadline = Date.now() + ROUTE_OPEN_RETRY_DEADLINE_MS; | ||
@@ -799,43 +885,29 @@ let routeRetryDelay = this.opts.reconnectBackoff.baseMs; | ||
| await this.ensureConnectedForManaged(); | ||
| } catch (err) { | ||
| throw this.notSentRecoveryError("route.open could not run because reconnect failed", err); | ||
| } catch (error) { | ||
| throw this.notSentRecoveryError("route.open could not run because reconnect failed", error); | ||
| } | ||
| if (cached.handle && this.isLiveHandle(cached.handle)) return cached.handle; | ||
| if (cached.channel !== null && cached.generation === this.generation && !this.closedErr) { | ||
| return cached.channel; | ||
| } | ||
| try { | ||
| const channel = await this.routeOpen(cached.target, cached.identity, { | ||
| const handle = await this.routeOpen(cached.target, cached.identity, { | ||
| consumerIdentity: cached.consumerIdentity ?? null, | ||
| }); | ||
| // Generation guard: a closeRoute may have flipped the tombstone WHILE this | ||
| // route.open was in flight. If so, close wins — do NOT install the channel | ||
| // into the (already-removed) cache entry; GOODBYE the channel we just opened | ||
| // so the daemon/module don't leak it, and fail as RouteClosed. | ||
| if (cached.closed) { | ||
| this.sendRouteGoodbye(channel); | ||
| this.liveRoutes.delete(handle.channel); | ||
| this.sendRouteGoodbye(handle); | ||
| throw this.routeClosedDuringOpen(); | ||
| } | ||
| cached.channel = channel; | ||
| cached.generation = this.generation; | ||
| return channel; | ||
| } catch (err) { | ||
| if (err instanceof SubcCallError && err.code === "route_closed") throw err; | ||
| if (!this.closeStarted && isConsumerReconnectTransient(err)) { | ||
| cached.handle = handle; | ||
| return handle; | ||
| } catch (error) { | ||
| if (error instanceof SubcCallError && error.code === "route_closed") throw error; | ||
| if (!this.closeStarted && isConsumerReconnectTransient(error)) { | ||
| try { | ||
| await this.reconnectAfterDrop(err); | ||
| } catch (reconnectErr) { | ||
| throw this.notSentRecoveryError("route.open was not sent and reconnect failed", reconnectErr); | ||
| await this.reconnectAfterDrop(error); | ||
| } catch (reconnectError) { | ||
| throw this.notSentRecoveryError("route.open was not sent and reconnect failed", reconnectError); | ||
| } | ||
| continue; | ||
| } | ||
| // A daemon-rejected route.open with a RETRYABLE code (target booting / | ||
| // reloading / momentarily absent) is retried IN-PLACE against the same live | ||
| // connection — never a socket reconnect, which would needlessly disrupt this | ||
| // connection's other routes — until the route-retry deadline. Past the | ||
| // deadline it surfaces as not_sent: provably pre-send (no data frame ever | ||
| // left the client) AND still transient, so the caller's own retry policy may | ||
| // safely re-attempt later. Reason and set kept in parity with subc-client-rs. | ||
| if (!this.closeStarted && err instanceof SubcError && isRetryableRouteOpenCode(err.code)) { | ||
| if (!this.closeStarted && error instanceof SubcError && isRetryableRouteOpenCode(error.code)) { | ||
| routeRetryAttempt += 1; | ||
@@ -848,11 +920,7 @@ if (routeRetryAttempt < this.opts.reconnectBackoff.maxAttempts && Date.now() < routeRetryDeadline) { | ||
| throw this.notSentCallError( | ||
| `route.open failed for module ${cached.moduleId}: ${err.code} (retry budget exhausted)`, | ||
| err, | ||
| `route.open failed for module ${cached.moduleId}: ${error.code} (retry budget exhausted)`, | ||
| error, | ||
| ); | ||
| } | ||
| // A permanent route.open rejection (bad_consumer_identity, config_divergence, | ||
| // unknown_target, ...) is pre-send but would never succeed on retry, so it | ||
| // stays terminal — a not_sent class here would invite a retry storm against a | ||
| // request the daemon will always reject. | ||
| throw this.terminalCallError(`route.open failed for module ${cached.moduleId}`, err); | ||
| throw this.terminalCallError(`route.open failed for module ${cached.moduleId}`, error); | ||
| } | ||
@@ -932,2 +1000,6 @@ } | ||
| this.generation += 1; | ||
| this.connectionToken = newConnectionToken(); | ||
| this.liveRoutes.clear(); | ||
| this.lateResponses.clear(); | ||
| this.nextCorr = 1n; | ||
| void this.readLoop(opened.sock, this.generation); | ||
@@ -937,25 +1009,14 @@ } | ||
| private async reopenCachedRoutes(): Promise<void> { | ||
| for (const cached of this.routes.values()) cached.handle = null; | ||
| for (const cached of this.routes.values()) { | ||
| cached.channel = null; | ||
| cached.generation = 0; | ||
| } | ||
| for (const cached of this.routes.values()) { | ||
| if (cached.closed) continue; // closed concurrently with reconnect — don't reopen. | ||
| // Thread the route's consumer identity through the reopen, exactly as the | ||
| // lazy per-call path (openCachedRoute) does. Dropping it here would make a | ||
| // route reopened after a reconnect send route.open with no consumer_identity, | ||
| // so the daemon would re-stamp it with a different (weaker) principal than the | ||
| // one it was originally bound under — a silent post-reconnect trust downgrade. | ||
| const channel = await this.routeOpen(cached.target, cached.identity, { | ||
| if (cached.closed) continue; | ||
| const handle = await this.routeOpen(cached.target, cached.identity, { | ||
| consumerIdentity: cached.consumerIdentity ?? null, | ||
| }); | ||
| // A closeRoute may have raced this reopen (flipping the tombstone during the | ||
| // route.open await). If so, GOODBYE the channel instead of installing it, so the | ||
| // closed route isn't silently re-established on the new connection. | ||
| if (cached.closed) { | ||
| this.sendRouteGoodbye(channel); | ||
| this.liveRoutes.delete(handle.channel); | ||
| this.sendRouteGoodbye(handle); | ||
| continue; | ||
| } | ||
| cached.channel = channel; | ||
| cached.generation = this.generation; | ||
| cached.handle = handle; | ||
| } | ||
@@ -981,22 +1042,12 @@ } | ||
| for (;;) { | ||
| // Header read waits indefinitely — idle time between frames is normal, and | ||
| // the reader is NOT "active" while parked here (a racing timeout must not | ||
| // grant grace just because the connection is idle between frames). | ||
| const headerBytes = await sock.readExact(HEADER_LEN, Number.POSITIVE_INFINITY); | ||
| // A frame is now arriving. Mark the reader active THROUGH dispatch so a | ||
| // timeout that fires mid-arrival grants the reply its bounded grace window | ||
| // instead of settling as a spurious timeout. | ||
| this.readerActive = true; | ||
| this.readerActive = false; | ||
| const frame = await sock.readFrame( | ||
| Number.POSITIVE_INFINITY, | ||
| Date.now() + BODY_READ_TIMEOUT_MS, | ||
| () => { | ||
| this.readerActive = true; | ||
| }, | ||
| ); | ||
| try { | ||
| const header = decodeHeader(headerBytes); | ||
| const body = | ||
| header.len === 0 | ||
| ? new Uint8Array(0) | ||
| : await sock.readExact(header.len, Date.now() + BODY_READ_TIMEOUT_MS); | ||
| // Drop a frame read off a socket this client has already replaced | ||
| // (reconnect): its pendings were settled by fail(), and dispatching it | ||
| // against the current pending map could match a re-used (channel, corr). | ||
| if (this.sock === sock && this.generation === generation) { | ||
| this.dispatch({ header, body }); | ||
| } | ||
| if (this.sock === sock && this.generation === generation) this.dispatch(frame); | ||
| } finally { | ||
@@ -1006,5 +1057,5 @@ this.readerActive = false; | ||
| } | ||
| } catch (err) { | ||
| } catch (error) { | ||
| if (this.sock === sock && this.generation === generation) { | ||
| this.fail(err instanceof Error ? err : new SubcError(String(err))); | ||
| this.fail(error instanceof Error ? error : new SubcError(String(error))); | ||
| } | ||
@@ -1015,5 +1066,15 @@ } | ||
| private dispatch(frame: Frame): void { | ||
| const key = `${frame.header.channel}:${frame.header.corr}`; | ||
| let handle: RouteHandle | null = null; | ||
| if (frame.header.channel !== 0) { | ||
| handle = this.liveRoutes.get(frame.header.channel) ?? null; | ||
| if (!handle || handle.epoch !== frame.header.epoch) { | ||
| this.ingressEpochDropCount += 1; | ||
| return; | ||
| } | ||
| } | ||
| const key = pendingKey(handle, frame.header.corr); | ||
| const pending = this.pending.get(key); | ||
| if (pending) { | ||
| if (pending.acceptFrame && !pending.acceptFrame(frame)) return; | ||
| switch (frame.header.ty) { | ||
@@ -1035,16 +1096,16 @@ case FrameType.Push: | ||
| } | ||
| if (frame.header.ty === FrameType.Goodbye) { | ||
| this.failChannel(frame.header.channel, new SubcError("route closed by subc (GOODBYE)")); | ||
| // The route is gone daemon-side (module restart, drain, or provider close). | ||
| // Evict the cached bind so the NEXT managed call re-opens instead of | ||
| // resending into the dead channel and dying on a terminal unknown_channel. | ||
| this.evictRouteChannel(frame.header.channel); | ||
| const late = this.lateResponses.get(key); | ||
| if (late && (frame.header.ty === FrameType.Response || frame.header.ty === FrameType.Error)) { | ||
| this.lateResponses.delete(key); | ||
| late(frame); | ||
| return; | ||
| } | ||
| // A terminal frame (Response/Error/StreamEnd) with no waiter is almost always | ||
| // a reply that arrived AFTER its request already settled — the fingerprint of a | ||
| // premature timeout under event-loop starvation (the reply raced the deadline | ||
| // and lost). Metadata-only debug log (never the body) so every future | ||
| // occurrence is a one-line diagnosis instead of an invisible drop. Enable with | ||
| // NODE_DEBUG=subc-client. | ||
| if (frame.header.ty === FrameType.Goodbye && handle) { | ||
| this.failHandle(handle, new SubcError("route closed by subc (GOODBYE)")); | ||
| if (this.liveRoutes.get(handle.channel) === handle) this.liveRoutes.delete(handle.channel); | ||
| this.evictRouteHandle(handle); | ||
| return; | ||
| } | ||
| if ( | ||
@@ -1056,12 +1117,10 @@ frame.header.ty === FrameType.Response || | ||
| debug( | ||
| "dropped terminal frame with no waiter: type=%d channel=%d corr=%s port=%s", | ||
| "dropped terminal frame with no waiter: type=%d channel=%d epoch=%d corr=%s port=%s", | ||
| frame.header.ty, | ||
| frame.header.channel, | ||
| frame.header.epoch, | ||
| frame.header.corr, | ||
| this.sock.localPort() ?? "?", | ||
| ); | ||
| return; | ||
| } | ||
| // Unmatched Push or stray frame: no registered waiter. Drop it — v1 has no | ||
| // unsolicited-push consumers. | ||
| } | ||
@@ -1103,21 +1162,11 @@ | ||
| /** | ||
| * Drop a dead channel from the managed-route cache so the next call re-opens. | ||
| * Only clears entries still pointing at THIS channel in the CURRENT socket | ||
| * generation; a route already re-opened (new channel) or re-created after a | ||
| * reconnect (new generation) is left alone. | ||
| */ | ||
| private evictRouteChannel(channel: number): void { | ||
| private evictRouteHandle(handle: RouteHandle): void { | ||
| for (const cached of this.routes.values()) { | ||
| if (cached.channel === channel && cached.generation === this.generation) { | ||
| cached.channel = null; | ||
| } | ||
| if (cached.handle && sameRouteHandle(cached.handle, handle)) cached.handle = null; | ||
| } | ||
| } | ||
| private failChannel(channel: number, err: Error): void { | ||
| private failHandle(handle: RouteHandle, error: Error): void { | ||
| for (const [key, pending] of this.pending) { | ||
| if (pending.channel === channel) { | ||
| this.rejectPending(key, pending, err); | ||
| } | ||
| if (pending.handle && sameRouteHandle(pending.handle, handle)) this.rejectPending(key, pending, error); | ||
| } | ||
@@ -1152,2 +1201,46 @@ } | ||
| /** Number of nonzero-channel ingress frames dropped by endpoint epoch validation. */ | ||
| get droppedIngressFrames(): number { | ||
| return this.ingressEpochDropCount; | ||
| } | ||
| private installRoute(channel: number, epoch: number): RouteHandle { | ||
| const handle = createRouteHandle(channel, epoch, this.connectionToken); | ||
| this.liveRoutes.set(channel, handle); | ||
| return handle; | ||
| } | ||
| private isLiveHandle(handle: RouteHandle): boolean { | ||
| return belongsToConnection(handle, this.connectionToken) && this.liveRoutes.get(handle.channel) === handle; | ||
| } | ||
| private assertLiveConnection(handle: RouteHandle): void { | ||
| if (!belongsToConnection(handle, this.connectionToken)) throw new StaleRouteHandleError(handle); | ||
| } | ||
| private assertLiveHandle(handle: RouteHandle): void { | ||
| if (!this.isLiveHandle(handle)) throw new StaleRouteHandleError(handle); | ||
| } | ||
| private allocateCorr(): bigint { | ||
| const maximum = 0xffff_ffff_ffff_ffffn; | ||
| if (this.nextCorr > maximum) { | ||
| const error = new SubcError("channel-0 correlation id allocator exhausted", "corr_exhausted"); | ||
| this.fail(error); | ||
| this.sock.close(); | ||
| this.scheduleReconnectAfterDrop(error); | ||
| throw error; | ||
| } | ||
| const corr = this.nextCorr; | ||
| this.nextCorr += 1n; | ||
| return corr; | ||
| } | ||
| private closeConnectionAfterCleanupFailure(): void { | ||
| const error = new SubcError("late route cleanup could not be queued", "late_route_cleanup_failed"); | ||
| this.fail(error); | ||
| this.sock.close(); | ||
| this.scheduleReconnectAfterDrop(error); | ||
| } | ||
| private encode(value: unknown): Uint8Array { | ||
@@ -1255,1 +1348,5 @@ return new Uint8Array(Buffer.from(JSON.stringify(value), "utf8")); | ||
| } | ||
| function pendingKey(handle: RouteHandle | null, corr: bigint): string { | ||
| return handle ? `${handle.channel}:${handle.epoch}:${corr}` : `0:0:${corr}`; | ||
| } |
+135
-73
@@ -1,8 +0,7 @@ | ||
| // Byte-for-byte port of subc-protocol's 17-byte envelope header. | ||
| // Source of truth: crates/subc-protocol/src/lib.rs. Keep field offsets, the | ||
| // little-endian encoding, and the frame-type/flag numbering in lock-step with | ||
| // the Rust; a one-byte drift here desynchronizes every frame on the wire. | ||
| // Byte-for-byte port of subc-protocol's fixed envelope header. | ||
| // Source of truth: crates/subc-protocol/src/lib.rs. Keep field offsets, little- | ||
| // endian encoding, and frame/flag numbering in lock-step with Rust. | ||
| export const PROTOCOL_VERSION = 1; | ||
| export const HEADER_LEN = 17; | ||
| export const PROTOCOL_VERSION = 2; | ||
| export const HEADER_LEN = 21; | ||
| export const FROZEN_PREFIX_LEN = 5; | ||
@@ -31,8 +30,3 @@ export const MAX_FRAME_BODY_LEN = 64 * 1024 * 1024; | ||
| export function isPureHeader(ty: FrameType): boolean { | ||
| return ( | ||
| ty === FrameType.Cancel || | ||
| ty === FrameType.Ping || | ||
| ty === FrameType.Pong || | ||
| ty === FrameType.Goodbye | ||
| ); | ||
| return ty === FrameType.Cancel || ty === FrameType.Ping || ty === FrameType.Pong || ty === FrameType.Goodbye; | ||
| } | ||
@@ -47,17 +41,36 @@ | ||
| const FLAG_BINARY = 0b0000_0001; // bit 0 | ||
| const FLAG_PRIORITY_MASK = 0b0000_0110; // bits 1-2 | ||
| /** Admission behavior carried in flags bits 4-5. */ | ||
| export enum AdmissionClass { | ||
| Normal = 0, | ||
| Expedite = 1, | ||
| Sheddable = 2, | ||
| } | ||
| const FLAG_BINARY = 0b0000_0001; | ||
| const FLAG_PRIORITY_MASK = 0b0000_0110; | ||
| const FLAG_PRIORITY_SHIFT = 1; | ||
| const FLAG_LAST = 0b0000_1000; // bit 3 | ||
| const FLAG_RESERVED_MASK = 0b1111_0000; // bits 4-7 must be zero | ||
| const FLAG_LAST = 0b0000_1000; | ||
| const FLAG_ADMISSION_MASK = 0b0011_0000; | ||
| const FLAG_ADMISSION_SHIFT = 4; | ||
| const FLAG_RESERVED_MASK = 0b1100_0000; | ||
| /** Build the flags byte from typed components (mirrors Flags::new). */ | ||
| export function buildFlags(binary: boolean, priority: Priority, last: boolean): number { | ||
| let b = 0; | ||
| if (binary) b |= FLAG_BINARY; | ||
| b |= priority << FLAG_PRIORITY_SHIFT; | ||
| if (last) b |= FLAG_LAST; | ||
| return b; | ||
| /** Build flags from typed components. Admission defaults to NORMAL. */ | ||
| export function buildFlags( | ||
| binary: boolean, | ||
| priority: Priority, | ||
| last: boolean, | ||
| admissionClass: AdmissionClass = AdmissionClass.Normal, | ||
| ): number { | ||
| let flags = 0; | ||
| if (binary) flags |= FLAG_BINARY; | ||
| flags |= priority << FLAG_PRIORITY_SHIFT; | ||
| if (last) flags |= FLAG_LAST; | ||
| flags |= admissionClass << FLAG_ADMISSION_SHIFT; | ||
| return flags; | ||
| } | ||
| export function admissionClass(flags: number): AdmissionClass { | ||
| return ((flags & FLAG_ADMISSION_MASK) >> FLAG_ADMISSION_SHIFT) as AdmissionClass; | ||
| } | ||
| export interface EnvelopeHeader { | ||
@@ -69,2 +82,3 @@ len: number; | ||
| channel: number; | ||
| epoch: number; | ||
| corr: bigint; | ||
@@ -78,57 +92,101 @@ } | ||
| /** Serialize a header to its fixed 17-byte little-endian form. */ | ||
| export function encodeHeader(h: EnvelopeHeader): Uint8Array { | ||
| const buf = new Uint8Array(HEADER_LEN); | ||
| const view = new DataView(buf.buffer); | ||
| view.setUint32(0, h.len, true); | ||
| buf[4] = h.ver; | ||
| buf[5] = h.ty; | ||
| buf[6] = h.flags; | ||
| view.setUint16(7, h.channel, true); | ||
| view.setBigUint64(9, h.corr, true); | ||
| return buf; | ||
| /** Serialize a header to its fixed 21-byte little-endian form. */ | ||
| export function encodeHeader(header: EnvelopeHeader): Uint8Array { | ||
| const buffer = new Uint8Array(HEADER_LEN); | ||
| const view = new DataView(buffer.buffer); | ||
| view.setUint32(0, header.len, true); | ||
| buffer[4] = header.ver; | ||
| buffer[5] = header.ty; | ||
| buffer[6] = header.flags; | ||
| view.setUint16(7, header.channel, true); | ||
| view.setUint32(9, header.epoch, true); | ||
| view.setBigUint64(13, header.corr, true); | ||
| return buffer; | ||
| } | ||
| export class DecodeError extends Error {} | ||
| export type DecodeErrorCode = | ||
| | "too_short_for_prefix" | ||
| | "unsupported_version" | ||
| | "too_short_for_header" | ||
| | "unknown_frame_type" | ||
| | "reserved_flag_bits" | ||
| | "reserved_priority_bits" | ||
| | "reserved_admission_class" | ||
| | "sheddable_illegal_frame_type" | ||
| | "nonzero_epoch_on_control_channel" | ||
| | "pure_header_frame_with_body" | ||
| | "frame_body_too_large" | ||
| | "frame_length_mismatch"; | ||
| /** | ||
| * Decode a header from the front of `bytes`, following the frozen-prefix | ||
| * discipline: need 5 bytes for len+ver, dispatch full header length on ver, | ||
| * then validate. Mirrors decode_header — never throws on a structurally short | ||
| * buffer beyond the typed DecodeError. | ||
| */ | ||
| /** Typed envelope decode failure mirroring the Rust wire taxonomy. */ | ||
| export class DecodeError extends Error { | ||
| constructor(message: string, readonly code: DecodeErrorCode) { | ||
| super(message); | ||
| this.name = "DecodeError"; | ||
| } | ||
| } | ||
| /** Decode and validate a header from the front of `bytes`. */ | ||
| export function decodeHeader(bytes: Uint8Array): EnvelopeHeader { | ||
| if (bytes.length < FROZEN_PREFIX_LEN) { | ||
| throw new DecodeError(`header shorter than frozen prefix: have ${bytes.length} bytes`); | ||
| throw new DecodeError(`header shorter than frozen prefix: have ${bytes.length} bytes`, "too_short_for_prefix"); | ||
| } | ||
| const ver = bytes[4]!; | ||
| if (ver !== PROTOCOL_VERSION) { | ||
| throw new DecodeError(`unsupported envelope version ${ver}`); | ||
| } | ||
| if (ver !== PROTOCOL_VERSION) throw new DecodeError(`unsupported envelope version ${ver}`, "unsupported_version"); | ||
| if (bytes.length < HEADER_LEN) { | ||
| throw new DecodeError(`header too short for version: have ${bytes.length} bytes, need ${HEADER_LEN}`); | ||
| throw new DecodeError( | ||
| `header too short for version: have ${bytes.length} bytes, need ${HEADER_LEN}`, | ||
| "too_short_for_header", | ||
| ); | ||
| } | ||
| const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength); | ||
| const len = view.getUint32(0, true); | ||
| const tyByte = bytes[5]!; | ||
| if (tyByte > FRAME_TYPE_MAX) { | ||
| throw new DecodeError(`unknown frame type byte ${tyByte}`); | ||
| } | ||
| const ty = tyByte as FrameType; | ||
| const typeByte = bytes[5]!; | ||
| if (typeByte > FRAME_TYPE_MAX) throw new DecodeError(`unknown frame type byte ${typeByte}`, "unknown_frame_type"); | ||
| const ty = typeByte as FrameType; | ||
| const flags = bytes[6]!; | ||
| if ((flags & FLAG_RESERVED_MASK) !== 0) { | ||
| throw new DecodeError(`reserved flag bits set in flags 0b${flags.toString(2)}`); | ||
| throw new DecodeError( | ||
| `reserved flag bits set in flags 0b${flags.toString(2).padStart(8, "0")}`, | ||
| "reserved_flag_bits", | ||
| ); | ||
| } | ||
| if (((flags & FLAG_PRIORITY_MASK) >> FLAG_PRIORITY_SHIFT) === 0b11) { | ||
| throw new DecodeError(`reserved priority bits set in flags 0b${flags.toString(2)}`); | ||
| throw new DecodeError( | ||
| `reserved priority bits set in flags 0b${flags.toString(2).padStart(8, "0")}`, | ||
| "reserved_priority_bits", | ||
| ); | ||
| } | ||
| const admission = (flags & FLAG_ADMISSION_MASK) >> FLAG_ADMISSION_SHIFT; | ||
| if (admission === 0b11) { | ||
| throw new DecodeError( | ||
| `reserved admission class set in flags 0b${flags.toString(2).padStart(8, "0")}`, | ||
| "reserved_admission_class", | ||
| ); | ||
| } | ||
| if (admission === AdmissionClass.Sheddable && ty !== FrameType.Push && ty !== FrameType.StreamData) { | ||
| throw new DecodeError( | ||
| `SHEDDABLE admission class is illegal on ${FrameType[ty]} in flags 0b${flags.toString(2).padStart(8, "0")}`, | ||
| "sheddable_illegal_frame_type", | ||
| ); | ||
| } | ||
| const channel = view.getUint16(7, true); | ||
| const epoch = view.getUint32(9, true); | ||
| if (channel === 0 && epoch !== 0) { | ||
| throw new DecodeError( | ||
| `control channel carried nonzero epoch ${epoch}`, | ||
| "nonzero_epoch_on_control_channel", | ||
| ); | ||
| } | ||
| if (isPureHeader(ty) && len !== 0) { | ||
| throw new DecodeError(`pure-header frame ${FrameType[ty]} declared non-zero body length ${len}`); | ||
| throw new DecodeError( | ||
| `pure-header frame ${FrameType[ty]} declared non-zero body length ${len}`, | ||
| "pure_header_frame_with_body", | ||
| ); | ||
| } | ||
| const channel = view.getUint16(7, true); | ||
| const corr = view.getBigUint64(9, true); | ||
| return { len, ver, ty, flags, channel, corr }; | ||
| return { len, ver, ty, flags, channel, epoch, corr: view.getBigUint64(13, true) }; | ||
| } | ||
| /** Build a full current-version frame, enforcing the body-length cap and the pure-header rule. */ | ||
| /** Build a current-version frame and validate its complete header. */ | ||
| export function buildFrame( | ||
@@ -138,9 +196,10 @@ ty: FrameType, | ||
| channel: number, | ||
| epoch: number, | ||
| corr: bigint, | ||
| body: Uint8Array, | ||
| ): Frame { | ||
| return buildFrameWithVersion(PROTOCOL_VERSION, ty, flags, channel, corr, body); | ||
| return buildFrameWithVersion(PROTOCOL_VERSION, ty, flags, channel, epoch, corr, body); | ||
| } | ||
| /** Build a full frame while preserving a peer-negotiated envelope version. */ | ||
| /** Build a frame while preserving the peer's exact supported version. */ | ||
| export function buildFrameWithVersion( | ||
@@ -151,2 +210,3 @@ ver: number, | ||
| channel: number, | ||
| epoch: number, | ||
| corr: bigint, | ||
@@ -156,20 +216,22 @@ body: Uint8Array, | ||
| if (body.length > MAX_FRAME_BODY_LEN) { | ||
| throw new DecodeError(`frame body ${body.length} exceeds max ${MAX_FRAME_BODY_LEN}`); | ||
| throw new DecodeError(`frame body ${body.length} exceeds max ${MAX_FRAME_BODY_LEN}`, "frame_body_too_large"); | ||
| } | ||
| if (isPureHeader(ty) && body.length !== 0) { | ||
| throw new DecodeError(`pure-header frame ${FrameType[ty]} cannot carry a body`); | ||
| } | ||
| return { | ||
| header: { len: body.length, ver, ty, flags, channel, corr }, | ||
| body, | ||
| }; | ||
| const header = { len: body.length, ver, ty, flags, channel, epoch, corr }; | ||
| decodeHeader(encodeHeader(header)); | ||
| return { header, body }; | ||
| } | ||
| /** Encode a frame to wire bytes: 17-byte header followed by `len` body bytes. */ | ||
| /** Encode a frame to wire bytes: header followed by exactly `len` body bytes. */ | ||
| export function encodeFrame(frame: Frame): Uint8Array { | ||
| if (frame.header.len !== frame.body.length) { | ||
| throw new DecodeError( | ||
| `frame header length ${frame.header.len} does not match body length ${frame.body.length}`, | ||
| "frame_length_mismatch", | ||
| ); | ||
| } | ||
| const header = encodeHeader(frame.header); | ||
| const out = new Uint8Array(header.length + frame.body.length); | ||
| out.set(header, 0); | ||
| out.set(frame.body, header.length); | ||
| return out; | ||
| const output = new Uint8Array(header.length + frame.body.length); | ||
| output.set(header, 0); | ||
| output.set(frame.body, header.length); | ||
| return output; | ||
| } |
+7
-0
@@ -24,3 +24,7 @@ export { | ||
| type CloseRouteOptions, | ||
| type ManagedCloseRouteOptions, | ||
| type RoutePollKind, | ||
| type RoutePollResult, | ||
| } from "./client.js"; | ||
| export { RouteHandle, StaleRouteHandleError } from "./route-handle.js"; | ||
| export { | ||
@@ -35,2 +39,3 @@ readConnectionFile, | ||
| Priority, | ||
| AdmissionClass, | ||
| PROTOCOL_VERSION, | ||
@@ -45,2 +50,3 @@ HEADER_LEN, | ||
| DecodeError, | ||
| type DecodeErrorCode, | ||
| type Frame, | ||
@@ -66,2 +72,3 @@ type EnvelopeHeader, | ||
| type ProviderRequestContext, | ||
| type ProviderEmitOptions, | ||
| type BindDecision, | ||
@@ -68,0 +75,0 @@ type Principal, |
+361
-94
| import { Buffer } from "node:buffer"; | ||
| import { AuthError, authenticateClient } from "./auth.js"; | ||
| import { DEFAULT_RECONNECT_BACKOFF, type BindIdentity, type ReconnectBackoff, type RouteTarget } from "./client.js"; | ||
| import { | ||
| DEFAULT_RECONNECT_BACKOFF, | ||
| type BindIdentity, | ||
| type ReconnectBackoff, | ||
| type RequestOptions, | ||
| type RouteTarget, | ||
| } from "./client.js"; | ||
| import { ConnectionFileError, readConnectionFile, type ConnectionInfo } from "./connection-file.js"; | ||
| import { | ||
| AdmissionClass, | ||
| buildFlags, | ||
| buildFrame, | ||
| buildFrameWithVersion, | ||
| decodeHeader, | ||
| encodeFrame, | ||
| FrameType, | ||
| HEADER_LEN, | ||
| Priority, | ||
@@ -19,2 +24,9 @@ PROTOCOL_VERSION, | ||
| import { | ||
| belongsToConnection, | ||
| createRouteHandle, | ||
| newConnectionToken, | ||
| RouteHandle, | ||
| StaleRouteHandleError, | ||
| } from "./route-handle.js"; | ||
| import { | ||
| SocketClosedError, | ||
@@ -185,2 +197,4 @@ SocketTimeoutError, | ||
| export interface ProviderRequestContext { | ||
| /** The immutable route generation that received this request. */ | ||
| readonly handle: RouteHandle; | ||
| /** | ||
@@ -191,3 +205,3 @@ * Emit an interim event as a StreamData frame on this request's (channel, corr). | ||
| */ | ||
| emit(body: Uint8Array): Promise<void>; | ||
| emit(body: Uint8Array, opts?: ProviderEmitOptions): Promise<void>; | ||
| /** Aborts when the consumer sends Cancel for this request, or the route is torn down. */ | ||
@@ -213,3 +227,3 @@ signal: AbortSignal; | ||
| export type ProviderHandler = ( | ||
| routeChannel: number, | ||
| handle: RouteHandle, | ||
| body: Uint8Array, | ||
@@ -227,8 +241,15 @@ ctx: ProviderRequestContext, | ||
| export interface RouteBindRequest { | ||
| route_channel: number; | ||
| handle: RouteHandle; | ||
| target: RouteTarget; | ||
| identity: BindIdentity; | ||
| principal?: Principal; | ||
| /** Consumer-declared reverse-request capabilities for this bind. This is a declaration, not a verified privilege; providers must treat an omitted field as no reverse-request capability. Known MCP method-family values today are "elicitation", "sampling", and "roots". */ | ||
| consumer_capabilities?: string[]; | ||
| } | ||
| export interface ProviderEmitOptions { | ||
| priority?: Priority; | ||
| admissionClass?: AdmissionClass; | ||
| } | ||
| export type BindDecision = | ||
@@ -256,3 +277,5 @@ | boolean | ||
| onBind?: (request: RouteBindRequest) => Promise<BindDecision> | BindDecision; | ||
| onRouteGone?: (routeChannel: number) => void | Promise<void>; | ||
| /** Runs only after an accepted bind ack is queued and the handle is installed. */ | ||
| onBound?: (handle: RouteHandle) => void | Promise<void>; | ||
| onRouteGone?: (handle: RouteHandle) => void | Promise<void>; | ||
| /** Backoff for provider reconnect after an unexpected socket drop. */ | ||
@@ -282,3 +305,5 @@ reconnectBackoff?: ReconnectBackoff; | ||
| onBind?: (request: RouteBindRequest) => Promise<BindDecision> | BindDecision; | ||
| onRouteGone?: (routeChannel: number) => void | Promise<void>; | ||
| /** Runs only after an accepted bind ack is queued and the handle is installed. */ | ||
| onBound?: (handle: RouteHandle) => void | Promise<void>; | ||
| onRouteGone?: (handle: RouteHandle) => void | Promise<void>; | ||
| reconnectBackoff: ReconnectBackoff; | ||
@@ -396,7 +421,7 @@ sleep: (ms: number) => Promise<void>; | ||
| export function jsonProviderHandler<Request = unknown, Response = unknown>( | ||
| handler: (routeChannel: number, request: Request) => Promise<Response> | Response, | ||
| handler: (handle: RouteHandle, request: Request) => Promise<Response> | Response, | ||
| ): ProviderHandler { | ||
| return async (routeChannel, body) => { | ||
| return async (handle, body) => { | ||
| const request = JSON.parse(Buffer.from(body).toString("utf8")) as Request; | ||
| const response = await handler(routeChannel, request); | ||
| const response = await handler(handle, request); | ||
| return encodeJson(response); | ||
@@ -415,2 +440,7 @@ }; | ||
| private readonly inflight = new Map<string, AbortController>(); | ||
| private readonly pending = new Map<string, { resolve: (frame: Frame) => void; reject: (error: Error) => void; timer: ReturnType<typeof setTimeout> }>(); | ||
| private readonly liveRoutes = new Map<number, RouteHandle>(); | ||
| private connectionToken = newConnectionToken(); | ||
| private nextCorr = 1n; | ||
| private ingressEpochDropCount = 0; | ||
| private readonly requestGate = new AsyncPermitPool(DEFAULT_PROVIDER_HANDLER_CAPACITY); | ||
@@ -445,2 +475,7 @@ private reconnecting: Promise<void> | null = null; | ||
| /** Number of nonzero-channel ingress frames rejected by endpoint validation. */ | ||
| get droppedIngressFrames(): number { | ||
| return this.ingressEpochDropCount; | ||
| } | ||
| get conn(): ConnectionInfo { | ||
@@ -454,2 +489,82 @@ return this.currentConn; | ||
| /** Send a reverse request on exactly one installed route generation. */ | ||
| async request(handle: RouteHandle, body: Uint8Array, opts: RequestOptions = {}): Promise<Uint8Array> { | ||
| this.assertLiveHandle(handle); | ||
| const corr = this.allocateCorr(); | ||
| const key = routeKey(handle, corr); | ||
| const timeoutMs = opts.timeoutMs ?? WRITE_TIMEOUT_MS; | ||
| const frame = buildFrame( | ||
| FrameType.Request, | ||
| buildFlags( | ||
| false, | ||
| opts.priority ?? Priority.Interactive, | ||
| false, | ||
| opts.admissionClass ?? AdmissionClass.Normal, | ||
| ), | ||
| handle.channel, | ||
| handle.epoch, | ||
| corr, | ||
| body, | ||
| ); | ||
| return await new Promise<Uint8Array>((resolve, reject) => { | ||
| const timer = setTimeout(() => { | ||
| if (this.pending.delete(key)) reject(new SubcProviderError("reverse request timed out", "request_timeout")); | ||
| }, timeoutMs); | ||
| this.pending.set(key, { | ||
| resolve: (response) => resolve(response.body), | ||
| reject, | ||
| timer, | ||
| }); | ||
| this.sendOn(this.sock, this.generation, frame).catch((error) => { | ||
| const pending = this.pending.get(key); | ||
| if (!pending) return; | ||
| this.pending.delete(key); | ||
| clearTimeout(pending.timer); | ||
| reject(error instanceof Error ? error : new SubcProviderError(String(error))); | ||
| }); | ||
| }); | ||
| } | ||
| /** Emit an unsolicited Push after onBound has published the route. */ | ||
| async push(handle: RouteHandle, body: Uint8Array, opts: ProviderEmitOptions = {}): Promise<void> { | ||
| this.assertLiveHandle(handle); | ||
| await this.sendOn( | ||
| this.sock, | ||
| this.generation, | ||
| buildFrame( | ||
| FrameType.Push, | ||
| buildFlags( | ||
| false, | ||
| opts.priority ?? Priority.Interactive, | ||
| false, | ||
| opts.admissionClass ?? AdmissionClass.Normal, | ||
| ), | ||
| handle.channel, | ||
| handle.epoch, | ||
| 0n, | ||
| body, | ||
| ), | ||
| ); | ||
| } | ||
| cancel(handle: RouteHandle, corr: bigint): void { | ||
| this.assertLiveHandle(handle); | ||
| void this.sendOn( | ||
| this.sock, | ||
| this.generation, | ||
| buildFrame(FrameType.Cancel, controlFlags(), handle.channel, handle.epoch, corr, new Uint8Array(0)), | ||
| ); | ||
| } | ||
| closeRoute(handle: RouteHandle): void { | ||
| this.assertLiveHandle(handle); | ||
| this.liveRoutes.delete(handle.channel); | ||
| this.abortHandle(handle); | ||
| void this.sendOn( | ||
| this.sock, | ||
| this.generation, | ||
| buildFrame(FrameType.Goodbye, controlFlags(), handle.channel, handle.epoch, 0n, new Uint8Array(0)), | ||
| ); | ||
| } | ||
| /** Read the connection file, authenticate as a client, register the manifest with HELLO, and serve frames. */ | ||
@@ -475,3 +590,3 @@ static async connect(opts: SubcProviderConnectOptions): Promise<SubcProvider> { | ||
| try { | ||
| await sendFrame(sock, buildFrame(FrameType.Goodbye, controlFlags(), 0, 0n, new Uint8Array(0))); | ||
| await sendFrame(sock, buildFrame(FrameType.Goodbye, controlFlags(), 0, 0, 0n, new Uint8Array(0))); | ||
| } catch { | ||
@@ -506,10 +621,4 @@ // The daemon may already have closed the connection; close() remains best-effort. | ||
| for (;;) { | ||
| // Header read waits indefinitely — idle time between frames is normal. | ||
| const headerBytes = await sock.readExact(HEADER_LEN, Number.POSITIVE_INFINITY); | ||
| const header = decodeHeader(headerBytes); | ||
| const body = | ||
| header.len === 0 | ||
| ? new Uint8Array(0) | ||
| : await sock.readExact(header.len, Date.now() + BODY_READ_TIMEOUT_MS); | ||
| const keepGoing = await this.dispatch({ header, body }, sock, generation); | ||
| const frame = await sock.readFrame(Number.POSITIVE_INFINITY, Date.now() + BODY_READ_TIMEOUT_MS); | ||
| const keepGoing = await this.dispatch(frame, sock, generation); | ||
| if (!keepGoing) { | ||
@@ -520,5 +629,5 @@ if (this.sock === sock && this.generation === generation) this.closeStarted = true; | ||
| } | ||
| } catch (err) { | ||
| } catch (error) { | ||
| if (this.sock === sock && this.generation === generation && !this.closeStarted) { | ||
| this.handleUnexpectedDrop(sock, generation, err instanceof Error ? err : new SubcProviderError(String(err))); | ||
| this.handleUnexpectedDrop(sock, generation, error instanceof Error ? error : new SubcProviderError(String(error))); | ||
| return; | ||
@@ -535,2 +644,31 @@ } | ||
| private async dispatch(frame: Frame, sock: SubcSocket, generation: number): Promise<boolean> { | ||
| let handle: RouteHandle | null = null; | ||
| if (frame.header.channel !== 0) { | ||
| handle = this.liveRoutes.get(frame.header.channel) ?? null; | ||
| if (!handle || handle.epoch !== frame.header.epoch) { | ||
| this.ingressEpochDropCount += 1; | ||
| return true; | ||
| } | ||
| } | ||
| if (handle) { | ||
| const pendingKey = routeKey(handle, frame.header.corr); | ||
| const pending = this.pending.get(pendingKey); | ||
| if (pending) { | ||
| if (frame.header.ty === FrameType.Push || frame.header.ty === FrameType.StreamData) return true; | ||
| if (frame.header.ty === FrameType.Response || frame.header.ty === FrameType.StreamEnd) { | ||
| this.pending.delete(pendingKey); | ||
| clearTimeout(pending.timer); | ||
| pending.resolve(frame); | ||
| return true; | ||
| } | ||
| if (frame.header.ty === FrameType.Error) { | ||
| this.pending.delete(pendingKey); | ||
| clearTimeout(pending.timer); | ||
| pending.reject(providerErrorFromFrame(frame)); | ||
| return true; | ||
| } | ||
| } | ||
| } | ||
| switch (frame.header.ty) { | ||
@@ -547,2 +685,3 @@ case FrameType.Ping: | ||
| 0, | ||
| 0, | ||
| frame.header.corr, | ||
@@ -555,12 +694,9 @@ new Uint8Array(0), | ||
| case FrameType.Goodbye: | ||
| if (frame.header.channel === 0) return false; | ||
| // The route is gone: abort in-flight requests on that route so streaming | ||
| // handlers unwind, then notify the provider owner. | ||
| this.abortChannel(generation, frame.header.channel); | ||
| await this.opts.onRouteGone?.(frame.header.channel); | ||
| if (!handle) return false; | ||
| this.liveRoutes.delete(handle.channel); | ||
| this.abortHandle(handle); | ||
| await this.opts.onRouteGone?.(handle); | ||
| return true; | ||
| case FrameType.Cancel: | ||
| // The consumer cancelled one request: abort the matching handler. Its | ||
| // streaming handler observes ctx.signal and ends with a StreamEnd terminal. | ||
| this.inflight.get(routeKey(generation, frame.header.channel, frame.header.corr))?.abort(); | ||
| if (handle) this.inflight.get(routeKey(handle, frame.header.corr))?.abort(); | ||
| return true; | ||
@@ -570,6 +706,6 @@ case FrameType.Request: | ||
| await this.handleControlRequest(frame, sock, generation); | ||
| } else { | ||
| void this.handleDataRequest(frame, sock, generation).catch((err) => { | ||
| } else if (handle) { | ||
| void this.handleDataRequest(frame, handle, sock, generation).catch((error) => { | ||
| if (!this.closeStarted && this.sock === sock && this.generation === generation) { | ||
| console.warn("SubcProvider handler failed after its request was dispatched", err); | ||
| console.warn("SubcProvider handler failed after its request was dispatched", error); | ||
| } | ||
@@ -584,15 +720,23 @@ }); | ||
| /** Abort every in-flight request on a route channel for the current socket generation. */ | ||
| private abortChannel(generation: number, channel: number): void { | ||
| const prefix = `${generation}:${channel}:`; | ||
| private abortHandle(handle: RouteHandle): void { | ||
| const prefix = `${handle.channel}:${handle.epoch}:`; | ||
| for (const [key, controller] of this.inflight) { | ||
| if (key.startsWith(prefix)) controller.abort(); | ||
| } | ||
| for (const [key, pending] of this.pending) { | ||
| if (!key.startsWith(prefix)) continue; | ||
| this.pending.delete(key); | ||
| clearTimeout(pending.timer); | ||
| pending.reject(new StaleRouteHandleError(handle)); | ||
| } | ||
| } | ||
| private abortGeneration(generation: number): void { | ||
| const prefix = `${generation}:`; | ||
| for (const [key, controller] of this.inflight) { | ||
| if (key.startsWith(prefix)) controller.abort(); | ||
| private abortGeneration(_generation: number): void { | ||
| this.abortAllInflight(); | ||
| for (const [key, pending] of this.pending) { | ||
| this.pending.delete(key); | ||
| clearTimeout(pending.timer); | ||
| pending.reject(new SubcProviderError("provider connection dropped", "connection_dropped")); | ||
| } | ||
| this.liveRoutes.clear(); | ||
| } | ||
@@ -605,7 +749,15 @@ | ||
| private async handleControlRequest(frame: Frame, sock: SubcSocket, generation: number): Promise<void> { | ||
| const request = parseJson(frame.body) as Partial<RouteBindRequest> & { op?: string }; | ||
| const request = parseJson(frame.body) as { | ||
| op?: string; | ||
| route_channel?: unknown; | ||
| epoch?: unknown; | ||
| target?: unknown; | ||
| identity?: unknown; | ||
| principal?: unknown; | ||
| consumer_capabilities?: unknown; | ||
| }; | ||
| if (request.op === HEALTH_CHECK_OP) { | ||
| void this.handleHealthRequest(frame, sock, generation).catch((err) => { | ||
| void this.handleHealthRequest(frame, sock, generation).catch((error) => { | ||
| if (!this.closeStarted && this.sock === sock && this.generation === generation) { | ||
| console.warn("SubcProvider health handler failed after its request was dispatched", err); | ||
| console.warn("SubcProvider health handler failed after its request was dispatched", error); | ||
| } | ||
@@ -619,41 +771,86 @@ }); | ||
| const tentative = createRouteHandle( | ||
| numberField(request.route_channel, "route_channel"), | ||
| numberField(request.epoch, "epoch"), | ||
| this.connectionToken, | ||
| ); | ||
| const bindRequest: RouteBindRequest = { | ||
| route_channel: numberField(request.route_channel, "route_channel"), | ||
| handle: tentative, | ||
| target: request.target as RouteTarget, | ||
| identity: request.identity as BindIdentity, | ||
| principal: request.principal as Principal | undefined, | ||
| consumer_capabilities: request.consumer_capabilities as string[] | undefined, | ||
| }; | ||
| const decision = await this.opts.onBind?.(bindRequest); | ||
| let decision: BindDecision | undefined; | ||
| try { | ||
| decision = await this.opts.onBind?.(bindRequest); | ||
| } catch (error) { | ||
| try { | ||
| await this.sendError( | ||
| frame, | ||
| "route_rejected", | ||
| error instanceof Error ? error.message : String(error), | ||
| controlFlags(), | ||
| sock, | ||
| generation, | ||
| ); | ||
| } finally { | ||
| await this.opts.onRouteGone?.(tentative); | ||
| } | ||
| return; | ||
| } | ||
| const rejection = bindRejection(decision); | ||
| if (rejection) { | ||
| await this.sendError(frame, rejection.code, rejection.message, controlFlags(), sock, generation); | ||
| try { | ||
| await this.sendError(frame, rejection.code, rejection.message, controlFlags(), sock, generation); | ||
| } finally { | ||
| await this.opts.onRouteGone?.(tentative); | ||
| } | ||
| return; | ||
| } | ||
| await this.sendOn( | ||
| sock, | ||
| generation, | ||
| buildFrameWithVersion( | ||
| frame.header.ver, | ||
| FrameType.Response, | ||
| controlFlags(), | ||
| 0, | ||
| frame.header.corr, | ||
| encodeJson({ op: "route.bind" }), | ||
| ), | ||
| ); | ||
| try { | ||
| await this.sendOn( | ||
| sock, | ||
| generation, | ||
| buildFrameWithVersion( | ||
| frame.header.ver, | ||
| FrameType.Response, | ||
| controlFlags(), | ||
| 0, | ||
| 0, | ||
| frame.header.corr, | ||
| encodeJson({ op: "route.bind" }), | ||
| ), | ||
| ); | ||
| } catch (error) { | ||
| await this.opts.onRouteGone?.(tentative); | ||
| throw error; | ||
| } | ||
| if (this.sock !== sock || this.generation !== generation || this.closeStarted || this.closedErr) { | ||
| await this.opts.onRouteGone?.(tentative); | ||
| return; | ||
| } | ||
| this.liveRoutes.set(tentative.channel, tentative); | ||
| await this.opts.onBound?.(tentative); | ||
| } | ||
| private async handleDataRequest(frame: Frame, sock: SubcSocket, generation: number): Promise<void> { | ||
| const { channel, corr, ver } = frame.header; | ||
| const key = routeKey(generation, channel, corr); | ||
| private async handleDataRequest( | ||
| frame: Frame, | ||
| handle: RouteHandle, | ||
| sock: SubcSocket, | ||
| generation: number, | ||
| ): Promise<void> { | ||
| const { corr, ver } = frame.header; | ||
| const key = routeKey(handle, corr); | ||
| const controller = new AbortController(); | ||
| this.inflight.set(key, controller); | ||
| const dataFlags = buildFlags(false, Priority.Interactive, false); | ||
| const ctx: ProviderRequestContext = { | ||
| const context: ProviderRequestContext = { | ||
| handle, | ||
| signal: controller.signal, | ||
| currentEpoch: () => this.connectionEpoch, | ||
| emit: async (eventBody) => { | ||
| // Once aborted (cancel / route-gone / socket drop), drop further events silently. | ||
| emit: async (eventBody, options = {}) => { | ||
| this.assertLiveHandle(handle); | ||
| if (controller.signal.aborted) return; | ||
@@ -663,3 +860,16 @@ await this.sendOn( | ||
| generation, | ||
| buildFrameWithVersion(ver, FrameType.StreamData, dataFlags, channel, corr, eventBody), | ||
| buildFrameWithVersion( | ||
| ver, | ||
| FrameType.StreamData, | ||
| buildFlags( | ||
| false, | ||
| options.priority ?? Priority.Interactive, | ||
| false, | ||
| options.admissionClass ?? AdmissionClass.Normal, | ||
| ), | ||
| handle.channel, | ||
| handle.epoch, | ||
| corr, | ||
| eventBody, | ||
| ), | ||
| ); | ||
@@ -669,11 +879,20 @@ }, | ||
| const releasePermit = await (this.requestGate ?? new AsyncPermitPool(DEFAULT_PROVIDER_HANDLER_CAPACITY)).acquire(); | ||
| const dataFlags = buildFlags(false, Priority.Interactive, false); | ||
| try { | ||
| const body = await this.opts.handler(channel, frame.body, ctx); | ||
| const body = await this.opts.handler(handle, frame.body, context); | ||
| if (controller.signal.aborted) return; | ||
| this.assertLiveHandle(handle); | ||
| if (body === undefined) { | ||
| // A streaming handler that ended: close the held-open request with a | ||
| // StreamEnd terminal (the consumer's subscription resolves). | ||
| await this.sendOn( | ||
| sock, | ||
| generation, | ||
| buildFrameWithVersion(ver, FrameType.StreamEnd, dataFlags, channel, corr, new Uint8Array(0)), | ||
| buildFrameWithVersion( | ||
| ver, | ||
| FrameType.StreamEnd, | ||
| dataFlags, | ||
| handle.channel, | ||
| handle.epoch, | ||
| corr, | ||
| new Uint8Array(0), | ||
| ), | ||
| ); | ||
@@ -684,15 +903,21 @@ } else if (body instanceof Uint8Array) { | ||
| generation, | ||
| buildFrameWithVersion(ver, FrameType.Response, dataFlags, channel, corr, body), | ||
| buildFrameWithVersion( | ||
| ver, | ||
| FrameType.Response, | ||
| dataFlags, | ||
| handle.channel, | ||
| handle.epoch, | ||
| corr, | ||
| body, | ||
| ), | ||
| ); | ||
| } else { | ||
| throw new SubcProviderError( | ||
| "provider handler must return a Uint8Array or void", | ||
| "invalid_handler_response", | ||
| ); | ||
| throw new SubcProviderError("provider handler must return a Uint8Array or void", "invalid_handler_response"); | ||
| } | ||
| } catch (err) { | ||
| } catch (error) { | ||
| if (error instanceof StaleRouteHandleError || controller.signal.aborted) return; | ||
| await this.sendError( | ||
| frame, | ||
| err instanceof SubcProviderError && err.code ? err.code : "handler_error", | ||
| err instanceof Error ? err.message : String(err), | ||
| error instanceof SubcProviderError && error.code ? error.code : "handler_error", | ||
| error instanceof Error ? error.message : String(error), | ||
| dataFlags, | ||
@@ -709,4 +934,4 @@ sock, | ||
| private async handleHealthRequest(frame: Frame, sock: SubcSocket, generation: number): Promise<void> { | ||
| const { channel, corr, ver } = frame.header; | ||
| const key = routeKey(generation, channel, corr); | ||
| const { corr, ver } = frame.header; | ||
| const key = `control:${generation}:${corr}`; | ||
| const controller = new AbortController(); | ||
@@ -725,3 +950,4 @@ this.inflight.set(key, controller); | ||
| controlFlags(), | ||
| channel, | ||
| 0, | ||
| 0, | ||
| corr, | ||
@@ -736,7 +962,7 @@ encodeJson({ | ||
| ); | ||
| } catch (err) { | ||
| } catch (error) { | ||
| await this.sendError( | ||
| frame, | ||
| err instanceof SubcProviderError && err.code ? err.code : "health_error", | ||
| err instanceof Error ? err.message : String(err), | ||
| error instanceof SubcProviderError && error.code ? error.code : "health_error", | ||
| error instanceof Error ? error.message : String(error), | ||
| controlFlags(), | ||
@@ -768,2 +994,3 @@ sock, | ||
| frame.header.channel, | ||
| frame.header.epoch, | ||
| frame.header.corr, | ||
@@ -830,3 +1057,3 @@ encodeJson({ code, message }), | ||
| private replaceConnection(opened: OpenedProviderConnection): void { | ||
| private replaceConnection(opened: OpenedProviderConnection): void { | ||
| this.sock.close(); | ||
@@ -838,2 +1065,5 @@ this.sock = opened.sock; | ||
| this.connectionEpoch += 1; | ||
| this.connectionToken = newConnectionToken(); | ||
| this.liveRoutes.clear(); | ||
| this.nextCorr = 1n; | ||
| const generation = this.generation; | ||
@@ -902,2 +1132,22 @@ void this.readLoop(opened.sock, generation); | ||
| private isLiveHandle(handle: RouteHandle): boolean { | ||
| return belongsToConnection(handle, this.connectionToken) && this.liveRoutes.get(handle.channel) === handle; | ||
| } | ||
| private assertLiveHandle(handle: RouteHandle): void { | ||
| if (!this.isLiveHandle(handle)) throw new StaleRouteHandleError(handle); | ||
| } | ||
| private allocateCorr(): bigint { | ||
| const maximum = 0xffff_ffff_ffff_ffffn; | ||
| if (this.nextCorr > maximum) { | ||
| const error = new SubcProviderError("channel-0 correlation id allocator exhausted", "corr_exhausted"); | ||
| this.handleUnexpectedDrop(this.sock, this.generation, error); | ||
| throw error; | ||
| } | ||
| const corr = this.nextCorr; | ||
| this.nextCorr += 1n; | ||
| return corr; | ||
| } | ||
| private failFatal(err: Error): void { | ||
@@ -917,6 +1167,15 @@ if (!this.closedErr) this.closedErr = err; | ||
| function routeKey(generation: number, channel: number, corr: bigint): string { | ||
| return `${generation}:${channel}:${corr}`; | ||
| function routeKey(handle: RouteHandle, corr: bigint): string { | ||
| return `${handle.channel}:${handle.epoch}:${corr}`; | ||
| } | ||
| function providerErrorFromFrame(frame: Frame): SubcProviderError { | ||
| try { | ||
| const body = parseJson(frame.body) as { code?: string; message?: string }; | ||
| return new SubcProviderError(body.message ?? "subc error", body.code); | ||
| } catch { | ||
| return new SubcProviderError(Buffer.from(frame.body).toString("utf8") || "subc error"); | ||
| } | ||
| } | ||
| function launchNonce(opts: SubcProviderConnectOptions): string | undefined { | ||
@@ -938,2 +1197,3 @@ const nonce = opts.launchNonce ?? process.env[SUBC_LAUNCH_NONCE_ENV]; | ||
| onBind: opts.onBind, | ||
| onBound: opts.onBound, | ||
| onRouteGone: opts.onRouteGone, | ||
@@ -961,2 +1221,3 @@ reconnectBackoff: opts.reconnectBackoff ?? DEFAULT_RECONNECT_BACKOFF, | ||
| 0, | ||
| 0, | ||
| HELLO_CORR, | ||
@@ -1014,10 +1275,16 @@ encodeJson({ | ||
| async function expectHelloAck(sock: SubcSocket, deadline: number): Promise<ModuleHelloAckBody> { | ||
| const header = decodeHeader(await sock.readExact(HEADER_LEN, deadline)); | ||
| const body = header.len === 0 ? new Uint8Array(0) : await sock.readExact(header.len, deadline); | ||
| const frame = { header, body }; | ||
| switch (header.ty) { | ||
| case FrameType.HelloAck: | ||
| return parseJson(body) as ModuleHelloAckBody; | ||
| const frame = await sock.readFrame(deadline, deadline); | ||
| switch (frame.header.ty) { | ||
| case FrameType.HelloAck: { | ||
| const ack = parseJson(frame.body) as ModuleHelloAckBody; | ||
| if (ack.negotiated_ver !== PROTOCOL_VERSION) { | ||
| throw new SubcProviderError( | ||
| `subc negotiated protocol ${ack.negotiated_ver}; expected exactly ${PROTOCOL_VERSION}`, | ||
| "unsupported_version", | ||
| ); | ||
| } | ||
| return ack; | ||
| } | ||
| case FrameType.Error: { | ||
| const error = parseJson(body) as { code?: string; message?: string }; | ||
| const error = parseJson(frame.body) as { code?: string; message?: string }; | ||
| throw new SubcProviderError( | ||
@@ -1024,0 +1291,0 @@ `subc rejected HELLO: ${error.code ?? "unknown"} — ${error.message ?? "subc error"}`, |
+37
-0
@@ -9,2 +9,12 @@ // A pull-based buffered wrapper over a node TCP socket. Node sockets are | ||
| import { | ||
| decodeHeader, | ||
| DecodeError, | ||
| FROZEN_PREFIX_LEN, | ||
| HEADER_LEN, | ||
| MAX_FRAME_BODY_LEN, | ||
| PROTOCOL_VERSION, | ||
| type Frame, | ||
| } from "./envelope.js"; | ||
| export class SocketClosedError extends Error {} | ||
@@ -103,2 +113,29 @@ export class SocketTimeoutError extends Error {} | ||
| /** | ||
| * Read one envelope frame. The frozen five-byte prefix is validated before | ||
| * waiting for the rest of the header, so a stale 17-byte v1 sender fails | ||
| * promptly instead of leaving this reader blocked for four bytes. | ||
| */ | ||
| async readFrame( | ||
| headerDeadlineMs: number, | ||
| bodyDeadlineMs: number, | ||
| onHeader?: () => void, | ||
| ): Promise<Frame> { | ||
| const prefix = await this.readExact(FROZEN_PREFIX_LEN, headerDeadlineMs); | ||
| const version = prefix[4]!; | ||
| if (version !== PROTOCOL_VERSION) throw new DecodeError(`unsupported envelope version ${version}`, "unsupported_version"); | ||
| const remainder = await this.readExact(HEADER_LEN - FROZEN_PREFIX_LEN, headerDeadlineMs); | ||
| const headerBytes = new Uint8Array(HEADER_LEN); | ||
| headerBytes.set(prefix); | ||
| headerBytes.set(remainder, FROZEN_PREFIX_LEN); | ||
| const header = decodeHeader(headerBytes); | ||
| if (header.len > MAX_FRAME_BODY_LEN) { | ||
| throw new DecodeError(`frame body ${header.len} exceeds max ${MAX_FRAME_BODY_LEN}`, "frame_body_too_large"); | ||
| } | ||
| onHeader?.(); | ||
| const body = header.len === 0 ? new Uint8Array(0) : await this.readExact(header.len, bodyDeadlineMs); | ||
| return { header, body }; | ||
| } | ||
| /** Read exactly `n` bytes, rejecting if `deadlineMs` (epoch ms) passes first. */ | ||
@@ -105,0 +142,0 @@ readExact(n: number, deadlineMs: number): Promise<Uint8Array> { |
385658
13.68%42
13.51%6572
14.55%104
15.56%