@query-farm/vgi-rpc 0.2.4 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/client/connect.d.ts.map +1 -1
- package/dist/client/index.d.ts +3 -3
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/introspect.d.ts +1 -1
- package/dist/client/introspect.d.ts.map +1 -1
- package/dist/client/ipc.d.ts +1 -1
- package/dist/client/ipc.d.ts.map +1 -1
- package/dist/client/pipe.d.ts +2 -2
- package/dist/client/pipe.d.ts.map +1 -1
- package/dist/client/stream.d.ts +1 -1
- package/dist/client/stream.d.ts.map +1 -1
- package/dist/dispatch/describe.d.ts +1 -1
- package/dist/dispatch/describe.d.ts.map +1 -1
- package/dist/dispatch/stream.d.ts +1 -1
- package/dist/dispatch/stream.d.ts.map +1 -1
- package/dist/dispatch/unary.d.ts.map +1 -1
- package/dist/http/common.d.ts +1 -1
- package/dist/http/common.d.ts.map +1 -1
- package/dist/http/dispatch.d.ts.map +1 -1
- package/dist/http/handler.d.ts.map +1 -1
- package/dist/http/index.d.ts +3 -1
- package/dist/http/index.d.ts.map +1 -1
- package/dist/http/token.d.ts.map +1 -1
- package/dist/http/types.d.ts.map +1 -1
- package/dist/index.d.ts +7 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2162 -2119
- package/dist/index.js.map +26 -26
- package/dist/protocol.d.ts +1 -1
- package/dist/protocol.d.ts.map +1 -1
- package/dist/schema.d.ts +1 -1
- package/dist/schema.d.ts.map +1 -1
- package/dist/server.d.ts +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/util/schema.d.ts +1 -1
- package/dist/util/schema.d.ts.map +1 -1
- package/dist/util/zstd.d.ts.map +1 -1
- package/dist/wire/reader.d.ts +1 -1
- package/dist/wire/reader.d.ts.map +1 -1
- package/dist/wire/request.d.ts +1 -1
- package/dist/wire/request.d.ts.map +1 -1
- package/dist/wire/response.d.ts +1 -1
- package/dist/wire/response.d.ts.map +1 -1
- package/dist/wire/writer.d.ts +1 -1
- package/dist/wire/writer.d.ts.map +1 -1
- package/package.json +9 -5
- package/src/client/connect.ts +12 -20
- package/src/client/index.ts +8 -8
- package/src/client/introspect.ts +11 -15
- package/src/client/ipc.ts +18 -32
- package/src/client/pipe.ts +17 -37
- package/src/client/stream.ts +20 -46
- package/src/dispatch/describe.ts +15 -27
- package/src/dispatch/stream.ts +7 -21
- package/src/dispatch/unary.ts +1 -2
- package/src/http/common.ts +9 -19
- package/src/http/dispatch.ts +115 -110
- package/src/http/handler.ts +20 -55
- package/src/http/index.ts +3 -1
- package/src/http/token.ts +2 -7
- package/src/http/types.ts +2 -6
- package/src/index.ts +44 -41
- package/src/protocol.ts +8 -8
- package/src/schema.ts +12 -16
- package/src/server.ts +16 -36
- package/src/types.ts +9 -36
- package/src/util/schema.ts +1 -1
- package/src/util/zstd.ts +2 -8
- package/src/wire/reader.ts +2 -4
- package/src/wire/request.ts +4 -15
- package/src/wire/response.ts +9 -25
- package/src/wire/writer.ts +1 -5
package/dist/index.js.map
CHANGED
|
@@ -1,34 +1,34 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/util/zstd.ts", "../src/
|
|
3
|
+
"sources": ["../src/util/zstd.ts", "../src/constants.ts", "../src/http/common.ts", "../src/client/introspect.ts", "../src/client/ipc.ts", "../src/errors.ts", "../src/wire/reader.ts", "../src/client/stream.ts", "../src/client/connect.ts", "../src/client/pipe.ts", "../src/http/handler.ts", "../src/types.ts", "../src/wire/response.ts", "../src/http/dispatch.ts", "../src/dispatch/describe.ts", "../src/util/schema.ts", "../src/wire/request.ts", "../src/http/token.ts", "../src/http/types.ts", "../src/protocol.ts", "../src/schema.ts", "../src/server.ts", "../src/dispatch/stream.ts", "../src/dispatch/unary.ts", "../src/wire/writer.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Cross-runtime zstd compression/decompression.\n *\n * Uses Bun.zstd* when running on Bun, otherwise falls back to node:zlib\n * (available on Node.js 22.15+ and Deno 2.6.9+).\n */\n\nimport * as zlib from \"node:zlib\";\n\nconst isBun = typeof globalThis.Bun !== \"undefined\";\n\n/** Compress data with zstd at the given level (1-22). */\nexport function zstdCompress(data: Uint8Array, level: number): Uint8Array<ArrayBuffer> {\n if (isBun) {\n return new Uint8Array(Bun.zstdCompressSync(data, { level }));\n }\n const fn = (zlib as any).zstdCompressSync;\n if (typeof fn !== \"function\") {\n throw new Error(\
|
|
6
|
-
"// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Schema } from \"apache-arrow\";\nimport { Protocol } from \"./protocol.js\";\nimport { IpcStreamReader } from \"./wire/reader.js\";\nimport { IpcStreamWriter } from \"./wire/writer.js\";\nimport { parseRequest } from \"./wire/request.js\";\nimport { buildErrorBatch } from \"./wire/response.js\";\nimport { buildDescribeBatch } from \"./dispatch/describe.js\";\nimport { dispatchUnary } from \"./dispatch/unary.js\";\nimport { dispatchStream } from \"./dispatch/stream.js\";\nimport { DESCRIBE_METHOD_NAME } from \"./constants.js\";\nimport { MethodType } from \"./types.js\";\nimport { RpcError, VersionError } from \"./errors.js\";\n\nconst EMPTY_SCHEMA = new Schema([]);\n\n/**\n * RPC server that reads Arrow IPC requests from stdin and writes responses to stdout.\n * Supports unary and streaming (producer/exchange) methods.\n */\nexport class VgiRpcServer {\n private protocol: Protocol;\n private enableDescribe: boolean;\n private serverId: string;\n private describeBatch: import(\"apache-arrow\").RecordBatch | null = null;\n\n constructor(\n protocol: Protocol,\n options?: { enableDescribe?: boolean; serverId?: string },\n ) {\n this.protocol = protocol;\n this.enableDescribe = options?.enableDescribe ?? true;\n this.serverId =\n options?.serverId ?? crypto.randomUUID().replace(/-/g, \"\").slice(0, 12);\n\n if (this.enableDescribe) {\n const { batch } = buildDescribeBatch(\n protocol.name,\n protocol.getMethods(),\n this.serverId,\n );\n this.describeBatch = batch;\n }\n }\n\n /** Start the server loop. Reads requests until stdin closes. */\n async run(): Promise<void> {\n const stdin = process.stdin as unknown as ReadableStream<Uint8Array>;\n\n // Warn if running interactively\n if (process.stdin.isTTY || process.stdout.isTTY) {\n process.stderr.write(\n \"WARNING: This process communicates via Arrow IPC on stdin/stdout \" +\n \"and is not intended to be run interactively.\\n\" +\n \"It should be launched as a subprocess by an RPC client \" +\n \"(e.g. vgi_rpc.connect()).\\n\",\n );\n }\n\n const reader = await IpcStreamReader.create(stdin);\n const writer = new IpcStreamWriter();\n\n try {\n while (true) {\n await this.serveOne(reader, writer);\n }\n } catch (e: any) {\n // EOF or broken pipe → clean exit\n if (\n e.message?.includes(\"closed\") ||\n e.message?.includes(\"Expected Schema Message\") ||\n e.message?.includes(\"null or length 0\") ||\n e.code === \"EPIPE\" ||\n e.code === \"ERR_STREAM_PREMATURE_CLOSE\" ||\n e.code === \"ERR_STREAM_DESTROYED\" ||\n (e instanceof Error && e.message.includes(\"EOF\"))\n ) {\n return;\n }\n // ArrowInvalid or unexpected error\n throw e;\n } finally {\n await reader.cancel();\n }\n }\n\n private async serveOne(\n reader: IpcStreamReader,\n writer: IpcStreamWriter,\n ): Promise<void> {\n const stream = await reader.readStream();\n if (!stream) {\n throw new Error(\"EOF\");\n }\n\n const { schema, batches } = stream;\n if (batches.length === 0) {\n const err = new RpcError(\"ProtocolError\", \"Request stream contains no batches\", \"\");\n const errBatch = buildErrorBatch(EMPTY_SCHEMA, err, this.serverId, null);\n writer.writeStream(EMPTY_SCHEMA, [errBatch]);\n return;\n }\n\n const batch = batches[0];\n let methodName: string;\n let params: Record<string, any>;\n let requestId: string | null;\n\n try {\n const parsed = parseRequest(schema, batch);\n methodName = parsed.methodName;\n params = parsed.params;\n requestId = parsed.requestId;\n } catch (e: any) {\n // Write error response for protocol/version errors\n const errBatch = buildErrorBatch(EMPTY_SCHEMA, e, this.serverId, null);\n writer.writeStream(EMPTY_SCHEMA, [errBatch]);\n if (e instanceof VersionError || e instanceof RpcError) {\n return; // Continue serving\n }\n throw e;\n }\n\n // Handle __describe__\n if (methodName === DESCRIBE_METHOD_NAME && this.describeBatch) {\n writer.writeStream(this.describeBatch.schema, [this.describeBatch]);\n return;\n }\n\n // Look up method\n const methods = this.protocol.getMethods();\n const method = methods.get(methodName);\n if (!method) {\n const available = [...methods.keys()].sort();\n const err = new Error(\n `Unknown method: '${methodName}'. Available methods: [${available.join(\", \")}]`,\n );\n const errBatch = buildErrorBatch(EMPTY_SCHEMA, err, this.serverId, requestId);\n writer.writeStream(EMPTY_SCHEMA, [errBatch]);\n return;\n }\n\n // Dispatch based on method type\n if (method.type === MethodType.UNARY) {\n await dispatchUnary(method, params, writer, this.serverId, requestId);\n } else {\n await dispatchStream(\n method,\n params,\n writer,\n reader,\n this.serverId,\n requestId,\n );\n }\n }\n}\n",
|
|
7
|
-
"// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport { RecordBatchReader, type RecordBatch, type Schema } from \"apache-arrow\";\n\nexport interface StreamMessage {\n schema: Schema;\n batches: RecordBatch[];\n}\n\n/**\n * Reads sequential IPC streams from a byte source (e.g., process.stdin).\n * Uses autoDestroy: false + reset/open pattern to read multiple streams\n * from the same underlying byte source.\n */\nexport class IpcStreamReader {\n private reader: RecordBatchReader;\n private initialized = false;\n /** True once readNextBatch() returns null (EOS reached for current stream). */\n private streamEnded = false;\n\n private constructor(reader: RecordBatchReader) {\n this.reader = reader;\n }\n\n static async create(\n input: ReadableStream<Uint8Array> | NodeJS.ReadableStream,\n ): Promise<IpcStreamReader> {\n const reader = await RecordBatchReader.from(input as any);\n await reader.open({ autoDestroy: false });\n if (reader.closed) {\n throw new Error(\"Input stream closed before first IPC message\");\n }\n return new IpcStreamReader(reader);\n }\n\n /**\n * Read one complete IPC stream (schema + all batches).\n * Returns null on EOF (no more streams).\n */\n async readStream(): Promise<StreamMessage | null> {\n if (this.initialized) {\n // Advance to next stream\n await this.reader.reset().open();\n if (this.reader.closed) {\n return null;\n }\n }\n this.initialized = true;\n\n const schema = this.reader.schema;\n if (!schema) {\n return null;\n }\n\n const batches: RecordBatch[] = [];\n while (true) {\n const result = await this.reader.next();\n if (result.done) break;\n // Skip Arrow-JS synthetic placeholder for empty streams\n if (result.value.constructor.name === \"_InternalEmptyPlaceholderRecordBatch\") break;\n batches.push(result.value);\n }\n\n return { schema, batches };\n }\n\n /**\n * Open the next IPC stream and return its schema.\n * Use readNextBatch() to read batches one at a time.\n * Returns null on EOF.\n */\n async openNextStream(): Promise<Schema | null> {\n if (this.initialized) {\n await this.reader.reset().open();\n if (this.reader.closed) {\n return null;\n }\n }\n this.initialized = true;\n this.streamEnded = false;\n return this.reader.schema ?? null;\n }\n\n /**\n * Read the next batch from the currently open IPC stream.\n * Returns null when the stream ends (EOS).\n *\n * Once EOS is reached, subsequent calls return null immediately without\n * reading from the underlying byte source. This prevents the Arrow-JS\n * reader from consuming bytes that belong to the next IPC stream.\n */\n async readNextBatch(): Promise<RecordBatch | null> {\n if (this.streamEnded) return null;\n const result = await this.reader.next();\n if (result.done) {\n this.streamEnded = true;\n return null;\n }\n // Arrow-JS synthesizes a placeholder batch for streams with a schema but\n // zero real batches. Treat it as EOS so callers don't block trying to\n // read more bytes from a stream that has already ended.\n if (result.value.constructor.name === \"_InternalEmptyPlaceholderRecordBatch\") {\n this.streamEnded = true;\n return null;\n }\n return result.value;\n }\n\n async cancel(): Promise<void> {\n await this.reader.cancel();\n }\n}\n",
|
|
8
|
-
"// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n RecordBatchStreamWriter,\n type RecordBatch,\n type Schema,\n} from \"apache-arrow\";\nimport { writeSync } from \"node:fs\";\n\nconst STDOUT_FD = 1;\n\n/**\n * Write all bytes to a file descriptor, looping on partial writes.\n * Handles EAGAIN (pipe buffer full) by busy-waiting with Atomics.wait().\n * writeSync() can return fewer bytes than requested when the pipe buffer\n * is full (e.g., 64KB limit), and throws EAGAIN on non-blocking fds.\n */\nfunction writeAll(fd: number, data: Uint8Array): void {\n let offset = 0;\n while (offset < data.length) {\n try {\n const written = writeSync(fd, data, offset, data.length - offset);\n if (written <= 0) throw new Error(`writeSync returned ${written}`);\n offset += written;\n } catch (e: any) {\n if (e.code === \"EAGAIN\") {\n // Pipe buffer full — busy-wait briefly then retry\n Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 1);\n continue;\n }\n throw e;\n }\n }\n}\n\n/**\n * Writes sequential IPC streams to a file descriptor (e.g., stdout).\n * Each call to writeStream() writes a complete IPC stream: schema + batches + EOS.\n *\n * All writes use synchronous I/O (writeSync) to avoid deadlocks when\n * interleaving stdout writes with blocking stdin reads.\n */\nexport class IpcStreamWriter {\n private readonly fd: number;\n\n constructor(fd: number = STDOUT_FD) {\n this.fd = fd;\n }\n\n /**\n * Write a complete IPC stream with the given schema and batches.\n * Creates schema message, writes all batches (with their metadata), writes EOS.\n */\n writeStream(schema: Schema, batches: RecordBatch[]): void {\n const writer = new RecordBatchStreamWriter();\n writer.reset(undefined, schema);\n for (const batch of batches) {\n // Use _writeRecordBatch to bypass schema comparison (see IncrementalStream.write)\n (writer as any)._writeRecordBatch(batch);\n }\n writer.close();\n const bytes = writer.toUint8Array(true);\n writeAll(this.fd, bytes);\n }\n\n /**\n * Open an incremental IPC stream for writing batches one at a time.\n * Used for streaming methods where output batches are produced incrementally.\n * Bytes are written synchronously after each batch.\n */\n openStream(schema: Schema): IncrementalStream {\n return new IncrementalStream(this.fd, schema);\n }\n}\n\n/**\n * An open IPC stream that supports incremental batch writes.\n *\n * Uses RecordBatchStreamWriter with internal buffering (no pipe to stdout).\n * After each operation, drains the writer's internal AsyncByteQueue buffer\n * and writes bytes synchronously via writeAll(). This avoids deadlocks\n * caused by Node.js async stream piping when stdin reads block before\n * stdout writes flush through the event loop.\n */\nexport class IncrementalStream {\n private writer: RecordBatchStreamWriter;\n private readonly fd: number;\n private closed = false;\n\n constructor(fd: number, schema: Schema) {\n this.fd = fd;\n this.writer = new RecordBatchStreamWriter();\n // Buffer internally (no sink) — we drain manually via writeAll\n this.writer.reset(undefined, schema);\n this.drain();\n }\n\n /**\n * Write a single batch to the stream. Bytes are flushed synchronously.\n *\n * Uses _writeRecordBatch() directly to bypass the Arrow writer's schema\n * comparison in write(). The public write() method calls compareSchemas()\n * and auto-closes the writer if the batch's schema differs (e.g., in\n * nullability), silently dropping the batch. Since our output schema is\n * set at stream open time and all batches are structurally compatible,\n * we skip the comparison.\n */\n write(batch: RecordBatch): void {\n if (this.closed) throw new Error(\"Stream already closed\");\n (this.writer as any)._writeRecordBatch(batch);\n this.drain();\n }\n\n /**\n * Close the stream (writes EOS marker synchronously).\n */\n close(): void {\n if (this.closed) return;\n this.closed = true;\n // EOS marker: continuation (0xFFFFFFFF) + metadata length (0x00000000)\n const eos = new Uint8Array(new Int32Array([-1, 0]).buffer);\n writeAll(this.fd, eos);\n }\n\n /**\n * Drain buffered bytes from the Arrow writer's internal queue\n * and write them synchronously to the output fd.\n */\n private drain(): void {\n const values = (this.writer as any)._sink._values as Uint8Array[];\n for (const chunk of values) {\n writeAll(this.fd, chunk);\n }\n values.length = 0;\n }\n}\n",
|
|
9
|
-
"// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport { DataType, type Schema, type RecordBatch } from \"apache-arrow\";\nimport {\n RPC_METHOD_KEY,\n REQUEST_VERSION_KEY,\n REQUEST_VERSION,\n REQUEST_ID_KEY,\n} from \"../constants.js\";\nimport { RpcError, VersionError } from \"../errors.js\";\n\nexport interface ParsedRequest {\n methodName: string;\n requestVersion: string;\n requestId: string | null;\n schema: Schema;\n params: Record<string, any>;\n rawMetadata: Map<string, string>;\n}\n\n/**\n * Parse a request from a RecordBatch with metadata.\n * Extracts method name, version, and params from the batch.\n */\nexport function parseRequest(\n schema: Schema,\n batch: RecordBatch,\n): ParsedRequest {\n const metadata: Map<string, string> = batch.metadata ?? new Map();\n\n const methodName = metadata.get(RPC_METHOD_KEY);\n if (methodName === undefined) {\n throw new RpcError(\n \"ProtocolError\",\n \"Missing 'vgi_rpc.method' in request batch custom_metadata. \" +\n \"Each request batch must carry a 'vgi_rpc.method' key in its Arrow IPC custom_metadata \" +\n \"with the method name as a UTF-8 string.\",\n \"\",\n );\n }\n\n const version = metadata.get(REQUEST_VERSION_KEY);\n if (version === undefined) {\n throw new VersionError(\n \"Missing 'vgi_rpc.request_version' in request batch custom_metadata. \" +\n `Set the 'vgi_rpc.request_version' custom_metadata value to '${REQUEST_VERSION}'.`,\n );\n }\n if (version !== REQUEST_VERSION) {\n throw new VersionError(\n `Unsupported request version '${version}', expected '${REQUEST_VERSION}'. ` +\n `Set the 'vgi_rpc.request_version' custom_metadata value to '${REQUEST_VERSION}'.`,\n );\n }\n\n const requestId = metadata.get(REQUEST_ID_KEY) ?? null;\n\n // Extract params from single-row batch\n const params: Record<string, any> = {};\n if (schema.fields.length > 0 && batch.numRows !== 1) {\n throw new RpcError(\n \"ProtocolError\",\n `Expected 1 row in request batch, got ${batch.numRows}. ` +\n \"Each parameter is a column (not a row). The batch should have exactly 1 row.\",\n \"\",\n );\n }\n\n for (let i = 0; i < schema.fields.length; i++) {\n const field = schema.fields[i];\n // Map_ columns have a broken .get() in arrow-js — pass through raw Data\n if (DataType.isMap(field.type)) {\n params[field.name] = batch.getChildAt(i)!.data[0];\n continue;\n }\n let value = batch.getChildAt(i)?.get(0);\n // Convert BigInt to Number when safe\n if (typeof value === \"bigint\") {\n if (\n value >= BigInt(Number.MIN_SAFE_INTEGER) &&\n value <= BigInt(Number.MAX_SAFE_INTEGER)\n ) {\n value = Number(value);\n }\n }\n params[field.name] = value;\n }\n\n return {\n methodName,\n requestVersion: version,\n requestId,\n schema,\n params,\n rawMetadata: metadata,\n };\n}\n",
|
|
5
|
+
"// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Cross-runtime zstd compression/decompression.\n *\n * Uses Bun.zstd* when running on Bun, otherwise falls back to node:zlib\n * (available on Node.js 22.15+ and Deno 2.6.9+).\n */\n\nimport * as zlib from \"node:zlib\";\n\nconst isBun = typeof globalThis.Bun !== \"undefined\";\n\n/** Compress data with zstd at the given level (1-22). */\nexport function zstdCompress(data: Uint8Array, level: number): Uint8Array<ArrayBuffer> {\n if (isBun) {\n return new Uint8Array(Bun.zstdCompressSync(data, { level }));\n }\n const fn = (zlib as any).zstdCompressSync;\n if (typeof fn !== \"function\") {\n throw new Error(\"zstd is not available in this runtime. \" + \"Requires Bun, Node.js >= 22.15, or Deno >= 2.6.9.\");\n }\n return new Uint8Array(\n fn(data, {\n params: {\n [(zlib.constants as any).ZSTD_c_compressionLevel]: level,\n },\n }),\n );\n}\n\n/** Decompress zstd-compressed data. */\nexport function zstdDecompress(data: Uint8Array): Uint8Array<ArrayBuffer> {\n if (isBun) {\n return new Uint8Array(Bun.zstdDecompressSync(data));\n }\n const fn = (zlib as any).zstdDecompressSync;\n if (typeof fn !== \"function\") {\n throw new Error(\"zstd is not available in this runtime. \" + \"Requires Bun, Node.js >= 22.15, or Deno >= 2.6.9.\");\n }\n return new Uint8Array(fn(data));\n}\n",
|
|
10
6
|
"// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\n/** Well-known metadata keys matching Python's metadata.py */\n\nexport const RPC_METHOD_KEY = \"vgi_rpc.method\";\nexport const LOG_LEVEL_KEY = \"vgi_rpc.log_level\";\nexport const LOG_MESSAGE_KEY = \"vgi_rpc.log_message\";\nexport const LOG_EXTRA_KEY = \"vgi_rpc.log_extra\";\nexport const REQUEST_VERSION_KEY = \"vgi_rpc.request_version\";\nexport const REQUEST_VERSION = \"1\";\n\nexport const SERVER_ID_KEY = \"vgi_rpc.server_id\";\nexport const REQUEST_ID_KEY = \"vgi_rpc.request_id\";\n\nexport const PROTOCOL_NAME_KEY = \"vgi_rpc.protocol_name\";\nexport const DESCRIBE_VERSION_KEY = \"vgi_rpc.describe_version\";\nexport const DESCRIBE_VERSION = \"2\";\n\nexport const DESCRIBE_METHOD_NAME = \"__describe__\";\n\nexport const STATE_KEY = \"vgi_rpc.stream_state#b64\";\n",
|
|
7
|
+
"// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n makeData,\n RecordBatch,\n RecordBatchReader,\n RecordBatchStreamWriter,\n type Schema,\n Struct,\n} from \"@query-farm/apache-arrow\";\n\nexport const ARROW_CONTENT_TYPE = \"application/vnd.apache.arrow.stream\";\n\nexport class HttpRpcError extends Error {\n constructor(\n message: string,\n public readonly statusCode: number,\n ) {\n super(message);\n this.name = \"HttpRpcError\";\n }\n}\n\n/**\n * Rebuild a batch's data to match the given schema's field types.\n *\n * Batches deserialized from IPC streams (e.g., from PyArrow) may use generic\n * types (Float) instead of specific ones (Float64). Arrow-JS's\n * RecordBatchStreamWriter silently drops batches whose child Data types don't\n * match the writer's schema. Cloning each child Data with the schema's field\n * type fixes the type metadata while preserving the underlying buffers.\n */\nfunction conformBatchToSchema(batch: RecordBatch, schema: Schema): RecordBatch {\n if (batch.numRows === 0) return batch;\n const children = schema.fields.map((f, i) => batch.data.children[i].clone(f.type));\n const structType = new Struct(schema.fields);\n const data = makeData({\n type: structType,\n length: batch.numRows,\n children,\n nullCount: batch.data.nullCount,\n nullBitmap: batch.data.nullBitmap,\n });\n return new RecordBatch(schema, data, batch.metadata);\n}\n\n/** Serialize a schema + batches into a complete IPC stream as Uint8Array. */\nexport function serializeIpcStream(schema: Schema, batches: RecordBatch[]): Uint8Array {\n const writer = new RecordBatchStreamWriter();\n writer.reset(undefined, schema);\n for (const batch of batches) {\n writer.write(conformBatchToSchema(batch, schema));\n }\n writer.close();\n return writer.toUint8Array(true);\n}\n\n/** Create a Response with Arrow IPC content type. Casts Uint8Array for TS lib compat. */\nexport function arrowResponse(body: Uint8Array, status = 200, extraHeaders?: Headers): Response {\n const headers = extraHeaders ?? new Headers();\n headers.set(\"Content-Type\", ARROW_CONTENT_TYPE);\n return new Response(body as unknown as BodyInit, { status, headers });\n}\n\n/** Read schema + first batch from an IPC stream body. */\nexport async function readRequestFromBody(body: Uint8Array): Promise<{ schema: Schema; batch: RecordBatch }> {\n const reader = await RecordBatchReader.from(body);\n await reader.open();\n const schema = reader.schema;\n if (!schema) {\n throw new HttpRpcError(\"Empty IPC stream: no schema\", 400);\n }\n const batches = reader.readAll();\n if (batches.length === 0) {\n throw new HttpRpcError(\"IPC stream contains no batches\", 400);\n }\n return { schema, batch: batches[0] };\n}\n",
|
|
8
|
+
"// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Schema as ArrowSchema, type RecordBatch, RecordBatchReader, type Schema } from \"@query-farm/apache-arrow\";\nimport { DESCRIBE_METHOD_NAME, PROTOCOL_NAME_KEY } from \"../constants.js\";\nimport { ARROW_CONTENT_TYPE } from \"../http/common.js\";\nimport { buildRequestIpc, dispatchLogOrError, readResponseBatches } from \"./ipc.js\";\nimport type { LogMessage } from \"./types.js\";\n\nexport interface MethodInfo {\n name: string;\n type: \"unary\" | \"stream\";\n paramsSchema: Schema;\n resultSchema: Schema;\n inputSchema?: Schema;\n outputSchema?: Schema;\n headerSchema?: Schema;\n doc?: string;\n paramTypes?: Record<string, string>;\n defaults?: Record<string, any>;\n}\n\nexport interface ServiceDescription {\n protocolName: string;\n methods: MethodInfo[];\n}\n\n/** Deserialize a schema from IPC bytes (schema message + EOS). */\nasync function deserializeSchema(bytes: Uint8Array): Promise<Schema> {\n const reader = await RecordBatchReader.from(bytes);\n await reader.open();\n return reader.schema!;\n}\n\n/**\n * Parse a __describe__ response from batches into a ServiceDescription.\n * Reusable across transports (HTTP, pipe, subprocess).\n */\nexport async function parseDescribeResponse(\n batches: RecordBatch[],\n onLog?: (msg: LogMessage) => void,\n): Promise<ServiceDescription> {\n // Find the data batch (skip log/error batches)\n let dataBatch = null;\n for (const batch of batches) {\n if (batch.numRows === 0) {\n dispatchLogOrError(batch, onLog);\n continue;\n }\n dataBatch = batch;\n }\n\n if (!dataBatch) {\n throw new Error(\"Empty __describe__ response\");\n }\n\n // Extract metadata from batch\n const meta = dataBatch.metadata;\n const protocolName = meta?.get(PROTOCOL_NAME_KEY) ?? \"\";\n\n const methods: MethodInfo[] = [];\n for (let i = 0; i < dataBatch.numRows; i++) {\n const name = dataBatch.getChildAt(0)!.get(i) as string; // name\n const methodType = dataBatch.getChildAt(1)!.get(i) as string; // method_type\n const doc = dataBatch.getChildAt(2)?.get(i) as string | null; // doc\n const _hasReturn = dataBatch.getChildAt(3)!.get(i) as boolean; // has_return\n const paramsIpc = dataBatch.getChildAt(4)!.get(i) as Uint8Array; // params_schema_ipc\n const resultIpc = dataBatch.getChildAt(5)!.get(i) as Uint8Array; // result_schema_ipc\n const paramTypesJson = dataBatch.getChildAt(6)?.get(i) as string | null; // param_types_json\n const paramDefaultsJson = dataBatch.getChildAt(7)?.get(i) as string | null; // param_defaults_json\n const hasHeader = dataBatch.getChildAt(8)!.get(i) as boolean; // has_header\n const headerIpc = dataBatch.getChildAt(9)?.get(i) as Uint8Array | null; // header_schema_ipc\n\n const paramsSchema = await deserializeSchema(paramsIpc);\n const resultSchema = await deserializeSchema(resultIpc);\n\n let paramTypes: Record<string, string> | undefined;\n if (paramTypesJson) {\n try {\n paramTypes = JSON.parse(paramTypesJson);\n } catch {}\n }\n\n let defaults: Record<string, any> | undefined;\n if (paramDefaultsJson) {\n try {\n defaults = JSON.parse(paramDefaultsJson);\n } catch {}\n }\n\n const info: MethodInfo = {\n name,\n type: methodType as \"unary\" | \"stream\",\n paramsSchema,\n resultSchema,\n doc: doc ?? undefined,\n paramTypes,\n defaults,\n };\n\n // For stream methods, result_schema_ipc actually holds the output schema\n if (methodType === \"stream\") {\n info.outputSchema = resultSchema;\n }\n\n if (hasHeader && headerIpc) {\n info.headerSchema = await deserializeSchema(headerIpc);\n }\n\n methods.push(info);\n }\n\n return { protocolName, methods };\n}\n\n/**\n * Send a __describe__ request and return a ServiceDescription.\n */\nexport async function httpIntrospect(baseUrl: string, options?: { prefix?: string }): Promise<ServiceDescription> {\n const prefix = options?.prefix ?? \"/vgi\";\n const emptySchema = new ArrowSchema([]);\n const body = buildRequestIpc(emptySchema, {}, DESCRIBE_METHOD_NAME);\n\n const response = await fetch(`${baseUrl}${prefix}/${DESCRIBE_METHOD_NAME}`, {\n method: \"POST\",\n headers: { \"Content-Type\": ARROW_CONTENT_TYPE },\n body: body as unknown as BodyInit,\n });\n\n const responseBody = new Uint8Array(await response.arrayBuffer());\n const { batches } = await readResponseBatches(responseBody);\n\n return parseDescribeResponse(batches);\n}\n",
|
|
9
|
+
"// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n Binary,\n Bool,\n DataType,\n Float64,\n Int64,\n makeData,\n RecordBatch,\n RecordBatchReader,\n type Schema,\n Struct,\n Utf8,\n vectorFromArray,\n} from \"@query-farm/apache-arrow\";\nimport {\n LOG_EXTRA_KEY,\n LOG_LEVEL_KEY,\n LOG_MESSAGE_KEY,\n REQUEST_VERSION,\n REQUEST_VERSION_KEY,\n RPC_METHOD_KEY,\n} from \"../constants.js\";\nimport { RpcError } from \"../errors.js\";\nimport { serializeIpcStream } from \"../http/common.js\";\nimport { IpcStreamReader } from \"../wire/reader.js\";\nimport type { LogMessage } from \"./types.js\";\n\n/** Infer an Arrow DataType from a JS value. */\nexport function inferArrowType(value: any): DataType {\n if (typeof value === \"string\") return new Utf8();\n if (typeof value === \"boolean\") return new Bool();\n if (typeof value === \"bigint\") return new Int64();\n if (typeof value === \"number\") return new Float64();\n if (value instanceof Uint8Array) return new Binary();\n return new Utf8(); // fallback\n}\n\n/**\n * Recursively coerce JS values to match Arrow type expectations.\n * Converts numbers to BigInt for Int64 fields, and recurses into Map/List types.\n */\nfunction coerceForArrow(type: DataType, value: any): any {\n if (value == null) return value;\n\n // Int64: convert number → BigInt\n if (DataType.isInt(type) && (type as any).bitWidth === 64) {\n if (typeof value === \"number\") return BigInt(value);\n return value;\n }\n\n // Map_: coerce map values recursively\n if (DataType.isMap(type)) {\n if (value instanceof Map) {\n const entriesField = (type as any).children[0];\n const valueType = entriesField.type.children[1].type;\n const coerced = new Map();\n for (const [k, v] of value) {\n coerced.set(k, coerceForArrow(valueType, v));\n }\n return coerced;\n }\n return value;\n }\n\n // List: coerce elements recursively\n if (DataType.isList(type)) {\n if (Array.isArray(value)) {\n const elemType = (type as any).children[0].type;\n return value.map((v: any) => coerceForArrow(elemType, v));\n }\n return value;\n }\n\n return value;\n}\n\n/**\n * Build a 1-row Arrow IPC request batch with method metadata.\n */\nexport function buildRequestIpc(schema: Schema, params: Record<string, any>, method: string): Uint8Array {\n const metadata = new Map<string, string>();\n metadata.set(RPC_METHOD_KEY, method);\n metadata.set(REQUEST_VERSION_KEY, REQUEST_VERSION);\n\n if (schema.fields.length === 0) {\n const structType = new Struct(schema.fields);\n const data = makeData({\n type: structType,\n length: 1,\n children: [],\n nullCount: 0,\n });\n const batch = new RecordBatch(schema, data, metadata);\n return serializeIpcStream(schema, [batch]);\n }\n\n const children = schema.fields.map((f) => {\n const val = coerceForArrow(f.type, params[f.name]);\n return vectorFromArray([val], f.type).data[0];\n });\n\n const structType = new Struct(schema.fields);\n const data = makeData({\n type: structType,\n length: 1,\n children,\n nullCount: 0,\n });\n\n const batch = new RecordBatch(schema, data, metadata);\n return serializeIpcStream(schema, [batch]);\n}\n\n/**\n * Read schema + all batches from an IPC stream body.\n */\nexport async function readResponseBatches(body: Uint8Array): Promise<{ schema: Schema; batches: RecordBatch[] }> {\n const reader = await RecordBatchReader.from(body);\n await reader.open();\n const schema = reader.schema;\n if (!schema) {\n throw new RpcError(\"ProtocolError\", \"Empty IPC stream: no schema\", \"\");\n }\n const batches = reader.readAll();\n return { schema, batches };\n}\n\n/**\n * Check if a zero-row batch carries log/error metadata.\n * If EXCEPTION → throw RpcError.\n * If other level → call onLog.\n * Returns true if the batch was consumed as a log/error.\n */\nexport function dispatchLogOrError(batch: RecordBatch, onLog?: (msg: LogMessage) => void): boolean {\n const meta = batch.metadata;\n if (!meta) return false;\n\n const level = meta.get(LOG_LEVEL_KEY);\n if (!level) return false;\n\n const message = meta.get(LOG_MESSAGE_KEY) ?? \"\";\n\n if (level === \"EXCEPTION\") {\n const extraStr = meta.get(LOG_EXTRA_KEY);\n let errorType = \"RpcError\";\n let errorMessage = message;\n let traceback = \"\";\n if (extraStr) {\n try {\n const extra = JSON.parse(extraStr);\n errorType = extra.exception_type ?? \"RpcError\";\n errorMessage = extra.exception_message ?? message;\n traceback = extra.traceback ?? \"\";\n } catch {}\n }\n throw new RpcError(errorType, errorMessage, traceback);\n }\n\n if (onLog) {\n const extraStr = meta.get(LOG_EXTRA_KEY);\n let extra: Record<string, any> | undefined;\n if (extraStr) {\n try {\n extra = JSON.parse(extraStr);\n } catch {}\n }\n onLog({ level, message, extra });\n }\n\n return true;\n}\n\n/**\n * Extract all rows from a batch as Record<string, any>[].\n * Converts BigInt to Number when safe.\n */\nexport function extractBatchRows(batch: RecordBatch): Record<string, any>[] {\n const rows: Record<string, any>[] = [];\n for (let r = 0; r < batch.numRows; r++) {\n const row: Record<string, any> = {};\n for (let i = 0; i < batch.schema.fields.length; i++) {\n const field = batch.schema.fields[i];\n let value = batch.getChildAt(i)?.get(r);\n if (typeof value === \"bigint\") {\n if (value >= BigInt(Number.MIN_SAFE_INTEGER) && value <= BigInt(Number.MAX_SAFE_INTEGER)) {\n value = Number(value);\n }\n }\n row[field.name] = value;\n }\n rows.push(row);\n }\n return rows;\n}\n\n/**\n * Read sequential IPC streams from a response body.\n * Returns an IpcStreamReader for reading header + data streams.\n */\nexport async function readSequentialStreams(body: Uint8Array): Promise<IpcStreamReader> {\n const stream = new ReadableStream<Uint8Array>({\n start(controller) {\n controller.enqueue(body);\n controller.close();\n },\n });\n return IpcStreamReader.create(stream);\n}\n",
|
|
11
10
|
"// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\n/** Error thrown when the server encounters an RPC protocol error. */\nexport class RpcError extends Error {\n constructor(\n public readonly errorType: string,\n public readonly errorMessage: string,\n public readonly remoteTraceback: string,\n ) {\n super(`${errorType}: ${errorMessage}`);\n this.name = \"RpcError\";\n }\n}\n\n/** Error thrown when the client sends an unsupported request version. */\nexport class VersionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"VersionError\";\n }\n}\n",
|
|
12
|
-
"// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport {
|
|
13
|
-
"// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport {
|
|
14
|
-
"// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport { RecordBatchStreamWriter, type Schema } from \"apache-arrow\";\n\n/**\n * Serialize a Schema to the Arrow IPC Schema message format.\n * This produces bytes compatible with Python's `pa.ipc.read_schema()`.\n *\n * We serialize by writing an empty-batch IPC stream and extracting\n * the bytes, which includes the schema message. Python's read_schema()\n * uses `pa.ipc.read_schema(pa.py_buffer(bytes))` which expects\n * the schema flatbuffer message bytes directly — but the Python side\n * actually uses `schema.serialize()` which produces Schema message bytes.\n *\n * In arrow-js, we can get the equivalent by using Message.from(schema)\n * and encoding it, or by serializing a zero-batch stream.\n *\n * The Python `schema.serialize()` produces the Schema flatbuffer message bytes,\n * and `pa.ipc.read_schema()` expects an IPC stream containing a schema message.\n * The actual format is: continuation marker (0xFFFFFFFF) + length + flatbuffer bytes.\n */\nexport function serializeSchema(schema: Schema): Uint8Array {\n // Write a complete IPC stream with no batches.\n // This writes: Schema message + EOS marker.\n // Python's pa.ipc.read_schema() can read this format.\n const writer = new RecordBatchStreamWriter();\n writer.reset(undefined, schema);\n writer.close();\n return writer.toUint8Array(true);\n}\n",
|
|
15
|
-
"// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport { type Schema, RecordBatch, recordBatchFromArrays } from \"apache-arrow\";\nimport { buildLogBatch, coerceInt64 } from \"./wire/response.js\";\n\nexport enum MethodType {\n UNARY = \"unary\",\n STREAM = \"stream\",\n}\n\n/** Logging interface available to handlers. */\nexport interface LogContext {\n clientLog(level: string, message: string, extra?: Record<string, string>): void;\n}\n\n/** Handler for unary (request-response) RPC methods. */\nexport type UnaryHandler = (\n params: Record<string, any>,\n ctx: LogContext,\n) => Promise<Record<string, any>> | Record<string, any>;\n\n/** Initialization function for producer streams. Returns the initial state object. */\nexport type ProducerInit<S = any> = (\n params: Record<string, any>,\n) => Promise<S> | S;\n/** Called repeatedly to produce output batches. Call `out.finish()` to end the stream. */\nexport type ProducerFn<S = any> = (\n state: S,\n out: OutputCollector,\n) => Promise<void> | void;\n\n/** Initialization function for exchange streams. Returns the initial state object. */\nexport type ExchangeInit<S = any> = (\n params: Record<string, any>,\n) => Promise<S> | S;\n/** Called once per input batch. Must emit exactly one output batch per call. */\nexport type ExchangeFn<S = any> = (\n state: S,\n input: RecordBatch,\n out: OutputCollector,\n) => Promise<void> | void;\n\n/** Produces a header batch sent before the first output batch in a stream. */\nexport type HeaderInit = (\n params: Record<string, any>,\n state: any,\n ctx: LogContext,\n) => Record<string, any>;\n\nexport interface MethodDefinition {\n name: string;\n type: MethodType;\n paramsSchema: Schema;\n resultSchema: Schema;\n outputSchema?: Schema;\n inputSchema?: Schema;\n handler?: UnaryHandler;\n producerInit?: ProducerInit;\n producerFn?: ProducerFn;\n exchangeInit?: ExchangeInit;\n exchangeFn?: ExchangeFn;\n headerSchema?: Schema;\n headerInit?: HeaderInit;\n doc?: string;\n defaults?: Record<string, any>;\n paramTypes?: Record<string, string>;\n}\n\nexport interface EmittedBatch {\n batch: RecordBatch;\n metadata?: Map<string, string>;\n}\n\n/**\n * Accumulates output batches during a produce/exchange call.\n * Enforces that exactly one data batch is emitted per call (plus any number of log batches).\n */\nexport class OutputCollector implements LogContext {\n private _batches: EmittedBatch[] = [];\n private _dataBatchIdx: number | null = null;\n private _finished = false;\n private _producerMode: boolean;\n private _outputSchema: Schema;\n private _serverId: string;\n private _requestId: string | null;\n\n constructor(outputSchema: Schema, producerMode = true, serverId = \"\", requestId: string | null = null) {\n this._outputSchema = outputSchema;\n this._producerMode = producerMode;\n this._serverId = serverId;\n this._requestId = requestId;\n }\n\n get outputSchema(): Schema {\n return this._outputSchema;\n }\n\n get finished(): boolean {\n return this._finished;\n }\n\n get batches(): EmittedBatch[] {\n return this._batches;\n }\n\n /** Emit a pre-built RecordBatch as the data batch for this call. */\n emit(batch: RecordBatch, metadata?: Map<string, string>): void;\n /** Emit a data batch from column arrays keyed by field name. Int64 Number values are coerced to BigInt. */\n emit(columns: Record<string, any[]>): void;\n emit(\n batchOrColumns: RecordBatch | Record<string, any[]>,\n metadata?: Map<string, string>,\n ): void {\n let batch: RecordBatch;\n if (batchOrColumns instanceof RecordBatch) {\n batch = batchOrColumns;\n } else {\n const coerced = coerceInt64(this._outputSchema, batchOrColumns);\n batch = recordBatchFromArrays(coerced, this._outputSchema);\n }\n if (this._dataBatchIdx !== null) {\n throw new Error(\"Only one data batch may be emitted per call\");\n }\n this._dataBatchIdx = this._batches.length;\n this._batches.push({ batch, metadata });\n }\n\n /** Single-row convenience. Wraps each value in `[value]` then calls `emit()`. */\n emitRow(values: Record<string, any>): void {\n const columns: Record<string, any[]> = {};\n for (const [key, value] of Object.entries(values)) {\n columns[key] = [value];\n }\n this.emit(columns);\n }\n\n /** Signal stream completion for producer streams. Throws if called on exchange streams. */\n finish(): void {\n if (!this._producerMode) {\n throw new Error(\n \"finish() is not allowed on exchange streams; \" +\n \"exchange streams must emit exactly one data batch per call\",\n );\n }\n this._finished = true;\n }\n\n /** Emit a zero-row client-directed log batch. */\n clientLog(level: string, message: string, extra?: Record<string, string>): void {\n const batch = buildLogBatch(\n this._outputSchema,\n level,\n message,\n extra,\n this._serverId,\n this._requestId,\n );\n this._batches.push({ batch });\n }\n\n}\n",
|
|
16
|
-
"// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Schema } from \"apache-arrow\";\nimport type {
|
|
17
|
-
"// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Schema } from \"apache-arrow\";\nimport
|
|
18
|
-
"// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport {
|
|
19
|
-
"// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n Schema,\n Field,\n DataType,\n Utf8,\n Binary,\n Int64,\n Int32,\n Int16,\n Float64,\n Float32,\n Bool,\n} from \"apache-arrow\";\n\n// ---------------------------------------------------------------------------\n// Convenient DataType singletons — re-export so users avoid arrow imports\n// ---------------------------------------------------------------------------\n\n/** Apache Arrow Utf8 type. Use as schema shorthand: `{ name: str }` */\nexport const str = new Utf8();\n/** Apache Arrow Binary type. Use as schema shorthand: `{ data: bytes }` */\nexport const bytes = new Binary();\n/** Apache Arrow Int64 type. Use as schema shorthand: `{ count: int }` */\nexport const int = new Int64();\n/** Apache Arrow Int32 type. Use as schema shorthand: `{ count: int32 }` */\nexport const int32 = new Int32();\n/** Apache Arrow Float64 type. Use as schema shorthand: `{ value: float }` */\nexport const float = new Float64();\n/** Apache Arrow Float32 type. Use as schema shorthand: `{ value: float32 }` */\nexport const float32 = new Float32();\n/** Apache Arrow Bool type. Use as schema shorthand: `{ flag: bool }` */\nexport const bool = new Bool();\n\n// ---------------------------------------------------------------------------\n// SchemaLike — shorthand for declaring schemas\n// ---------------------------------------------------------------------------\n\n/**\n * A schema specification that accepts:\n * - A real `Schema` (passed through)\n * - A record mapping field names to `DataType` instances or `Field` instances\n * - An empty `{}` for an empty schema\n */\nexport type SchemaLike = Schema | Record<string, DataType | Field>;\n\n/**\n * Convert a SchemaLike spec into a real `Schema`.\n *\n * - `Schema` → returned as-is\n * - `Record<string, DataType>` → each entry becomes `new Field(name, type, false)`\n * - `Record<string, Field>` → each entry is passed through\n * - `{}` → `new Schema([])`\n */\nexport function toSchema(spec: SchemaLike): Schema {\n if (spec instanceof Schema) return spec;\n\n const fields: Field[] = [];\n for (const [name, value] of Object.entries(spec)) {\n if (value instanceof Field) {\n fields.push(value);\n } else if (value instanceof DataType) {\n fields.push(new Field(name, value, false));\n } else {\n throw new TypeError(\n `Invalid schema value for \"${name}\": expected DataType or Field, got ${typeof value}`,\n );\n }\n }\n return new Schema(fields);\n}\n\n// ---------------------------------------------------------------------------\n// inferParamTypes — derive paramTypes from a schema spec\n// ---------------------------------------------------------------------------\n\nconst TYPE_MAP: [new (...args: any[]) => DataType, string][] = [\n [Utf8, \"str\"],\n [Binary, \"bytes\"],\n [Bool, \"bool\"],\n [Float64, \"float\"],\n [Float32, \"float\"],\n [Int64, \"int\"],\n [Int32, \"int\"],\n [Int16, \"int\"],\n];\n\n/**\n * Derive a `paramTypes` record from a SchemaLike spec.\n * Maps common Arrow scalar types to Python-style type strings.\n * Returns `undefined` if any field has a complex type (List, Map_, Dictionary, etc.).\n */\nexport function inferParamTypes(\n spec: SchemaLike,\n): Record<string, string> | undefined {\n const schema = toSchema(spec);\n if (schema.fields.length === 0) return undefined;\n\n const result: Record<string, string> = {};\n for (const field of schema.fields) {\n let mapped: string | undefined;\n for (const [ctor, name] of TYPE_MAP) {\n if (field.type instanceof ctor) {\n mapped = name;\n break;\n }\n }\n if (!mapped) return undefined;\n result[field.name] = mapped;\n }\n return result;\n}\n",
|
|
20
|
-
"// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport {
|
|
21
|
-
"// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\
|
|
22
|
-
"// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport {
|
|
23
|
-
"// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Schema, RecordBatch } from \"apache-arrow\";\nimport type { MethodDefinition } from \"../types.js\";\nimport { OutputCollector } from \"../types.js\";\nimport { parseRequest } from \"../wire/request.js\";\nimport {\n buildResultBatch,\n buildErrorBatch,\n buildEmptyBatch,\n} from \"../wire/response.js\";\nimport { buildDescribeBatch, DESCRIBE_SCHEMA } from \"../dispatch/describe.js\";\nimport { STATE_KEY } from \"../constants.js\";\nimport { serializeSchema } from \"../util/schema.js\";\nimport {\n HttpRpcError,\n serializeIpcStream,\n readRequestFromBody,\n arrowResponse,\n} from \"./common.js\";\nimport { packStateToken, unpackStateToken } from \"./token.js\";\nimport type { StateSerializer } from \"./types.js\";\n\nconst EMPTY_SCHEMA = new Schema([]);\n\nexport interface DispatchContext {\n signingKey: Uint8Array;\n tokenTtl: number;\n serverId: string;\n maxStreamResponseBytes?: number;\n stateSerializer: StateSerializer;\n}\n\n/** Dispatch a __describe__ request. */\nexport function httpDispatchDescribe(\n protocolName: string,\n methods: Map<string, MethodDefinition>,\n serverId: string,\n): Response {\n const { batch } = buildDescribeBatch(protocolName, methods, serverId);\n const body = serializeIpcStream(DESCRIBE_SCHEMA, [batch]);\n return arrowResponse(body);\n}\n\n/** Dispatch a unary HTTP request. */\nexport async function httpDispatchUnary(\n method: MethodDefinition,\n body: Uint8Array,\n ctx: DispatchContext,\n): Promise<Response> {\n const schema = method.resultSchema;\n const { schema: reqSchema, batch: reqBatch } = await readRequestFromBody(body);\n const parsed = parseRequest(reqSchema, reqBatch);\n\n if (parsed.methodName !== method.name) {\n throw new HttpRpcError(\n `Method name in request '${parsed.methodName}' does not match URL '${method.name}'`,\n 400,\n );\n }\n\n const out = new OutputCollector(schema, true, ctx.serverId, parsed.requestId);\n\n try {\n const result = await method.handler!(parsed.params, out);\n const resultBatch = buildResultBatch(schema, result, ctx.serverId, parsed.requestId);\n const batches = [...out.batches.map((b) => b.batch), resultBatch];\n return arrowResponse(serializeIpcStream(schema, batches));\n } catch (error: any) {\n const errBatch = buildErrorBatch(schema, error, ctx.serverId, parsed.requestId);\n return arrowResponse(serializeIpcStream(schema, [errBatch]), 500);\n }\n}\n\n/** Dispatch a stream init HTTP request (producer or exchange). */\nexport async function httpDispatchStreamInit(\n method: MethodDefinition,\n body: Uint8Array,\n ctx: DispatchContext,\n): Promise<Response> {\n const isProducer =\n !method.inputSchema || method.inputSchema.fields.length === 0;\n const outputSchema = method.outputSchema!;\n const inputSchema = method.inputSchema ?? EMPTY_SCHEMA;\n\n const { schema: reqSchema, batch: reqBatch } = await readRequestFromBody(body);\n const parsed = parseRequest(reqSchema, reqBatch);\n\n if (parsed.methodName !== method.name) {\n throw new HttpRpcError(\n `Method name in request '${parsed.methodName}' does not match URL '${method.name}'`,\n 400,\n );\n }\n\n // Init state\n let state: any;\n try {\n if (isProducer) {\n state = await method.producerInit!(parsed.params);\n } else {\n state = await method.exchangeInit!(parsed.params);\n }\n } catch (error: any) {\n const errSchema = method.headerSchema ?? EMPTY_SCHEMA;\n const errBatch = buildErrorBatch(errSchema, error, ctx.serverId, parsed.requestId);\n return arrowResponse(serializeIpcStream(errSchema, [errBatch]), 500);\n }\n\n // Support dynamic output schemas (same as pipe transport)\n const resolvedOutputSchema = state?.__outputSchema ?? outputSchema;\n const effectiveProducer = state?.__isProducer ?? isProducer;\n\n // Build header IPC stream if method has a header schema\n let headerBytes: Uint8Array | null = null;\n if (method.headerSchema && method.headerInit) {\n try {\n const headerOut = new OutputCollector(\n method.headerSchema,\n true,\n ctx.serverId,\n parsed.requestId,\n );\n const headerValues = method.headerInit(parsed.params, state, headerOut);\n const headerBatch = buildResultBatch(\n method.headerSchema,\n headerValues,\n ctx.serverId,\n parsed.requestId,\n );\n const headerBatches = [\n ...headerOut.batches.map((b) => b.batch),\n headerBatch,\n ];\n headerBytes = serializeIpcStream(method.headerSchema, headerBatches);\n } catch (error: any) {\n const errBatch = buildErrorBatch(\n method.headerSchema,\n error,\n ctx.serverId,\n parsed.requestId,\n );\n return arrowResponse(serializeIpcStream(method.headerSchema, [errBatch]), 500);\n }\n }\n\n if (effectiveProducer) {\n return produceStreamResponse(\n method,\n state,\n resolvedOutputSchema,\n inputSchema,\n ctx,\n parsed.requestId,\n headerBytes,\n );\n } else {\n // Exchange: serialize state into signed token, return zero-row batch with token\n const stateBytes = ctx.stateSerializer.serialize(state);\n const schemaBytes = serializeSchema(resolvedOutputSchema);\n const inputSchemaBytes = serializeSchema(inputSchema);\n const token = packStateToken(\n stateBytes,\n schemaBytes,\n inputSchemaBytes,\n ctx.signingKey,\n );\n\n const tokenMeta = new Map<string, string>();\n tokenMeta.set(STATE_KEY, token);\n const tokenBatch = buildEmptyBatch(resolvedOutputSchema, tokenMeta);\n const tokenStreamBytes = serializeIpcStream(resolvedOutputSchema, [tokenBatch]);\n\n let responseBody: Uint8Array;\n if (headerBytes) {\n responseBody = concatBytes(headerBytes, tokenStreamBytes);\n } else {\n responseBody = tokenStreamBytes;\n }\n\n return arrowResponse(responseBody);\n }\n}\n\n/** Dispatch a stream exchange HTTP request (producer continuation or exchange round). */\nexport async function httpDispatchStreamExchange(\n method: MethodDefinition,\n body: Uint8Array,\n ctx: DispatchContext,\n): Promise<Response> {\n const isProducer =\n !method.inputSchema || method.inputSchema.fields.length === 0;\n\n const { batch: reqBatch } = await readRequestFromBody(body);\n\n // Get state token from batch metadata\n const tokenBase64 = reqBatch.metadata?.get(STATE_KEY);\n if (!tokenBase64) {\n throw new HttpRpcError(\"Missing state token in exchange request\", 400);\n }\n\n let unpacked;\n try {\n unpacked = unpackStateToken(tokenBase64, ctx.signingKey, ctx.tokenTtl);\n } catch (error: any) {\n throw new HttpRpcError(`Invalid state token: ${error.message}`, 400);\n }\n\n const state = ctx.stateSerializer.deserialize(unpacked.stateBytes);\n\n // Support dynamic output schemas (same as pipe transport)\n const outputSchema = state?.__outputSchema ?? method.outputSchema!;\n const inputSchema = method.inputSchema ?? EMPTY_SCHEMA;\n const effectiveProducer = state?.__isProducer ?? isProducer;\n\n if (effectiveProducer) {\n return produceStreamResponse(\n method,\n state,\n outputSchema,\n inputSchema,\n ctx,\n null,\n null,\n );\n } else {\n const out = new OutputCollector(outputSchema, false, ctx.serverId, null);\n\n try {\n await method.exchangeFn!(state, reqBatch, out);\n } catch (error: any) {\n const errBatch = buildErrorBatch(outputSchema, error, ctx.serverId, null);\n return arrowResponse(serializeIpcStream(outputSchema, [errBatch]), 500);\n }\n\n // Repack updated state into new token\n const stateBytes = ctx.stateSerializer.serialize(state);\n const schemaBytes = serializeSchema(outputSchema);\n const inputSchemaBytes = serializeSchema(inputSchema);\n const token = packStateToken(\n stateBytes,\n schemaBytes,\n inputSchemaBytes,\n ctx.signingKey,\n );\n\n // Merge token into the data batch's metadata (matching Python behavior).\n // The Python client expects the token on the data batch itself, not a\n // separate zero-row batch.\n const batches: RecordBatch[] = [];\n for (const emitted of out.batches) {\n const batch = emitted.batch;\n if (batch.numRows > 0) {\n // This is the data batch — merge token into its metadata\n const mergedMeta = new Map<string, string>(batch.metadata ?? []);\n mergedMeta.set(STATE_KEY, token);\n batches.push(new RecordBatch(batch.schema, batch.data, mergedMeta));\n } else {\n batches.push(batch);\n }\n }\n\n return arrowResponse(serializeIpcStream(outputSchema, batches));\n }\n}\n\n/** Run the producer loop and build the response. */\nasync function produceStreamResponse(\n method: MethodDefinition,\n state: any,\n outputSchema: Schema,\n inputSchema: Schema,\n ctx: DispatchContext,\n requestId: string | null,\n headerBytes: Uint8Array | null,\n): Promise<Response> {\n const allBatches: RecordBatch[] = [];\n const maxBytes = ctx.maxStreamResponseBytes;\n let estimatedBytes = 0;\n\n while (true) {\n const out = new OutputCollector(outputSchema, true, ctx.serverId, requestId);\n\n try {\n await method.producerFn!(state, out);\n } catch (error: any) {\n allBatches.push(buildErrorBatch(outputSchema, error, ctx.serverId, requestId));\n break;\n }\n\n for (const emitted of out.batches) {\n allBatches.push(emitted.batch);\n if (maxBytes != null) {\n estimatedBytes += emitted.batch.data.byteLength;\n }\n }\n\n if (out.finished) {\n break;\n }\n\n // Check byte budget — if exceeded, emit continuation token\n if (maxBytes != null && estimatedBytes >= maxBytes) {\n const stateBytes = ctx.stateSerializer.serialize(state);\n const schemaBytes = serializeSchema(outputSchema);\n const inputSchemaBytes = serializeSchema(inputSchema);\n const token = packStateToken(\n stateBytes,\n schemaBytes,\n inputSchemaBytes,\n ctx.signingKey,\n );\n const tokenMeta = new Map<string, string>();\n tokenMeta.set(STATE_KEY, token);\n allBatches.push(buildEmptyBatch(outputSchema, tokenMeta));\n break;\n }\n }\n\n const dataBytes = serializeIpcStream(outputSchema, allBatches);\n let responseBody: Uint8Array;\n if (headerBytes) {\n responseBody = concatBytes(headerBytes, dataBytes);\n } else {\n responseBody = dataBytes;\n }\n return arrowResponse(responseBody);\n}\n\nfunction concatBytes(...arrays: Uint8Array[]): Uint8Array {\n const totalLen = arrays.reduce((sum, a) => sum + a.length, 0);\n const result = new Uint8Array(totalLen);\n let offset = 0;\n for (const arr of arrays) {\n result.set(arr, offset);\n offset += arr.length;\n }\n return result;\n}\n",
|
|
24
|
-
"// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\
|
|
25
|
-
"// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport {
|
|
26
|
-
"// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport {
|
|
27
|
-
"// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport {
|
|
28
|
-
"// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport { RecordBatch, Schema } from \"apache-arrow\";\nimport { STATE_KEY, LOG_LEVEL_KEY, DESCRIBE_METHOD_NAME } from \"../constants.js\";\nimport { ARROW_CONTENT_TYPE } from \"../http/common.js\";\nimport {\n buildRequestIpc,\n readResponseBatches,\n dispatchLogOrError,\n extractBatchRows,\n readSequentialStreams,\n} from \"./ipc.js\";\nimport { httpIntrospect, type MethodInfo, type ServiceDescription } from \"./introspect.js\";\nimport { HttpStreamSession } from \"./stream.js\";\nimport type { HttpConnectOptions, LogMessage, StreamSession } from \"./types.js\";\n\ntype CompressFn = (data: Uint8Array, level: number) => Uint8Array;\ntype DecompressFn = (data: Uint8Array) => Uint8Array;\n\nexport interface RpcClient {\n call(method: string, params?: Record<string, any>): Promise<Record<string, any> | null>;\n stream(method: string, params?: Record<string, any>): Promise<StreamSession>;\n describe(): Promise<ServiceDescription>;\n close(): void;\n}\n\nexport function httpConnect(\n baseUrl: string,\n options?: HttpConnectOptions,\n): RpcClient {\n const prefix = (options?.prefix ?? \"/vgi\").replace(/\\/+$/, \"\");\n const onLog = options?.onLog;\n const compressionLevel = options?.compressionLevel;\n\n let methodCache: Map<string, MethodInfo> | null = null;\n let compressFn: CompressFn | undefined;\n let decompressFn: DecompressFn | undefined;\n let compressionLoaded = false;\n\n async function ensureCompression(): Promise<void> {\n if (compressionLoaded || compressionLevel == null) return;\n compressionLoaded = true;\n try {\n const mod = await import(\"../util/zstd.js\");\n compressFn = mod.zstdCompress;\n decompressFn = mod.zstdDecompress;\n } catch {\n // zstd not available in this runtime\n }\n }\n\n function buildHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n \"Content-Type\": ARROW_CONTENT_TYPE,\n };\n if (compressionLevel != null) {\n headers[\"Content-Encoding\"] = \"zstd\";\n headers[\"Accept-Encoding\"] = \"zstd\";\n }\n return headers;\n }\n\n function prepareBody(content: Uint8Array): Uint8Array {\n if (compressionLevel != null && compressFn) {\n return compressFn(content, compressionLevel);\n }\n return content;\n }\n\n async function readResponse(resp: Response): Promise<Uint8Array<ArrayBuffer>> {\n let body = new Uint8Array(await resp.arrayBuffer());\n if (resp.headers.get(\"Content-Encoding\") === \"zstd\" && decompressFn) {\n body = new Uint8Array(decompressFn(body));\n }\n return body;\n }\n\n async function ensureMethodCache(): Promise<Map<string, MethodInfo>> {\n if (methodCache) return methodCache;\n const desc = await httpIntrospect(baseUrl, { prefix });\n methodCache = new Map(desc.methods.map((m) => [m.name, m]));\n return methodCache;\n }\n\n return {\n async call(\n method: string,\n params?: Record<string, any>,\n ): Promise<Record<string, any> | null> {\n await ensureCompression();\n const methods = await ensureMethodCache();\n const info = methods.get(method);\n if (!info) {\n throw new Error(`Unknown method: '${method}'`);\n }\n\n // Apply defaults\n const fullParams = { ...(info.defaults ?? {}), ...(params ?? {}) };\n\n const body = buildRequestIpc(info.paramsSchema, fullParams, method);\n const resp = await fetch(`${baseUrl}${prefix}/${method}`, {\n method: \"POST\",\n headers: buildHeaders(),\n body: prepareBody(body) as unknown as BodyInit,\n });\n\n const responseBody = await readResponse(resp);\n const { batches } = await readResponseBatches(responseBody);\n\n // Process batches: dispatch logs, find result\n let resultBatch: RecordBatch | null = null;\n for (const batch of batches) {\n if (batch.numRows === 0) {\n dispatchLogOrError(batch, onLog);\n continue;\n }\n resultBatch = batch;\n }\n\n if (!resultBatch) {\n // Void return (result schema has no fields)\n return null;\n }\n\n // Extract single-row result\n const rows = extractBatchRows(resultBatch);\n if (rows.length === 0) return null;\n\n const result = rows[0];\n // For void methods (empty result schema), return null\n if (info.resultSchema.fields.length === 0) return null;\n\n // For single-field results, return the whole object\n return result;\n },\n\n async stream(\n method: string,\n params?: Record<string, any>,\n ): Promise<HttpStreamSession> {\n await ensureCompression();\n const methods = await ensureMethodCache();\n const info = methods.get(method);\n if (!info) {\n throw new Error(`Unknown method: '${method}'`);\n }\n\n // Apply defaults\n const fullParams = { ...(info.defaults ?? {}), ...(params ?? {}) };\n\n const body = buildRequestIpc(info.paramsSchema, fullParams, method);\n const resp = await fetch(`${baseUrl}${prefix}/${method}/init`, {\n method: \"POST\",\n headers: buildHeaders(),\n body: prepareBody(body) as unknown as BodyInit,\n });\n\n const responseBody = await readResponse(resp);\n\n // Parse the response: may contain header stream + data stream\n let header: Record<string, any> | null = null;\n let stateToken: string | null = null;\n const pendingBatches: RecordBatch[] = [];\n let finished = false;\n let streamSchema: Schema | null = null;\n\n if (info.headerSchema) {\n // Response may contain two concatenated IPC streams:\n // 1. Header stream\n // 2. Data stream (with state token and/or data batches)\n const reader = await readSequentialStreams(responseBody);\n\n // First stream: header\n const headerStream = await reader.readStream();\n if (headerStream) {\n for (const batch of headerStream.batches) {\n if (batch.numRows === 0) {\n dispatchLogOrError(batch, onLog);\n continue;\n }\n const rows = extractBatchRows(batch);\n if (rows.length > 0) {\n header = rows[0];\n }\n }\n }\n\n // Second stream: data/state\n const dataStream = await reader.readStream();\n if (dataStream) {\n streamSchema = dataStream.schema;\n }\n const headerErrorBatches: RecordBatch[] = [];\n if (dataStream) {\n for (const batch of dataStream.batches) {\n if (batch.numRows === 0) {\n // Check for state token\n const token = batch.metadata?.get(STATE_KEY);\n if (token) {\n stateToken = token;\n continue;\n }\n const level = batch.metadata?.get(LOG_LEVEL_KEY);\n if (level === \"EXCEPTION\") {\n headerErrorBatches.push(batch);\n continue;\n }\n dispatchLogOrError(batch, onLog);\n continue;\n }\n pendingBatches.push(batch);\n }\n }\n\n if (headerErrorBatches.length > 0) {\n if (pendingBatches.length > 0 || stateToken !== null) {\n pendingBatches.push(...headerErrorBatches);\n } else {\n for (const batch of headerErrorBatches) {\n dispatchLogOrError(batch, onLog);\n }\n }\n }\n\n if (!dataStream && !stateToken) {\n finished = true;\n }\n } else {\n // Single IPC stream: data/state (no header)\n const { schema: responseSchema, batches } = await readResponseBatches(responseBody);\n streamSchema = responseSchema;\n\n // Collect error batches separately — only defer them if there are\n // data batches or state tokens (mid-stream errors). Otherwise throw\n // immediately (init-only errors like exchange_error_on_init).\n const errorBatches: RecordBatch[] = [];\n\n for (const batch of batches) {\n if (batch.numRows === 0) {\n // Check for state token\n const token = batch.metadata?.get(STATE_KEY);\n if (token) {\n stateToken = token;\n continue;\n }\n // Collect EXCEPTION batches for deferred dispatch\n const level = batch.metadata?.get(LOG_LEVEL_KEY);\n if (level === \"EXCEPTION\") {\n errorBatches.push(batch);\n continue;\n }\n dispatchLogOrError(batch, onLog);\n continue;\n }\n pendingBatches.push(batch);\n }\n\n // If we have data batches or a state token, defer errors to iteration.\n // Otherwise throw immediately (error on init).\n if (errorBatches.length > 0) {\n if (pendingBatches.length > 0 || stateToken !== null) {\n pendingBatches.push(...errorBatches);\n } else {\n // No data, no state — this is a pure init error. Throw now.\n for (const batch of errorBatches) {\n dispatchLogOrError(batch, onLog);\n }\n }\n }\n }\n\n if (pendingBatches.length === 0 && stateToken === null) {\n finished = true;\n }\n\n // Determine output schema: prefer the IPC stream schema from the init\n // response (it carries the server's actual output schema even for\n // zero-row token batches), then pending batch schemas, then describe info.\n const outputSchema =\n (streamSchema && streamSchema.fields.length > 0 ? streamSchema : null)\n ?? (pendingBatches.length > 0 ? pendingBatches[0].schema : null)\n ?? info.outputSchema ?? info.resultSchema;\n\n return new HttpStreamSession({\n baseUrl,\n prefix,\n method,\n stateToken,\n outputSchema,\n inputSchema: info.inputSchema,\n onLog,\n pendingBatches,\n finished,\n header,\n compressionLevel,\n compressFn,\n decompressFn,\n });\n },\n\n async describe(): Promise<ServiceDescription> {\n return httpIntrospect(baseUrl, { prefix });\n },\n\n close(): void {\n // No-op (HTTP stateless)\n },\n };\n}\n",
|
|
29
|
-
"// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n RecordBatch,\n RecordBatchStreamWriter,\n Schema,\n Field,\n Struct,\n makeData,\n vectorFromArray,\n} from \"apache-arrow\";\nimport { DESCRIBE_METHOD_NAME } from \"../constants.js\";\nimport { serializeIpcStream } from \"../http/common.js\";\nimport { IpcStreamReader } from \"../wire/reader.js\";\nimport {\n inferArrowType,\n buildRequestIpc,\n dispatchLogOrError,\n extractBatchRows,\n} from \"./ipc.js\";\nimport {\n parseDescribeResponse,\n type MethodInfo,\n type ServiceDescription,\n} from \"./introspect.js\";\nimport type {\n LogMessage,\n PipeConnectOptions,\n SubprocessConnectOptions,\n StreamSession,\n} from \"./types.js\";\nimport type { RpcClient } from \"./connect.js\";\nimport { RpcError } from \"../errors.js\";\n\n// ---------------------------------------------------------------------------\n// Writable abstraction\n// ---------------------------------------------------------------------------\n\ninterface PipeWritable {\n write(data: Uint8Array): void;\n flush?(): void;\n end(): void;\n}\n\ntype WriteFn = (bytes: Uint8Array) => void;\n\n// ---------------------------------------------------------------------------\n// PipeIncrementalWriter — batch-by-batch IPC writing for lockstep streaming\n// ---------------------------------------------------------------------------\n\nclass PipeIncrementalWriter {\n private writer: RecordBatchStreamWriter;\n private writeFn: WriteFn;\n private closed = false;\n\n constructor(writeFn: WriteFn, schema: Schema) {\n this.writeFn = writeFn;\n this.writer = new RecordBatchStreamWriter();\n this.writer.reset(undefined, schema);\n this.drain(); // flushes schema message\n }\n\n write(batch: RecordBatch): void {\n if (this.closed) throw new Error(\"PipeIncrementalWriter already closed\");\n (this.writer as any)._writeRecordBatch(batch);\n this.drain();\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n // EOS marker: continuation (0xFFFFFFFF) + metadata length (0x00000000)\n const eos = new Uint8Array(new Int32Array([-1, 0]).buffer);\n this.writeFn(eos);\n }\n\n private drain(): void {\n const values = (this.writer as any)._sink._values as Uint8Array[];\n for (const chunk of values) {\n this.writeFn(chunk);\n }\n values.length = 0;\n }\n}\n\n// ---------------------------------------------------------------------------\n// PipeStreamSession — lockstep streaming over pipes\n// ---------------------------------------------------------------------------\n\nexport class PipeStreamSession implements StreamSession {\n private _reader: IpcStreamReader;\n private _writeFn: WriteFn;\n private _onLog?: (msg: LogMessage) => void;\n private _header: Record<string, any> | null;\n private _inputWriter: PipeIncrementalWriter | null = null;\n private _inputSchema: Schema | null = null;\n private _outputStreamOpened = false;\n private _closed = false;\n private _outputSchema: Schema;\n private _releaseBusy: () => void;\n private _setDrainPromise: (p: Promise<void>) => void;\n\n constructor(opts: {\n reader: IpcStreamReader;\n writeFn: WriteFn;\n onLog?: (msg: LogMessage) => void;\n header: Record<string, any> | null;\n outputSchema: Schema;\n releaseBusy: () => void;\n setDrainPromise: (p: Promise<void>) => void;\n }) {\n this._reader = opts.reader;\n this._writeFn = opts.writeFn;\n this._onLog = opts.onLog;\n this._header = opts.header;\n this._outputSchema = opts.outputSchema;\n this._releaseBusy = opts.releaseBusy;\n this._setDrainPromise = opts.setDrainPromise;\n }\n\n get header(): Record<string, any> | null {\n return this._header;\n }\n\n /**\n * Read output batches from the server until a data batch is found.\n * Dispatches log/error batches along the way.\n * Returns null when server closes output stream (EOS).\n */\n private async _readOutputBatch(): Promise<RecordBatch | null> {\n while (true) {\n const batch = await this._reader.readNextBatch();\n if (batch === null) return null; // Server closed output stream\n\n if (batch.numRows === 0) {\n // Check if it's a log/error batch. If so, dispatch and continue.\n // Otherwise it's a zero-row data batch — return it.\n if (dispatchLogOrError(batch, this._onLog)) {\n continue;\n }\n }\n\n return batch;\n }\n }\n\n /**\n * Ensure the server's output stream is opened for reading.\n * Must be called AFTER sending the first input batch, because\n * the server's output schema may not be flushed until it processes\n * the first input and writes the first output batch.\n */\n private async _ensureOutputStream(): Promise<void> {\n if (this._outputStreamOpened) return;\n this._outputStreamOpened = true;\n const schema = await this._reader.openNextStream();\n if (!schema) {\n throw new RpcError(\"ProtocolError\", \"Expected output stream but got EOF\", \"\");\n }\n }\n\n /**\n * Send an exchange request and return the data rows.\n */\n async exchange(input: Record<string, any>[]): Promise<Record<string, any>[]> {\n if (this._closed) {\n throw new RpcError(\"ProtocolError\", \"Stream session is closed\", \"\");\n }\n\n // Build input batch\n let inputSchema: Schema;\n let batch: RecordBatch;\n\n if (input.length === 0) {\n // Zero-row exchange: use cached input schema from a prior exchange,\n // then fall back to the output schema from describe. The cached\n // schema is preferred because input and output schemas may differ\n // (e.g. exchange_accumulate: input {value} → output {running_sum, exchange_count}).\n inputSchema = this._inputSchema ?? this._outputSchema;\n const children = inputSchema.fields.map((f) => {\n return makeData({ type: f.type, length: 0, nullCount: 0 });\n });\n const structType = new Struct(inputSchema.fields);\n const data = makeData({\n type: structType,\n length: 0,\n children,\n nullCount: 0,\n });\n batch = new RecordBatch(inputSchema, data);\n } else {\n // Infer schema from first row.\n // Always use nullable fields — the server validates input schemas\n // strictly and its schema typically uses nullable columns.\n const keys = Object.keys(input[0]);\n const fields = keys.map((key) => {\n let sample: any = undefined;\n for (const row of input) {\n if (row[key] != null) { sample = row[key]; break; }\n }\n const arrowType = inferArrowType(sample);\n return new Field(key, arrowType, /* nullable */ true);\n });\n inputSchema = new Schema(fields);\n\n // Validate schema consistency: all exchanges on the same pipe session\n // share a single IPC stream, so the schema is locked to the first call.\n if (this._inputSchema) {\n const cached = this._inputSchema;\n if (\n cached.fields.length !== inputSchema.fields.length ||\n cached.fields.some((f, i) => f.name !== inputSchema.fields[i].name)\n ) {\n throw new RpcError(\n \"ProtocolError\",\n `Exchange input schema changed: expected [${cached.fields.map((f) => f.name).join(\", \")}] ` +\n `but got [${inputSchema.fields.map((f) => f.name).join(\", \")}]`,\n \"\",\n );\n }\n } else {\n this._inputSchema = inputSchema;\n }\n\n const children = inputSchema.fields.map((f) => {\n const values = input.map((row) => row[f.name]);\n return vectorFromArray(values, f.type).data[0];\n });\n const structType = new Struct(inputSchema.fields);\n const data = makeData({\n type: structType,\n length: input.length,\n children,\n nullCount: 0,\n });\n batch = new RecordBatch(inputSchema, data);\n }\n\n // Lazy-open input writer on first exchange\n if (!this._inputWriter) {\n this._inputWriter = new PipeIncrementalWriter(this._writeFn, inputSchema);\n }\n\n // Write one input batch FIRST, then open output stream.\n // The server may not flush the output schema until it processes the\n // first input batch and writes the first output batch.\n this._inputWriter.write(batch);\n await this._ensureOutputStream();\n\n // Read output batch(es) from server\n try {\n const outputBatch = await this._readOutputBatch();\n if (outputBatch === null) {\n return [];\n }\n return extractBatchRows(outputBatch);\n } catch (e) {\n // On error, clean up the pipe so it's ready for the next request\n await this._cleanup();\n throw e;\n }\n }\n\n /**\n * Clean up after an error: close input, drain output, release busy.\n */\n private async _cleanup(): Promise<void> {\n if (this._closed) return;\n this._closed = true;\n if (this._inputWriter) {\n this._inputWriter.close();\n this._inputWriter = null;\n }\n try {\n if (this._outputStreamOpened) {\n while ((await this._reader.readNextBatch()) !== null) {}\n }\n } catch {\n // Suppress errors during drain\n }\n this._releaseBusy();\n }\n\n /**\n * Iterate over producer stream batches (lockstep).\n */\n async *[Symbol.asyncIterator](): AsyncIterableIterator<Record<string, any>[]> {\n if (this._closed) return;\n\n try {\n // Open input writer with empty schema for tick batches\n const tickSchema = new Schema([]);\n this._inputWriter = new PipeIncrementalWriter(this._writeFn, tickSchema);\n\n // Build a zero-row tick batch\n const structType = new Struct(tickSchema.fields);\n const tickData = makeData({\n type: structType,\n length: 0,\n children: [],\n nullCount: 0,\n });\n const tickBatch = new RecordBatch(tickSchema, tickData);\n\n while (true) {\n // Send one tick FIRST, then open output stream on first iteration.\n // The server may not flush the output schema until it processes the\n // first tick and writes the first output batch.\n this._inputWriter.write(tickBatch);\n await this._ensureOutputStream();\n\n // Read output batch(es)\n const outputBatch = await this._readOutputBatch();\n if (outputBatch === null) {\n // Server finished — EOS on output stream\n break;\n }\n\n yield extractBatchRows(outputBatch);\n }\n } finally {\n // Close input stream if still open\n if (this._inputWriter) {\n this._inputWriter.close();\n this._inputWriter = null;\n }\n // Drain any remaining output batches\n try {\n if (this._outputStreamOpened) {\n while ((await this._reader.readNextBatch()) !== null) {}\n }\n } catch {\n // Suppress errors during drain\n }\n this._closed = true;\n this._releaseBusy();\n }\n }\n\n close(): void {\n if (this._closed) return;\n this._closed = true;\n\n if (this._inputWriter) {\n // Close the input stream (EOS)\n this._inputWriter.close();\n this._inputWriter = null;\n } else {\n // Never iterated/exchanged — send empty schema stream so server unblocks.\n // Server is blocked at reader.openNextStream() waiting for client's input.\n const emptySchema = new Schema([]);\n const ipc = serializeIpcStream(emptySchema, []);\n this._writeFn(ipc);\n }\n\n // Drain remaining output batches asynchronously. Register the drain\n // promise so that the next acquireBusy() waits for it to complete.\n const drainPromise = (async () => {\n try {\n if (!this._outputStreamOpened) {\n const schema = await this._reader.openNextStream();\n if (schema) {\n while ((await this._reader.readNextBatch()) !== null) {}\n }\n } else {\n while ((await this._reader.readNextBatch()) !== null) {}\n }\n } catch {\n // Suppress errors during drain\n } finally {\n this._releaseBusy();\n }\n })();\n this._setDrainPromise(drainPromise);\n }\n}\n\n// ---------------------------------------------------------------------------\n// pipeConnect — create an RpcClient over raw readable/writable streams\n// ---------------------------------------------------------------------------\n\nexport function pipeConnect(\n readable: ReadableStream<Uint8Array>,\n writable: PipeWritable,\n options?: PipeConnectOptions,\n): RpcClient {\n const onLog = options?.onLog;\n\n let reader: IpcStreamReader | null = null;\n let readerPromise: Promise<IpcStreamReader> | null = null;\n let methodCache: Map<string, MethodInfo> | null = null;\n let protocolName = \"\";\n let _busy = false;\n let _drainPromise: Promise<void> | null = null;\n let closed = false;\n\n const writeFn: WriteFn = (bytes: Uint8Array) => {\n writable.write(bytes);\n writable.flush?.();\n };\n\n // The IpcStreamReader.create() blocks until the first IPC schema arrives\n // on the readable. To avoid deadlock, we must send our first request\n // (the __describe__ call) BEFORE opening the reader. After that, the\n // response bytes are in the pipe buffer and the reader can consume them.\n async function ensureReader(): Promise<IpcStreamReader> {\n if (reader) return reader;\n if (!readerPromise) {\n readerPromise = IpcStreamReader.create(readable);\n }\n reader = await readerPromise;\n return reader;\n }\n\n async function acquireBusy(): Promise<void> {\n // Wait for any pending drain from a previous close()\n if (_drainPromise) {\n await _drainPromise;\n _drainPromise = null;\n }\n if (_busy) {\n throw new Error(\n \"Pipe transport is busy — another call or stream is in progress. \" +\n \"Pipe connections are single-threaded; wait for the current operation to complete.\",\n );\n }\n _busy = true;\n }\n\n function releaseBusy(): void {\n _busy = false;\n }\n\n function setDrainPromise(p: Promise<void>): void {\n _drainPromise = p;\n }\n\n async function ensureMethodCache(): Promise<Map<string, MethodInfo>> {\n if (methodCache) return methodCache;\n\n await acquireBusy();\n try {\n // Send __describe__ request BEFORE opening the reader.\n // IpcStreamReader.create() blocks on reader.open() which reads the\n // first schema message. The server won't write anything until it\n // receives a request. Sending first avoids deadlock.\n const emptySchema = new Schema([]);\n const body = buildRequestIpc(emptySchema, {}, DESCRIBE_METHOD_NAME);\n writeFn(body);\n\n const r = await ensureReader();\n\n // Read response (first IPC stream = describe response schema + batches)\n // ensureReader() consumed the schema via open(). Use readStream()\n // which — on the first call (initialized=false) — returns the current\n // stream without calling reset().\n const response = await r.readStream();\n if (!response) {\n throw new Error(\"EOF reading __describe__ response\");\n }\n\n const desc = await parseDescribeResponse(response.batches, onLog);\n protocolName = desc.protocolName;\n methodCache = new Map(desc.methods.map((m) => [m.name, m]));\n return methodCache;\n } finally {\n releaseBusy();\n }\n }\n\n return {\n async call(\n method: string,\n params?: Record<string, any>,\n ): Promise<Record<string, any> | null> {\n const methods = await ensureMethodCache();\n await acquireBusy();\n try {\n const info = methods.get(method);\n if (!info) {\n throw new Error(`Unknown method: '${method}'`);\n }\n\n const r = await ensureReader();\n\n // Apply defaults\n const fullParams = { ...(info.defaults ?? {}), ...(params ?? {}) };\n\n // Send request\n const body = buildRequestIpc(info.paramsSchema, fullParams, method);\n writeFn(body);\n\n // Read response\n const response = await r.readStream();\n if (!response) {\n throw new Error(\"EOF reading response\");\n }\n\n // Process batches: dispatch logs, find result\n let resultBatch: RecordBatch | null = null;\n for (const batch of response.batches) {\n if (batch.numRows === 0) {\n dispatchLogOrError(batch, onLog);\n continue;\n }\n resultBatch = batch;\n }\n\n if (!resultBatch) {\n return null;\n }\n\n const rows = extractBatchRows(resultBatch);\n if (rows.length === 0) return null;\n\n if (info.resultSchema.fields.length === 0) return null;\n\n return rows[0];\n } finally {\n releaseBusy();\n }\n },\n\n async stream(\n method: string,\n params?: Record<string, any>,\n ): Promise<StreamSession> {\n const methods = await ensureMethodCache();\n await acquireBusy();\n\n try {\n const info = methods.get(method);\n if (!info) {\n throw new Error(`Unknown method: '${method}'`);\n }\n\n const r = await ensureReader();\n\n // Apply defaults\n const fullParams = { ...(info.defaults ?? {}), ...(params ?? {}) };\n\n // Send init request (params as a complete IPC stream)\n const body = buildRequestIpc(info.paramsSchema, fullParams, method);\n writeFn(body);\n\n // Read header if method has headerSchema\n let header: Record<string, any> | null = null;\n if (info.headerSchema) {\n const headerStream = await r.readStream();\n if (headerStream) {\n for (const batch of headerStream.batches) {\n if (batch.numRows === 0) {\n dispatchLogOrError(batch, onLog);\n continue;\n }\n const rows = extractBatchRows(batch);\n if (rows.length > 0) {\n header = rows[0];\n }\n }\n }\n }\n\n const outputSchema = info.outputSchema ?? info.resultSchema;\n\n // Don't release busy here — PipeStreamSession owns the lock\n // and will release it when done\n return new PipeStreamSession({\n reader: r,\n writeFn,\n onLog,\n header,\n outputSchema,\n releaseBusy,\n setDrainPromise,\n });\n } catch (e) {\n // Init error (e.g., server raised exception during init).\n // Send empty input stream so server's drain unblocks, then\n // drain the server's output stream if needed.\n try {\n const r = await ensureReader();\n const emptySchema = new Schema([]);\n const ipc = serializeIpcStream(emptySchema, []);\n writeFn(ipc);\n // Drain server's output stream (error response + EOS)\n const outStream = await r.readStream();\n // outStream may be null or contain remaining batches — just consume\n void outStream;\n } catch {\n // Suppress errors during cleanup\n }\n releaseBusy();\n throw e;\n }\n },\n\n async describe(): Promise<ServiceDescription> {\n const methods = await ensureMethodCache();\n return {\n protocolName,\n methods: [...methods.values()],\n };\n },\n\n close(): void {\n if (closed) return;\n closed = true;\n writable.end();\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// subprocessConnect — spawn a process and wrap with pipeConnect\n// ---------------------------------------------------------------------------\n\nexport function subprocessConnect(\n cmd: string[],\n options?: SubprocessConnectOptions,\n): RpcClient {\n const proc = Bun.spawn(cmd, {\n stdin: \"pipe\",\n stdout: \"pipe\",\n stderr: options?.stderr ?? \"ignore\",\n cwd: options?.cwd,\n env: options?.env ? { ...process.env, ...options.env } : undefined,\n });\n\n const stdout = proc.stdout as ReadableStream<Uint8Array>;\n\n const writable: PipeWritable = {\n write(data: Uint8Array) {\n (proc.stdin as any).write(data);\n },\n flush() {\n (proc.stdin as any).flush();\n },\n end() {\n (proc.stdin as any).end();\n },\n };\n\n const client = pipeConnect(stdout, writable, {\n onLog: options?.onLog,\n });\n\n // Wrap close to also kill the subprocess\n const originalClose = client.close;\n client.close = () => {\n originalClose.call(client);\n try {\n proc.kill();\n } catch {\n // Process may have already exited\n }\n };\n\n return client;\n}\n"
|
|
11
|
+
"// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport { type RecordBatch, RecordBatchReader, type Schema } from \"@query-farm/apache-arrow\";\n\nexport interface StreamMessage {\n schema: Schema;\n batches: RecordBatch[];\n}\n\n/**\n * Reads sequential IPC streams from a byte source (e.g., process.stdin).\n * Uses autoDestroy: false + reset/open pattern to read multiple streams\n * from the same underlying byte source.\n */\nexport class IpcStreamReader {\n private reader: RecordBatchReader;\n private initialized = false;\n /** True once readNextBatch() returns null (EOS reached for current stream). */\n private streamEnded = false;\n\n private constructor(reader: RecordBatchReader) {\n this.reader = reader;\n }\n\n static async create(input: ReadableStream<Uint8Array> | NodeJS.ReadableStream): Promise<IpcStreamReader> {\n const reader = await RecordBatchReader.from(input as any);\n await reader.open({ autoDestroy: false });\n if (reader.closed) {\n throw new Error(\"Input stream closed before first IPC message\");\n }\n return new IpcStreamReader(reader);\n }\n\n /**\n * Read one complete IPC stream (schema + all batches).\n * Returns null on EOF (no more streams).\n */\n async readStream(): Promise<StreamMessage | null> {\n if (this.initialized) {\n // Advance to next stream\n await this.reader.reset().open();\n if (this.reader.closed) {\n return null;\n }\n }\n this.initialized = true;\n\n const schema = this.reader.schema;\n if (!schema) {\n return null;\n }\n\n const batches: RecordBatch[] = [];\n while (true) {\n const result = await this.reader.next();\n if (result.done) break;\n // Skip Arrow-JS synthetic placeholder for empty streams\n if (result.value.constructor.name === \"_InternalEmptyPlaceholderRecordBatch\") break;\n batches.push(result.value);\n }\n\n return { schema, batches };\n }\n\n /**\n * Open the next IPC stream and return its schema.\n * Use readNextBatch() to read batches one at a time.\n * Returns null on EOF.\n */\n async openNextStream(): Promise<Schema | null> {\n if (this.initialized) {\n await this.reader.reset().open();\n if (this.reader.closed) {\n return null;\n }\n }\n this.initialized = true;\n this.streamEnded = false;\n return this.reader.schema ?? null;\n }\n\n /**\n * Read the next batch from the currently open IPC stream.\n * Returns null when the stream ends (EOS).\n *\n * Once EOS is reached, subsequent calls return null immediately without\n * reading from the underlying byte source. This prevents the Arrow-JS\n * reader from consuming bytes that belong to the next IPC stream.\n */\n async readNextBatch(): Promise<RecordBatch | null> {\n if (this.streamEnded) return null;\n const result = await this.reader.next();\n if (result.done) {\n this.streamEnded = true;\n return null;\n }\n // Arrow-JS synthesizes a placeholder batch for streams with a schema but\n // zero real batches. Treat it as EOS so callers don't block trying to\n // read more bytes from a stream that has already ended.\n if (result.value.constructor.name === \"_InternalEmptyPlaceholderRecordBatch\") {\n this.streamEnded = true;\n return null;\n }\n return result.value;\n }\n\n async cancel(): Promise<void> {\n await this.reader.cancel();\n }\n}\n",
|
|
12
|
+
"// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Field, makeData, RecordBatch, Schema, Struct, vectorFromArray } from \"@query-farm/apache-arrow\";\nimport { STATE_KEY } from \"../constants.js\";\nimport { RpcError } from \"../errors.js\";\nimport { ARROW_CONTENT_TYPE, serializeIpcStream } from \"../http/common.js\";\nimport { dispatchLogOrError, extractBatchRows, inferArrowType, readResponseBatches } from \"./ipc.js\";\nimport type { LogMessage, StreamSession } from \"./types.js\";\n\ntype CompressFn = (data: Uint8Array, level: number) => Uint8Array;\ntype DecompressFn = (data: Uint8Array) => Uint8Array;\n\nexport class HttpStreamSession implements StreamSession {\n private _baseUrl: string;\n private _prefix: string;\n private _method: string;\n private _stateToken: string | null;\n private _outputSchema: Schema;\n private _inputSchema?: Schema;\n private _onLog?: (msg: LogMessage) => void;\n private _pendingBatches: RecordBatch[];\n private _finished: boolean;\n private _header: Record<string, any> | null;\n private _compressionLevel?: number;\n private _compressFn?: CompressFn;\n private _decompressFn?: DecompressFn;\n\n constructor(opts: {\n baseUrl: string;\n prefix: string;\n method: string;\n stateToken: string | null;\n outputSchema: Schema;\n inputSchema?: Schema;\n onLog?: (msg: LogMessage) => void;\n pendingBatches: RecordBatch[];\n finished: boolean;\n header: Record<string, any> | null;\n compressionLevel?: number;\n compressFn?: CompressFn;\n decompressFn?: DecompressFn;\n }) {\n this._baseUrl = opts.baseUrl;\n this._prefix = opts.prefix;\n this._method = opts.method;\n this._stateToken = opts.stateToken;\n this._outputSchema = opts.outputSchema;\n this._inputSchema = opts.inputSchema;\n this._onLog = opts.onLog;\n this._pendingBatches = opts.pendingBatches;\n this._finished = opts.finished;\n this._header = opts.header;\n this._compressionLevel = opts.compressionLevel;\n this._compressFn = opts.compressFn;\n this._decompressFn = opts.decompressFn;\n }\n\n get header(): Record<string, any> | null {\n return this._header;\n }\n\n private _buildHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n \"Content-Type\": ARROW_CONTENT_TYPE,\n };\n if (this._compressionLevel != null) {\n headers[\"Content-Encoding\"] = \"zstd\";\n headers[\"Accept-Encoding\"] = \"zstd\";\n }\n return headers;\n }\n\n private _prepareBody(content: Uint8Array): Uint8Array {\n if (this._compressionLevel != null && this._compressFn) {\n return this._compressFn(content, this._compressionLevel);\n }\n return content;\n }\n\n private async _readResponse(resp: Response): Promise<Uint8Array<ArrayBuffer>> {\n let body = new Uint8Array(await resp.arrayBuffer());\n if (resp.headers.get(\"Content-Encoding\") === \"zstd\" && this._decompressFn) {\n body = new Uint8Array(this._decompressFn(body));\n }\n return body;\n }\n\n /**\n * Send an exchange request and return the data rows.\n */\n async exchange(input: Record<string, any>[]): Promise<Record<string, any>[]> {\n if (this._stateToken === null) {\n throw new RpcError(\"ProtocolError\", \"Stream has finished \\u2014 no state token available\", \"\");\n }\n\n // We need to determine the input schema from the data.\n // Build a batch from the input rows using the output schema's field types.\n // For exchange, the input schema matches what the server expects.\n // We'll use the keys from input[0] to figure out columns.\n if (input.length === 0) {\n // Zero-row exchange: build an empty batch with state token.\n // Use inputSchema from __describe__ if available; fall back to\n // outputSchema so the server sees the correct column names.\n const zeroSchema = this._inputSchema ?? this._outputSchema;\n const emptyBatch = this._buildEmptyBatch(zeroSchema);\n const metadata = new Map<string, string>();\n metadata.set(STATE_KEY, this._stateToken);\n const batchWithMeta = new RecordBatch(zeroSchema, emptyBatch.data, metadata);\n return this._doExchange(zeroSchema, [batchWithMeta]);\n }\n\n // Infer schema from first row values (input schema may differ from output).\n const keys = Object.keys(input[0]);\n const fields = keys.map((key) => {\n // Find first non-null value to infer type\n let sample: any;\n for (const row of input) {\n if (row[key] != null) {\n sample = row[key];\n break;\n }\n }\n const arrowType = inferArrowType(sample);\n const nullable = input.some((row) => row[key] == null);\n return new Field(key, arrowType, nullable);\n });\n\n const inputSchema = new Schema(fields);\n const children = inputSchema.fields.map((f) => {\n const values = input.map((row) => row[f.name]);\n return vectorFromArray(values, f.type).data[0];\n });\n\n const structType = new Struct(inputSchema.fields);\n const data = makeData({\n type: structType,\n length: input.length,\n children,\n nullCount: 0,\n });\n\n const metadata = new Map<string, string>();\n metadata.set(STATE_KEY, this._stateToken);\n const batch = new RecordBatch(inputSchema, data, metadata);\n\n return this._doExchange(inputSchema, [batch]);\n }\n\n private async _doExchange(schema: Schema, batches: RecordBatch[]): Promise<Record<string, any>[]> {\n const body = serializeIpcStream(schema, batches);\n const resp = await fetch(`${this._baseUrl}${this._prefix}/${this._method}/exchange`, {\n method: \"POST\",\n headers: this._buildHeaders(),\n body: this._prepareBody(body) as unknown as BodyInit,\n });\n\n const responseBody = await this._readResponse(resp);\n const { batches: responseBatches } = await readResponseBatches(responseBody);\n\n let resultRows: Record<string, any>[] = [];\n for (const batch of responseBatches) {\n if (batch.numRows === 0) {\n // Could be log/error or state token\n dispatchLogOrError(batch, this._onLog);\n // Check for state token\n const token = batch.metadata?.get(STATE_KEY);\n if (token) {\n this._stateToken = token;\n }\n continue;\n }\n\n // Data batch — extract state token from metadata\n const token = batch.metadata?.get(STATE_KEY);\n if (token) {\n this._stateToken = token;\n }\n\n resultRows = extractBatchRows(batch);\n }\n\n return resultRows;\n }\n\n private _buildEmptyBatch(schema: Schema): RecordBatch {\n const children = schema.fields.map((f) => {\n return makeData({ type: f.type, length: 0, nullCount: 0 });\n });\n const structType = new Struct(schema.fields);\n const data = makeData({\n type: structType,\n length: 0,\n children,\n nullCount: 0,\n });\n return new RecordBatch(schema, data);\n }\n\n /**\n * Iterate over producer stream batches.\n */\n async *[Symbol.asyncIterator](): AsyncIterableIterator<Record<string, any>[]> {\n // Yield pre-loaded batches from init\n for (const batch of this._pendingBatches) {\n if (batch.numRows === 0) {\n dispatchLogOrError(batch, this._onLog);\n continue;\n }\n yield extractBatchRows(batch);\n }\n this._pendingBatches = [];\n\n if (this._finished) return;\n if (this._stateToken === null) return;\n\n // Follow continuation tokens\n while (true) {\n const responseBody = await this._sendContinuation(this._stateToken);\n const { batches } = await readResponseBatches(responseBody);\n\n let gotContinuation = false;\n for (const batch of batches) {\n if (batch.numRows === 0) {\n // Check for continuation token\n const token = batch.metadata?.get(STATE_KEY);\n if (token) {\n this._stateToken = token;\n gotContinuation = true;\n continue;\n }\n // Log/error batch\n dispatchLogOrError(batch, this._onLog);\n continue;\n }\n\n yield extractBatchRows(batch);\n }\n\n if (!gotContinuation) break;\n }\n }\n\n private async _sendContinuation(token: string): Promise<Uint8Array> {\n const emptySchema = new Schema([]);\n const metadata = new Map<string, string>();\n metadata.set(STATE_KEY, token);\n\n const structType = new Struct(emptySchema.fields);\n const data = makeData({\n type: structType,\n length: 1,\n children: [],\n nullCount: 0,\n });\n const batch = new RecordBatch(emptySchema, data, metadata);\n const body = serializeIpcStream(emptySchema, [batch]);\n\n const resp = await fetch(`${this._baseUrl}${this._prefix}/${this._method}/exchange`, {\n method: \"POST\",\n headers: this._buildHeaders(),\n body: this._prepareBody(body) as unknown as BodyInit,\n });\n\n return this._readResponse(resp);\n }\n\n close(): void {\n // No-op for HTTP (stateless)\n }\n}\n",
|
|
13
|
+
"// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { RecordBatch, Schema } from \"@query-farm/apache-arrow\";\nimport { LOG_LEVEL_KEY, STATE_KEY } from \"../constants.js\";\nimport { ARROW_CONTENT_TYPE } from \"../http/common.js\";\nimport { httpIntrospect, type MethodInfo, type ServiceDescription } from \"./introspect.js\";\nimport {\n buildRequestIpc,\n dispatchLogOrError,\n extractBatchRows,\n readResponseBatches,\n readSequentialStreams,\n} from \"./ipc.js\";\nimport { HttpStreamSession } from \"./stream.js\";\nimport type { HttpConnectOptions, StreamSession } from \"./types.js\";\n\ntype CompressFn = (data: Uint8Array, level: number) => Uint8Array;\ntype DecompressFn = (data: Uint8Array) => Uint8Array;\n\nexport interface RpcClient {\n call(method: string, params?: Record<string, any>): Promise<Record<string, any> | null>;\n stream(method: string, params?: Record<string, any>): Promise<StreamSession>;\n describe(): Promise<ServiceDescription>;\n close(): void;\n}\n\nexport function httpConnect(baseUrl: string, options?: HttpConnectOptions): RpcClient {\n const prefix = (options?.prefix ?? \"/vgi\").replace(/\\/+$/, \"\");\n const onLog = options?.onLog;\n const compressionLevel = options?.compressionLevel;\n\n let methodCache: Map<string, MethodInfo> | null = null;\n let compressFn: CompressFn | undefined;\n let decompressFn: DecompressFn | undefined;\n let compressionLoaded = false;\n\n async function ensureCompression(): Promise<void> {\n if (compressionLoaded || compressionLevel == null) return;\n compressionLoaded = true;\n try {\n const mod = await import(\"../util/zstd.js\");\n compressFn = mod.zstdCompress;\n decompressFn = mod.zstdDecompress;\n } catch {\n // zstd not available in this runtime\n }\n }\n\n function buildHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n \"Content-Type\": ARROW_CONTENT_TYPE,\n };\n if (compressionLevel != null) {\n headers[\"Content-Encoding\"] = \"zstd\";\n headers[\"Accept-Encoding\"] = \"zstd\";\n }\n return headers;\n }\n\n function prepareBody(content: Uint8Array): Uint8Array {\n if (compressionLevel != null && compressFn) {\n return compressFn(content, compressionLevel);\n }\n return content;\n }\n\n async function readResponse(resp: Response): Promise<Uint8Array<ArrayBuffer>> {\n let body = new Uint8Array(await resp.arrayBuffer());\n if (resp.headers.get(\"Content-Encoding\") === \"zstd\" && decompressFn) {\n body = new Uint8Array(decompressFn(body));\n }\n return body;\n }\n\n async function ensureMethodCache(): Promise<Map<string, MethodInfo>> {\n if (methodCache) return methodCache;\n const desc = await httpIntrospect(baseUrl, { prefix });\n methodCache = new Map(desc.methods.map((m) => [m.name, m]));\n return methodCache;\n }\n\n return {\n async call(method: string, params?: Record<string, any>): Promise<Record<string, any> | null> {\n await ensureCompression();\n const methods = await ensureMethodCache();\n const info = methods.get(method);\n if (!info) {\n throw new Error(`Unknown method: '${method}'`);\n }\n\n // Apply defaults\n const fullParams = { ...(info.defaults ?? {}), ...(params ?? {}) };\n\n const body = buildRequestIpc(info.paramsSchema, fullParams, method);\n const resp = await fetch(`${baseUrl}${prefix}/${method}`, {\n method: \"POST\",\n headers: buildHeaders(),\n body: prepareBody(body) as unknown as BodyInit,\n });\n\n const responseBody = await readResponse(resp);\n const { batches } = await readResponseBatches(responseBody);\n\n // Process batches: dispatch logs, find result\n let resultBatch: RecordBatch | null = null;\n for (const batch of batches) {\n if (batch.numRows === 0) {\n dispatchLogOrError(batch, onLog);\n continue;\n }\n resultBatch = batch;\n }\n\n if (!resultBatch) {\n // Void return (result schema has no fields)\n return null;\n }\n\n // Extract single-row result\n const rows = extractBatchRows(resultBatch);\n if (rows.length === 0) return null;\n\n const result = rows[0];\n // For void methods (empty result schema), return null\n if (info.resultSchema.fields.length === 0) return null;\n\n // For single-field results, return the whole object\n return result;\n },\n\n async stream(method: string, params?: Record<string, any>): Promise<HttpStreamSession> {\n await ensureCompression();\n const methods = await ensureMethodCache();\n const info = methods.get(method);\n if (!info) {\n throw new Error(`Unknown method: '${method}'`);\n }\n\n // Apply defaults\n const fullParams = { ...(info.defaults ?? {}), ...(params ?? {}) };\n\n const body = buildRequestIpc(info.paramsSchema, fullParams, method);\n const resp = await fetch(`${baseUrl}${prefix}/${method}/init`, {\n method: \"POST\",\n headers: buildHeaders(),\n body: prepareBody(body) as unknown as BodyInit,\n });\n\n const responseBody = await readResponse(resp);\n\n // Parse the response: may contain header stream + data stream\n let header: Record<string, any> | null = null;\n let stateToken: string | null = null;\n const pendingBatches: RecordBatch[] = [];\n let finished = false;\n let streamSchema: Schema | null = null;\n\n if (info.headerSchema) {\n // Response may contain two concatenated IPC streams:\n // 1. Header stream\n // 2. Data stream (with state token and/or data batches)\n const reader = await readSequentialStreams(responseBody);\n\n // First stream: header\n const headerStream = await reader.readStream();\n if (headerStream) {\n for (const batch of headerStream.batches) {\n if (batch.numRows === 0) {\n dispatchLogOrError(batch, onLog);\n continue;\n }\n const rows = extractBatchRows(batch);\n if (rows.length > 0) {\n header = rows[0];\n }\n }\n }\n\n // Second stream: data/state\n const dataStream = await reader.readStream();\n if (dataStream) {\n streamSchema = dataStream.schema;\n }\n const headerErrorBatches: RecordBatch[] = [];\n if (dataStream) {\n for (const batch of dataStream.batches) {\n if (batch.numRows === 0) {\n // Check for state token\n const token = batch.metadata?.get(STATE_KEY);\n if (token) {\n stateToken = token;\n continue;\n }\n const level = batch.metadata?.get(LOG_LEVEL_KEY);\n if (level === \"EXCEPTION\") {\n headerErrorBatches.push(batch);\n continue;\n }\n dispatchLogOrError(batch, onLog);\n continue;\n }\n pendingBatches.push(batch);\n }\n }\n\n if (headerErrorBatches.length > 0) {\n if (pendingBatches.length > 0 || stateToken !== null) {\n pendingBatches.push(...headerErrorBatches);\n } else {\n for (const batch of headerErrorBatches) {\n dispatchLogOrError(batch, onLog);\n }\n }\n }\n\n if (!dataStream && !stateToken) {\n finished = true;\n }\n } else {\n // Single IPC stream: data/state (no header)\n const { schema: responseSchema, batches } = await readResponseBatches(responseBody);\n streamSchema = responseSchema;\n\n // Collect error batches separately — only defer them if there are\n // data batches or state tokens (mid-stream errors). Otherwise throw\n // immediately (init-only errors like exchange_error_on_init).\n const errorBatches: RecordBatch[] = [];\n\n for (const batch of batches) {\n if (batch.numRows === 0) {\n // Check for state token\n const token = batch.metadata?.get(STATE_KEY);\n if (token) {\n stateToken = token;\n continue;\n }\n // Collect EXCEPTION batches for deferred dispatch\n const level = batch.metadata?.get(LOG_LEVEL_KEY);\n if (level === \"EXCEPTION\") {\n errorBatches.push(batch);\n continue;\n }\n dispatchLogOrError(batch, onLog);\n continue;\n }\n pendingBatches.push(batch);\n }\n\n // If we have data batches or a state token, defer errors to iteration.\n // Otherwise throw immediately (error on init).\n if (errorBatches.length > 0) {\n if (pendingBatches.length > 0 || stateToken !== null) {\n pendingBatches.push(...errorBatches);\n } else {\n // No data, no state — this is a pure init error. Throw now.\n for (const batch of errorBatches) {\n dispatchLogOrError(batch, onLog);\n }\n }\n }\n }\n\n if (pendingBatches.length === 0 && stateToken === null) {\n finished = true;\n }\n\n // Determine output schema: prefer the IPC stream schema from the init\n // response (it carries the server's actual output schema even for\n // zero-row token batches), then pending batch schemas, then describe info.\n const outputSchema =\n (streamSchema && streamSchema.fields.length > 0 ? streamSchema : null) ??\n (pendingBatches.length > 0 ? pendingBatches[0].schema : null) ??\n info.outputSchema ??\n info.resultSchema;\n\n return new HttpStreamSession({\n baseUrl,\n prefix,\n method,\n stateToken,\n outputSchema,\n inputSchema: info.inputSchema,\n onLog,\n pendingBatches,\n finished,\n header,\n compressionLevel,\n compressFn,\n decompressFn,\n });\n },\n\n async describe(): Promise<ServiceDescription> {\n return httpIntrospect(baseUrl, { prefix });\n },\n\n close(): void {\n // No-op (HTTP stateless)\n },\n };\n}\n",
|
|
14
|
+
"// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n Field,\n makeData,\n RecordBatch,\n RecordBatchStreamWriter,\n Schema,\n Struct,\n vectorFromArray,\n} from \"@query-farm/apache-arrow\";\nimport { DESCRIBE_METHOD_NAME } from \"../constants.js\";\nimport { RpcError } from \"../errors.js\";\nimport { serializeIpcStream } from \"../http/common.js\";\nimport { IpcStreamReader } from \"../wire/reader.js\";\nimport type { RpcClient } from \"./connect.js\";\nimport { type MethodInfo, parseDescribeResponse, type ServiceDescription } from \"./introspect.js\";\nimport { buildRequestIpc, dispatchLogOrError, extractBatchRows, inferArrowType } from \"./ipc.js\";\nimport type { LogMessage, PipeConnectOptions, StreamSession, SubprocessConnectOptions } from \"./types.js\";\n\n// ---------------------------------------------------------------------------\n// Writable abstraction\n// ---------------------------------------------------------------------------\n\ninterface PipeWritable {\n write(data: Uint8Array): void;\n flush?(): void;\n end(): void;\n}\n\ntype WriteFn = (bytes: Uint8Array) => void;\n\n// ---------------------------------------------------------------------------\n// PipeIncrementalWriter — batch-by-batch IPC writing for lockstep streaming\n// ---------------------------------------------------------------------------\n\nclass PipeIncrementalWriter {\n private writer: RecordBatchStreamWriter;\n private writeFn: WriteFn;\n private closed = false;\n\n constructor(writeFn: WriteFn, schema: Schema) {\n this.writeFn = writeFn;\n this.writer = new RecordBatchStreamWriter();\n this.writer.reset(undefined, schema);\n this.drain(); // flushes schema message\n }\n\n write(batch: RecordBatch): void {\n if (this.closed) throw new Error(\"PipeIncrementalWriter already closed\");\n (this.writer as any)._writeRecordBatch(batch);\n this.drain();\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n // EOS marker: continuation (0xFFFFFFFF) + metadata length (0x00000000)\n const eos = new Uint8Array(new Int32Array([-1, 0]).buffer);\n this.writeFn(eos);\n }\n\n private drain(): void {\n const values = (this.writer as any)._sink._values as Uint8Array[];\n for (const chunk of values) {\n this.writeFn(chunk);\n }\n values.length = 0;\n }\n}\n\n// ---------------------------------------------------------------------------\n// PipeStreamSession — lockstep streaming over pipes\n// ---------------------------------------------------------------------------\n\nexport class PipeStreamSession implements StreamSession {\n private _reader: IpcStreamReader;\n private _writeFn: WriteFn;\n private _onLog?: (msg: LogMessage) => void;\n private _header: Record<string, any> | null;\n private _inputWriter: PipeIncrementalWriter | null = null;\n private _inputSchema: Schema | null = null;\n private _outputStreamOpened = false;\n private _closed = false;\n private _outputSchema: Schema;\n private _releaseBusy: () => void;\n private _setDrainPromise: (p: Promise<void>) => void;\n\n constructor(opts: {\n reader: IpcStreamReader;\n writeFn: WriteFn;\n onLog?: (msg: LogMessage) => void;\n header: Record<string, any> | null;\n outputSchema: Schema;\n releaseBusy: () => void;\n setDrainPromise: (p: Promise<void>) => void;\n }) {\n this._reader = opts.reader;\n this._writeFn = opts.writeFn;\n this._onLog = opts.onLog;\n this._header = opts.header;\n this._outputSchema = opts.outputSchema;\n this._releaseBusy = opts.releaseBusy;\n this._setDrainPromise = opts.setDrainPromise;\n }\n\n get header(): Record<string, any> | null {\n return this._header;\n }\n\n /**\n * Read output batches from the server until a data batch is found.\n * Dispatches log/error batches along the way.\n * Returns null when server closes output stream (EOS).\n */\n private async _readOutputBatch(): Promise<RecordBatch | null> {\n while (true) {\n const batch = await this._reader.readNextBatch();\n if (batch === null) return null; // Server closed output stream\n\n if (batch.numRows === 0) {\n // Check if it's a log/error batch. If so, dispatch and continue.\n // Otherwise it's a zero-row data batch — return it.\n if (dispatchLogOrError(batch, this._onLog)) {\n continue;\n }\n }\n\n return batch;\n }\n }\n\n /**\n * Ensure the server's output stream is opened for reading.\n * Must be called AFTER sending the first input batch, because\n * the server's output schema may not be flushed until it processes\n * the first input and writes the first output batch.\n */\n private async _ensureOutputStream(): Promise<void> {\n if (this._outputStreamOpened) return;\n this._outputStreamOpened = true;\n const schema = await this._reader.openNextStream();\n if (!schema) {\n throw new RpcError(\"ProtocolError\", \"Expected output stream but got EOF\", \"\");\n }\n }\n\n /**\n * Send an exchange request and return the data rows.\n */\n async exchange(input: Record<string, any>[]): Promise<Record<string, any>[]> {\n if (this._closed) {\n throw new RpcError(\"ProtocolError\", \"Stream session is closed\", \"\");\n }\n\n // Build input batch\n let inputSchema: Schema;\n let batch: RecordBatch;\n\n if (input.length === 0) {\n // Zero-row exchange: use cached input schema from a prior exchange,\n // then fall back to the output schema from describe. The cached\n // schema is preferred because input and output schemas may differ\n // (e.g. exchange_accumulate: input {value} → output {running_sum, exchange_count}).\n inputSchema = this._inputSchema ?? this._outputSchema;\n const children = inputSchema.fields.map((f) => {\n return makeData({ type: f.type, length: 0, nullCount: 0 });\n });\n const structType = new Struct(inputSchema.fields);\n const data = makeData({\n type: structType,\n length: 0,\n children,\n nullCount: 0,\n });\n batch = new RecordBatch(inputSchema, data);\n } else {\n // Infer schema from first row.\n // Always use nullable fields — the server validates input schemas\n // strictly and its schema typically uses nullable columns.\n const keys = Object.keys(input[0]);\n const fields = keys.map((key) => {\n let sample: any;\n for (const row of input) {\n if (row[key] != null) {\n sample = row[key];\n break;\n }\n }\n const arrowType = inferArrowType(sample);\n return new Field(key, arrowType, /* nullable */ true);\n });\n inputSchema = new Schema(fields);\n\n // Validate schema consistency: all exchanges on the same pipe session\n // share a single IPC stream, so the schema is locked to the first call.\n if (this._inputSchema) {\n const cached = this._inputSchema;\n if (\n cached.fields.length !== inputSchema.fields.length ||\n cached.fields.some((f, i) => f.name !== inputSchema.fields[i].name)\n ) {\n throw new RpcError(\n \"ProtocolError\",\n `Exchange input schema changed: expected [${cached.fields.map((f) => f.name).join(\", \")}] ` +\n `but got [${inputSchema.fields.map((f) => f.name).join(\", \")}]`,\n \"\",\n );\n }\n } else {\n this._inputSchema = inputSchema;\n }\n\n const children = inputSchema.fields.map((f) => {\n const values = input.map((row) => row[f.name]);\n return vectorFromArray(values, f.type).data[0];\n });\n const structType = new Struct(inputSchema.fields);\n const data = makeData({\n type: structType,\n length: input.length,\n children,\n nullCount: 0,\n });\n batch = new RecordBatch(inputSchema, data);\n }\n\n // Lazy-open input writer on first exchange\n if (!this._inputWriter) {\n this._inputWriter = new PipeIncrementalWriter(this._writeFn, inputSchema);\n }\n\n // Write one input batch FIRST, then open output stream.\n // The server may not flush the output schema until it processes the\n // first input batch and writes the first output batch.\n this._inputWriter.write(batch);\n await this._ensureOutputStream();\n\n // Read output batch(es) from server\n try {\n const outputBatch = await this._readOutputBatch();\n if (outputBatch === null) {\n return [];\n }\n return extractBatchRows(outputBatch);\n } catch (e) {\n // On error, clean up the pipe so it's ready for the next request\n await this._cleanup();\n throw e;\n }\n }\n\n /**\n * Clean up after an error: close input, drain output, release busy.\n */\n private async _cleanup(): Promise<void> {\n if (this._closed) return;\n this._closed = true;\n if (this._inputWriter) {\n this._inputWriter.close();\n this._inputWriter = null;\n }\n try {\n if (this._outputStreamOpened) {\n while ((await this._reader.readNextBatch()) !== null) {}\n }\n } catch {\n // Suppress errors during drain\n }\n this._releaseBusy();\n }\n\n /**\n * Iterate over producer stream batches (lockstep).\n */\n async *[Symbol.asyncIterator](): AsyncIterableIterator<Record<string, any>[]> {\n if (this._closed) return;\n\n try {\n // Open input writer with empty schema for tick batches\n const tickSchema = new Schema([]);\n this._inputWriter = new PipeIncrementalWriter(this._writeFn, tickSchema);\n\n // Build a zero-row tick batch\n const structType = new Struct(tickSchema.fields);\n const tickData = makeData({\n type: structType,\n length: 0,\n children: [],\n nullCount: 0,\n });\n const tickBatch = new RecordBatch(tickSchema, tickData);\n\n while (true) {\n // Send one tick FIRST, then open output stream on first iteration.\n // The server may not flush the output schema until it processes the\n // first tick and writes the first output batch.\n this._inputWriter.write(tickBatch);\n await this._ensureOutputStream();\n\n // Read output batch(es)\n const outputBatch = await this._readOutputBatch();\n if (outputBatch === null) {\n // Server finished — EOS on output stream\n break;\n }\n\n yield extractBatchRows(outputBatch);\n }\n } finally {\n // Close input stream if still open\n if (this._inputWriter) {\n this._inputWriter.close();\n this._inputWriter = null;\n }\n // Drain any remaining output batches\n try {\n if (this._outputStreamOpened) {\n while ((await this._reader.readNextBatch()) !== null) {}\n }\n } catch {\n // Suppress errors during drain\n }\n this._closed = true;\n this._releaseBusy();\n }\n }\n\n close(): void {\n if (this._closed) return;\n this._closed = true;\n\n if (this._inputWriter) {\n // Close the input stream (EOS)\n this._inputWriter.close();\n this._inputWriter = null;\n } else {\n // Never iterated/exchanged — send empty schema stream so server unblocks.\n // Server is blocked at reader.openNextStream() waiting for client's input.\n const emptySchema = new Schema([]);\n const ipc = serializeIpcStream(emptySchema, []);\n this._writeFn(ipc);\n }\n\n // Drain remaining output batches asynchronously. Register the drain\n // promise so that the next acquireBusy() waits for it to complete.\n const drainPromise = (async () => {\n try {\n if (!this._outputStreamOpened) {\n const schema = await this._reader.openNextStream();\n if (schema) {\n while ((await this._reader.readNextBatch()) !== null) {}\n }\n } else {\n while ((await this._reader.readNextBatch()) !== null) {}\n }\n } catch {\n // Suppress errors during drain\n } finally {\n this._releaseBusy();\n }\n })();\n this._setDrainPromise(drainPromise);\n }\n}\n\n// ---------------------------------------------------------------------------\n// pipeConnect — create an RpcClient over raw readable/writable streams\n// ---------------------------------------------------------------------------\n\nexport function pipeConnect(\n readable: ReadableStream<Uint8Array>,\n writable: PipeWritable,\n options?: PipeConnectOptions,\n): RpcClient {\n const onLog = options?.onLog;\n\n let reader: IpcStreamReader | null = null;\n let readerPromise: Promise<IpcStreamReader> | null = null;\n let methodCache: Map<string, MethodInfo> | null = null;\n let protocolName = \"\";\n let _busy = false;\n let _drainPromise: Promise<void> | null = null;\n let closed = false;\n\n const writeFn: WriteFn = (bytes: Uint8Array) => {\n writable.write(bytes);\n writable.flush?.();\n };\n\n // The IpcStreamReader.create() blocks until the first IPC schema arrives\n // on the readable. To avoid deadlock, we must send our first request\n // (the __describe__ call) BEFORE opening the reader. After that, the\n // response bytes are in the pipe buffer and the reader can consume them.\n async function ensureReader(): Promise<IpcStreamReader> {\n if (reader) return reader;\n if (!readerPromise) {\n readerPromise = IpcStreamReader.create(readable);\n }\n reader = await readerPromise;\n return reader;\n }\n\n async function acquireBusy(): Promise<void> {\n // Wait for any pending drain from a previous close()\n if (_drainPromise) {\n await _drainPromise;\n _drainPromise = null;\n }\n if (_busy) {\n throw new Error(\n \"Pipe transport is busy — another call or stream is in progress. \" +\n \"Pipe connections are single-threaded; wait for the current operation to complete.\",\n );\n }\n _busy = true;\n }\n\n function releaseBusy(): void {\n _busy = false;\n }\n\n function setDrainPromise(p: Promise<void>): void {\n _drainPromise = p;\n }\n\n async function ensureMethodCache(): Promise<Map<string, MethodInfo>> {\n if (methodCache) return methodCache;\n\n await acquireBusy();\n try {\n // Send __describe__ request BEFORE opening the reader.\n // IpcStreamReader.create() blocks on reader.open() which reads the\n // first schema message. The server won't write anything until it\n // receives a request. Sending first avoids deadlock.\n const emptySchema = new Schema([]);\n const body = buildRequestIpc(emptySchema, {}, DESCRIBE_METHOD_NAME);\n writeFn(body);\n\n const r = await ensureReader();\n\n // Read response (first IPC stream = describe response schema + batches)\n // ensureReader() consumed the schema via open(). Use readStream()\n // which — on the first call (initialized=false) — returns the current\n // stream without calling reset().\n const response = await r.readStream();\n if (!response) {\n throw new Error(\"EOF reading __describe__ response\");\n }\n\n const desc = await parseDescribeResponse(response.batches, onLog);\n protocolName = desc.protocolName;\n methodCache = new Map(desc.methods.map((m) => [m.name, m]));\n return methodCache;\n } finally {\n releaseBusy();\n }\n }\n\n return {\n async call(method: string, params?: Record<string, any>): Promise<Record<string, any> | null> {\n const methods = await ensureMethodCache();\n await acquireBusy();\n try {\n const info = methods.get(method);\n if (!info) {\n throw new Error(`Unknown method: '${method}'`);\n }\n\n const r = await ensureReader();\n\n // Apply defaults\n const fullParams = { ...(info.defaults ?? {}), ...(params ?? {}) };\n\n // Send request\n const body = buildRequestIpc(info.paramsSchema, fullParams, method);\n writeFn(body);\n\n // Read response\n const response = await r.readStream();\n if (!response) {\n throw new Error(\"EOF reading response\");\n }\n\n // Process batches: dispatch logs, find result\n let resultBatch: RecordBatch | null = null;\n for (const batch of response.batches) {\n if (batch.numRows === 0) {\n dispatchLogOrError(batch, onLog);\n continue;\n }\n resultBatch = batch;\n }\n\n if (!resultBatch) {\n return null;\n }\n\n const rows = extractBatchRows(resultBatch);\n if (rows.length === 0) return null;\n\n if (info.resultSchema.fields.length === 0) return null;\n\n return rows[0];\n } finally {\n releaseBusy();\n }\n },\n\n async stream(method: string, params?: Record<string, any>): Promise<StreamSession> {\n const methods = await ensureMethodCache();\n await acquireBusy();\n\n try {\n const info = methods.get(method);\n if (!info) {\n throw new Error(`Unknown method: '${method}'`);\n }\n\n const r = await ensureReader();\n\n // Apply defaults\n const fullParams = { ...(info.defaults ?? {}), ...(params ?? {}) };\n\n // Send init request (params as a complete IPC stream)\n const body = buildRequestIpc(info.paramsSchema, fullParams, method);\n writeFn(body);\n\n // Read header if method has headerSchema\n let header: Record<string, any> | null = null;\n if (info.headerSchema) {\n const headerStream = await r.readStream();\n if (headerStream) {\n for (const batch of headerStream.batches) {\n if (batch.numRows === 0) {\n dispatchLogOrError(batch, onLog);\n continue;\n }\n const rows = extractBatchRows(batch);\n if (rows.length > 0) {\n header = rows[0];\n }\n }\n }\n }\n\n const outputSchema = info.outputSchema ?? info.resultSchema;\n\n // Don't release busy here — PipeStreamSession owns the lock\n // and will release it when done\n return new PipeStreamSession({\n reader: r,\n writeFn,\n onLog,\n header,\n outputSchema,\n releaseBusy,\n setDrainPromise,\n });\n } catch (e) {\n // Init error (e.g., server raised exception during init).\n // Send empty input stream so server's drain unblocks, then\n // drain the server's output stream if needed.\n try {\n const r = await ensureReader();\n const emptySchema = new Schema([]);\n const ipc = serializeIpcStream(emptySchema, []);\n writeFn(ipc);\n // Drain server's output stream (error response + EOS)\n const outStream = await r.readStream();\n // outStream may be null or contain remaining batches — just consume\n void outStream;\n } catch {\n // Suppress errors during cleanup\n }\n releaseBusy();\n throw e;\n }\n },\n\n async describe(): Promise<ServiceDescription> {\n const methods = await ensureMethodCache();\n return {\n protocolName,\n methods: [...methods.values()],\n };\n },\n\n close(): void {\n if (closed) return;\n closed = true;\n writable.end();\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// subprocessConnect — spawn a process and wrap with pipeConnect\n// ---------------------------------------------------------------------------\n\nexport function subprocessConnect(cmd: string[], options?: SubprocessConnectOptions): RpcClient {\n const proc = Bun.spawn(cmd, {\n stdin: \"pipe\",\n stdout: \"pipe\",\n stderr: options?.stderr ?? \"ignore\",\n cwd: options?.cwd,\n env: options?.env ? { ...process.env, ...options.env } : undefined,\n });\n\n const stdout = proc.stdout as ReadableStream<Uint8Array>;\n\n const writable: PipeWritable = {\n write(data: Uint8Array) {\n (proc.stdin as any).write(data);\n },\n flush() {\n (proc.stdin as any).flush();\n },\n end() {\n (proc.stdin as any).end();\n },\n };\n\n const client = pipeConnect(stdout, writable, {\n onLog: options?.onLog,\n });\n\n // Wrap close to also kill the subprocess\n const originalClose = client.close;\n client.close = () => {\n originalClose.call(client);\n try {\n proc.kill();\n } catch {\n // Process may have already exited\n }\n };\n\n return client;\n}\n",
|
|
15
|
+
"// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport { randomBytes } from \"node:crypto\";\nimport { Schema } from \"@query-farm/apache-arrow\";\nimport { DESCRIBE_METHOD_NAME } from \"../constants.js\";\nimport type { Protocol } from \"../protocol.js\";\nimport { MethodType } from \"../types.js\";\nimport { zstdCompress, zstdDecompress } from \"../util/zstd.js\";\nimport { buildErrorBatch } from \"../wire/response.js\";\nimport { ARROW_CONTENT_TYPE, arrowResponse, HttpRpcError, serializeIpcStream } from \"./common.js\";\nimport {\n httpDispatchDescribe,\n httpDispatchStreamExchange,\n httpDispatchStreamInit,\n httpDispatchUnary,\n} from \"./dispatch.js\";\nimport { type HttpHandlerOptions, jsonStateSerializer } from \"./types.js\";\n\nconst EMPTY_SCHEMA = new Schema([]);\n\n/**\n * Create a fetch-compatible HTTP handler for a vgi-rpc Protocol.\n *\n * Compatible with Bun.serve(), Deno.serve(), Cloudflare Workers, and any\n * Web API runtime that uses the standard Request/Response types.\n *\n * @example\n * ```typescript\n * const handler = createHttpHandler(protocol);\n * Bun.serve({ port: 8080, fetch: handler });\n * ```\n */\nexport function createHttpHandler(\n protocol: Protocol,\n options?: HttpHandlerOptions,\n): (request: Request) => Response | Promise<Response> {\n const prefix = (options?.prefix ?? \"/vgi\").replace(/\\/+$/, \"\");\n const signingKey = options?.signingKey ?? randomBytes(32);\n const tokenTtl = options?.tokenTtl ?? 3600;\n const corsOrigins = options?.corsOrigins;\n const maxRequestBytes = options?.maxRequestBytes;\n const maxStreamResponseBytes = options?.maxStreamResponseBytes;\n const serverId = options?.serverId ?? crypto.randomUUID().replace(/-/g, \"\").slice(0, 12);\n\n const methods = protocol.getMethods();\n\n const compressionLevel = options?.compressionLevel;\n const stateSerializer = options?.stateSerializer ?? jsonStateSerializer;\n\n const ctx = {\n signingKey,\n tokenTtl,\n serverId,\n maxStreamResponseBytes,\n stateSerializer,\n };\n\n function addCorsHeaders(headers: Headers): void {\n if (corsOrigins) {\n headers.set(\"Access-Control-Allow-Origin\", corsOrigins);\n headers.set(\"Access-Control-Allow-Methods\", \"POST, OPTIONS\");\n headers.set(\"Access-Control-Allow-Headers\", \"Content-Type\");\n }\n }\n\n async function compressIfAccepted(response: Response, clientAcceptsZstd: boolean): Promise<Response> {\n if (compressionLevel == null || !clientAcceptsZstd) return response;\n const responseBody = new Uint8Array(await response.arrayBuffer());\n const compressed = zstdCompress(responseBody, compressionLevel);\n const headers = new Headers(response.headers);\n headers.set(\"Content-Encoding\", \"zstd\");\n return new Response(compressed as unknown as BodyInit, {\n status: response.status,\n headers,\n });\n }\n\n function makeErrorResponse(error: Error, statusCode: number, schema: Schema = EMPTY_SCHEMA): Response {\n const errBatch = buildErrorBatch(schema, error, serverId, null);\n const body = serializeIpcStream(schema, [errBatch]);\n const resp = arrowResponse(body, statusCode);\n addCorsHeaders(resp.headers);\n return resp;\n }\n\n return async function handler(request: Request): Promise<Response> {\n const url = new URL(request.url);\n const path = url.pathname;\n\n // CORS preflight\n if (request.method === \"OPTIONS\") {\n if (path === `${prefix}/__capabilities__`) {\n const headers = new Headers();\n addCorsHeaders(headers);\n if (maxRequestBytes != null) {\n headers.set(\"VGI-Max-Request-Bytes\", String(maxRequestBytes));\n }\n return new Response(null, { status: 204, headers });\n }\n\n if (corsOrigins) {\n const headers = new Headers();\n addCorsHeaders(headers);\n return new Response(null, { status: 204, headers });\n }\n\n return new Response(null, { status: 405 });\n }\n\n if (request.method !== \"POST\") {\n return new Response(\"Method Not Allowed\", { status: 405 });\n }\n\n // Validate Content-Type\n const contentType = request.headers.get(\"Content-Type\");\n if (!contentType || !contentType.includes(ARROW_CONTENT_TYPE)) {\n return new Response(`Unsupported Media Type: expected ${ARROW_CONTENT_TYPE}`, { status: 415 });\n }\n\n // Check request body size\n if (maxRequestBytes != null) {\n const contentLength = request.headers.get(\"Content-Length\");\n if (contentLength && parseInt(contentLength, 10) > maxRequestBytes) {\n return new Response(\"Request body too large\", { status: 413 });\n }\n }\n\n const clientAcceptsZstd = (request.headers.get(\"Accept-Encoding\") ?? \"\").includes(\"zstd\");\n\n // Read body, decompressing if needed\n let body = new Uint8Array(await request.arrayBuffer());\n const contentEncoding = request.headers.get(\"Content-Encoding\");\n if (contentEncoding === \"zstd\") {\n body = zstdDecompress(body);\n }\n\n // Route: {prefix}/__describe__\n if (path === `${prefix}/${DESCRIBE_METHOD_NAME}`) {\n try {\n const response = httpDispatchDescribe(protocol.name, methods, serverId);\n addCorsHeaders(response.headers);\n return compressIfAccepted(response, clientAcceptsZstd);\n } catch (error: any) {\n return compressIfAccepted(makeErrorResponse(error, 500), clientAcceptsZstd);\n }\n }\n\n // Parse method name and sub-path from URL\n if (!path.startsWith(`${prefix}/`)) {\n return new Response(\"Not Found\", { status: 404 });\n }\n\n const subPath = path.slice(prefix.length + 1);\n let methodName: string;\n let action: \"call\" | \"init\" | \"exchange\";\n\n if (subPath.endsWith(\"/init\")) {\n methodName = subPath.slice(0, -5);\n action = \"init\";\n } else if (subPath.endsWith(\"/exchange\")) {\n methodName = subPath.slice(0, -9);\n action = \"exchange\";\n } else {\n methodName = subPath;\n action = \"call\";\n }\n\n // Look up method\n const method = methods.get(methodName);\n if (!method) {\n const available = [...methods.keys()].sort();\n const err = new Error(`Unknown method: '${methodName}'. Available methods: [${available.join(\", \")}]`);\n return compressIfAccepted(makeErrorResponse(err, 404), clientAcceptsZstd);\n }\n\n try {\n let response: Response;\n\n if (action === \"call\") {\n if (method.type !== MethodType.UNARY) {\n throw new HttpRpcError(`Method '${methodName}' is a stream method. Use /init and /exchange endpoints.`, 400);\n }\n response = await httpDispatchUnary(method, body, ctx);\n } else if (action === \"init\") {\n if (method.type !== MethodType.STREAM) {\n throw new HttpRpcError(\n `Method '${methodName}' is a unary method. Use POST ${prefix}/${methodName} instead.`,\n 400,\n );\n }\n response = await httpDispatchStreamInit(method, body, ctx);\n } else {\n if (method.type !== MethodType.STREAM) {\n throw new HttpRpcError(\n `Method '${methodName}' is a unary method. Use POST ${prefix}/${methodName} instead.`,\n 400,\n );\n }\n response = await httpDispatchStreamExchange(method, body, ctx);\n }\n\n addCorsHeaders(response.headers);\n return compressIfAccepted(response, clientAcceptsZstd);\n } catch (error: any) {\n if (error instanceof HttpRpcError) {\n return compressIfAccepted(makeErrorResponse(error, error.statusCode), clientAcceptsZstd);\n }\n return compressIfAccepted(makeErrorResponse(error, 500), clientAcceptsZstd);\n }\n };\n}\n",
|
|
16
|
+
"// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport { RecordBatch, recordBatchFromArrays, type Schema } from \"@query-farm/apache-arrow\";\nimport { buildLogBatch, coerceInt64 } from \"./wire/response.js\";\n\nexport enum MethodType {\n UNARY = \"unary\",\n STREAM = \"stream\",\n}\n\n/** Logging interface available to handlers. */\nexport interface LogContext {\n clientLog(level: string, message: string, extra?: Record<string, string>): void;\n}\n\n/** Handler for unary (request-response) RPC methods. */\nexport type UnaryHandler = (\n params: Record<string, any>,\n ctx: LogContext,\n) => Promise<Record<string, any>> | Record<string, any>;\n\n/** Initialization function for producer streams. Returns the initial state object. */\nexport type ProducerInit<S = any> = (params: Record<string, any>) => Promise<S> | S;\n/** Called repeatedly to produce output batches. Call `out.finish()` to end the stream. */\nexport type ProducerFn<S = any> = (state: S, out: OutputCollector) => Promise<void> | void;\n\n/** Initialization function for exchange streams. Returns the initial state object. */\nexport type ExchangeInit<S = any> = (params: Record<string, any>) => Promise<S> | S;\n/** Called once per input batch. Must emit exactly one output batch per call. */\nexport type ExchangeFn<S = any> = (state: S, input: RecordBatch, out: OutputCollector) => Promise<void> | void;\n\n/** Produces a header batch sent before the first output batch in a stream. */\nexport type HeaderInit = (params: Record<string, any>, state: any, ctx: LogContext) => Record<string, any>;\n\nexport interface MethodDefinition {\n name: string;\n type: MethodType;\n paramsSchema: Schema;\n resultSchema: Schema;\n outputSchema?: Schema;\n inputSchema?: Schema;\n handler?: UnaryHandler;\n producerInit?: ProducerInit;\n producerFn?: ProducerFn;\n exchangeInit?: ExchangeInit;\n exchangeFn?: ExchangeFn;\n headerSchema?: Schema;\n headerInit?: HeaderInit;\n doc?: string;\n defaults?: Record<string, any>;\n paramTypes?: Record<string, string>;\n}\n\nexport interface EmittedBatch {\n batch: RecordBatch;\n metadata?: Map<string, string>;\n}\n\n/**\n * Accumulates output batches during a produce/exchange call.\n * Enforces that exactly one data batch is emitted per call (plus any number of log batches).\n */\nexport class OutputCollector implements LogContext {\n private _batches: EmittedBatch[] = [];\n private _dataBatchIdx: number | null = null;\n private _finished = false;\n private _producerMode: boolean;\n private _outputSchema: Schema;\n private _serverId: string;\n private _requestId: string | null;\n\n constructor(outputSchema: Schema, producerMode = true, serverId = \"\", requestId: string | null = null) {\n this._outputSchema = outputSchema;\n this._producerMode = producerMode;\n this._serverId = serverId;\n this._requestId = requestId;\n }\n\n get outputSchema(): Schema {\n return this._outputSchema;\n }\n\n get finished(): boolean {\n return this._finished;\n }\n\n get batches(): EmittedBatch[] {\n return this._batches;\n }\n\n /** Emit a pre-built RecordBatch as the data batch for this call. */\n emit(batch: RecordBatch, metadata?: Map<string, string>): void;\n /** Emit a data batch from column arrays keyed by field name. Int64 Number values are coerced to BigInt. */\n emit(columns: Record<string, any[]>): void;\n emit(batchOrColumns: RecordBatch | Record<string, any[]>, metadata?: Map<string, string>): void {\n let batch: RecordBatch;\n if (batchOrColumns instanceof RecordBatch) {\n batch = batchOrColumns;\n } else {\n const coerced = coerceInt64(this._outputSchema, batchOrColumns);\n batch = recordBatchFromArrays(coerced, this._outputSchema);\n }\n if (this._dataBatchIdx !== null) {\n throw new Error(\"Only one data batch may be emitted per call\");\n }\n this._dataBatchIdx = this._batches.length;\n this._batches.push({ batch, metadata });\n }\n\n /** Single-row convenience. Wraps each value in `[value]` then calls `emit()`. */\n emitRow(values: Record<string, any>): void {\n const columns: Record<string, any[]> = {};\n for (const [key, value] of Object.entries(values)) {\n columns[key] = [value];\n }\n this.emit(columns);\n }\n\n /** Signal stream completion for producer streams. Throws if called on exchange streams. */\n finish(): void {\n if (!this._producerMode) {\n throw new Error(\n \"finish() is not allowed on exchange streams; \" + \"exchange streams must emit exactly one data batch per call\",\n );\n }\n this._finished = true;\n }\n\n /** Emit a zero-row client-directed log batch. */\n clientLog(level: string, message: string, extra?: Record<string, string>): void {\n const batch = buildLogBatch(this._outputSchema, level, message, extra, this._serverId, this._requestId);\n this._batches.push({ batch });\n }\n}\n",
|
|
17
|
+
"// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n Data,\n DataType,\n type Field,\n makeData,\n RecordBatch,\n type Schema,\n Struct,\n vectorFromArray,\n} from \"@query-farm/apache-arrow\";\nimport { LOG_EXTRA_KEY, LOG_LEVEL_KEY, LOG_MESSAGE_KEY, REQUEST_ID_KEY, SERVER_ID_KEY } from \"../constants.js\";\n\n/**\n * Coerce values for Int64 schema fields from Number to BigInt.\n * Handles both single values and arrays. Returns a new record with coerced values.\n */\nexport function coerceInt64(schema: Schema, values: Record<string, any>): Record<string, any> {\n const result: Record<string, any> = { ...values };\n for (const field of schema.fields) {\n const val = result[field.name];\n if (val === undefined) continue;\n if (!DataType.isInt(field.type) || (field.type as any).bitWidth !== 64) continue;\n\n if (Array.isArray(val)) {\n result[field.name] = val.map((v: any) => (typeof v === \"number\" ? BigInt(v) : v));\n } else if (typeof val === \"number\") {\n result[field.name] = BigInt(val);\n }\n }\n return result;\n}\n\n/**\n * Build a 1-row result batch with optional metadata.\n * For unary methods, `values` maps field names to single values.\n */\nexport function buildResultBatch(\n schema: Schema,\n values: Record<string, any>,\n serverId: string,\n requestId: string | null,\n): RecordBatch {\n const metadata = new Map<string, string>();\n metadata.set(SERVER_ID_KEY, serverId);\n if (requestId !== null) {\n metadata.set(REQUEST_ID_KEY, requestId);\n }\n\n if (schema.fields.length === 0) {\n return buildEmptyBatch(schema, metadata);\n }\n\n // Validate required fields\n for (const field of schema.fields) {\n if (values[field.name] === undefined && !field.nullable) {\n const got = Object.keys(values);\n throw new TypeError(`Handler result missing required field '${field.name}'. Got keys: [${got.join(\", \")}]`);\n }\n }\n\n const coerced = coerceInt64(schema, values);\n\n const children = schema.fields.map((f: Field) => {\n const val = coerced[f.name];\n // Raw Data passthrough for Map_ types (whose .get() is broken in arrow-js)\n if (val instanceof Data) {\n return val;\n }\n const arr = vectorFromArray([val], f.type);\n return arr.data[0];\n });\n\n const structType = new Struct(schema.fields);\n const data = makeData({\n type: structType,\n length: 1,\n children,\n nullCount: 0,\n });\n\n return new RecordBatch(schema, data, metadata);\n}\n\n/**\n * Build a 0-row error batch with EXCEPTION metadata matching Python's Message.from_exception().\n */\nexport function buildErrorBatch(schema: Schema, error: Error, serverId: string, requestId: string | null): RecordBatch {\n const metadata = new Map<string, string>();\n metadata.set(LOG_LEVEL_KEY, \"EXCEPTION\");\n metadata.set(LOG_MESSAGE_KEY, `${error.constructor.name}: ${error.message}`);\n\n const extra: Record<string, any> = {\n exception_type: error.constructor.name,\n exception_message: error.message,\n traceback: error.stack ?? \"\",\n };\n metadata.set(LOG_EXTRA_KEY, JSON.stringify(extra));\n metadata.set(SERVER_ID_KEY, serverId);\n if (requestId !== null) {\n metadata.set(REQUEST_ID_KEY, requestId);\n }\n\n return buildEmptyBatch(schema, metadata);\n}\n\n/**\n * Build a 0-row log batch.\n */\nexport function buildLogBatch(\n schema: Schema,\n level: string,\n message: string,\n extra?: Record<string, any>,\n serverId?: string,\n requestId?: string | null,\n): RecordBatch {\n const metadata = new Map<string, string>();\n metadata.set(LOG_LEVEL_KEY, level);\n metadata.set(LOG_MESSAGE_KEY, message);\n if (extra) {\n metadata.set(LOG_EXTRA_KEY, JSON.stringify(extra));\n }\n if (serverId != null) {\n metadata.set(SERVER_ID_KEY, serverId);\n }\n if (requestId != null) {\n metadata.set(REQUEST_ID_KEY, requestId);\n }\n\n return buildEmptyBatch(schema, metadata);\n}\n\n/**\n * Build a 0-row batch from a schema with metadata.\n * Used for error/log batches.\n */\nexport function buildEmptyBatch(schema: Schema, metadata?: Map<string, string>): RecordBatch {\n const children = schema.fields.map((f: Field) => {\n return makeData({ type: f.type, length: 0, nullCount: 0 });\n });\n\n if (schema.fields.length === 0) {\n const structType = new Struct(schema.fields);\n const data = makeData({\n type: structType,\n length: 0,\n children: [],\n nullCount: 0,\n });\n return new RecordBatch(schema, data, metadata);\n }\n\n const structType = new Struct(schema.fields);\n const data = makeData({\n type: structType,\n length: 0,\n children,\n nullCount: 0,\n });\n\n return new RecordBatch(schema, data, metadata);\n}\n",
|
|
18
|
+
"// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport { RecordBatch, RecordBatchReader, Schema } from \"@query-farm/apache-arrow\";\nimport { STATE_KEY } from \"../constants.js\";\nimport { buildDescribeBatch, DESCRIBE_SCHEMA } from \"../dispatch/describe.js\";\nimport type { MethodDefinition } from \"../types.js\";\nimport { OutputCollector } from \"../types.js\";\nimport { serializeSchema } from \"../util/schema.js\";\nimport { parseRequest } from \"../wire/request.js\";\nimport { buildEmptyBatch, buildErrorBatch, buildResultBatch } from \"../wire/response.js\";\nimport { arrowResponse, HttpRpcError, readRequestFromBody, serializeIpcStream } from \"./common.js\";\nimport { packStateToken, unpackStateToken } from \"./token.js\";\nimport type { StateSerializer } from \"./types.js\";\n\nasync function deserializeSchema(bytes: Uint8Array): Promise<Schema> {\n const reader = await RecordBatchReader.from(bytes);\n await reader.open();\n return reader.schema!;\n}\n\nconst EMPTY_SCHEMA = new Schema([]);\n\nexport interface DispatchContext {\n signingKey: Uint8Array;\n tokenTtl: number;\n serverId: string;\n maxStreamResponseBytes?: number;\n stateSerializer: StateSerializer;\n}\n\n/** Dispatch a __describe__ request. */\nexport function httpDispatchDescribe(\n protocolName: string,\n methods: Map<string, MethodDefinition>,\n serverId: string,\n): Response {\n const { batch } = buildDescribeBatch(protocolName, methods, serverId);\n const body = serializeIpcStream(DESCRIBE_SCHEMA, [batch]);\n return arrowResponse(body);\n}\n\n/** Dispatch a unary HTTP request. */\nexport async function httpDispatchUnary(\n method: MethodDefinition,\n body: Uint8Array,\n ctx: DispatchContext,\n): Promise<Response> {\n const schema = method.resultSchema;\n const { schema: reqSchema, batch: reqBatch } = await readRequestFromBody(body);\n const parsed = parseRequest(reqSchema, reqBatch);\n\n if (parsed.methodName !== method.name) {\n throw new HttpRpcError(`Method name in request '${parsed.methodName}' does not match URL '${method.name}'`, 400);\n }\n\n const out = new OutputCollector(schema, true, ctx.serverId, parsed.requestId);\n\n try {\n const result = await method.handler!(parsed.params, out);\n const resultBatch = buildResultBatch(schema, result, ctx.serverId, parsed.requestId);\n const batches = [...out.batches.map((b) => b.batch), resultBatch];\n return arrowResponse(serializeIpcStream(schema, batches));\n } catch (error: any) {\n const errBatch = buildErrorBatch(schema, error, ctx.serverId, parsed.requestId);\n return arrowResponse(serializeIpcStream(schema, [errBatch]), 500);\n }\n}\n\n/** Dispatch a stream init HTTP request (producer or exchange). */\nexport async function httpDispatchStreamInit(\n method: MethodDefinition,\n body: Uint8Array,\n ctx: DispatchContext,\n): Promise<Response> {\n const isProducer = !!method.producerFn;\n const outputSchema = method.outputSchema!;\n const inputSchema = method.inputSchema ?? EMPTY_SCHEMA;\n\n const { schema: reqSchema, batch: reqBatch } = await readRequestFromBody(body);\n const parsed = parseRequest(reqSchema, reqBatch);\n\n if (parsed.methodName !== method.name) {\n throw new HttpRpcError(`Method name in request '${parsed.methodName}' does not match URL '${method.name}'`, 400);\n }\n\n // Init state\n let state: any;\n try {\n if (isProducer) {\n state = await method.producerInit!(parsed.params);\n } else {\n state = await method.exchangeInit!(parsed.params);\n }\n } catch (error: any) {\n const errSchema = method.headerSchema ?? EMPTY_SCHEMA;\n const errBatch = buildErrorBatch(errSchema, error, ctx.serverId, parsed.requestId);\n return arrowResponse(serializeIpcStream(errSchema, [errBatch]), 500);\n }\n\n // Support dynamic output schemas (same as pipe transport)\n const resolvedOutputSchema = state?.__outputSchema ?? outputSchema;\n const effectiveProducer = state?.__isProducer ?? isProducer;\n\n // Build header IPC stream if method has a header schema\n let headerBytes: Uint8Array | null = null;\n if (method.headerSchema && method.headerInit) {\n try {\n const headerOut = new OutputCollector(method.headerSchema, true, ctx.serverId, parsed.requestId);\n const headerValues = method.headerInit(parsed.params, state, headerOut);\n const headerBatch = buildResultBatch(method.headerSchema, headerValues, ctx.serverId, parsed.requestId);\n const headerBatches = [...headerOut.batches.map((b) => b.batch), headerBatch];\n headerBytes = serializeIpcStream(method.headerSchema, headerBatches);\n } catch (error: any) {\n const errBatch = buildErrorBatch(method.headerSchema, error, ctx.serverId, parsed.requestId);\n return arrowResponse(serializeIpcStream(method.headerSchema, [errBatch]), 500);\n }\n }\n\n if (effectiveProducer) {\n // Producer method — produce data inline in the init response.\n // For exchange-registered methods acting as producers (__isProducer),\n // produceStreamResponse falls back to exchangeFn with tick batches.\n return produceStreamResponse(method, state, resolvedOutputSchema, inputSchema, ctx, parsed.requestId, headerBytes);\n } else {\n // Exchange: serialize state into signed token, return zero-row batch with token\n const stateBytes = ctx.stateSerializer.serialize(state);\n const schemaBytes = serializeSchema(resolvedOutputSchema);\n const inputSchemaBytes = serializeSchema(inputSchema);\n const token = packStateToken(stateBytes, schemaBytes, inputSchemaBytes, ctx.signingKey);\n\n const tokenMeta = new Map<string, string>();\n tokenMeta.set(STATE_KEY, token);\n const tokenBatch = buildEmptyBatch(resolvedOutputSchema, tokenMeta);\n const tokenStreamBytes = serializeIpcStream(resolvedOutputSchema, [tokenBatch]);\n\n let responseBody: Uint8Array;\n if (headerBytes) {\n responseBody = concatBytes(headerBytes, tokenStreamBytes);\n } else {\n responseBody = tokenStreamBytes;\n }\n\n return arrowResponse(responseBody);\n }\n}\n\n/** Dispatch a stream exchange HTTP request (producer continuation or exchange round). */\nexport async function httpDispatchStreamExchange(\n method: MethodDefinition,\n body: Uint8Array,\n ctx: DispatchContext,\n): Promise<Response> {\n const isProducer = !!method.producerFn;\n\n const { batch: reqBatch } = await readRequestFromBody(body);\n\n // Get state token from batch metadata\n const tokenBase64 = reqBatch.metadata?.get(STATE_KEY);\n if (!tokenBase64) {\n throw new HttpRpcError(\"Missing state token in exchange request\", 400);\n }\n\n let unpacked: import(\"./token.js\").UnpackedToken;\n try {\n unpacked = unpackStateToken(tokenBase64, ctx.signingKey, ctx.tokenTtl);\n } catch (error: any) {\n throw new HttpRpcError(`Invalid state token: ${error.message}`, 400);\n }\n\n let state: any;\n try {\n state = ctx.stateSerializer.deserialize(unpacked.stateBytes);\n } catch (error: any) {\n console.error(`[httpDispatchStreamExchange] state deserialize error:`, error.message);\n throw new HttpRpcError(`State deserialization failed: ${error.message}`, 500);\n }\n\n // Recover schemas from the token (the state itself may not contain\n // Schema objects after JSON round-trip — always prefer the token).\n let outputSchema: Schema;\n if (unpacked.schemaBytes.length > 0) {\n outputSchema = await deserializeSchema(unpacked.schemaBytes);\n } else {\n outputSchema = state?.__outputSchema ?? method.outputSchema!;\n }\n let inputSchema: Schema;\n if (unpacked.inputSchemaBytes.length > 0) {\n inputSchema = await deserializeSchema(unpacked.inputSchemaBytes);\n } else {\n inputSchema = method.inputSchema ?? EMPTY_SCHEMA;\n }\n const effectiveProducer = state?.__isProducer ?? isProducer;\n if (process.env.VGI_DISPATCH_DEBUG)\n console.error(\n `[httpDispatchStreamExchange] method=${method.name} effectiveProducer=${effectiveProducer} stateKeys=${Object.keys(state || {})}`,\n );\n\n if (effectiveProducer) {\n // Producer continuation — produce more data inline.\n // For exchange-registered methods, falls back to exchangeFn with tick batches.\n return produceStreamResponse(method, state, outputSchema, inputSchema, ctx, null, null);\n } else {\n // Exchange path — also handles exchange-registered methods acting as\n // producers (__isProducer=true). Use producer mode on the OutputCollector\n // when effectiveProducer so finish() is allowed.\n const out = new OutputCollector(outputSchema, effectiveProducer, ctx.serverId, null);\n\n try {\n if (method.exchangeFn) {\n await method.exchangeFn(state, reqBatch, out);\n } else {\n await method.producerFn!(state, out);\n }\n } catch (error: any) {\n if (process.env.VGI_DISPATCH_DEBUG)\n console.error(\n `[httpDispatchStreamExchange] exchange handler error:`,\n error.message,\n error.stack?.split(\"\\n\").slice(0, 5).join(\"\\n\"),\n );\n const errBatch = buildErrorBatch(outputSchema, error, ctx.serverId, null);\n return arrowResponse(serializeIpcStream(outputSchema, [errBatch]), 500);\n }\n\n // Collect emitted batches\n const batches: RecordBatch[] = [];\n\n if (out.finished) {\n // Stream is done — return data WITHOUT state token.\n // The absence of a token tells the client there's no more data.\n for (const emitted of out.batches) {\n batches.push(emitted.batch);\n }\n } else {\n // More data may follow — repack state into token for next exchange.\n const stateBytes = ctx.stateSerializer.serialize(state);\n const schemaBytes = serializeSchema(outputSchema);\n const inputSchemaBytes = serializeSchema(inputSchema);\n const token = packStateToken(stateBytes, schemaBytes, inputSchemaBytes, ctx.signingKey);\n\n for (const emitted of out.batches) {\n const batch = emitted.batch;\n if (batch.numRows > 0) {\n const mergedMeta = new Map<string, string>(batch.metadata ?? []);\n mergedMeta.set(STATE_KEY, token);\n batches.push(new RecordBatch(batch.schema, batch.data, mergedMeta));\n } else {\n batches.push(batch);\n }\n }\n\n // Safety net: if no batch carries a state token (e.g. all rows were\n // filtered out by pushdown filters), emit an empty batch with the\n // token so the client knows to continue exchanging.\n if (!batches.some((b) => b.metadata?.get(STATE_KEY))) {\n const tokenMeta = new Map<string, string>();\n tokenMeta.set(STATE_KEY, token);\n batches.push(buildEmptyBatch(outputSchema, tokenMeta));\n }\n }\n\n return arrowResponse(serializeIpcStream(outputSchema, batches));\n }\n}\n\n/** Run the producer loop and build the response. */\nasync function produceStreamResponse(\n method: MethodDefinition,\n state: any,\n outputSchema: Schema,\n inputSchema: Schema,\n ctx: DispatchContext,\n requestId: string | null,\n headerBytes: Uint8Array | null,\n): Promise<Response> {\n const allBatches: RecordBatch[] = [];\n const maxBytes = ctx.maxStreamResponseBytes;\n let estimatedBytes = 0;\n\n while (true) {\n const out = new OutputCollector(outputSchema, true, ctx.serverId, requestId);\n\n try {\n if (method.producerFn) {\n await method.producerFn(state, out);\n } else {\n // Exchange-registered method acting as producer (e.g. VGI's \"init\"\n // method which is registered as exchange but may produce based on\n // the __isProducer state flag). Call exchangeFn with an empty tick\n // batch, matching how the subprocess transport dispatches these.\n const tickBatch = buildEmptyBatch(inputSchema);\n await method.exchangeFn!(state, tickBatch, out);\n }\n } catch (error: any) {\n if (process.env.VGI_DISPATCH_DEBUG)\n console.error(`[produceStreamResponse] error:`, error.message, error.stack?.split(\"\\n\").slice(0, 3).join(\"\\n\"));\n allBatches.push(buildErrorBatch(outputSchema, error, ctx.serverId, requestId));\n break;\n }\n\n for (const emitted of out.batches) {\n allBatches.push(emitted.batch);\n if (maxBytes != null) {\n estimatedBytes += emitted.batch.data.byteLength;\n }\n }\n\n if (out.finished) {\n break;\n }\n\n // Check byte budget — if exceeded, emit continuation token\n if (maxBytes != null && estimatedBytes >= maxBytes) {\n const stateBytes = ctx.stateSerializer.serialize(state);\n const schemaBytes = serializeSchema(outputSchema);\n const inputSchemaBytes = serializeSchema(inputSchema);\n const token = packStateToken(stateBytes, schemaBytes, inputSchemaBytes, ctx.signingKey);\n const tokenMeta = new Map<string, string>();\n tokenMeta.set(STATE_KEY, token);\n allBatches.push(buildEmptyBatch(outputSchema, tokenMeta));\n break;\n }\n }\n\n const dataBytes = serializeIpcStream(outputSchema, allBatches);\n let responseBody: Uint8Array;\n if (headerBytes) {\n responseBody = concatBytes(headerBytes, dataBytes);\n } else {\n responseBody = dataBytes;\n }\n return arrowResponse(responseBody);\n}\n\nfunction concatBytes(...arrays: Uint8Array[]): Uint8Array {\n const totalLen = arrays.reduce((sum, a) => sum + a.length, 0);\n const result = new Uint8Array(totalLen);\n let offset = 0;\n for (const arr of arrays) {\n result.set(arr, offset);\n offset += arr.length;\n }\n return result;\n}\n",
|
|
19
|
+
"// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n Binary,\n Bool,\n Field,\n makeData,\n RecordBatch,\n Schema,\n Struct,\n Utf8,\n vectorFromArray,\n} from \"@query-farm/apache-arrow\";\nimport {\n DESCRIBE_VERSION,\n DESCRIBE_VERSION_KEY,\n PROTOCOL_NAME_KEY,\n REQUEST_VERSION,\n REQUEST_VERSION_KEY,\n SERVER_ID_KEY,\n} from \"../constants.js\";\nimport type { MethodDefinition } from \"../types.js\";\nimport { serializeSchema } from \"../util/schema.js\";\n\n/**\n * The schema for the __describe__ response, matching Python's _DESCRIBE_SCHEMA.\n */\nexport const DESCRIBE_SCHEMA = new Schema([\n new Field(\"name\", new Utf8(), false),\n new Field(\"method_type\", new Utf8(), false),\n new Field(\"doc\", new Utf8(), true),\n new Field(\"has_return\", new Bool(), false),\n new Field(\"params_schema_ipc\", new Binary(), false),\n new Field(\"result_schema_ipc\", new Binary(), false),\n new Field(\"param_types_json\", new Utf8(), true),\n new Field(\"param_defaults_json\", new Utf8(), true),\n new Field(\"has_header\", new Bool(), false),\n new Field(\"header_schema_ipc\", new Binary(), true),\n]);\n\n/**\n * Build the __describe__ response batch and metadata.\n */\nexport function buildDescribeBatch(\n protocolName: string,\n methods: Map<string, MethodDefinition>,\n serverId: string,\n): { batch: RecordBatch; metadata: Map<string, string> } {\n // Sort methods by name for consistent ordering\n const sortedEntries = [...methods.entries()].sort(([a], [b]) => a.localeCompare(b));\n\n const names: (string | null)[] = [];\n const methodTypes: (string | null)[] = [];\n const docs: (string | null)[] = [];\n const hasReturns: boolean[] = [];\n const paramsSchemas: (Uint8Array | null)[] = [];\n const resultSchemas: (Uint8Array | null)[] = [];\n const paramTypesJsons: (string | null)[] = [];\n const paramDefaultsJsons: (string | null)[] = [];\n const hasHeaders: boolean[] = [];\n const headerSchemas: (Uint8Array | null)[] = [];\n\n for (const [name, method] of sortedEntries) {\n names.push(name);\n methodTypes.push(method.type);\n docs.push(method.doc ?? null);\n\n // Unary methods with non-empty result schema have a return value\n const hasReturn = method.type === \"unary\" && method.resultSchema.fields.length > 0;\n hasReturns.push(hasReturn);\n\n paramsSchemas.push(serializeSchema(method.paramsSchema));\n resultSchemas.push(serializeSchema(method.resultSchema));\n\n // Build param_types_json\n if (method.paramTypes && Object.keys(method.paramTypes).length > 0) {\n paramTypesJsons.push(JSON.stringify(method.paramTypes));\n } else {\n paramTypesJsons.push(null);\n }\n\n // Build param_defaults_json\n if (method.defaults && Object.keys(method.defaults).length > 0) {\n const safe: Record<string, any> = {};\n for (const [k, v] of Object.entries(method.defaults)) {\n if (v === null || typeof v === \"string\" || typeof v === \"number\" || typeof v === \"boolean\") {\n safe[k] = v;\n }\n }\n paramDefaultsJsons.push(Object.keys(safe).length > 0 ? JSON.stringify(safe) : null);\n } else {\n paramDefaultsJsons.push(null);\n }\n\n hasHeaders.push(!!method.headerSchema);\n headerSchemas.push(method.headerSchema ? serializeSchema(method.headerSchema) : null);\n }\n\n // Build the batch using vectorFromArray for each column\n const nameArr = vectorFromArray(names, new Utf8());\n const methodTypeArr = vectorFromArray(methodTypes, new Utf8());\n const docArr = vectorFromArray(docs, new Utf8());\n const hasReturnArr = vectorFromArray(hasReturns, new Bool());\n const paramsSchemaArr = vectorFromArray(paramsSchemas, new Binary());\n const resultSchemaArr = vectorFromArray(resultSchemas, new Binary());\n const paramTypesArr = vectorFromArray(paramTypesJsons, new Utf8());\n const paramDefaultsArr = vectorFromArray(paramDefaultsJsons, new Utf8());\n const hasHeaderArr = vectorFromArray(hasHeaders, new Bool());\n const headerSchemaArr = vectorFromArray(headerSchemas, new Binary());\n\n const children = [\n nameArr.data[0],\n methodTypeArr.data[0],\n docArr.data[0],\n hasReturnArr.data[0],\n paramsSchemaArr.data[0],\n resultSchemaArr.data[0],\n paramTypesArr.data[0],\n paramDefaultsArr.data[0],\n hasHeaderArr.data[0],\n headerSchemaArr.data[0],\n ];\n\n const structType = new Struct(DESCRIBE_SCHEMA.fields);\n const data = makeData({\n type: structType,\n length: sortedEntries.length,\n children,\n nullCount: 0,\n });\n\n // Build metadata for the batch\n const metadata = new Map<string, string>();\n metadata.set(PROTOCOL_NAME_KEY, protocolName);\n metadata.set(REQUEST_VERSION_KEY, REQUEST_VERSION);\n metadata.set(DESCRIBE_VERSION_KEY, DESCRIBE_VERSION);\n metadata.set(SERVER_ID_KEY, serverId);\n\n const batch = new RecordBatch(DESCRIBE_SCHEMA, data, metadata);\n\n return { batch, metadata };\n}\n",
|
|
20
|
+
"// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport { RecordBatchStreamWriter, type Schema } from \"@query-farm/apache-arrow\";\n\n/**\n * Serialize a Schema to the Arrow IPC Schema message format.\n * This produces bytes compatible with Python's `pa.ipc.read_schema()`.\n *\n * We serialize by writing an empty-batch IPC stream and extracting\n * the bytes, which includes the schema message. Python's read_schema()\n * uses `pa.ipc.read_schema(pa.py_buffer(bytes))` which expects\n * the schema flatbuffer message bytes directly — but the Python side\n * actually uses `schema.serialize()` which produces Schema message bytes.\n *\n * In arrow-js, we can get the equivalent by using Message.from(schema)\n * and encoding it, or by serializing a zero-batch stream.\n *\n * The Python `schema.serialize()` produces the Schema flatbuffer message bytes,\n * and `pa.ipc.read_schema()` expects an IPC stream containing a schema message.\n * The actual format is: continuation marker (0xFFFFFFFF) + length + flatbuffer bytes.\n */\nexport function serializeSchema(schema: Schema): Uint8Array {\n // Write a complete IPC stream with no batches.\n // This writes: Schema message + EOS marker.\n // Python's pa.ipc.read_schema() can read this format.\n const writer = new RecordBatchStreamWriter();\n writer.reset(undefined, schema);\n writer.close();\n return writer.toUint8Array(true);\n}\n",
|
|
21
|
+
"// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport { DataType, type RecordBatch, type Schema } from \"@query-farm/apache-arrow\";\nimport { REQUEST_ID_KEY, REQUEST_VERSION, REQUEST_VERSION_KEY, RPC_METHOD_KEY } from \"../constants.js\";\nimport { RpcError, VersionError } from \"../errors.js\";\n\nexport interface ParsedRequest {\n methodName: string;\n requestVersion: string;\n requestId: string | null;\n schema: Schema;\n params: Record<string, any>;\n rawMetadata: Map<string, string>;\n}\n\n/**\n * Parse a request from a RecordBatch with metadata.\n * Extracts method name, version, and params from the batch.\n */\nexport function parseRequest(schema: Schema, batch: RecordBatch): ParsedRequest {\n const metadata: Map<string, string> = batch.metadata ?? new Map();\n\n const methodName = metadata.get(RPC_METHOD_KEY);\n if (methodName === undefined) {\n throw new RpcError(\n \"ProtocolError\",\n \"Missing 'vgi_rpc.method' in request batch custom_metadata. \" +\n \"Each request batch must carry a 'vgi_rpc.method' key in its Arrow IPC custom_metadata \" +\n \"with the method name as a UTF-8 string.\",\n \"\",\n );\n }\n\n const version = metadata.get(REQUEST_VERSION_KEY);\n if (version === undefined) {\n throw new VersionError(\n \"Missing 'vgi_rpc.request_version' in request batch custom_metadata. \" +\n `Set the 'vgi_rpc.request_version' custom_metadata value to '${REQUEST_VERSION}'.`,\n );\n }\n if (version !== REQUEST_VERSION) {\n throw new VersionError(\n `Unsupported request version '${version}', expected '${REQUEST_VERSION}'. ` +\n `Set the 'vgi_rpc.request_version' custom_metadata value to '${REQUEST_VERSION}'.`,\n );\n }\n\n const requestId = metadata.get(REQUEST_ID_KEY) ?? null;\n\n // Extract params from single-row batch\n const params: Record<string, any> = {};\n if (schema.fields.length > 0 && batch.numRows !== 1) {\n throw new RpcError(\n \"ProtocolError\",\n `Expected 1 row in request batch, got ${batch.numRows}. ` +\n \"Each parameter is a column (not a row). The batch should have exactly 1 row.\",\n \"\",\n );\n }\n\n for (let i = 0; i < schema.fields.length; i++) {\n const field = schema.fields[i];\n // Map_ columns have a broken .get() in arrow-js — pass through raw Data\n if (DataType.isMap(field.type)) {\n params[field.name] = batch.getChildAt(i)!.data[0];\n continue;\n }\n let value = batch.getChildAt(i)?.get(0);\n // Convert BigInt to Number when safe\n if (typeof value === \"bigint\") {\n if (value >= BigInt(Number.MIN_SAFE_INTEGER) && value <= BigInt(Number.MAX_SAFE_INTEGER)) {\n value = Number(value);\n }\n }\n params[field.name] = value;\n }\n\n return {\n methodName,\n requestVersion: version,\n requestId,\n schema,\n params,\n rawMetadata: metadata,\n };\n}\n",
|
|
22
|
+
"// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport { createHmac, timingSafeEqual } from \"node:crypto\";\n\nconst TOKEN_VERSION = 2;\nconst HMAC_LEN = 32;\n// 1 (version) + 8 (created_at) + 4*3 (three length prefixes) + 32 (hmac)\nconst MIN_TOKEN_LEN = 1 + 8 + 12 + HMAC_LEN;\n\n/**\n * Pack a state token matching the Python v2 wire format.\n *\n * Layout:\n * [1B version=2]\n * [8B created_at uint64 LE (seconds since epoch)]\n * [4B state_len uint32 LE] [state_len bytes]\n * [4B schema_len uint32 LE] [schema_len bytes]\n * [4B input_schema_len uint32 LE] [input_schema_len bytes]\n * [32B HMAC-SHA256(signing_key, all above bytes)]\n */\nexport function packStateToken(\n stateBytes: Uint8Array,\n schemaBytes: Uint8Array,\n inputSchemaBytes: Uint8Array,\n signingKey: Uint8Array,\n createdAt?: number,\n): string {\n const now = createdAt ?? Math.floor(Date.now() / 1000);\n\n const payloadLen = 1 + 8 + 4 + stateBytes.length + 4 + schemaBytes.length + 4 + inputSchemaBytes.length;\n const buf = Buffer.alloc(payloadLen);\n let offset = 0;\n\n // version\n buf.writeUInt8(TOKEN_VERSION, offset);\n offset += 1;\n\n // created_at as uint64 LE\n buf.writeBigUInt64LE(BigInt(now), offset);\n offset += 8;\n\n // state\n buf.writeUInt32LE(stateBytes.length, offset);\n offset += 4;\n buf.set(stateBytes, offset);\n offset += stateBytes.length;\n\n // output schema\n buf.writeUInt32LE(schemaBytes.length, offset);\n offset += 4;\n buf.set(schemaBytes, offset);\n offset += schemaBytes.length;\n\n // input schema\n buf.writeUInt32LE(inputSchemaBytes.length, offset);\n offset += 4;\n buf.set(inputSchemaBytes, offset);\n offset += inputSchemaBytes.length;\n\n // HMAC\n const mac = createHmac(\"sha256\", signingKey).update(buf).digest();\n const token = Buffer.concat([buf, mac]);\n\n return token.toString(\"base64\");\n}\n\nexport interface UnpackedToken {\n stateBytes: Uint8Array;\n schemaBytes: Uint8Array;\n inputSchemaBytes: Uint8Array;\n createdAt: number;\n}\n\n/**\n * Unpack and verify a state token.\n * Throws on tampered, expired, or malformed tokens.\n */\nexport function unpackStateToken(tokenBase64: string, signingKey: Uint8Array, tokenTtl: number): UnpackedToken {\n const token = Buffer.from(tokenBase64, \"base64\");\n\n if (token.length < MIN_TOKEN_LEN) {\n throw new Error(\"State token too short\");\n }\n\n // Split payload and mac\n const payload = token.subarray(0, token.length - HMAC_LEN);\n const receivedMac = token.subarray(token.length - HMAC_LEN);\n\n // Verify HMAC first (before inspecting any fields)\n const expectedMac = createHmac(\"sha256\", signingKey).update(payload).digest();\n if (!timingSafeEqual(receivedMac, expectedMac)) {\n throw new Error(\"State token HMAC verification failed\");\n }\n\n let offset = 0;\n\n // Version\n const version = payload.readUInt8(offset);\n offset += 1;\n if (version !== TOKEN_VERSION) {\n throw new Error(`Unsupported state token version: ${version}`);\n }\n\n // created_at\n const createdAt = Number(payload.readBigUInt64LE(offset));\n offset += 8;\n\n // TTL check\n if (tokenTtl > 0) {\n const now = Math.floor(Date.now() / 1000);\n if (now - createdAt > tokenTtl) {\n throw new Error(\"State token expired\");\n }\n }\n\n // state bytes\n const stateLen = payload.readUInt32LE(offset);\n offset += 4;\n if (offset + stateLen > payload.length) {\n throw new Error(\"State token truncated (state)\");\n }\n const stateBytes = payload.slice(offset, offset + stateLen);\n offset += stateLen;\n\n // output schema bytes\n const schemaLen = payload.readUInt32LE(offset);\n offset += 4;\n if (offset + schemaLen > payload.length) {\n throw new Error(\"State token truncated (schema)\");\n }\n const schemaBytes = payload.slice(offset, offset + schemaLen);\n offset += schemaLen;\n\n // input schema bytes\n const inputSchemaLen = payload.readUInt32LE(offset);\n offset += 4;\n if (offset + inputSchemaLen > payload.length) {\n throw new Error(\"State token truncated (input schema)\");\n }\n const inputSchemaBytes = payload.slice(offset, offset + inputSchemaLen);\n\n return { stateBytes, schemaBytes, inputSchemaBytes, createdAt };\n}\n",
|
|
23
|
+
"// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\n/** Configuration options for createHttpHandler(). */\nexport interface HttpHandlerOptions {\n /** URL path prefix for all endpoints. Default: \"/vgi\" */\n prefix?: string;\n /** HMAC-SHA256 signing key for state tokens. Random 32 bytes if omitted. */\n signingKey?: Uint8Array;\n /** State token time-to-live in seconds. Default: 3600 (1 hour). 0 disables TTL checks. */\n tokenTtl?: number;\n /** CORS allowed origins. If set, CORS headers are added to all responses. */\n corsOrigins?: string;\n /** Maximum request body size in bytes. Advertised via VGI-Max-Request-Bytes header. */\n maxRequestBytes?: number;\n /** Maximum bytes before a producer stream emits a continuation token. */\n maxStreamResponseBytes?: number;\n /** Server ID included in response metadata. Random if omitted. */\n serverId?: string;\n /** Custom state serializer for stream state objects. Default: JSON with BigInt support. */\n stateSerializer?: StateSerializer;\n /** zstd compression level for responses (1-22). If set, responses are\n * compressed when the client sends Accept-Encoding: zstd. */\n compressionLevel?: number;\n}\n\n/** Serializer for stream state objects stored in state tokens. */\nexport interface StateSerializer {\n serialize(state: any): Uint8Array;\n deserialize(bytes: Uint8Array): any;\n}\n\n/** Default state serializer using JSON (with BigInt support). */\nexport const jsonStateSerializer: StateSerializer = {\n serialize(state: any): Uint8Array {\n return new TextEncoder().encode(\n JSON.stringify(state, (_key, value) => (typeof value === \"bigint\" ? `__bigint__:${value}` : value)),\n );\n },\n deserialize(bytes: Uint8Array): any {\n return JSON.parse(new TextDecoder().decode(bytes), (_key, value) =>\n typeof value === \"string\" && value.startsWith(\"__bigint__:\") ? BigInt(value.slice(11)) : value,\n );\n },\n};\n",
|
|
24
|
+
"// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Schema } from \"@query-farm/apache-arrow\";\nimport { inferParamTypes, type SchemaLike, toSchema } from \"./schema.js\";\nimport {\n type ExchangeFn,\n type ExchangeInit,\n type HeaderInit,\n type MethodDefinition,\n MethodType,\n type ProducerFn,\n type ProducerInit,\n type UnaryHandler,\n} from \"./types.js\";\n\nconst EMPTY_SCHEMA = new Schema([]);\n\n/**\n * Fluent builder for defining RPC methods.\n * Register unary, producer, and exchange methods, then pass to `VgiRpcServer`.\n */\nexport class Protocol {\n readonly name: string;\n private _methods: Map<string, MethodDefinition> = new Map();\n\n constructor(name: string) {\n this.name = name;\n }\n\n /**\n * Register a unary (request-response) method.\n * @param name - Method name exposed to clients\n * @param config.params - Parameter schema (SchemaLike)\n * @param config.result - Result schema (SchemaLike)\n * @param config.handler - Async function receiving params and returning result values\n * @param config.doc - Optional documentation string\n * @param config.defaults - Optional default parameter values\n * @param config.paramTypes - Optional parameter type hints (inferred from params if omitted)\n */\n unary(\n name: string,\n config: {\n params: SchemaLike;\n result: SchemaLike;\n handler: UnaryHandler;\n doc?: string;\n defaults?: Record<string, any>;\n paramTypes?: Record<string, string>;\n },\n ): this {\n const params = toSchema(config.params);\n this._methods.set(name, {\n name,\n type: MethodType.UNARY,\n paramsSchema: params,\n resultSchema: toSchema(config.result),\n handler: config.handler,\n doc: config.doc,\n defaults: config.defaults,\n paramTypes: config.paramTypes ?? inferParamTypes(params),\n });\n return this;\n }\n\n /**\n * Register a producer (server-streaming) method.\n * The generic `S` is inferred from the `init` return type and threaded to `produce`.\n */\n producer<S>(\n name: string,\n config: {\n params: SchemaLike;\n outputSchema: SchemaLike;\n init: ProducerInit<S>;\n produce: ProducerFn<S>;\n headerSchema?: SchemaLike;\n headerInit?: HeaderInit;\n doc?: string;\n defaults?: Record<string, any>;\n paramTypes?: Record<string, string>;\n },\n ): this {\n const params = toSchema(config.params);\n this._methods.set(name, {\n name,\n type: MethodType.STREAM,\n paramsSchema: params,\n resultSchema: EMPTY_SCHEMA,\n outputSchema: toSchema(config.outputSchema),\n inputSchema: EMPTY_SCHEMA,\n producerInit: config.init as ProducerInit,\n producerFn: config.produce as ProducerFn,\n headerSchema: config.headerSchema ? toSchema(config.headerSchema) : undefined,\n headerInit: config.headerInit,\n doc: config.doc,\n defaults: config.defaults,\n paramTypes: config.paramTypes ?? inferParamTypes(params),\n });\n return this;\n }\n\n /**\n * Register an exchange (bidirectional-streaming) method.\n * The generic `S` is inferred from the `init` return type and threaded to `exchange`.\n */\n exchange<S>(\n name: string,\n config: {\n params: SchemaLike;\n inputSchema: SchemaLike;\n outputSchema: SchemaLike;\n init: ExchangeInit<S>;\n exchange: ExchangeFn<S>;\n headerSchema?: SchemaLike;\n headerInit?: HeaderInit;\n doc?: string;\n defaults?: Record<string, any>;\n paramTypes?: Record<string, string>;\n },\n ): this {\n const params = toSchema(config.params);\n this._methods.set(name, {\n name,\n type: MethodType.STREAM,\n paramsSchema: params,\n resultSchema: EMPTY_SCHEMA,\n inputSchema: toSchema(config.inputSchema),\n outputSchema: toSchema(config.outputSchema),\n exchangeInit: config.init as ExchangeInit,\n exchangeFn: config.exchange as ExchangeFn,\n headerSchema: config.headerSchema ? toSchema(config.headerSchema) : undefined,\n headerInit: config.headerInit,\n doc: config.doc,\n defaults: config.defaults,\n paramTypes: config.paramTypes ?? inferParamTypes(params),\n });\n return this;\n }\n\n getMethods(): Map<string, MethodDefinition> {\n return new Map(this._methods);\n }\n}\n",
|
|
25
|
+
"// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n Binary,\n Bool,\n DataType,\n Field,\n Float32,\n Float64,\n Int16,\n Int32,\n Int64,\n Schema,\n Utf8,\n} from \"@query-farm/apache-arrow\";\n\n// ---------------------------------------------------------------------------\n// Convenient DataType singletons — re-export so users avoid arrow imports\n// ---------------------------------------------------------------------------\n\n/** Apache Arrow Utf8 type. Use as schema shorthand: `{ name: str }` */\nexport const str = new Utf8();\n/** Apache Arrow Binary type. Use as schema shorthand: `{ data: bytes }` */\nexport const bytes = new Binary();\n/** Apache Arrow Int64 type. Use as schema shorthand: `{ count: int }` */\nexport const int = new Int64();\n/** Apache Arrow Int32 type. Use as schema shorthand: `{ count: int32 }` */\nexport const int32 = new Int32();\n/** Apache Arrow Float64 type. Use as schema shorthand: `{ value: float }` */\nexport const float = new Float64();\n/** Apache Arrow Float32 type. Use as schema shorthand: `{ value: float32 }` */\nexport const float32 = new Float32();\n/** Apache Arrow Bool type. Use as schema shorthand: `{ flag: bool }` */\nexport const bool = new Bool();\n\n// ---------------------------------------------------------------------------\n// SchemaLike — shorthand for declaring schemas\n// ---------------------------------------------------------------------------\n\n/**\n * A schema specification that accepts:\n * - A real `Schema` (passed through)\n * - A record mapping field names to `DataType` instances or `Field` instances\n * - An empty `{}` for an empty schema\n */\nexport type SchemaLike = Schema | Record<string, DataType | Field>;\n\n/**\n * Convert a SchemaLike spec into a real `Schema`.\n *\n * - `Schema` → returned as-is\n * - `Record<string, DataType>` → each entry becomes `new Field(name, type, false)`\n * - `Record<string, Field>` → each entry is passed through\n * - `{}` → `new Schema([])`\n */\nexport function toSchema(spec: SchemaLike): Schema {\n if (spec instanceof Schema) return spec;\n\n const fields: Field[] = [];\n for (const [name, value] of Object.entries(spec)) {\n if (value instanceof Field) {\n fields.push(value);\n } else if (value instanceof DataType) {\n fields.push(new Field(name, value, false));\n } else {\n throw new TypeError(`Invalid schema value for \"${name}\": expected DataType or Field, got ${typeof value}`);\n }\n }\n return new Schema(fields);\n}\n\n// ---------------------------------------------------------------------------\n// inferParamTypes — derive paramTypes from a schema spec\n// ---------------------------------------------------------------------------\n\nconst TYPE_MAP: [new (...args: any[]) => DataType, string][] = [\n [Utf8, \"str\"],\n [Binary, \"bytes\"],\n [Bool, \"bool\"],\n [Float64, \"float\"],\n [Float32, \"float\"],\n [Int64, \"int\"],\n [Int32, \"int\"],\n [Int16, \"int\"],\n];\n\n/**\n * Derive a `paramTypes` record from a SchemaLike spec.\n * Maps common Arrow scalar types to Python-style type strings.\n * Returns `undefined` if any field has a complex type (List, Map_, Dictionary, etc.).\n */\nexport function inferParamTypes(spec: SchemaLike): Record<string, string> | undefined {\n const schema = toSchema(spec);\n if (schema.fields.length === 0) return undefined;\n\n const result: Record<string, string> = {};\n for (const field of schema.fields) {\n let mapped: string | undefined;\n for (const [ctor, name] of TYPE_MAP) {\n if (field.type instanceof ctor) {\n mapped = name;\n break;\n }\n }\n if (!mapped) return undefined;\n result[field.name] = mapped;\n }\n return result;\n}\n",
|
|
26
|
+
"// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Schema } from \"@query-farm/apache-arrow\";\nimport { DESCRIBE_METHOD_NAME } from \"./constants.js\";\nimport { buildDescribeBatch } from \"./dispatch/describe.js\";\nimport { dispatchStream } from \"./dispatch/stream.js\";\nimport { dispatchUnary } from \"./dispatch/unary.js\";\nimport { RpcError, VersionError } from \"./errors.js\";\nimport type { Protocol } from \"./protocol.js\";\nimport { MethodType } from \"./types.js\";\nimport { IpcStreamReader } from \"./wire/reader.js\";\nimport { parseRequest } from \"./wire/request.js\";\nimport { buildErrorBatch } from \"./wire/response.js\";\nimport { IpcStreamWriter } from \"./wire/writer.js\";\n\nconst EMPTY_SCHEMA = new Schema([]);\n\n/**\n * RPC server that reads Arrow IPC requests from stdin and writes responses to stdout.\n * Supports unary and streaming (producer/exchange) methods.\n */\nexport class VgiRpcServer {\n private protocol: Protocol;\n private enableDescribe: boolean;\n private serverId: string;\n private describeBatch: import(\"@query-farm/apache-arrow\").RecordBatch | null = null;\n\n constructor(protocol: Protocol, options?: { enableDescribe?: boolean; serverId?: string }) {\n this.protocol = protocol;\n this.enableDescribe = options?.enableDescribe ?? true;\n this.serverId = options?.serverId ?? crypto.randomUUID().replace(/-/g, \"\").slice(0, 12);\n\n if (this.enableDescribe) {\n const { batch } = buildDescribeBatch(protocol.name, protocol.getMethods(), this.serverId);\n this.describeBatch = batch;\n }\n }\n\n /** Start the server loop. Reads requests until stdin closes. */\n async run(): Promise<void> {\n const stdin = process.stdin as unknown as ReadableStream<Uint8Array>;\n\n // Warn if running interactively\n if (process.stdin.isTTY || process.stdout.isTTY) {\n process.stderr.write(\n \"WARNING: This process communicates via Arrow IPC on stdin/stdout \" +\n \"and is not intended to be run interactively.\\n\" +\n \"It should be launched as a subprocess by an RPC client \" +\n \"(e.g. vgi_rpc.connect()).\\n\",\n );\n }\n\n const reader = await IpcStreamReader.create(stdin);\n const writer = new IpcStreamWriter();\n\n try {\n while (true) {\n await this.serveOne(reader, writer);\n }\n } catch (e: any) {\n // EOF or broken pipe → clean exit\n if (\n e.message?.includes(\"closed\") ||\n e.message?.includes(\"Expected Schema Message\") ||\n e.message?.includes(\"null or length 0\") ||\n e.code === \"EPIPE\" ||\n e.code === \"ERR_STREAM_PREMATURE_CLOSE\" ||\n e.code === \"ERR_STREAM_DESTROYED\" ||\n (e instanceof Error && e.message.includes(\"EOF\"))\n ) {\n return;\n }\n // ArrowInvalid or unexpected error\n throw e;\n } finally {\n await reader.cancel();\n }\n }\n\n private async serveOne(reader: IpcStreamReader, writer: IpcStreamWriter): Promise<void> {\n const stream = await reader.readStream();\n if (!stream) {\n throw new Error(\"EOF\");\n }\n\n const { schema, batches } = stream;\n if (batches.length === 0) {\n const err = new RpcError(\"ProtocolError\", \"Request stream contains no batches\", \"\");\n const errBatch = buildErrorBatch(EMPTY_SCHEMA, err, this.serverId, null);\n writer.writeStream(EMPTY_SCHEMA, [errBatch]);\n return;\n }\n\n const batch = batches[0];\n let methodName: string;\n let params: Record<string, any>;\n let requestId: string | null;\n\n try {\n const parsed = parseRequest(schema, batch);\n methodName = parsed.methodName;\n params = parsed.params;\n requestId = parsed.requestId;\n } catch (e: any) {\n // Write error response for protocol/version errors\n const errBatch = buildErrorBatch(EMPTY_SCHEMA, e, this.serverId, null);\n writer.writeStream(EMPTY_SCHEMA, [errBatch]);\n if (e instanceof VersionError || e instanceof RpcError) {\n return; // Continue serving\n }\n throw e;\n }\n\n // Handle __describe__\n if (methodName === DESCRIBE_METHOD_NAME && this.describeBatch) {\n writer.writeStream(this.describeBatch.schema, [this.describeBatch]);\n return;\n }\n\n // Look up method\n const methods = this.protocol.getMethods();\n const method = methods.get(methodName);\n if (!method) {\n const available = [...methods.keys()].sort();\n const err = new Error(`Unknown method: '${methodName}'. Available methods: [${available.join(\", \")}]`);\n const errBatch = buildErrorBatch(EMPTY_SCHEMA, err, this.serverId, requestId);\n writer.writeStream(EMPTY_SCHEMA, [errBatch]);\n return;\n }\n\n // Dispatch based on method type\n if (method.type === MethodType.UNARY) {\n await dispatchUnary(method, params, writer, this.serverId, requestId);\n } else {\n await dispatchStream(method, params, writer, reader, this.serverId, requestId);\n }\n }\n}\n",
|
|
27
|
+
"// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Schema } from \"@query-farm/apache-arrow\";\nimport type { MethodDefinition } from \"../types.js\";\nimport { OutputCollector } from \"../types.js\";\nimport type { IpcStreamReader } from \"../wire/reader.js\";\nimport { buildErrorBatch, buildResultBatch } from \"../wire/response.js\";\nimport type { IpcStreamWriter } from \"../wire/writer.js\";\n\nconst EMPTY_SCHEMA = new Schema([]);\n\n/**\n * Dispatch a stream RPC call (producer or exchange).\n *\n * Producer streams (empty input schema):\n * - Client sends tick batches (empty schema, 0 rows)\n * - Server reads each tick, calls produce(state, out)\n * - Server writes output batch(es) for each tick\n * - When produce() calls out.finish(), server closes output stream\n *\n * Exchange streams (real input schema):\n * - Client sends data batches\n * - Server reads each batch, calls exchange(state, input, out)\n * - Server writes output batch(es) for each input\n * - Stream ends when client closes input (EOS)\n */\nexport async function dispatchStream(\n method: MethodDefinition,\n params: Record<string, any>,\n writer: IpcStreamWriter,\n reader: IpcStreamReader,\n serverId: string,\n requestId: string | null,\n): Promise<void> {\n const isProducer = !!method.producerFn;\n\n let state: any;\n try {\n if (isProducer) {\n state = await method.producerInit!(params);\n } else {\n state = await method.exchangeInit!(params);\n }\n } catch (error: any) {\n const errSchema = method.headerSchema ?? EMPTY_SCHEMA;\n const errBatch = buildErrorBatch(errSchema, error, serverId, requestId);\n writer.writeStream(errSchema, [errBatch]);\n // Still need to consume the input stream from the client\n const inputSchema = await reader.openNextStream();\n if (inputSchema) {\n while ((await reader.readNextBatch()) !== null) {\n // drain\n }\n }\n return;\n }\n\n // Support dynamic output schemas: init may return state with __outputSchema\n // to override the method's registered output schema (needed for methods\n // like VGI's \"init\" that produce different schemas per invocation).\n const outputSchema = state?.__outputSchema ?? method.outputSchema!;\n\n // Effective producer mode: check state override (VGI \"init\" is registered as\n // exchange but may act as producer depending on the function type).\n const effectiveProducer = state?.__isProducer ?? isProducer;\n\n // Write header IPC stream if method has a header schema\n if (method.headerSchema && method.headerInit) {\n try {\n const headerOut = new OutputCollector(method.headerSchema, true, serverId, requestId);\n const headerValues = method.headerInit(params, state, headerOut);\n const headerBatch = buildResultBatch(method.headerSchema, headerValues, serverId, requestId);\n const headerBatches = [...headerOut.batches.map((b) => b.batch), headerBatch];\n writer.writeStream(method.headerSchema, headerBatches);\n } catch (error: any) {\n const errBatch = buildErrorBatch(method.headerSchema, error, serverId, requestId);\n writer.writeStream(method.headerSchema, [errBatch]);\n // Drain input stream so client doesn't hang\n const inputSchema = await reader.openNextStream();\n if (inputSchema) {\n while ((await reader.readNextBatch()) !== null) {}\n }\n return;\n }\n }\n\n // Open the input IPC stream (ticks or data from client)\n const inputSchema = await reader.openNextStream();\n if (!inputSchema) {\n const errBatch = buildErrorBatch(outputSchema, new Error(\"Expected input stream but got EOF\"), serverId, requestId);\n writer.writeStream(outputSchema, [errBatch]);\n return;\n }\n\n // Use a single continuous IPC stream for all output (matching Python vgi-rpc).\n // DuckDB exchanges are ping-pong: one input batch → one output batch on the\n // same stream. We use IncrementalStream which writes bytes synchronously.\n const stream = writer.openStream(outputSchema);\n\n try {\n while (true) {\n const inputBatch = await reader.readNextBatch();\n if (!inputBatch) break;\n\n const out = new OutputCollector(outputSchema, effectiveProducer, serverId, requestId);\n\n if (isProducer) {\n await method.producerFn!(state, out);\n } else {\n await method.exchangeFn!(state, inputBatch, out);\n }\n\n for (const emitted of out.batches) {\n stream.write(emitted.batch);\n }\n\n if (out.finished) {\n break;\n }\n }\n } catch (error: any) {\n stream.write(buildErrorBatch(outputSchema, error, serverId, requestId));\n }\n\n stream.close();\n\n // Drain remaining input so transport stays synchronized for next request.\n // Matches Python's _drain_stream() called after every streaming method.\n // Needed when the loop exits early (out.finished, error) while client\n // is still sending batches.\n try {\n while ((await reader.readNextBatch()) !== null) {}\n } catch {\n // Suppress errors during drain (broken pipe, etc.)\n }\n}\n",
|
|
28
|
+
"// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { MethodDefinition } from \"../types.js\";\nimport { OutputCollector } from \"../types.js\";\nimport { buildErrorBatch, buildResultBatch } from \"../wire/response.js\";\nimport type { IpcStreamWriter } from \"../wire/writer.js\";\n\n/**\n * Dispatch a unary RPC call.\n * Calls the handler with parsed params, writes result or error batch.\n * Supports client-directed logging via ctx.clientLog().\n */\nexport async function dispatchUnary(\n method: MethodDefinition,\n params: Record<string, any>,\n writer: IpcStreamWriter,\n serverId: string,\n requestId: string | null,\n): Promise<void> {\n const schema = method.resultSchema;\n const out = new OutputCollector(schema, true, serverId, requestId);\n\n try {\n const result = await method.handler!(params, out);\n const resultBatch = buildResultBatch(schema, result, serverId, requestId);\n // Collect log batches (from clientLog) + result batch\n const batches = [...out.batches.map((b) => b.batch), resultBatch];\n writer.writeStream(schema, batches);\n } catch (error: any) {\n const batch = buildErrorBatch(schema, error, serverId, requestId);\n writer.writeStream(schema, [batch]);\n }\n}\n",
|
|
29
|
+
"// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport { writeSync } from \"node:fs\";\nimport { type RecordBatch, RecordBatchStreamWriter, type Schema } from \"@query-farm/apache-arrow\";\n\nconst STDOUT_FD = 1;\n\n/**\n * Write all bytes to a file descriptor, looping on partial writes.\n * Handles EAGAIN (pipe buffer full) by busy-waiting with Atomics.wait().\n * writeSync() can return fewer bytes than requested when the pipe buffer\n * is full (e.g., 64KB limit), and throws EAGAIN on non-blocking fds.\n */\nfunction writeAll(fd: number, data: Uint8Array): void {\n let offset = 0;\n while (offset < data.length) {\n try {\n const written = writeSync(fd, data, offset, data.length - offset);\n if (written <= 0) throw new Error(`writeSync returned ${written}`);\n offset += written;\n } catch (e: any) {\n if (e.code === \"EAGAIN\") {\n // Pipe buffer full — busy-wait briefly then retry\n Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 1);\n continue;\n }\n throw e;\n }\n }\n}\n\n/**\n * Writes sequential IPC streams to a file descriptor (e.g., stdout).\n * Each call to writeStream() writes a complete IPC stream: schema + batches + EOS.\n *\n * All writes use synchronous I/O (writeSync) to avoid deadlocks when\n * interleaving stdout writes with blocking stdin reads.\n */\nexport class IpcStreamWriter {\n private readonly fd: number;\n\n constructor(fd: number = STDOUT_FD) {\n this.fd = fd;\n }\n\n /**\n * Write a complete IPC stream with the given schema and batches.\n * Creates schema message, writes all batches (with their metadata), writes EOS.\n */\n writeStream(schema: Schema, batches: RecordBatch[]): void {\n const writer = new RecordBatchStreamWriter();\n writer.reset(undefined, schema);\n for (const batch of batches) {\n // Use _writeRecordBatch to bypass schema comparison (see IncrementalStream.write)\n (writer as any)._writeRecordBatch(batch);\n }\n writer.close();\n const bytes = writer.toUint8Array(true);\n writeAll(this.fd, bytes);\n }\n\n /**\n * Open an incremental IPC stream for writing batches one at a time.\n * Used for streaming methods where output batches are produced incrementally.\n * Bytes are written synchronously after each batch.\n */\n openStream(schema: Schema): IncrementalStream {\n return new IncrementalStream(this.fd, schema);\n }\n}\n\n/**\n * An open IPC stream that supports incremental batch writes.\n *\n * Uses RecordBatchStreamWriter with internal buffering (no pipe to stdout).\n * After each operation, drains the writer's internal AsyncByteQueue buffer\n * and writes bytes synchronously via writeAll(). This avoids deadlocks\n * caused by Node.js async stream piping when stdin reads block before\n * stdout writes flush through the event loop.\n */\nexport class IncrementalStream {\n private writer: RecordBatchStreamWriter;\n private readonly fd: number;\n private closed = false;\n\n constructor(fd: number, schema: Schema) {\n this.fd = fd;\n this.writer = new RecordBatchStreamWriter();\n // Buffer internally (no sink) — we drain manually via writeAll\n this.writer.reset(undefined, schema);\n this.drain();\n }\n\n /**\n * Write a single batch to the stream. Bytes are flushed synchronously.\n *\n * Uses _writeRecordBatch() directly to bypass the Arrow writer's schema\n * comparison in write(). The public write() method calls compareSchemas()\n * and auto-closes the writer if the batch's schema differs (e.g., in\n * nullability), silently dropping the batch. Since our output schema is\n * set at stream open time and all batches are structurally compatible,\n * we skip the comparison.\n */\n write(batch: RecordBatch): void {\n if (this.closed) throw new Error(\"Stream already closed\");\n (this.writer as any)._writeRecordBatch(batch);\n this.drain();\n }\n\n /**\n * Close the stream (writes EOS marker synchronously).\n */\n close(): void {\n if (this.closed) return;\n this.closed = true;\n // EOS marker: continuation (0xFFFFFFFF) + metadata length (0x00000000)\n const eos = new Uint8Array(new Int32Array([-1, 0]).buffer);\n writeAll(this.fd, eos);\n }\n\n /**\n * Drain buffered bytes from the Arrow writer's internal queue\n * and write them synchronously to the output fd.\n */\n private drain(): void {\n const values = (this.writer as any)._sink._values as Uint8Array[];\n for (const chunk of values) {\n writeAll(this.fd, chunk);\n }\n values.length = 0;\n }\n}\n"
|
|
30
30
|
],
|
|
31
|
-
"mappings": "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",
|
|
32
|
-
"debugId": "
|
|
31
|
+
"mappings": "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",
|
|
32
|
+
"debugId": "E5E571F45BA75F8D64756E2164756E21",
|
|
33
33
|
"names": []
|
|
34
34
|
}
|