@naeemo/capnp 0.7.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpc-connection-CHjKsrMC.js","names":["isNode"],"sources":["../src/debug/config.ts","../src/rpc/four-tables.ts","../src/debug/index.ts","../src/rpc/pipeline.ts","../src/rpc/schema-types.ts","../src/rpc/schema-parser.ts","../src/rpc/schema-serializer.ts","../src/rpc/rpc-connection.ts"],"sourcesContent":["/**\n * Global Debug Configuration for Cap'n Proto TypeScript\n *\n * Provides runtime debug controls and logging configuration.\n */\n\n/**\n * Debug configuration options\n */\nexport interface DebugOptions {\n /** Enable colored output in debug logs */\n colors?: boolean;\n /** Maximum bytes to display when logging binary data */\n maxBytes?: number;\n /** Filter by message type or peer (string or RegExp) */\n filter?: string | RegExp;\n}\n\n/**\n * Internal debug state\n */\ninterface DebugState {\n enabled: boolean;\n options: Required<DebugOptions>;\n}\n\n/**\n * Global debug state\n */\nconst debugState: DebugState = {\n enabled: false,\n options: {\n colors: true,\n maxBytes: 256,\n filter: '',\n },\n};\n\n/**\n * Check if running in Node.js environment\n */\nfunction isNode(): boolean {\n return (\n typeof process !== 'undefined' && process.versions != null && process.versions.node != null\n );\n}\n\n/**\n * Check CAPNP_DEBUG environment variable in Node.js\n */\nfunction checkEnvVar(): boolean {\n if (isNode()) {\n try {\n const envValue = process.env.CAPNP_DEBUG;\n return envValue === '1' || envValue === 'true';\n } catch {\n // Environment access failed, assume false\n return false;\n }\n }\n return false;\n}\n\n// Initialize from environment variable on module load\nif (checkEnvVar()) {\n debugState.enabled = true;\n}\n\n/**\n * Enable debug mode with optional configuration\n *\n * @param options - Debug configuration options\n * @example\n * ```typescript\n * enableDebug({ colors: true, maxBytes: 512 });\n * ```\n */\nexport function enableDebug(options?: DebugOptions): void {\n debugState.enabled = true;\n if (options) {\n debugState.options = {\n ...debugState.options,\n ...options,\n };\n }\n}\n\n/**\n * Disable debug mode\n *\n * @example\n * ```typescript\n * disableDebug();\n * ```\n */\nexport function disableDebug(): void {\n debugState.enabled = false;\n}\n\n/**\n * Check if debug mode is currently enabled\n *\n * @returns True if debug mode is enabled\n * @example\n * ```typescript\n * if (isDebugEnabled()) {\n * console.log('Debug is on');\n * }\n * ```\n */\nexport function isDebugEnabled(): boolean {\n return debugState.enabled;\n}\n\n/**\n * Get current debug options (internal use)\n * @internal\n */\nexport function getDebugOptions(): Readonly<Required<DebugOptions>> {\n return Object.freeze({ ...debugState.options });\n}\n\n/**\n * Check if a message/peer matches the current filter\n * @internal\n */\nexport function matchesFilter(messageType: string, peer?: string): boolean {\n const { filter } = debugState.options;\n\n if (!filter || filter === '') {\n return true;\n }\n\n const target = peer ? `${messageType}:${peer}` : messageType;\n\n if (filter instanceof RegExp) {\n return filter.test(target);\n }\n\n return target.includes(filter);\n}\n\n/**\n * Format bytes for debug output\n * @internal\n */\nexport function formatBytes(data: Uint8Array, maxBytes?: number): string {\n const limit = maxBytes ?? debugState.options.maxBytes;\n const slice = data.length > limit ? data.slice(0, limit) : data;\n const hex = Array.from(slice)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join(' ');\n\n if (data.length > limit) {\n return `${hex}... (${data.length} bytes total)`;\n }\n return hex;\n}\n","/**\n * The Four Tables\n *\n * Cap'n Proto RPC connections maintain four state tables per connection:\n * - Questions: Outbound calls awaiting answers\n * - Answers: Inbound calls being processed\n * - Imports: Capabilities received from remote\n * - Exports: Capabilities sent to remote\n *\n * See: http://www.erights.org/elib/distrib/captp/4tables.html\n */\n\nimport type { AnswerId, ExportId, ImportId, QuestionId, RpcMessage } from './rpc-types.js';\n\n// ========================================================================================\n// Question Table\n// ========================================================================================\n\n/** Entry in the question table (outbound calls) */\nexport interface Question {\n id: QuestionId;\n /** Whether the call has completed */\n isComplete: boolean;\n /** Whether a Finish message has been sent */\n finishSent: boolean;\n /** Promise that resolves when the call completes */\n completionPromise: Promise<unknown>;\n /** Resolve function for the completion promise */\n resolveCompletion: (value: unknown) => void;\n /** Reject function for the completion promise */\n rejectCompletion: (error: Error) => void;\n}\n\n/** Manages the question table for outbound calls */\nexport class QuestionTable {\n private questions = new Map<QuestionId, Question>();\n private nextId = 1;\n\n /** Create a new question entry */\n create(): Question {\n const id = this.allocateId();\n let resolveCompletion: (value: unknown) => void;\n let rejectCompletion: (error: Error) => void;\n\n const completionPromise = new Promise<unknown>((resolve, reject) => {\n resolveCompletion = resolve;\n rejectCompletion = reject;\n });\n\n const question: Question = {\n id,\n isComplete: false,\n finishSent: false,\n completionPromise,\n resolveCompletion: resolveCompletion!,\n rejectCompletion: rejectCompletion!,\n };\n\n this.questions.set(id, question);\n return question;\n }\n\n /** Get a question by ID */\n get(id: QuestionId): Question | undefined {\n return this.questions.get(id);\n }\n\n /** Mark a question as complete */\n complete(id: QuestionId, result: unknown): void {\n const question = this.questions.get(id);\n if (question && !question.isComplete) {\n question.isComplete = true;\n question.resolveCompletion(result);\n }\n }\n\n /** Mark a question as canceled */\n cancel(id: QuestionId, error: Error): void {\n const question = this.questions.get(id);\n if (question && !question.isComplete) {\n question.isComplete = true;\n question.rejectCompletion(error);\n }\n }\n\n /** Mark that Finish has been sent for a question */\n markFinishSent(id: QuestionId): void {\n const question = this.questions.get(id);\n if (question) {\n question.finishSent = true;\n }\n }\n\n /** Remove a question from the table (when both sides are done) */\n remove(id: QuestionId): void {\n const question = this.questions.get(id);\n if (question?.isComplete && question.finishSent) {\n this.questions.delete(id);\n }\n }\n\n /** Clean up all questions (e.g., on disconnect) */\n clear(): void {\n for (const question of this.questions.values()) {\n if (!question.isComplete) {\n question.rejectCompletion(new Error('Connection closed'));\n }\n }\n this.questions.clear();\n this.nextId = 1;\n }\n\n private allocateId(): QuestionId {\n // Simple allocation - in production, reuse freed IDs\n return this.nextId++;\n }\n}\n\n// ========================================================================================\n// Answer Table\n// ========================================================================================\n\n/** Entry in the answer table (inbound calls) */\nexport interface Answer {\n id: AnswerId;\n /** Whether the call has completed */\n isComplete: boolean;\n /** Whether a Return message has been sent */\n returnSent: boolean;\n /** Whether a Finish message has been received */\n finishReceived: boolean;\n /** The result of the call (if complete) */\n result?: unknown;\n}\n\n/** Manages the answer table for inbound calls */\nexport class AnswerTable {\n private answers = new Map<AnswerId, Answer>();\n\n /** Create a new answer entry */\n create(id: AnswerId): Answer {\n const answer: Answer = {\n id,\n isComplete: false,\n returnSent: false,\n finishReceived: false,\n };\n this.answers.set(id, answer);\n return answer;\n }\n\n /** Get an answer by ID */\n get(id: AnswerId): Answer | undefined {\n return this.answers.get(id);\n }\n\n /** Mark that Return has been sent */\n markReturnSent(id: AnswerId): void {\n const answer = this.answers.get(id);\n if (answer) {\n answer.returnSent = true;\n }\n }\n\n /** Mark that Finish has been received */\n markFinishReceived(id: AnswerId): void {\n const answer = this.answers.get(id);\n if (answer) {\n answer.finishReceived = true;\n }\n }\n\n /** Remove an answer from the table (when both sides are done) */\n remove(id: AnswerId): void {\n const answer = this.answers.get(id);\n if (answer?.returnSent && answer.finishReceived) {\n this.answers.delete(id);\n }\n }\n\n /** Clean up all answers (e.g., on disconnect) */\n clear(): void {\n this.answers.clear();\n }\n}\n\n// ========================================================================================\n// Import Table\n// ========================================================================================\n\n/** Entry in the import table (capabilities from remote) */\nexport interface Import {\n id: ImportId;\n /** Reference count */\n refCount: number;\n /** Whether this is a promise (not yet resolved) */\n isPromise: boolean;\n}\n\n/** Manages the import table for capabilities received from remote */\nexport class ImportTable {\n private imports = new Map<ImportId, Import>();\n\n /** Add a new import */\n add(id: ImportId, isPromise: boolean): Import {\n const importEntry: Import = {\n id,\n refCount: 1,\n isPromise,\n };\n this.imports.set(id, importEntry);\n return importEntry;\n }\n\n /** Get an import by ID */\n get(id: ImportId): Import | undefined {\n return this.imports.get(id);\n }\n\n /** Increment reference count */\n addRef(id: ImportId): void {\n const importEntry = this.imports.get(id);\n if (importEntry) {\n importEntry.refCount++;\n }\n }\n\n /** Decrement reference count, returns true if refCount reached 0 */\n release(id: ImportId, count: number): boolean {\n const importEntry = this.imports.get(id);\n if (importEntry) {\n importEntry.refCount -= count;\n if (importEntry.refCount <= 0) {\n this.imports.delete(id);\n return true;\n }\n }\n return false;\n }\n\n /** Mark a promise as resolved */\n markResolved(id: ImportId): void {\n const importEntry = this.imports.get(id);\n if (importEntry) {\n importEntry.isPromise = false;\n }\n }\n\n /** Clean up all imports (e.g., on disconnect) */\n clear(): void {\n this.imports.clear();\n }\n}\n\n// ========================================================================================\n// Export Table\n// ========================================================================================\n\n/** Entry in the export table (capabilities sent to remote) */\nexport interface Export {\n id: ExportId;\n /** Reference count */\n refCount: number;\n /** Whether this is a promise (not yet resolved) */\n isPromise: boolean;\n /** The actual capability object */\n capability: unknown;\n}\n\n/** Manages the export table for capabilities sent to remote */\nexport class ExportTable {\n private exports = new Map<ExportId, Export>();\n private nextId = 1;\n\n /** Add a new export */\n add(capability: unknown, isPromise: boolean): Export {\n const id = this.allocateId();\n const exportEntry: Export = {\n id,\n refCount: 1,\n isPromise,\n capability,\n };\n this.exports.set(id, exportEntry);\n return exportEntry;\n }\n\n /** Get an export by ID */\n get(id: ExportId): Export | undefined {\n return this.exports.get(id);\n }\n\n /** Increment reference count */\n addRef(id: ExportId): void {\n const exportEntry = this.exports.get(id);\n if (exportEntry) {\n exportEntry.refCount++;\n }\n }\n\n /** Decrement reference count, returns true if refCount reached 0 */\n release(id: ExportId, count: number): boolean {\n const exportEntry = this.exports.get(id);\n if (exportEntry) {\n exportEntry.refCount -= count;\n if (exportEntry.refCount <= 0) {\n this.exports.delete(id);\n return true;\n }\n }\n return false;\n }\n\n /** Mark a promise as resolved */\n markResolved(id: ExportId): void {\n const exportEntry = this.exports.get(id);\n if (exportEntry) {\n exportEntry.isPromise = false;\n }\n }\n\n /** Clean up all exports (e.g., on disconnect) */\n clear(): void {\n this.exports.clear();\n this.nextId = 1;\n }\n\n private allocateId(): ExportId {\n // Simple allocation - in production, reuse freed IDs\n return this.nextId++;\n }\n}\n","/**\n * Debug/Trace module for Cap'n Proto RPC\n * Provides formatted logging of binary messages with hexdump-style output\n */\n\n/**\n * Configuration options for debug logging\n */\nexport interface DebugConfig {\n /** Whether debugging is enabled */\n enabled: boolean;\n /** Whether to use colors in output */\n colors: boolean;\n /** Maximum number of bytes to log per message */\n maxBytesToLog: number;\n}\n\n/**\n * Default configuration for debug logging\n */\nconst DEFAULT_CONFIG: DebugConfig = {\n enabled: false,\n colors: true,\n maxBytesToLog: 1024,\n};\n\n/**\n * ANSI color codes for Node.js output\n */\nconst ANSI_COLORS = {\n reset: '\\x1b[0m',\n bright: '\\x1b[1m',\n dim: '\\x1b[2m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m',\n white: '\\x1b[37m',\n gray: '\\x1b[90m',\n};\n\n/**\n * CSS styles for browser console output\n */\nconst BROWSER_STYLES = {\n header: 'color: #6c757d; font-weight: bold;',\n send: 'color: #28a745; font-weight: bold;',\n recv: 'color: #007bff; font-weight: bold;',\n hex: 'color: #6c757d;',\n ascii: 'color: #495057;',\n arrow: 'color: #6c757d;',\n parsed: 'color: #17a2b8;',\n};\n\n/**\n * Check if running in Node.js environment\n */\nfunction isNode(): boolean {\n return (\n typeof process !== 'undefined' && process.versions != null && process.versions.node != null\n );\n}\n\n/**\n * Format a byte as two-digit hex string\n */\nfunction byteToHex(byte: number): string {\n return byte.toString(16).padStart(2, '0');\n}\n\n/**\n * Check if a byte is printable ASCII\n */\nfunction isPrintable(byte: number): boolean {\n return byte >= 32 && byte < 127;\n}\n\n/**\n * Format binary data as hex + ASCII (like hexdump -C)\n *\n * Output format:\n * 00000000: 00 00 00 00 02 00 00 00 │........│\n *\n * @param data - The binary data to format\n * @param maxBytes - Maximum number of bytes to format\n * @param useColors - Whether to include ANSI colors\n * @returns Array of formatted lines\n */\nexport function formatHexDump(data: Uint8Array, maxBytes = 1024, useColors = false): string[] {\n const lines: string[] = [];\n const bytesToFormat = Math.min(data.length, maxBytes);\n const bytesPerLine = 16;\n\n for (let offset = 0; offset < bytesToFormat; offset += bytesPerLine) {\n const chunk = data.slice(offset, Math.min(offset + bytesPerLine, bytesToFormat));\n\n // Address prefix\n let line = `${byteToHex((offset >> 24) & 0xff)}${byteToHex((offset >> 16) & 0xff)}${byteToHex((offset >> 8) & 0xff)}${byteToHex(offset & 0xff)}: `;\n\n // Hex bytes\n const hexParts: string[] = [];\n for (let i = 0; i < bytesPerLine; i++) {\n if (i < chunk.length) {\n hexParts.push(byteToHex(chunk[i]));\n } else {\n hexParts.push(' ');\n }\n // Add extra space after 8 bytes for readability\n if (i === 7) {\n hexParts.push('');\n }\n }\n line += hexParts.join(' ');\n\n // ASCII representation with delimiter\n let ascii = ' │';\n for (let i = 0; i < chunk.length; i++) {\n ascii += isPrintable(chunk[i]) ? String.fromCharCode(chunk[i]) : '.';\n }\n ascii += '│';\n\n line += ascii;\n\n // Add ANSI colors if enabled (dim the hex/ascii parts)\n if (useColors && isNode()) {\n // Find where hex starts (after address)\n const hexStart = line.indexOf(':') + 2;\n const delimiterIndex = line.indexOf('│');\n const hexPart = line.slice(hexStart, delimiterIndex);\n const asciiPart = line.slice(delimiterIndex);\n line =\n line.slice(0, hexStart) +\n ANSI_COLORS.gray +\n hexPart +\n ANSI_COLORS.reset +\n ANSI_COLORS.dim +\n asciiPart +\n ANSI_COLORS.reset;\n }\n\n lines.push(line);\n }\n\n // Add truncation indicator if data was truncated\n if (data.length > maxBytes) {\n const remaining = data.length - maxBytes;\n lines.push(`... (${remaining} more bytes)`);\n }\n\n return lines;\n}\n\n/**\n * Debug logger for Cap'n Proto RPC messages\n */\nexport class DebugLogger {\n private config: DebugConfig;\n\n /**\n * Create a new DebugLogger instance\n * @param config - Partial configuration to override defaults\n */\n constructor(config: Partial<DebugConfig> = {}) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Update the logger configuration\n * @param config - Partial configuration to merge\n */\n setConfig(config: Partial<DebugConfig>): void {\n this.config = { ...this.config, ...config };\n }\n\n /**\n * Get current configuration\n */\n getConfig(): DebugConfig {\n return { ...this.config };\n }\n\n /**\n * Check if debugging is enabled\n */\n isEnabled(): boolean {\n return this.config.enabled;\n }\n\n /**\n * Enable debug logging\n */\n enable(): void {\n this.config.enabled = true;\n }\n\n /**\n * Disable debug logging\n */\n disable(): void {\n this.config.enabled = false;\n }\n\n /**\n * Format the header for a log message\n * @param direction - 'send' or 'recv'\n * @param byteLength - Number of bytes\n * @returns Formatted header string\n */\n private formatHeader(direction: 'send' | 'recv', byteLength: number): string {\n const prefix = direction === 'send' ? 'CAPNP:SEND' : 'CAPNP:RECV';\n const _directionStr = direction === 'send' ? 'SEND' : 'RECV';\n\n if (isNode() && this.config.colors) {\n const color = direction === 'send' ? ANSI_COLORS.green : ANSI_COLORS.blue;\n return `${color}[${prefix}]${ANSI_COLORS.reset} ${byteLength} bytes`;\n }\n\n return `[${prefix}] ${byteLength} bytes`;\n }\n\n /**\n * Log a Cap'n Proto message\n *\n * Output format:\n * [CAPNP:SEND] 64 bytes\n * 00000000: 00 00 00 00 02 00 00 00 │........│\n * → { messageType: 'Bootstrap', ... }\n *\n * @param direction - 'send' for outgoing, 'recv' for incoming\n * @param data - The raw binary message data\n * @param parsed - Optional parsed message object to display\n */\n logMessage(direction: 'send' | 'recv', data: Uint8Array, parsed?: object): void {\n if (!this.config.enabled) {\n return;\n }\n\n const isNodeEnv = isNode();\n const useColors = this.config.colors;\n\n // Format and log header\n const header = this.formatHeader(direction, data.length);\n\n // Format hex dump\n const hexLines = formatHexDump(data, this.config.maxBytesToLog, useColors);\n\n if (isNodeEnv) {\n // Node.js output with ANSI colors\n console.log(header);\n for (const line of hexLines) {\n console.log(line);\n }\n\n if (parsed !== undefined) {\n const arrow = useColors ? `${ANSI_COLORS.gray}→${ANSI_COLORS.reset}` : '→';\n const parsedStr = JSON.stringify(parsed, null, 2);\n const coloredParsed = useColors\n ? `${ANSI_COLORS.cyan}${parsedStr}${ANSI_COLORS.reset}`\n : parsedStr;\n console.log(`${arrow} ${coloredParsed}`);\n }\n } else {\n // Browser output with CSS\n if (useColors) {\n const style = direction === 'send' ? BROWSER_STYLES.send : BROWSER_STYLES.recv;\n console.log(\n `%c[CAPNP:${direction.toUpperCase()}]%c ${data.length} bytes`,\n style,\n 'color: inherit;'\n );\n\n for (const line of hexLines) {\n console.log(`%c${line}`, BROWSER_STYLES.hex);\n }\n\n if (parsed !== undefined) {\n console.log('%c→%c %o', BROWSER_STYLES.arrow, BROWSER_STYLES.parsed, parsed);\n }\n } else {\n console.log(header);\n for (const line of hexLines) {\n console.log(line);\n }\n if (parsed !== undefined) {\n console.log('→', parsed);\n }\n }\n }\n }\n\n /**\n * Log a generic debug message (only if enabled)\n * @param message - Message to log\n * @param args - Additional arguments\n */\n log(message: string, ...args: unknown[]): void {\n if (!this.config.enabled) {\n return;\n }\n\n if (isNode() && this.config.colors) {\n console.log(`${ANSI_COLORS.gray}[CAPNP:DEBUG]${ANSI_COLORS.reset} ${message}`, ...args);\n } else {\n console.log(`[CAPNP:DEBUG] ${message}`, ...args);\n }\n }\n\n /**\n * Log an error message (always shown if debug is enabled)\n * @param message - Error message\n * @param error - Optional error object\n */\n error(message: string, error?: unknown): void {\n if (!this.config.enabled) {\n return;\n }\n\n if (isNode() && this.config.colors) {\n console.error(`${ANSI_COLORS.red}[CAPNP:ERROR]${ANSI_COLORS.reset} ${message}`, error ?? '');\n } else {\n console.error(`[CAPNP:ERROR] ${message}`, error ?? '');\n }\n }\n}\n\n/**\n * Create a default debug logger instance\n * @param config - Optional configuration\n * @returns DebugLogger instance\n */\nexport function createDebugLogger(config?: Partial<DebugConfig>): DebugLogger {\n return new DebugLogger(config);\n}\n\n/**\n * Global debug logger instance for convenience\n */\nexport const debug = new DebugLogger();\n\n// Export default for convenience\nexport default DebugLogger;\n","/**\n * Promise Pipelining Implementation\n *\n * Phase 2: Level 1 RPC Feature\n *\n * Promise Pipelining allows making calls on results that haven't arrived yet,\n * dramatically reducing latency in distributed systems.\n *\n * Key concepts:\n * - PipelineClient: A proxy that represents a promised answer\n * - PipelineOp: Operations to transform the promised answer (field access)\n * - Queued calls: Calls made on pipeline clients before the answer arrives\n */\n\nimport type { RpcConnection } from './rpc-connection.js';\nimport type {\n Call,\n ImportId,\n InterfaceId,\n MethodId,\n Payload,\n PromisedAnswer,\n PromisedAnswerOp,\n QuestionId,\n} from './rpc-types.js';\n\n// ========================================================================================\n// PipelineOp - Operations on promised answers\n// ========================================================================================\n\n/**\n * Tracks a chain of operations to apply to a promised answer.\n * This forms the \"transform\" field in PromisedAnswer.\n */\nexport class PipelineOpTracker {\n private ops: PromisedAnswerOp[] = [];\n\n /**\n * Add a no-op (use the result as-is)\n */\n addNoop(): void {\n this.ops.push({ type: 'noop' });\n }\n\n /**\n * Add a pointer field access operation\n */\n addGetPointerField(fieldIndex: number): void {\n this.ops.push({ type: 'getPointerField', fieldIndex });\n }\n\n /**\n * Get the current transform chain\n */\n getTransform(): PromisedAnswerOp[] {\n return [...this.ops];\n }\n\n /**\n * Clone this tracker (for creating derived pipelines)\n */\n clone(): PipelineOpTracker {\n const cloned = new PipelineOpTracker();\n cloned.ops = [...this.ops];\n return cloned;\n }\n}\n\n// ========================================================================================\n// PipelineClient - Proxy for promised answers\n// ========================================================================================\n\n/**\n * Symbol used to identify pipeline clients internally\n */\nexport const PIPELINE_CLIENT_SYMBOL = Symbol('PipelineClient');\n\n/**\n * Interface for pipeline client capabilities\n */\nexport interface PipelineClient {\n readonly [PIPELINE_CLIENT_SYMBOL]: true;\n readonly connection: RpcConnection;\n readonly questionId: QuestionId;\n readonly opTracker: PipelineOpTracker;\n\n /**\n * Make a pipelined call on this promised answer\n */\n call(interfaceId: InterfaceId, methodId: MethodId, params: Payload): Promise<unknown>;\n\n /**\n * Get a pipeline client for a field of this promised answer\n */\n getPointerField(fieldIndex: number): PipelineClient;\n}\n\n/**\n * Options for creating a PipelineClient\n */\nexport interface PipelineClientOptions {\n connection: RpcConnection;\n questionId: QuestionId;\n opTracker?: PipelineOpTracker;\n}\n\n/**\n * Creates a PipelineClient using JavaScript Proxy.\n * The proxy intercepts property accesses to build up the transform chain.\n */\nexport function createPipelineClient(options: PipelineClientOptions): PipelineClient {\n const { connection, questionId, opTracker = new PipelineOpTracker() } = options;\n\n // The base pipeline client object\n const baseClient: PipelineClient = {\n [PIPELINE_CLIENT_SYMBOL]: true,\n connection,\n questionId,\n opTracker,\n\n call(interfaceId: InterfaceId, methodId: MethodId, params: Payload): Promise<unknown> {\n return makePipelinedCall(\n connection,\n questionId,\n opTracker.getTransform(),\n interfaceId,\n methodId,\n params\n );\n },\n\n getPointerField(fieldIndex: number): PipelineClient {\n const newTracker = opTracker.clone();\n newTracker.addGetPointerField(fieldIndex);\n return createPipelineClient({\n connection,\n questionId,\n opTracker: newTracker,\n });\n },\n };\n\n return baseClient;\n}\n\n/**\n * Check if a value is a PipelineClient\n */\nexport function isPipelineClient(value: unknown): value is PipelineClient {\n return typeof value === 'object' && value !== null && PIPELINE_CLIENT_SYMBOL in value;\n}\n\n// ========================================================================================\n// Pipelined Call Implementation\n// ========================================================================================\n\n/**\n * Makes a call on a promised answer (pipeline call).\n * This sends a Call message with target.type = 'promisedAnswer'.\n */\nasync function makePipelinedCall(\n connection: RpcConnection,\n questionId: QuestionId,\n transform: PromisedAnswerOp[],\n interfaceId: InterfaceId,\n methodId: MethodId,\n params: Payload\n): Promise<unknown> {\n // Create a new question for this pipelined call\n const newQuestionId = connection.createQuestion();\n\n const call: Call = {\n questionId: newQuestionId,\n target: {\n type: 'promisedAnswer',\n promisedAnswer: {\n questionId,\n transform,\n },\n },\n interfaceId,\n methodId,\n allowThirdPartyTailCall: false,\n noPromisePipelining: false,\n onlyPromisePipeline: false,\n params,\n sendResultsTo: { type: 'caller' },\n };\n\n await connection.sendCall(call);\n\n // Return a promise that resolves when the answer arrives\n return connection.waitForAnswer(newQuestionId);\n}\n\n// ========================================================================================\n// Queued Calls Management\n// ========================================================================================\n\n/**\n * Represents a queued call waiting for a promise to resolve\n */\nexport interface QueuedCall {\n interfaceId: InterfaceId;\n methodId: MethodId;\n params: Payload;\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n}\n\n/**\n * Manages calls that were made on a pipeline client before the answer arrived.\n * When the answer arrives, these calls are dispatched to the actual capability.\n */\nexport class QueuedCallManager {\n private queuedCalls = new Map<QuestionId, QueuedCall[]>();\n\n /**\n * Queue a call for when the promise resolves\n */\n queueCall(questionId: QuestionId, call: QueuedCall): void {\n const calls = this.queuedCalls.get(questionId) ?? [];\n calls.push(call);\n this.queuedCalls.set(questionId, calls);\n }\n\n /**\n * Get and clear all queued calls for a question\n */\n dequeueCalls(questionId: QuestionId): QueuedCall[] {\n const calls = this.queuedCalls.get(questionId) ?? [];\n this.queuedCalls.delete(questionId);\n return calls;\n }\n\n /**\n * Check if there are queued calls for a question\n */\n hasQueuedCalls(questionId: QuestionId): boolean {\n return (this.queuedCalls.get(questionId)?.length ?? 0) > 0;\n }\n\n /**\n * Clear all queued calls (e.g., on disconnect)\n */\n clear(): void {\n // Reject all pending calls\n for (const calls of this.queuedCalls.values()) {\n for (const call of calls) {\n call.reject(new Error('Connection closed'));\n }\n }\n this.queuedCalls.clear();\n }\n}\n\n// ========================================================================================\n// Capability Resolution\n// ========================================================================================\n\n/**\n * Represents a resolved capability (either a real capability or an error)\n */\nexport type ResolvedCapability =\n | { type: 'capability'; importId: ImportId }\n | { type: 'exception'; reason: string };\n\n/**\n * Tracks pending pipeline resolutions\n */\nexport class PipelineResolutionTracker {\n private pendingResolutions = new Map<QuestionId, ResolvedCapability>();\n\n /**\n * Mark a question as resolved to a capability\n */\n resolveToCapability(questionId: QuestionId, importId: ImportId): void {\n this.pendingResolutions.set(questionId, { type: 'capability', importId });\n }\n\n /**\n * Mark a question as resolved to an exception\n */\n resolveToException(questionId: QuestionId, reason: string): void {\n this.pendingResolutions.set(questionId, { type: 'exception', reason });\n }\n\n /**\n * Get the resolution for a question (if available)\n */\n getResolution(questionId: QuestionId): ResolvedCapability | undefined {\n return this.pendingResolutions.get(questionId);\n }\n\n /**\n * Check if a question has been resolved\n */\n isResolved(questionId: QuestionId): boolean {\n return this.pendingResolutions.has(questionId);\n }\n\n /**\n * Remove a resolution entry\n */\n remove(questionId: QuestionId): void {\n this.pendingResolutions.delete(questionId);\n }\n\n /**\n * Clear all resolutions\n */\n clear(): void {\n this.pendingResolutions.clear();\n }\n}\n","/**\n * Phase 7: Dynamic Schema Transfer Protocol - Type Definitions\n *\n * This module provides TypeScript types for the Dynamic Schema extension\n * to the Cap'n Proto RPC protocol.\n */\n\nimport type { Exception, MessageTarget, Payload } from './rpc-types';\n\n/**\n * Question ID for schema requests\n */\nexport type SchemaQuestionId = number;\n\n/**\n * Answer ID for schema responses\n */\nexport type SchemaAnswerId = number;\n\n/**\n * Schema request message - sent to fetch schema information from remote vat\n */\nexport interface SchemaRequest {\n /** Question ID identifying this request */\n questionId: SchemaQuestionId;\n\n /** Specifies which schema(s) to fetch */\n targetSchema: SchemaTarget;\n}\n\n/**\n * Schema target - specifies what schema information is being requested\n */\nexport type SchemaTarget =\n | { type: 'allSchemas' }\n | { type: 'byTypeId'; typeId: bigint }\n | { type: 'byTypeName'; typeName: string }\n | { type: 'byFileId'; fileId: bigint }\n | { type: 'byFileName'; fileName: string }\n | { type: 'bootstrapInterface' };\n\n/**\n * Schema response message - contains requested schema information or error\n */\nexport interface SchemaResponse {\n /** Answer ID corresponding to the SchemaRequest */\n answerId: SchemaAnswerId;\n\n /** Response result */\n result: SchemaResponseResult;\n}\n\n/**\n * Schema response result variants\n */\nexport type SchemaResponseResult =\n | { type: 'success'; payload: SchemaPayload }\n | { type: 'exception'; exception: Exception };\n\n/**\n * Schema payload containing serialized schema information\n */\nexport interface SchemaPayload {\n /** Serialized schema nodes in Cap'n Proto binary format */\n schemaData: Uint8Array;\n\n /** Format of the schema data */\n format: SchemaFormat;\n\n /** Optional source information (doc comments, source locations) */\n sourceInfo?: Uint8Array;\n\n /** List of imported schemas needed to understand the returned schema */\n dependencies: SchemaDependency[];\n}\n\n/**\n * Supported schema serialization formats\n */\nexport enum SchemaFormat {\n /** Standard Cap'n Proto binary format (schema.capnp structs) */\n BINARY = 0,\n\n /** JSON representation of the schema */\n JSON = 1,\n\n /** Cap'n Proto schema language text format */\n CAPNP = 2,\n}\n\n/**\n * Schema dependency information\n */\nexport interface SchemaDependency {\n /** ID of the imported file */\n fileId: bigint;\n\n /** Name/path of the imported file */\n fileName: string;\n\n /** Optional hash of schema content for caching/versioning */\n schemaHash?: Uint8Array;\n}\n\n/**\n * Available schema information (for schema listing)\n */\nexport interface AvailableSchema {\n /** Type ID */\n typeId: bigint;\n\n /** Display name */\n displayName: string;\n\n /** File ID */\n fileId: bigint;\n\n /** File name */\n fileName: string;\n\n /** Type flags */\n isInterface: boolean;\n isStruct: boolean;\n isEnum: boolean;\n}\n\n/**\n * Schema capability interface - for dedicated schema providers\n */\nexport interface SchemaCapability {\n /**\n * Fetch schema information\n */\n getSchema(params: GetSchemaParams): Promise<GetSchemaResults>;\n\n /**\n * List all available schemas\n */\n listAvailableSchemas(): Promise<ListSchemasResults>;\n}\n\n/**\n * Parameters for getSchema call\n */\nexport interface GetSchemaParams {\n /** Schema target specification */\n target: SchemaTarget;\n\n /** Desired format (defaults to binary) */\n format?: SchemaFormat;\n}\n\n/**\n * Results from getSchema call\n */\nexport interface GetSchemaResults {\n /** Schema payload */\n payload: SchemaPayload;\n}\n\n/**\n * Results from listAvailableSchemas call\n */\nexport interface ListSchemasResults {\n /** List of available schemas */\n schemas: AvailableSchema[];\n}\n\n/**\n * Schema node types (mirroring schema.capnp Node union)\n */\nexport enum SchemaNodeType {\n FILE = 0,\n STRUCT = 1,\n ENUM = 2,\n INTERFACE = 3,\n CONST = 4,\n ANNOTATION = 5,\n}\n\n/**\n * Type reference (mirroring schema.capnp Type)\n */\nexport interface SchemaType {\n kind: SchemaTypeKind;\n}\n\nexport type SchemaTypeKind =\n | { type: 'void' }\n | { type: 'bool' }\n | { type: 'int8' }\n | { type: 'int16' }\n | { type: 'int32' }\n | { type: 'int64' }\n | { type: 'uint8' }\n | { type: 'uint16' }\n | { type: 'uint32' }\n | { type: 'uint64' }\n | { type: 'float32' }\n | { type: 'float64' }\n | { type: 'text' }\n | { type: 'data' }\n | { type: 'list'; elementType: SchemaType }\n | { type: 'enum'; typeId: bigint; brand?: SchemaBrand }\n | { type: 'struct'; typeId: bigint; brand?: SchemaBrand }\n | { type: 'interface'; typeId: bigint; brand?: SchemaBrand }\n | { type: 'anyPointer'; constraint?: AnyPointerConstraint };\n\nexport type AnyPointerConstraint =\n | { type: 'unconstrained'; kind: 'anyKind' | 'struct' | 'list' | 'capability' }\n | { type: 'parameter'; scopeId: bigint; parameterIndex: number }\n | { type: 'implicitMethodParameter'; parameterIndex: number };\n\n/**\n * Brand for generic type parameters\n */\nexport interface SchemaBrand {\n scopes: SchemaBrandScope[];\n}\n\nexport interface SchemaBrandScope {\n scopeId: bigint;\n bindings: SchemaBrandBinding[];\n}\n\nexport type SchemaBrandBinding = { type: 'unbound' } | { type: 'type'; value: SchemaType };\n\n/**\n * Field definition (mirroring schema.capnp Field)\n */\nexport interface SchemaField {\n name: string;\n codeOrder: number;\n discriminantValue: number;\n offset: number;\n type: SchemaType;\n defaultValue?: SchemaValue;\n hadExplicitDefault: boolean;\n}\n\n/**\n * Value representation (mirroring schema.capnp Value)\n */\nexport type SchemaValue =\n | { type: 'void' }\n | { type: 'bool'; value: boolean }\n | { type: 'int8'; value: number }\n | { type: 'int16'; value: number }\n | { type: 'int32'; value: number }\n | { type: 'int64'; value: bigint }\n | { type: 'uint8'; value: number }\n | { type: 'uint16'; value: number }\n | { type: 'uint32'; value: number }\n | { type: 'uint64'; value: bigint }\n | { type: 'float32'; value: number }\n | { type: 'float64'; value: number }\n | { type: 'text'; value: string }\n | { type: 'data'; value: Uint8Array }\n | { type: 'list'; value: unknown }\n | { type: 'enum'; value: number }\n | { type: 'struct'; value: unknown }\n | { type: 'interface' }\n | { type: 'anyPointer'; value: unknown };\n\n/**\n * Method definition (mirroring schema.capnp Method)\n */\nexport interface SchemaMethod {\n name: string;\n codeOrder: number;\n paramStructType: bigint;\n resultStructType: bigint;\n annotations: SchemaAnnotation[];\n}\n\n/**\n * Annotation definition\n */\nexport interface SchemaAnnotation {\n id: bigint;\n value: SchemaValue;\n brand?: SchemaBrand;\n}\n\n/**\n * Parsed schema node\n */\nexport interface SchemaNode {\n id: bigint;\n displayName: string;\n displayNamePrefixLength: number;\n scopeId: bigint;\n nestedNodes: Array<{ name: string; id: bigint }>;\n annotations: SchemaAnnotation[];\n type: SchemaNodeType;\n\n // Type-specific fields\n structInfo?: {\n dataWordCount: number;\n pointerCount: number;\n preferredListEncoding: number;\n isGroup: boolean;\n discriminantCount: number;\n discriminantOffset: number;\n fields: SchemaField[];\n };\n\n enumInfo?: {\n enumerants: Array<{ name: string; codeOrder: number; annotations: SchemaAnnotation[] }>;\n };\n\n interfaceInfo?: {\n methods: SchemaMethod[];\n superclasses: Array<{ id: bigint; brand: SchemaBrand }>;\n };\n\n constInfo?: {\n type: SchemaType;\n value: SchemaValue;\n };\n\n annotationInfo?: {\n type: SchemaType;\n targetsFile: boolean;\n targetsConst: boolean;\n targetsEnum: boolean;\n targetsEnumerant: boolean;\n targetsStruct: boolean;\n targetsField: boolean;\n targetsUnion: boolean;\n targetsGroup: boolean;\n targetsInterface: boolean;\n targetsMethod: boolean;\n targetsParam: boolean;\n targetsAnnotation: boolean;\n };\n}\n\n/**\n * Schema registry interface for managing parsed schemas\n */\nexport interface SchemaRegistry {\n /**\n * Register a schema node\n */\n registerNode(node: SchemaNode): void;\n\n /**\n * Get a schema node by ID\n */\n getNode(id: bigint): SchemaNode | undefined;\n\n /**\n * Get a schema node by fully qualified name\n */\n getNodeByName(name: string): SchemaNode | undefined;\n\n /**\n * Get all nodes in a file\n */\n getNodesByFile(fileId: bigint): SchemaNode[];\n\n /**\n * Check if a node exists\n */\n hasNode(id: bigint): boolean;\n\n /**\n * Clear all registered schemas\n */\n clear(): void;\n}\n\n/**\n * Dynamic schema loader interface\n */\nexport interface DynamicSchemaLoader {\n /**\n * Load schema from remote vat\n */\n loadSchema(target: SchemaTarget): Promise<SchemaPayload>;\n\n /**\n * Parse binary schema data into SchemaNode objects\n */\n parseSchema(data: Uint8Array): SchemaNode[];\n\n /**\n * Get the schema registry\n */\n getRegistry(): SchemaRegistry;\n}\n","/**\n * Phase 7: Dynamic Schema Transfer Protocol - Schema Parser\n *\n * This module provides runtime parsing of Cap'n Proto schema binary data,\n * allowing dynamic generation of readers/writers for types not known at compile time.\n */\n\nimport type {\n SchemaAnnotation,\n SchemaBrand,\n SchemaBrandBinding,\n SchemaBrandScope,\n SchemaField,\n SchemaMethod,\n SchemaNode,\n SchemaType,\n SchemaTypeKind,\n SchemaValue,\n} from './schema-types.js';\nimport { SchemaNodeType } from './schema-types.js';\n\n/**\n * Parse schema binary data into SchemaNode objects\n *\n * This parses the CodeGeneratorRequest format from schema.capnp\n */\nexport function parseSchemaNodes(data: Uint8Array): SchemaNode[] {\n const parser = new SchemaParser(data);\n return parser.parse();\n}\n\n/**\n * Schema parser class\n */\nclass SchemaParser {\n private data: Uint8Array;\n private view: DataView;\n private textDecoder = new TextDecoder();\n\n constructor(data: Uint8Array) {\n this.data = data;\n this.view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n }\n\n /**\n * Parse the schema data and return all nodes\n */\n parse(): SchemaNode[] {\n // Parse the CodeGeneratorRequest structure\n // See schema.capnp for the exact layout\n\n const nodes: SchemaNode[] = [];\n\n // Handle empty data\n if (this.data.length < 8) {\n return nodes;\n }\n\n // CodeGeneratorRequest layout:\n // - capnpVersion: CapnpVersion (4 bytes)\n // - nodes: List(Node) - pointer at offset 8\n // - sourceInfo: List(Node.SourceInfo) - pointer at offset 16\n // - requestedFiles: List(RequestedFile) - pointer at offset 24\n\n // Read nodes list pointer\n const nodesPtr = this.readPointer(8);\n if (nodesPtr.offset > 0 && nodesPtr.size > 0) {\n const nodeList = this.readStructList(nodesPtr.offset, nodesPtr.size, (offset) =>\n this.parseNode(offset)\n );\n nodes.push(...nodeList);\n }\n\n return nodes;\n }\n\n /**\n * Parse a single Node structure\n */\n private parseNode(offset: number): SchemaNode {\n // Node layout (from schema.capnp):\n // - id: UInt64 @0\n // - displayName: Text @1\n // - displayNamePrefixLength: UInt32 @2\n // - scopeId: UInt64 @3\n // - parameters: List(Parameter) @32\n // - isGeneric: Bool @33\n // - nestedNodes: List(NestedNode) @4\n // - annotations: List(Annotation) @5\n // - union: @6 (various node types)\n\n const id = this.view.getBigUint64(offset, true);\n\n // Read displayName (pointer at offset 8)\n const displayNamePtr = this.readPointer(offset + 8);\n const displayName = this.readText(displayNamePtr.offset, displayNamePtr.size);\n\n // Read displayNamePrefixLength\n const displayNamePrefixLength = this.view.getUint32(offset + 16, true);\n\n // Read scopeId\n const scopeId = this.view.getBigUint64(offset + 24, true);\n\n // Read nestedNodes (pointer at offset 32)\n const nestedNodesPtr = this.readPointer(offset + 32);\n const nestedNodes =\n nestedNodesPtr.offset > 0 && nestedNodesPtr.size > 0\n ? this.readStructList(nestedNodesPtr.offset, nestedNodesPtr.size, (noffset) =>\n this.parseNestedNode(noffset)\n )\n : [];\n\n // Read annotations (pointer at offset 40)\n const annotationsPtr = this.readPointer(offset + 40);\n const annotations =\n annotationsPtr.offset > 0 && annotationsPtr.size > 0\n ? this.readStructList(annotationsPtr.offset, annotationsPtr.size, (aoffset) =>\n this.parseAnnotation(aoffset)\n )\n : [];\n\n // Read node type union (discriminant at offset 48, data starts at 56)\n const discriminant = this.view.getUint16(offset + 48, true);\n const type = this.mapNodeType(discriminant);\n\n const node: SchemaNode = {\n id,\n displayName,\n displayNamePrefixLength,\n scopeId,\n nestedNodes,\n annotations,\n type,\n };\n\n // Parse type-specific data\n const unionOffset = offset + 56;\n switch (type) {\n case SchemaNodeType.STRUCT:\n node.structInfo = this.parseStructInfo(unionOffset);\n break;\n case SchemaNodeType.ENUM:\n node.enumInfo = this.parseEnumInfo(unionOffset);\n break;\n case SchemaNodeType.INTERFACE:\n node.interfaceInfo = this.parseInterfaceInfo(unionOffset);\n break;\n case SchemaNodeType.CONST:\n node.constInfo = this.parseConstInfo(unionOffset);\n break;\n case SchemaNodeType.ANNOTATION:\n node.annotationInfo = this.parseAnnotationInfo(unionOffset);\n break;\n }\n\n return node;\n }\n\n /**\n * Parse nested node reference\n */\n private parseNestedNode(offset: number): { name: string; id: bigint } {\n // NestedNode layout:\n // - name: Text @0\n // - id: UInt64 @1\n\n const namePtr = this.readPointer(offset);\n const name = this.readText(namePtr.offset, namePtr.size);\n const id = this.view.getBigUint64(offset + 8, true);\n\n return { name, id };\n }\n\n /**\n * Parse annotation\n */\n private parseAnnotation(offset: number): SchemaAnnotation {\n // Annotation layout:\n // - id: UInt64 @0\n // - brand: Brand @2\n // - value: Value @1\n\n const id = this.view.getBigUint64(offset, true);\n\n const valuePtr = this.readPointer(offset + 8);\n const value = this.parseValue(valuePtr.offset);\n\n const brandPtr = this.readPointer(offset + 16);\n const brand = brandPtr.offset > 0 ? this.parseBrand(brandPtr.offset) : { scopes: [] };\n\n return { id, value, brand };\n }\n\n /**\n * Parse struct-specific info\n */\n private parseStructInfo(offset: number): NonNullable<SchemaNode['structInfo']> {\n // Struct group layout:\n // - dataWordCount: UInt16 @7\n // - pointerCount: UInt16 @8\n // - preferredListEncoding: ElementSize @9\n // - isGroup: Bool @10\n // - discriminantCount: UInt16 @11\n // - discriminantOffset: UInt32 @12\n // - fields: List(Field) @13\n\n const dataWordCount = this.view.getUint16(offset, true);\n const pointerCount = this.view.getUint16(offset + 2, true);\n const preferredListEncoding = this.view.getUint16(offset + 4, true);\n const isGroup = this.view.getUint8(offset + 6) !== 0;\n const discriminantCount = this.view.getUint16(offset + 8, true);\n const discriminantOffset = this.view.getUint32(offset + 12, true);\n\n const fieldsPtr = this.readPointer(offset + 16);\n const fields =\n fieldsPtr.offset > 0 && fieldsPtr.size > 0\n ? this.readStructList(fieldsPtr.offset, fieldsPtr.size, (foffset) =>\n this.parseField(foffset)\n )\n : [];\n\n return {\n dataWordCount,\n pointerCount,\n preferredListEncoding,\n isGroup,\n discriminantCount,\n discriminantOffset,\n fields,\n };\n }\n\n /**\n * Parse field definition\n */\n private parseField(offset: number): SchemaField {\n // Field layout:\n // - name: Text @0\n // - codeOrder: UInt16 @1\n // - annotations: List(Annotation) @2\n // - discriminantValue: UInt16 @3\n // - union: slot/group @4\n // - ordinal: union @8\n\n const namePtr = this.readPointer(offset);\n const name = this.readText(namePtr.offset, namePtr.size);\n\n const codeOrder = this.view.getUint16(offset + 8, true);\n\n const discriminantValue = this.view.getUint16(offset + 12, true);\n\n // Read slot info (simplified - assumes slot type)\n const slotOffset = this.view.getUint32(offset + 24, true);\n\n const typePtr = this.readPointer(offset + 32);\n const type = this.parseType(typePtr.offset);\n\n const defaultValuePtr = this.readPointer(offset + 40);\n const defaultValue =\n defaultValuePtr.offset > 0 ? this.parseValue(defaultValuePtr.offset) : undefined;\n\n const hadExplicitDefault = this.view.getUint8(offset + 48) !== 0;\n\n return {\n name,\n codeOrder,\n discriminantValue,\n offset: slotOffset,\n type,\n defaultValue,\n hadExplicitDefault,\n };\n }\n\n /**\n * Parse type definition\n */\n private parseType(offset: number): SchemaType {\n // Type is a union, discriminant at offset\n const discriminant = this.view.getUint16(offset, true);\n const kind = this.parseTypeKind(discriminant, offset + 8);\n\n return { kind };\n }\n\n /**\n * Parse type kind based on discriminant\n */\n private parseTypeKind(discriminant: number, offset: number): SchemaTypeKind {\n // Type discriminant values (from schema.capnp):\n // void @0, bool @1, int8 @2, int16 @3, int32 @4, int64 @5,\n // uint8 @6, uint16 @7, uint32 @8, uint64 @9,\n // float32 @10, float64 @11, text @12, data @13,\n // list @14, enum @15, struct @16, interface @17, anyPointer @18\n\n switch (discriminant) {\n case 0:\n return { type: 'void' };\n case 1:\n return { type: 'bool' };\n case 2:\n return { type: 'int8' };\n case 3:\n return { type: 'int16' };\n case 4:\n return { type: 'int32' };\n case 5:\n return { type: 'int64' };\n case 6:\n return { type: 'uint8' };\n case 7:\n return { type: 'uint16' };\n case 8:\n return { type: 'uint32' };\n case 9:\n return { type: 'uint64' };\n case 10:\n return { type: 'float32' };\n case 11:\n return { type: 'float64' };\n case 12:\n return { type: 'text' };\n case 13:\n return { type: 'data' };\n case 14: {\n const elementTypePtr = this.readPointer(offset);\n const elementType = this.parseType(elementTypePtr.offset);\n return { type: 'list', elementType };\n }\n case 15: {\n const typeId = this.view.getBigUint64(offset, true);\n const brandPtr = this.readPointer(offset + 8);\n const brand = brandPtr.offset > 0 ? this.parseBrand(brandPtr.offset) : undefined;\n return { type: 'enum', typeId, brand };\n }\n case 16: {\n const typeId = this.view.getBigUint64(offset, true);\n const brandPtr = this.readPointer(offset + 8);\n const brand = brandPtr.offset > 0 ? this.parseBrand(brandPtr.offset) : undefined;\n return { type: 'struct', typeId, brand };\n }\n case 17: {\n const typeId = this.view.getBigUint64(offset, true);\n const brandPtr = this.readPointer(offset + 8);\n const brand = brandPtr.offset > 0 ? this.parseBrand(brandPtr.offset) : undefined;\n return { type: 'interface', typeId, brand };\n }\n case 18: {\n // anyPointer is a nested union\n const anyPtrDisc = this.view.getUint16(offset, true);\n return this.parseAnyPointerKind(anyPtrDisc, offset + 8);\n }\n default:\n return { type: 'void' };\n }\n }\n\n /**\n * Parse anyPointer constraint\n */\n private parseAnyPointerKind(discriminant: number, offset: number): SchemaTypeKind {\n // anyPointer union:\n // - unconstrained @0 (with sub-union)\n // - parameter @1\n // - implicitMethodParameter @2\n\n switch (discriminant) {\n case 0: {\n // unconstrained sub-union\n const subDisc = this.view.getUint16(offset, true);\n const kinds = ['anyKind', 'struct', 'list', 'capability'] as const;\n return {\n type: 'anyPointer',\n constraint: { type: 'unconstrained', kind: kinds[subDisc] ?? 'anyKind' },\n };\n }\n case 1: {\n const scopeId = this.view.getBigUint64(offset, true);\n const parameterIndex = this.view.getUint16(offset + 8, true);\n return {\n type: 'anyPointer',\n constraint: { type: 'parameter', scopeId, parameterIndex },\n };\n }\n case 2: {\n const parameterIndex = this.view.getUint16(offset, true);\n return {\n type: 'anyPointer',\n constraint: { type: 'implicitMethodParameter', parameterIndex },\n };\n }\n default:\n return { type: 'anyPointer', constraint: { type: 'unconstrained', kind: 'anyKind' } };\n }\n }\n\n /**\n * Parse brand (generic type bindings)\n */\n private parseBrand(offset: number): SchemaBrand {\n // Brand layout:\n // - scopes: List(Scope) @0\n\n const scopesPtr = this.readPointer(offset);\n const scopes =\n scopesPtr.offset > 0 && scopesPtr.size > 0\n ? this.readStructList(scopesPtr.offset, scopesPtr.size, (soffset) =>\n this.parseBrandScope(soffset)\n )\n : [];\n\n return { scopes };\n }\n\n /**\n * Parse brand scope\n */\n private parseBrandScope(offset: number): SchemaBrandScope {\n // Scope layout:\n // - scopeId: UInt64 @0\n // - union: bind/inherit @1\n\n const scopeId = this.view.getBigUint64(offset, true);\n const discriminant = this.view.getUint16(offset + 8, true);\n\n let bindings: SchemaBrandBinding[] = [];\n\n if (discriminant === 0) {\n // bind: List(Binding)\n const bindingsPtr = this.readPointer(offset + 16);\n bindings =\n bindingsPtr.offset > 0 && bindingsPtr.size > 0\n ? this.readStructList(bindingsPtr.offset, bindingsPtr.size, (boffset) =>\n this.parseBrandBinding(boffset)\n )\n : [];\n }\n // inherit: no data needed\n\n return { scopeId, bindings };\n }\n\n /**\n * Parse brand binding\n */\n private parseBrandBinding(offset: number): SchemaBrandBinding {\n // Binding layout:\n // - union: unbound @0, type @1\n\n const discriminant = this.view.getUint16(offset, true);\n\n if (discriminant === 0) {\n return { type: 'unbound' };\n }\n const typePtr = this.readPointer(offset + 8);\n const type = this.parseType(typePtr.offset);\n return { type: 'type', value: type };\n }\n\n /**\n * Parse value\n */\n private parseValue(offset: number): SchemaValue {\n // Value is a union, discriminant at offset\n const discriminant = this.view.getUint16(offset, true);\n const dataOffset = offset + 8;\n\n switch (discriminant) {\n case 0:\n return { type: 'void' };\n case 1:\n return { type: 'bool', value: this.view.getUint8(dataOffset) !== 0 };\n case 2:\n return { type: 'int8', value: this.view.getInt8(dataOffset) };\n case 3:\n return { type: 'int16', value: this.view.getInt16(dataOffset, true) };\n case 4:\n return { type: 'int32', value: this.view.getInt32(dataOffset, true) };\n case 5:\n return { type: 'int64', value: this.view.getBigInt64(dataOffset, true) };\n case 6:\n return { type: 'uint8', value: this.view.getUint8(dataOffset) };\n case 7:\n return { type: 'uint16', value: this.view.getUint16(dataOffset, true) };\n case 8:\n return { type: 'uint32', value: this.view.getUint32(dataOffset, true) };\n case 9:\n return { type: 'uint64', value: this.view.getBigUint64(dataOffset, true) };\n case 10:\n return { type: 'float32', value: this.view.getFloat32(dataOffset, true) };\n case 11:\n return { type: 'float64', value: this.view.getFloat64(dataOffset, true) };\n case 12: {\n const ptr = this.readPointer(dataOffset);\n return { type: 'text', value: this.readText(ptr.offset, ptr.size) };\n }\n case 13: {\n const ptr = this.readPointer(dataOffset);\n return { type: 'data', value: this.data.slice(ptr.offset, ptr.offset + ptr.size) };\n }\n case 14:\n return { type: 'list', value: null }; // Simplified\n case 15:\n return { type: 'enum', value: this.view.getUint16(dataOffset, true) };\n case 16:\n return { type: 'struct', value: null }; // Simplified\n case 17:\n return { type: 'interface' };\n case 18:\n return { type: 'anyPointer', value: null }; // Simplified\n default:\n return { type: 'void' };\n }\n }\n\n /**\n * Parse enum-specific info\n */\n private parseEnumInfo(offset: number): NonNullable<SchemaNode['enumInfo']> {\n // Enum group layout:\n // - enumerants: List(Enumerant) @14\n\n const enumerantsPtr = this.readPointer(offset);\n const enumerants =\n enumerantsPtr.offset > 0 && enumerantsPtr.size > 0\n ? this.readStructList(enumerantsPtr.offset, enumerantsPtr.size, (eoffset) =>\n this.parseEnumerant(eoffset)\n )\n : [];\n\n return { enumerants };\n }\n\n /**\n * Parse enumerant\n */\n private parseEnumerant(offset: number): {\n name: string;\n codeOrder: number;\n annotations: SchemaAnnotation[];\n } {\n // Enumerant layout:\n // - name: Text @0\n // - codeOrder: UInt16 @1\n // - annotations: List(Annotation) @2\n\n const namePtr = this.readPointer(offset);\n const name = this.readText(namePtr.offset, namePtr.size);\n\n const codeOrder = this.view.getUint16(offset + 8, true);\n\n const annotationsPtr = this.readPointer(offset + 16);\n const annotations =\n annotationsPtr.offset > 0 && annotationsPtr.size > 0\n ? this.readStructList(annotationsPtr.offset, annotationsPtr.size, (aoffset) =>\n this.parseAnnotation(aoffset)\n )\n : [];\n\n return { name, codeOrder, annotations };\n }\n\n /**\n * Parse interface-specific info\n */\n private parseInterfaceInfo(offset: number): NonNullable<SchemaNode['interfaceInfo']> {\n // Interface group layout:\n // - methods: List(Method) @15\n // - superclasses: List(Superclass) @31\n\n const methodsPtr = this.readPointer(offset);\n const methods =\n methodsPtr.offset > 0 && methodsPtr.size > 0\n ? this.readStructList(methodsPtr.offset, methodsPtr.size, (moffset) =>\n this.parseMethod(moffset)\n )\n : [];\n\n const superclassesPtr = this.readPointer(offset + 8);\n const superclasses =\n superclassesPtr.offset > 0 && superclassesPtr.size > 0\n ? this.readStructList(superclassesPtr.offset, superclassesPtr.size, (soffset) =>\n this.parseSuperclass(soffset)\n )\n : [];\n\n return { methods, superclasses };\n }\n\n /**\n * Parse method\n */\n private parseMethod(offset: number): SchemaMethod {\n // Method layout:\n // - name: Text @0\n // - codeOrder: UInt16 @1\n // - implicitParameters: List(Parameter) @7\n // - paramStructType: UInt64 @2\n // - paramBrand: Brand @5\n // - resultStructType: UInt64 @3\n // - resultBrand: Brand @6\n // - annotations: List(Annotation) @4\n\n const namePtr = this.readPointer(offset);\n const name = this.readText(namePtr.offset, namePtr.size);\n\n const codeOrder = this.view.getUint16(offset + 8, true);\n\n const paramStructType = this.view.getBigUint64(offset + 16, true);\n const resultStructType = this.view.getBigUint64(offset + 24, true);\n\n const annotationsPtr = this.readPointer(offset + 32);\n const annotations =\n annotationsPtr.offset > 0 && annotationsPtr.size > 0\n ? this.readStructList(annotationsPtr.offset, annotationsPtr.size, (aoffset) =>\n this.parseAnnotation(aoffset)\n )\n : [];\n\n return { name, codeOrder, paramStructType, resultStructType, annotations };\n }\n\n /**\n * Parse superclass\n */\n private parseSuperclass(offset: number): { id: bigint; brand: SchemaBrand } {\n // Superclass layout:\n // - id: UInt64 @0\n // - brand: Brand @1\n\n const id = this.view.getBigUint64(offset, true);\n\n const brandPtr = this.readPointer(offset + 8);\n const brand = brandPtr.offset > 0 ? this.parseBrand(brandPtr.offset) : { scopes: [] };\n\n return { id, brand };\n }\n\n /**\n * Parse const-specific info\n */\n private parseConstInfo(offset: number): NonNullable<SchemaNode['constInfo']> {\n // Const group layout:\n // - type: Type @16\n // - value: Value @17\n\n const typePtr = this.readPointer(offset);\n const type = this.parseType(typePtr.offset);\n\n const valuePtr = this.readPointer(offset + 8);\n const value = this.parseValue(valuePtr.offset);\n\n return { type, value };\n }\n\n /**\n * Parse annotation-specific info\n */\n private parseAnnotationInfo(offset: number): NonNullable<SchemaNode['annotationInfo']> {\n // Annotation group layout:\n // - type: Type @18\n // - targetsFile: Bool @19\n // - targetsConst: Bool @20\n // - targetsEnum: Bool @21\n // - targetsEnumerant: Bool @22\n // - targetsStruct: Bool @23\n // - targetsField: Bool @24\n // - targetsUnion: Bool @25\n // - targetsGroup: Bool @26\n // - targetsInterface: Bool @27\n // - targetsMethod: Bool @28\n // - targetsParam: Bool @29\n // - targetsAnnotation: Bool @30\n\n const typePtr = this.readPointer(offset);\n const type = this.parseType(typePtr.offset);\n\n const flags = this.view.getUint16(offset + 8, true);\n\n return {\n type,\n targetsFile: (flags & 0x0001) !== 0,\n targetsConst: (flags & 0x0002) !== 0,\n targetsEnum: (flags & 0x0004) !== 0,\n targetsEnumerant: (flags & 0x0008) !== 0,\n targetsStruct: (flags & 0x0010) !== 0,\n targetsField: (flags & 0x0020) !== 0,\n targetsUnion: (flags & 0x0040) !== 0,\n targetsGroup: (flags & 0x0080) !== 0,\n targetsInterface: (flags & 0x0100) !== 0,\n targetsMethod: (flags & 0x0200) !== 0,\n targetsParam: (flags & 0x0400) !== 0,\n targetsAnnotation: (flags & 0x0800) !== 0,\n };\n }\n\n /**\n * Map node type discriminant to SchemaNodeType\n */\n private mapNodeType(discriminant: number): SchemaNodeType {\n // Node union discriminant values:\n // file @6, struct @7, enum @8, interface @9, const @10, annotation @11\n const types: SchemaNodeType[] = [\n SchemaNodeType.FILE, // 0 (placeholder)\n SchemaNodeType.FILE, // 1 (placeholder)\n SchemaNodeType.FILE, // 2 (placeholder)\n SchemaNodeType.FILE, // 3 (placeholder)\n SchemaNodeType.FILE, // 4 (placeholder)\n SchemaNodeType.FILE, // 5 (placeholder)\n SchemaNodeType.FILE, // 6\n SchemaNodeType.STRUCT, // 7\n SchemaNodeType.ENUM, // 8\n SchemaNodeType.INTERFACE, // 9\n SchemaNodeType.CONST, // 10\n SchemaNodeType.ANNOTATION, // 11\n ];\n return types[discriminant] ?? SchemaNodeType.FILE;\n }\n\n /**\n * Read a pointer value\n */\n private readPointer(offset: number): { offset: number; size: number } {\n // Simplified pointer encoding\n // In real Cap'n Proto, this would decode the full pointer structure\n const wordOffset = this.view.getInt32(offset, true);\n const sizeAndType = this.view.getUint32(offset + 4, true);\n const size = sizeAndType & 0xffffff;\n const _type = (sizeAndType >> 24) & 0x07;\n\n if (wordOffset === 0 && size === 0) {\n return { offset: 0, size: 0 };\n }\n\n // Calculate absolute offset\n const absoluteOffset = offset + 8 + wordOffset * 8;\n\n return { offset: absoluteOffset, size };\n }\n\n /**\n * Read text from offset\n */\n private readText(offset: number, size: number): string {\n if (size === 0) return '';\n // Text includes null terminator, so subtract 1\n const actualSize = size > 0 ? size - 1 : 0;\n const bytes = this.data.slice(offset, offset + actualSize);\n return this.textDecoder.decode(bytes);\n }\n\n /**\n * Read a list of structs\n */\n private readStructList<T>(offset: number, count: number, parser: (offset: number) => T): T[] {\n const result: T[] = [];\n let currentOffset = offset;\n\n // Assume fixed-size structs for simplicity\n // In real implementation, would read struct size from list pointer\n const structSize = 64; // Default assumption\n\n for (let i = 0; i < count; i++) {\n result.push(parser(currentOffset));\n currentOffset += structSize;\n }\n\n return result;\n }\n}\n\n/**\n * Create a schema registry for managing parsed schemas\n */\nexport function createSchemaRegistry(): {\n registerNode: (node: SchemaNode) => void;\n getNode: (id: bigint) => SchemaNode | undefined;\n getNodeByName: (name: string) => SchemaNode | undefined;\n getNodesByFile: (fileId: bigint) => SchemaNode[];\n hasNode: (id: bigint) => boolean;\n clear: () => void;\n} {\n const nodesById = new Map<bigint, SchemaNode>();\n const nodesByName = new Map<string, SchemaNode>();\n const nodesByFile = new Map<bigint, SchemaNode[]>();\n\n return {\n registerNode(node: SchemaNode) {\n nodesById.set(node.id, node);\n nodesByName.set(node.displayName, node);\n\n // Find file ID (scope chain traversal would be needed for accurate result)\n // For now, use scopeId as proxy\n const fileNodes = nodesByFile.get(node.scopeId) ?? [];\n fileNodes.push(node);\n nodesByFile.set(node.scopeId, fileNodes);\n },\n\n getNode(id: bigint) {\n return nodesById.get(id);\n },\n\n getNodeByName(name: string) {\n return nodesByName.get(name);\n },\n\n getNodesByFile(fileId: bigint) {\n return nodesByFile.get(fileId) ?? [];\n },\n\n hasNode(id: bigint) {\n return nodesById.has(id);\n },\n\n clear() {\n nodesById.clear();\n nodesByName.clear();\n nodesByFile.clear();\n },\n };\n}\n","/**\n * Phase 7: Dynamic Schema Transfer Protocol - Message Serializer\n *\n * This module handles serialization and deserialization of schema-related\n * RPC messages (SchemaRequest, SchemaResponse, etc.)\n */\n\nimport type { Exception, ExceptionType } from './rpc-types';\nimport type {\n AvailableSchema,\n GetSchemaParams,\n GetSchemaResults,\n ListSchemasResults,\n SchemaDependency,\n SchemaPayload,\n SchemaRequest,\n SchemaResponse,\n SchemaResponseResult,\n SchemaTarget,\n} from './schema-types';\nimport { SchemaFormat } from './schema-types.js';\n\n// Message type IDs for schema messages\nexport const SCHEMA_MESSAGE_TYPES = {\n SCHEMA_REQUEST: 14,\n SCHEMA_RESPONSE: 15,\n} as const;\n\n/**\n * Serialize a SchemaRequest to binary format\n */\nexport function serializeSchemaRequest(request: SchemaRequest): Uint8Array {\n // Calculate size needed\n const targetSize = getSchemaTargetSize(request.targetSchema);\n const totalSize = 8 + targetSize; // questionId (4) + padding + target\n\n const buffer = new ArrayBuffer(totalSize);\n const view = new DataView(buffer);\n const bytes = new Uint8Array(buffer);\n\n // Write questionId\n view.setUint32(0, request.questionId, true);\n\n // Write target (starts at offset 8 for alignment)\n let offset = 8;\n offset = writeSchemaTarget(bytes, offset, request.targetSchema);\n\n return bytes;\n}\n\n/**\n * Deserialize a SchemaRequest from binary format\n */\nexport function deserializeSchemaRequest(data: Uint8Array): SchemaRequest {\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n\n // Read questionId\n const questionId = view.getUint32(0, true);\n\n // Read target (starts at offset 8)\n const target = readSchemaTarget(data, 8);\n\n return {\n questionId,\n targetSchema: target.value,\n };\n}\n\n/**\n * Get the serialized size of a SchemaTarget\n */\nfunction getSchemaTargetSize(target: SchemaTarget): number {\n switch (target.type) {\n case 'allSchemas':\n case 'bootstrapInterface':\n return 8; // tag only\n case 'byTypeId':\n case 'byFileId':\n return 16; // tag + 8-byte ID\n case 'byTypeName':\n case 'byFileName': {\n // tag + pointer + string data (aligned)\n const strLen = target.type === 'byTypeName' ? target.typeName.length : target.fileName.length;\n return 16 + align8(strLen);\n }\n default:\n return 8;\n }\n}\n\n/**\n * Write a SchemaTarget to binary format\n */\nfunction writeSchemaTarget(bytes: Uint8Array, offset: number, target: SchemaTarget): number {\n const view = new DataView(bytes.buffer, bytes.byteOffset);\n\n switch (target.type) {\n case 'allSchemas':\n view.setUint16(offset, 0, true);\n break;\n case 'byTypeId':\n view.setUint16(offset, 1, true);\n view.setBigUint64(offset + 8, target.typeId, true);\n break;\n case 'byTypeName': {\n view.setUint16(offset, 2, true);\n const strBytes = new TextEncoder().encode(target.typeName);\n writePointer(bytes, offset + 8, strBytes.length);\n bytes.set(strBytes, offset + 16);\n return offset + 16 + align8(strBytes.length);\n }\n case 'byFileId':\n view.setUint16(offset, 3, true);\n view.setBigUint64(offset + 8, target.fileId, true);\n break;\n case 'byFileName': {\n view.setUint16(offset, 4, true);\n const strBytes = new TextEncoder().encode(target.fileName);\n writePointer(bytes, offset + 8, strBytes.length);\n bytes.set(strBytes, offset + 16);\n return offset + 16 + align8(strBytes.length);\n }\n case 'bootstrapInterface':\n view.setUint16(offset, 5, true);\n break;\n }\n\n return offset + 8;\n}\n\n/**\n * Read a SchemaTarget from binary format\n */\nfunction readSchemaTarget(\n data: Uint8Array,\n offset: number\n): { value: SchemaTarget; nextOffset: number } {\n const view = new DataView(data.buffer, data.byteOffset);\n const tag = view.getUint16(offset, true);\n\n switch (tag) {\n case 0:\n return { value: { type: 'allSchemas' }, nextOffset: offset + 8 };\n case 1:\n return {\n value: { type: 'byTypeId', typeId: view.getBigUint64(offset + 8, true) },\n nextOffset: offset + 16,\n };\n case 2: {\n const strLen = readPointer(data, offset + 8);\n const strBytes = data.slice(offset + 16, offset + 16 + strLen);\n const typeName = new TextDecoder().decode(strBytes);\n return {\n value: { type: 'byTypeName', typeName },\n nextOffset: offset + 16 + align8(strLen),\n };\n }\n case 3:\n return {\n value: { type: 'byFileId', fileId: view.getBigUint64(offset + 8, true) },\n nextOffset: offset + 16,\n };\n case 4: {\n const strLen = readPointer(data, offset + 8);\n const strBytes = data.slice(offset + 16, offset + 16 + strLen);\n const fileName = new TextDecoder().decode(strBytes);\n return {\n value: { type: 'byFileName', fileName },\n nextOffset: offset + 16 + align8(strLen),\n };\n }\n case 5:\n return { value: { type: 'bootstrapInterface' }, nextOffset: offset + 8 };\n default:\n return { value: { type: 'allSchemas' }, nextOffset: offset + 8 };\n }\n}\n\n/**\n * Serialize a SchemaResponse to binary format\n */\nexport function serializeSchemaResponse(response: SchemaResponse): Uint8Array {\n const resultSize = getSchemaResponseResultSize(response.result);\n const totalSize = 8 + resultSize; // answerId (4) + padding + result\n\n const buffer = new ArrayBuffer(totalSize);\n const view = new DataView(buffer);\n const bytes = new Uint8Array(buffer);\n\n // Write answerId\n view.setUint32(0, response.answerId, true);\n\n // Write result\n writeSchemaResponseResult(bytes, 8, response.result);\n\n return bytes;\n}\n\n/**\n * Deserialize a SchemaResponse from binary format\n */\nexport function deserializeSchemaResponse(data: Uint8Array): SchemaResponse {\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n\n // Read answerId\n const answerId = view.getUint32(0, true);\n\n // Read result\n const result = readSchemaResponseResult(data, 8);\n\n return {\n answerId,\n result: result.value,\n };\n}\n\n/**\n * Get the serialized size of a SchemaResponseResult\n */\nfunction getSchemaResponseResultSize(result: SchemaResponseResult): number {\n switch (result.type) {\n case 'success':\n return 8 + getSchemaPayloadSize(result.payload);\n case 'exception':\n return 8 + getExceptionSize(result.exception);\n default:\n return 8;\n }\n}\n\n/**\n * Write a SchemaResponseResult to binary format\n */\nfunction writeSchemaResponseResult(\n bytes: Uint8Array,\n offset: number,\n result: SchemaResponseResult\n): number {\n const view = new DataView(bytes.buffer, bytes.byteOffset);\n\n switch (result.type) {\n case 'success':\n view.setUint16(offset, 0, true);\n return writeSchemaPayload(bytes, offset + 8, result.payload);\n case 'exception':\n view.setUint16(offset, 1, true);\n return writeException(bytes, offset + 8, result.exception);\n default:\n view.setUint16(offset, 0, true);\n return offset + 8;\n }\n}\n\n/**\n * Read a SchemaResponseResult from binary format\n */\nfunction readSchemaResponseResult(\n data: Uint8Array,\n offset: number\n): { value: SchemaResponseResult; nextOffset: number } {\n const view = new DataView(data.buffer, data.byteOffset);\n const tag = view.getUint16(offset, true);\n\n switch (tag) {\n case 0: {\n const payload = readSchemaPayload(data, offset + 8);\n return { value: { type: 'success', payload: payload.value }, nextOffset: payload.nextOffset };\n }\n case 1: {\n const exception = readException(data, offset + 8);\n return {\n value: { type: 'exception', exception: exception.value },\n nextOffset: exception.nextOffset,\n };\n }\n default:\n return {\n value: {\n type: 'success',\n payload: { schemaData: new Uint8Array(), format: SchemaFormat.BINARY, dependencies: [] },\n },\n nextOffset: offset + 8,\n };\n }\n}\n\n/**\n * Get the serialized size of a SchemaPayload\n */\nfunction getSchemaPayloadSize(payload: SchemaPayload): number {\n let size = 32; // format (4) + padding + schemaData pointer (8) + sourceInfo pointer (8) + dependencies pointer (8)\n size += align8(payload.schemaData.length);\n if (payload.sourceInfo) {\n size += align8(payload.sourceInfo.length);\n }\n size += getSchemaDependenciesSize(payload.dependencies);\n return size;\n}\n\n/**\n * Write a SchemaPayload to binary format\n */\nfunction writeSchemaPayload(bytes: Uint8Array, offset: number, payload: SchemaPayload): number {\n const view = new DataView(bytes.buffer, bytes.byteOffset);\n\n // Write format\n view.setUint32(offset, payload.format, true);\n\n let currentOffset = offset + 8; // Skip padding to align to 8 bytes\n\n // Write schemaData pointer and data\n writePointer(bytes, currentOffset, payload.schemaData.length);\n currentOffset += 8;\n bytes.set(payload.schemaData, currentOffset);\n currentOffset += align8(payload.schemaData.length);\n\n // Write sourceInfo pointer and data (optional)\n if (payload.sourceInfo) {\n writePointer(bytes, currentOffset, payload.sourceInfo.length);\n currentOffset += 8;\n bytes.set(payload.sourceInfo, currentOffset);\n currentOffset += align8(payload.sourceInfo.length);\n } else {\n writePointer(bytes, currentOffset, 0);\n currentOffset += 8;\n }\n\n // Write dependencies\n currentOffset = writeSchemaDependencies(bytes, currentOffset, payload.dependencies);\n\n return currentOffset;\n}\n\n/**\n * Read a SchemaPayload from binary format\n */\nfunction readSchemaPayload(\n data: Uint8Array,\n offset: number\n): { value: SchemaPayload; nextOffset: number } {\n const view = new DataView(data.buffer, data.byteOffset);\n\n // Read format\n const format = view.getUint32(offset, true) as SchemaFormat;\n\n let currentOffset = offset + 8; // Skip padding\n\n // Read schemaData pointer and data\n const schemaDataLen = readPointer(data, currentOffset);\n currentOffset += 8;\n const schemaData = data.slice(currentOffset, currentOffset + schemaDataLen);\n currentOffset += align8(schemaDataLen);\n\n // Read sourceInfo pointer and data (optional)\n const sourceInfoLen = readPointer(data, currentOffset);\n currentOffset += 8;\n let sourceInfo: Uint8Array | undefined;\n if (sourceInfoLen > 0) {\n sourceInfo = data.slice(currentOffset, currentOffset + sourceInfoLen);\n currentOffset += align8(sourceInfoLen);\n }\n\n // Read dependencies\n const deps = readSchemaDependencies(data, currentOffset);\n\n return {\n value: {\n schemaData,\n format,\n sourceInfo,\n dependencies: deps.value,\n },\n nextOffset: deps.nextOffset,\n };\n}\n\n/**\n * Get the serialized size of SchemaDependency array\n */\nfunction getSchemaDependenciesSize(deps: SchemaDependency[]): number {\n let size = 8; // List pointer\n for (const dep of deps) {\n size += 32; // fileId (8) + fileName pointer (8) + schemaHash pointer (8) + padding to align\n size += align8(dep.fileName.length + 1); // +1 for null terminator\n if (dep.schemaHash) {\n size += align8(dep.schemaHash.length);\n }\n }\n return size;\n}\n\n/**\n * Write SchemaDependency array to binary format\n */\nfunction writeSchemaDependencies(\n bytes: Uint8Array,\n offset: number,\n deps: SchemaDependency[]\n): number {\n const view = new DataView(bytes.buffer, bytes.byteOffset);\n\n // Write list pointer (count)\n writePointer(bytes, offset, deps.length);\n let currentOffset = offset + 8;\n\n for (const dep of deps) {\n // Write fileId\n view.setBigUint64(currentOffset, dep.fileId, true);\n currentOffset += 8;\n\n // Write fileName pointer and text (with null terminator)\n const fileNameBytes = new TextEncoder().encode(`${dep.fileName}\\0`);\n writePointer(bytes, currentOffset, fileNameBytes.length);\n currentOffset += 8;\n bytes.set(fileNameBytes, currentOffset);\n currentOffset += align8(fileNameBytes.length);\n\n // Write schemaHash pointer and data (if present)\n if (dep.schemaHash && dep.schemaHash.length > 0) {\n writePointer(bytes, currentOffset, dep.schemaHash.length);\n currentOffset += 8;\n bytes.set(dep.schemaHash, currentOffset);\n currentOffset += align8(dep.schemaHash.length);\n } else {\n writePointer(bytes, currentOffset, 0);\n currentOffset += 8;\n }\n }\n\n return currentOffset;\n}\n\n/**\n * Read SchemaDependency array from binary format\n */\nfunction readSchemaDependencies(\n data: Uint8Array,\n offset: number\n): { value: SchemaDependency[]; nextOffset: number } {\n const view = new DataView(data.buffer, data.byteOffset);\n\n // Read list pointer (count)\n const count = readPointer(data, offset);\n let currentOffset = offset + 8;\n\n const deps: SchemaDependency[] = [];\n\n for (let i = 0; i < count; i++) {\n // Read fileId\n const fileId = view.getBigUint64(currentOffset, true);\n currentOffset += 8;\n\n // Read fileName pointer and text\n const fileNameLen = readPointer(data, currentOffset);\n currentOffset += 8;\n const fileNameBytes = data.slice(currentOffset, currentOffset + fileNameLen);\n // Remove null terminator if present\n const fileName = new TextDecoder().decode(fileNameBytes).replace(/\\0$/, '');\n currentOffset += align8(fileNameLen);\n\n // Read schemaHash pointer and data\n const schemaHashLen = readPointer(data, currentOffset);\n currentOffset += 8;\n let schemaHash: Uint8Array | undefined;\n if (schemaHashLen > 0) {\n schemaHash = data.slice(currentOffset, currentOffset + schemaHashLen);\n currentOffset += align8(schemaHashLen);\n }\n\n deps.push({ fileId, fileName, schemaHash });\n }\n\n return { value: deps, nextOffset: currentOffset };\n}\n\n/**\n * Get the serialized size of an Exception\n */\nfunction getExceptionSize(exception: Exception): number {\n let size = 24; // reason pointer (8) + type (8) + deprecated fields (8)\n size += align8(exception.reason.length);\n return size;\n}\n\n/**\n * Write an Exception to binary format\n */\nfunction writeException(bytes: Uint8Array, offset: number, exception: Exception): number {\n const view = new DataView(bytes.buffer, bytes.byteOffset);\n\n // Write reason pointer and text\n const reasonBytes = new TextEncoder().encode(exception.reason);\n writePointer(bytes, offset, reasonBytes.length);\n bytes.set(reasonBytes, offset + 8);\n let currentOffset = offset + 8 + align8(reasonBytes.length);\n\n // Write type (aligned to 8 bytes)\n view.setUint16(currentOffset, exception.type as unknown as number, true);\n currentOffset += 8;\n\n // Write deprecated fields (aligned to 8 bytes)\n view.setUint8(currentOffset, exception.obsoleteIsCallersFault ? 1 : 0);\n view.setUint16(currentOffset + 1, (exception.obsoleteDurability ?? 0) as unknown as number, true);\n currentOffset += 8;\n\n return currentOffset;\n}\n\n/**\n * Read an Exception from binary format\n */\nfunction readException(data: Uint8Array, offset: number): { value: Exception; nextOffset: number } {\n const view = new DataView(data.buffer, data.byteOffset);\n\n // Read reason pointer and text\n const reasonLen = readPointer(data, offset);\n const reasonBytes = data.slice(offset + 8, offset + 8 + reasonLen);\n const reason = new TextDecoder().decode(reasonBytes);\n let currentOffset = offset + 8 + align8(reasonLen);\n\n // Read type (aligned to 8 bytes)\n const type = view.getUint16(currentOffset, true) as unknown as ExceptionType;\n currentOffset += 8;\n\n // Read deprecated fields (aligned to 8 bytes)\n const obsoleteIsCallersFault = view.getUint8(currentOffset) !== 0;\n const obsoleteDurability = view.getUint16(currentOffset + 1, true);\n currentOffset += 8;\n\n return {\n value: {\n reason,\n type,\n obsoleteIsCallersFault,\n obsoleteDurability,\n },\n nextOffset: currentOffset,\n };\n}\n\n/**\n * Helper: Align size to 8-byte boundary\n */\nfunction align8(size: number): number {\n return (size + 7) & ~7;\n}\n\n/**\n * Helper: Write a pointer (list/struct offset and size)\n */\nfunction writePointer(bytes: Uint8Array, offset: number, size: number): void {\n const view = new DataView(bytes.buffer, bytes.byteOffset);\n // Simple encoding: just store the size for now\n // In full implementation, this would encode offset + size + type tag\n view.setUint32(offset, size, true);\n view.setUint32(offset + 4, 0, true); // Type tag / padding\n}\n\n/**\n * Helper: Read a pointer\n */\nfunction readPointer(data: Uint8Array, offset: number): number {\n const view = new DataView(data.buffer, data.byteOffset);\n return view.getUint32(offset, true);\n}\n\n/**\n * Serialize GetSchemaParams\n */\nexport function serializeGetSchemaParams(params: GetSchemaParams): Uint8Array {\n const targetSize = getSchemaTargetSize(params.target);\n const totalSize = 12 + targetSize; // format (4) + padding + target\n\n const buffer = new ArrayBuffer(totalSize);\n const view = new DataView(buffer);\n const bytes = new Uint8Array(buffer);\n\n // Write format\n view.setUint32(0, params.format ?? SchemaFormat.BINARY, true);\n\n // Write target\n writeSchemaTarget(bytes, 8, params.target);\n\n return bytes;\n}\n\n/**\n * Serialize GetSchemaResults\n */\nexport function serializeGetSchemaResults(results: GetSchemaResults): Uint8Array {\n const payloadSize = getSchemaPayloadSize(results.payload);\n const totalSize = 8 + payloadSize;\n\n const buffer = new ArrayBuffer(totalSize);\n const bytes = new Uint8Array(buffer);\n\n // Write payload\n writeSchemaPayload(bytes, 8, results.payload);\n\n return bytes;\n}\n\n/**\n * Serialize ListSchemasResults\n */\nexport function serializeListSchemasResults(results: ListSchemasResults): Uint8Array {\n let totalSize = 16; // List pointer + padding\n\n for (const schema of results.schemas) {\n totalSize += 32; // typeId (8) + displayName pointer + fileId (8) + fileName pointer + flags\n totalSize += align8(schema.displayName.length);\n totalSize += align8(schema.fileName.length);\n }\n\n const buffer = new ArrayBuffer(totalSize);\n const view = new DataView(buffer);\n const bytes = new Uint8Array(buffer);\n\n // Write list pointer\n writePointer(bytes, 8, results.schemas.length);\n let offset = 16;\n\n for (const schema of results.schemas) {\n // Write typeId\n view.setBigUint64(offset, schema.typeId, true);\n offset += 8;\n\n // Write displayName\n const displayNameBytes = new TextEncoder().encode(schema.displayName);\n writePointer(bytes, offset, displayNameBytes.length);\n offset += 8;\n bytes.set(displayNameBytes, offset);\n offset += align8(displayNameBytes.length);\n\n // Write fileId\n view.setBigUint64(offset, schema.fileId, true);\n offset += 8;\n\n // Write fileName\n const fileNameBytes = new TextEncoder().encode(schema.fileName);\n writePointer(bytes, offset, fileNameBytes.length);\n offset += 8;\n bytes.set(fileNameBytes, offset);\n offset += align8(fileNameBytes.length);\n\n // Write flags\n let flags = 0;\n if (schema.isInterface) flags |= 1;\n if (schema.isStruct) flags |= 2;\n if (schema.isEnum) flags |= 4;\n view.setUint8(offset, flags);\n offset += 8;\n }\n\n return bytes;\n}\n","/**\n * RpcConnection\n *\n * Manages a single RPC connection, handling message routing and the Four Tables.\n * This is the core of the RPC implementation.\n *\n * Phase 2 Updates:\n * - Added Promise Pipelining support\n * - Added capability passing\n * - Added Resolve/Release/Disembargo message handling\n *\n * Phase 4 Updates:\n * - Added Level 3 RPC support (Provide/Accept)\n * - Added third-party capability handling\n * - Integrated with ConnectionManager for multi-vat scenarios\n */\n\nimport { getDebugOptions, isDebugEnabled } from '../debug/config.js';\nimport { createDebugLogger } from '../debug/index.js';\nimport type { ConnectionManager, VatId } from './connection-manager.js';\nimport { AnswerTable, ExportTable, ImportTable, QuestionTable } from './four-tables.js';\nimport type { Level3Handlers } from './level3-handlers.js';\nimport type { Level4Handlers } from './level4-handlers.js';\nimport {\n type PipelineClient,\n PipelineOpTracker,\n PipelineResolutionTracker,\n QueuedCallManager,\n createPipelineClient,\n isPipelineClient,\n} from './pipeline.js';\nimport type {\n Accept,\n AnswerId,\n Bootstrap,\n Call,\n CapDescriptor,\n Disembargo,\n ExportId,\n Finish,\n ImportId,\n Join,\n Payload,\n PromisedAnswerOp,\n Provide,\n QuestionId,\n Release,\n Resolve,\n Return,\n RpcMessage,\n ThirdPartyCapId,\n} from './rpc-types.js';\nimport { createSchemaRegistry, parseSchemaNodes } from './schema-parser.js';\nimport { deserializeSchemaResponse, serializeSchemaRequest } from './schema-serializer.js';\nimport type { SchemaNode, SchemaPayload, SchemaRegistry, SchemaTarget } from './schema-types.js';\nimport { SchemaFormat } from './schema-types.js';\nimport type { RpcTransport } from './transport.js';\n\nexport interface RpcConnectionOptions {\n /** Bootstrap capability to expose to the peer */\n bootstrap?: unknown;\n /** This vat's ID (for Level 3 RPC) */\n selfVatId?: VatId;\n /** Connection manager for Level 3 RPC */\n connectionManager?: ConnectionManager;\n /** Level 3 message handlers */\n level3Handlers?: Level3Handlers;\n /** Level 4 message handlers */\n level4Handlers?: Level4Handlers;\n /** Enable debug logging for this connection */\n debug?: boolean;\n}\n\nexport class RpcConnection {\n private transport: RpcTransport;\n private options: RpcConnectionOptions;\n\n // Debug logger\n private debugLogger = createDebugLogger();\n\n // The Four Tables\n private questions = new QuestionTable();\n private answers = new AnswerTable();\n private imports = new ImportTable();\n private exports = new ExportTable();\n\n // Phase 2: Pipeline support\n private queuedCalls = new QueuedCallManager();\n private pipelineResolutions = new PipelineResolutionTracker();\n\n // Message processing\n private running = false;\n private messageHandler?: Promise<void>;\n\n // Phase 4: Level 3 handlers\n private level3Handlers?: Level3Handlers;\n\n // Phase 6: Level 4 handlers\n private level4Handlers?: Level4Handlers;\n\n // Phase 7: Dynamic Schema cache\n private schemaCache: Map<bigint, SchemaNode> = new Map();\n private schemaRegistry: SchemaRegistry = createSchemaRegistry();\n private schemaQuestionIdCounter = 1000000; // Separate counter for schema requests\n private schemaProvider?: import('./schema-capability.js').SchemaCapabilityServer;\n\n constructor(transport: RpcTransport, options: RpcConnectionOptions = {}) {\n this.transport = transport;\n this.options = options;\n this.level3Handlers = options.level3Handlers;\n\n // Initialize debug logging\n const debugEnabled = options.debug ?? isDebugEnabled();\n if (debugEnabled) {\n this.debugLogger.enable();\n this.debugLogger.setConfig(getDebugOptions());\n this.debugLogger.log('RPC connection created');\n }\n\n // Set up transport event handlers\n this.transport.onClose = (reason) => {\n this.handleDisconnect(reason);\n };\n\n this.transport.onError = (error) => {\n this.handleError(error);\n };\n\n // Set up Level 3 and Level 4 handlers\n this.level3Handlers = options.level3Handlers;\n this.level4Handlers = options.level4Handlers;\n }\n\n /** Start processing messages */\n async start(): Promise<void> {\n if (this.running) return;\n\n this.running = true;\n this.messageHandler = this.messageLoop();\n }\n\n /** Stop the connection */\n async stop(): Promise<void> {\n this.running = false;\n this.transport.close();\n\n if (this.messageHandler) {\n try {\n await this.messageHandler;\n } catch {\n // Ignore errors during shutdown\n }\n }\n }\n\n /** Send a bootstrap request and return the bootstrap capability */\n async bootstrap(): Promise<unknown> {\n const question = this.questions.create();\n\n const bootstrapMsg: RpcMessage = {\n type: 'bootstrap',\n bootstrap: {\n questionId: question.id,\n },\n };\n\n await this.sendWithLogging(bootstrapMsg);\n\n // Wait for the bootstrap response\n await question.completionPromise;\n\n // Return the bootstrap capability\n // In full implementation, this would extract the capability from the response\n return {};\n }\n\n /** Make a call to a remote capability */\n async call(\n target: ImportId | ExportId | PipelineClient,\n interfaceId: bigint,\n methodId: number,\n params: Payload\n ): Promise<unknown> {\n // Check if target is a pipeline client\n if (isPipelineClient(target)) {\n return target.call(interfaceId, methodId, params);\n }\n\n const question = this.questions.create();\n\n const callMsg: RpcMessage = {\n type: 'call',\n call: {\n questionId: question.id,\n target: { type: 'importedCap', importId: target as ImportId },\n interfaceId,\n methodId,\n allowThirdPartyTailCall: false,\n noPromisePipelining: false,\n onlyPromisePipeline: false,\n params,\n sendResultsTo: { type: 'caller' },\n },\n };\n\n await this.sendWithLogging(callMsg);\n\n // Wait for the call to complete\n return question.completionPromise;\n }\n\n /**\n * Make a call that returns a PipelineClient for promise pipelining.\n * This allows making calls on the result before it arrives.\n */\n async callPipelined(\n target: ImportId | ExportId,\n interfaceId: bigint,\n methodId: number,\n params: Payload\n ): Promise<PipelineClient> {\n const question = this.questions.create();\n\n const callMsg: RpcMessage = {\n type: 'call',\n call: {\n questionId: question.id,\n target: { type: 'importedCap', importId: target },\n interfaceId,\n methodId,\n allowThirdPartyTailCall: false,\n noPromisePipelining: false,\n onlyPromisePipeline: false,\n params,\n sendResultsTo: { type: 'caller' },\n },\n };\n\n await this.sendWithLogging(callMsg);\n\n // Return a pipeline client immediately without waiting\n return createPipelineClient({\n connection: this,\n questionId: question.id,\n });\n }\n\n /** Send a finish message to release a question */\n async finish(questionId: QuestionId, releaseResultCaps = true): Promise<void> {\n const question = this.questions.get(questionId);\n if (!question) return;\n\n const finishMsg: RpcMessage = {\n type: 'finish',\n finish: {\n questionId,\n releaseResultCaps,\n requireEarlyCancellationWorkaround: false,\n },\n };\n\n await this.sendWithLogging(finishMsg);\n this.questions.markFinishSent(questionId);\n this.questions.remove(questionId);\n }\n\n /** Send a release message for an imported capability */\n async release(importId: ImportId, referenceCount = 1): Promise<void> {\n const releaseMsg: RpcMessage = {\n type: 'release',\n release: {\n id: importId,\n referenceCount,\n },\n };\n\n await this.sendWithLogging(releaseMsg);\n }\n\n /** Send a resolve message to indicate a promise has resolved */\n async resolve(promiseId: ExportId, cap: CapDescriptor): Promise<void> {\n const resolveMsg: RpcMessage = {\n type: 'resolve',\n resolve: {\n promiseId,\n resolution: { type: 'cap', cap },\n },\n };\n\n await this.sendWithLogging(resolveMsg);\n }\n\n /** Send a resolve message indicating a promise was broken */\n async resolveException(promiseId: ExportId, reason: string): Promise<void> {\n const resolveMsg: RpcMessage = {\n type: 'resolve',\n resolve: {\n promiseId,\n resolution: {\n type: 'exception',\n exception: { reason, type: 'failed' },\n },\n },\n };\n\n await this.sendWithLogging(resolveMsg);\n }\n\n /** Send a return message (internal use) */\n async sendReturn(ret: Return): Promise<void> {\n const returnMsg: RpcMessage = { type: 'return', return: ret };\n await this.sendWithLogging(returnMsg);\n }\n\n /** Send a disembargo message (internal use) */\n async sendDisembargo(disembargo: Disembargo): Promise<void> {\n const disembargoMsg: RpcMessage = { type: 'disembargo', disembargo };\n await this.sendWithLogging(disembargoMsg);\n }\n\n /** Internal method: Create a new question (used by pipeline) */\n createQuestion(): QuestionId {\n const question = this.questions.create();\n return question.id;\n }\n\n /** Internal method: Send a call message (used by pipeline) */\n async sendCall(call: Call): Promise<void> {\n const callMsg: RpcMessage = { type: 'call', call };\n await this.sendWithLogging(callMsg);\n }\n\n /** Internal method: Wait for an answer (used by pipeline) */\n async waitForAnswer(questionId: QuestionId): Promise<unknown> {\n const question = this.questions.get(questionId);\n if (!question) {\n throw new Error(`Question ${questionId} not found`);\n }\n return question.completionPromise;\n }\n\n /** Main message processing loop */\n private async messageLoop(): Promise<void> {\n while (this.running) {\n try {\n const message = await this.receiveWithLogging();\n\n if (message === null) {\n // Connection closed\n break;\n }\n\n await this.handleMessage(message);\n } catch (error) {\n if (this.running) {\n this.handleError(error as Error);\n }\n }\n }\n }\n\n /** Handle incoming messages */\n private async handleMessage(message: RpcMessage): Promise<void> {\n switch (message.type) {\n case 'bootstrap':\n await this.handleBootstrap(message.bootstrap);\n break;\n case 'call':\n await this.handleCall(message.call);\n break;\n case 'return':\n await this.handleReturn(message.return);\n break;\n case 'finish':\n await this.handleFinish(message.finish);\n break;\n case 'resolve':\n await this.handleResolve(message.resolve);\n break;\n case 'release':\n await this.handleRelease(message.release);\n break;\n case 'disembargo':\n await this.handleDisembargo(message.disembargo);\n break;\n // Level 3 message types\n case 'provide':\n await this.handleProvide(message.provide);\n break;\n case 'accept':\n await this.handleAccept(message.accept);\n break;\n // Level 4 message types\n case 'join':\n await this.handleJoin(message.join);\n break;\n case 'abort':\n this.handleAbort(message.exception.reason);\n break;\n case 'unimplemented':\n // Handle unimplemented message\n break;\n default:\n // Send unimplemented response\n await this.sendUnimplemented(message);\n }\n }\n\n /** Handle bootstrap request */\n private async handleBootstrap(bootstrap: Bootstrap): Promise<void> {\n // Create answer entry\n this.answers.create(bootstrap.questionId);\n\n // Return the bootstrap capability\n const returnMsg: RpcMessage = {\n type: 'return',\n return: {\n answerId: bootstrap.questionId,\n releaseParamCaps: true,\n noFinishNeeded: false,\n result: {\n type: 'results',\n payload: {\n content: new Uint8Array(0),\n capTable: [],\n },\n },\n },\n };\n\n await this.sendWithLogging(returnMsg);\n this.answers.markReturnSent(bootstrap.questionId);\n }\n\n /** Handle incoming call */\n private async handleCall(call: Call): Promise<void> {\n // Create answer entry\n this.answers.create(call.questionId);\n\n // TODO: Dispatch to the appropriate capability/method\n // For Phase 1, we'll return a placeholder result\n\n const returnMsg: RpcMessage = {\n type: 'return',\n return: {\n answerId: call.questionId,\n releaseParamCaps: true,\n noFinishNeeded: false,\n result: {\n type: 'exception',\n exception: {\n reason: 'Method not implemented',\n type: 'unimplemented',\n },\n },\n },\n };\n\n await this.sendWithLogging(returnMsg);\n this.answers.markReturnSent(call.questionId);\n }\n\n /** Handle return message */\n private async handleReturn(ret: Return): Promise<void> {\n const question = this.questions.get(ret.answerId);\n if (!question) return;\n\n // Track pipeline resolution\n if (ret.result.type === 'results') {\n // Check if result contains a capability\n const capTable = ret.result.payload.capTable;\n if (capTable.length > 0) {\n const cap = capTable[0];\n if (cap.type === 'receiverHosted') {\n this.pipelineResolutions.resolveToCapability(ret.answerId, cap.importId);\n } else if (cap.type === 'thirdPartyHosted') {\n // Level 3: Handle third-party capability\n await this.handleThirdPartyCapability(ret.answerId, cap.thirdPartyCapId);\n }\n }\n } else if (ret.result.type === 'exception') {\n this.pipelineResolutions.resolveToException(ret.answerId, ret.result.exception.reason);\n }\n\n switch (ret.result.type) {\n case 'results':\n this.questions.complete(ret.answerId, ret.result.payload);\n break;\n case 'exception':\n this.questions.cancel(ret.answerId, new Error(ret.result.exception.reason));\n break;\n case 'canceled':\n this.questions.cancel(ret.answerId, new Error('Call canceled'));\n break;\n case 'acceptFromThirdParty':\n // Level 3: Need to contact third party to get results\n await this.handleAcceptFromThirdParty(ret.answerId, ret.result.thirdPartyCapId);\n break;\n default:\n this.questions.cancel(ret.answerId, new Error('Unknown return type'));\n }\n }\n\n /** Handle finish message */\n private async handleFinish(finish: Finish): Promise<void> {\n this.answers.markFinishReceived(finish.questionId);\n this.answers.remove(finish.questionId);\n }\n\n /** Handle resolve message (Level 1) */\n private async handleResolve(resolve: Resolve): Promise<void> {\n const { promiseId, resolution } = resolve;\n\n switch (resolution.type) {\n case 'cap':\n // The promise resolved to a capability\n // Update import table to mark as resolved\n this.imports.markResolved(promiseId);\n break;\n case 'exception':\n // The promise was broken\n // TODO: Handle broken promise - notify pending calls\n console.warn(`Promise ${promiseId} broken: ${resolution.exception.reason}`);\n break;\n }\n }\n\n /** Handle release message (Level 1) */\n private async handleRelease(release: Release): Promise<void> {\n const { id, referenceCount } = release;\n\n // Release the export\n const shouldRemove = this.exports.release(id, referenceCount);\n if (shouldRemove) {\n // Export is fully released, clean up any associated resources\n console.log(`Export ${id} fully released`);\n }\n }\n\n /** Handle disembargo message (Level 1) */\n private async handleDisembargo(disembargo: Disembargo): Promise<void> {\n const { target, context } = disembargo;\n\n // Level 3: Delegate to level3Handlers if available\n if (this.level3Handlers) {\n await this.level3Handlers.handleDisembargo(disembargo);\n return;\n }\n\n // Echo back the disembargo for loopback contexts\n if (context.type === 'senderLoopback') {\n // Echo back as receiverLoopback\n const echoMsg: RpcMessage = {\n type: 'disembargo',\n disembargo: {\n target,\n context: { type: 'receiverLoopback', embargoId: context.embargoId },\n },\n };\n await this.sendWithLogging(echoMsg);\n }\n // For other contexts (accept, provide), more complex handling is needed\n }\n\n /** Handle provide message (Level 3) */\n private async handleProvide(provide: Provide): Promise<void> {\n if (this.level3Handlers) {\n await this.level3Handlers.handleProvide(provide);\n } else {\n // Level 3 not enabled - send unimplemented\n await this.sendReturnException(provide.questionId, 'Level 3 RPC (Provide) not implemented');\n }\n }\n\n /** Handle accept message (Level 3) */\n private async handleAccept(accept: Accept): Promise<void> {\n if (this.level3Handlers) {\n await this.level3Handlers.handleAccept(accept);\n } else {\n // Level 3 not enabled - send unimplemented\n await this.sendReturnException(accept.questionId, 'Level 3 RPC (Accept) not implemented');\n }\n }\n\n /** Handle third-party capability in return results (Level 3) */\n private async handleThirdPartyCapability(\n _questionId: QuestionId,\n thirdPartyCapId: ThirdPartyCapId\n ): Promise<void> {\n if (this.level3Handlers) {\n const importId = await this.level3Handlers.handleThirdPartyCapability(thirdPartyCapId);\n if (importId !== undefined) {\n // Update the question result with the local import ID\n // This allows the caller to use the capability through the local import\n }\n }\n }\n\n /** Handle acceptFromThirdParty return type (Level 3) */\n private async handleAcceptFromThirdParty(\n questionId: QuestionId,\n thirdPartyCapId: ThirdPartyCapId\n ): Promise<void> {\n if (this.level3Handlers) {\n const importId = await this.level3Handlers.handleThirdPartyCapability(thirdPartyCapId);\n if (importId !== undefined) {\n // Complete the question with the resolved capability\n this.questions.complete(questionId, { importId });\n } else {\n this.questions.cancel(questionId, new Error('Failed to resolve third-party capability'));\n }\n } else {\n this.questions.cancel(questionId, new Error('Level 3 RPC not enabled'));\n }\n }\n\n /** Handle abort message */\n private handleAbort(_reason: string): void {\n this.running = false;\n this.questions.clear();\n this.answers.clear();\n this.imports.clear();\n this.exports.clear();\n this.queuedCalls.clear();\n this.pipelineResolutions.clear();\n }\n\n /** Handle disconnect */\n private handleDisconnect(_reason?: Error): void {\n this.running = false;\n this.questions.clear();\n this.answers.clear();\n this.imports.clear();\n this.exports.clear();\n this.queuedCalls.clear();\n this.pipelineResolutions.clear();\n }\n\n /** Handle error */\n private handleError(error: Error): void {\n console.error('RPC error:', error);\n }\n\n /** Send unimplemented response */\n private async sendUnimplemented(originalMessage: RpcMessage): Promise<void> {\n const msg: RpcMessage = {\n type: 'unimplemented',\n message: originalMessage,\n };\n await this.sendWithLogging(msg);\n }\n\n /** Send return exception (helper) */\n private async sendReturnException(questionId: QuestionId, reason: string): Promise<void> {\n const returnMsg: RpcMessage = {\n type: 'return',\n return: {\n answerId: questionId,\n releaseParamCaps: true,\n noFinishNeeded: false,\n result: {\n type: 'exception',\n exception: {\n reason,\n type: 'unimplemented',\n },\n },\n },\n };\n await this.sendWithLogging(returnMsg);\n }\n\n // ========================================================================================\n // Level 4 RPC Methods\n // ========================================================================================\n\n /**\n * Set the Level 4 handlers for this connection.\n * This enables reference equality verification support.\n */\n setLevel4Handlers(handlers: Level4Handlers): void {\n this.level4Handlers = handlers;\n }\n\n /**\n * Send a Join message to verify that two capabilities point to the same object.\n * Requires Level 4 handlers to be set.\n */\n async join(_target1: ImportId, _target2: ImportId): Promise<unknown> {\n if (!this.level4Handlers) {\n throw new Error('Level 4 handlers not set');\n }\n\n // This is a simplified implementation\n // In a full implementation, we'd use the Level4Handlers to send the Join\n return undefined;\n }\n\n /** Handle join message (Level 4) */\n private async handleJoin(join: Join): Promise<void> {\n if (this.level4Handlers) {\n await this.level4Handlers.handleJoin(join);\n } else {\n // Level 4 not enabled - send unimplemented\n await this.sendReturnException(join.questionId, 'Level 4 RPC (Join) not implemented');\n }\n }\n\n // ========================================================================================\n // Capability Management\n // ========================================================================================\n\n /** Import a capability from the remote peer */\n importCapability(importId: ImportId, isPromise = false): void {\n this.imports.add(importId, isPromise);\n }\n\n /** Export a capability to the remote peer */\n exportCapability(capability: unknown, isPromise = false): ExportId {\n const exportEntry = this.exports.add(capability, isPromise);\n return exportEntry.id;\n }\n\n /** Get an imported capability */\n getImport(importId: ImportId) {\n return this.imports.get(importId);\n }\n\n /** Get an exported capability */\n getExport(exportId: ExportId) {\n return this.exports.get(exportId);\n }\n\n // ========================================================================================\n // Level 3 RPC Methods\n // ========================================================================================\n\n /**\n * Set the Level 3 handlers for this connection.\n * This enables three-way introduction support.\n */\n setLevel3Handlers(handlers: Level3Handlers): void {\n this.level3Handlers = handlers;\n }\n\n /**\n * Send a Provide message to offer a capability to a third party.\n * Requires Level 3 handlers to be set.\n */\n async provideToThirdParty(\n _target: { type: 'importedCap'; importId: ImportId },\n _recipient: VatId\n ): Promise<{ questionId: number; thirdPartyCapId: ThirdPartyCapId } | undefined> {\n if (!this.level3Handlers) {\n throw new Error('Level 3 handlers not set');\n }\n\n // This is a simplified implementation\n // In a full implementation, we'd send the Provide message and wait for response\n return undefined;\n }\n\n // ========================================================================================\n // Phase 7: Dynamic Schema Methods\n // ========================================================================================\n\n /**\n * Get dynamic schema information for a type from the remote server.\n * This allows runtime discovery of schema information for types not known at compile time.\n *\n * Results are cached to avoid repeated network requests for the same type.\n *\n * @param typeId - The unique type ID of the schema to fetch\n * @returns The schema node for the requested type\n * @throws Error if the schema cannot be fetched or parsed\n *\n * @example\n * ```typescript\n * const schema = await connection.getDynamicSchema(0x1234567890abcdefn);\n * console.log('Struct fields:', schema.structInfo?.fields);\n * ```\n */\n async getDynamicSchema(typeId: bigint): Promise<SchemaNode> {\n // Check cache first\n const cached = this.schemaCache.get(typeId);\n if (cached) {\n return cached;\n }\n\n // Check registry\n const registered = this.schemaRegistry.getNode(typeId);\n if (registered) {\n this.schemaCache.set(typeId, registered);\n return registered;\n }\n\n // Fetch from remote\n const schemaPayload = await this.fetchSchemaFromRemote({ type: 'byTypeId', typeId });\n\n // Parse the schema data\n const nodes = parseSchemaNodes(schemaPayload.schemaData);\n\n // Register all parsed nodes\n for (const node of nodes) {\n this.schemaRegistry.registerNode(node);\n this.schemaCache.set(node.id, node);\n }\n\n // Return the requested node\n const result = this.schemaRegistry.getNode(typeId);\n if (!result) {\n throw new Error(`Schema for type ${typeId.toString(16)} not found in response`);\n }\n\n return result;\n }\n\n /**\n * Get dynamic schema by type name.\n *\n * @param typeName - The fully qualified type name (e.g., \"foo.bar.MyStruct\")\n * @returns The schema node for the requested type\n * @throws Error if the schema cannot be fetched or parsed\n */\n async getDynamicSchemaByName(typeName: string): Promise<SchemaNode> {\n // Check registry by name\n const registered = this.schemaRegistry.getNodeByName(typeName);\n if (registered) {\n this.schemaCache.set(registered.id, registered);\n return registered;\n }\n\n // Fetch from remote\n const schemaPayload = await this.fetchSchemaFromRemote({ type: 'byTypeName', typeName });\n\n // Parse the schema data\n const nodes = parseSchemaNodes(schemaPayload.schemaData);\n\n // Register all parsed nodes\n for (const node of nodes) {\n this.schemaRegistry.registerNode(node);\n this.schemaCache.set(node.id, node);\n }\n\n // Return the requested node\n const result = this.schemaRegistry.getNodeByName(typeName);\n if (!result) {\n throw new Error(`Schema for type \"${typeName}\" not found in response`);\n }\n\n return result;\n }\n\n /**\n * Fetch schema information from the remote vat.\n * This is an internal method used by getDynamicSchema.\n *\n * @param target - The schema target specification\n * @returns The schema payload containing binary schema data\n * @throws Error if the request fails\n */\n private async fetchSchemaFromRemote(target: SchemaTarget): Promise<SchemaPayload> {\n if (!this.running) {\n throw new Error('Connection is not running');\n }\n\n const questionId = this.schemaQuestionIdCounter++;\n\n // Create schema request\n const requestData = serializeSchemaRequest({\n questionId,\n targetSchema: target,\n });\n\n // Send the request as a custom RPC message\n // In a full implementation, this would use a proper RPC interface\n // For now, we use a simplified approach with a custom message type\n const schemaRequestMsg: RpcMessage = {\n type: 'call',\n call: {\n questionId,\n target: { type: 'importedCap', importId: 0 }, // Schema capability ID\n interfaceId: BigInt('0x1234567890abcdef'), // Schema interface ID\n methodId: 0, // getSchema method\n allowThirdPartyTailCall: false,\n noPromisePipelining: false,\n onlyPromisePipeline: false,\n params: {\n content: requestData,\n capTable: [],\n },\n sendResultsTo: { type: 'caller' },\n },\n };\n\n await this.sendWithLogging(schemaRequestMsg);\n\n // Wait for response\n const question = this.questions.create();\n // Override the question ID to match our schema request\n (question as { id: number }).id = questionId;\n\n try {\n const result = await question.completionPromise;\n\n // Parse the response\n if (result && typeof result === 'object' && 'content' in result) {\n const response = deserializeSchemaResponse((result as { content: Uint8Array }).content);\n\n if (response.result.type === 'success') {\n return response.result.payload;\n }\n throw new Error(`Schema request failed: ${response.result.exception.reason}`);\n }\n\n throw new Error('Invalid schema response format');\n } catch (error) {\n this.questions.remove(questionId);\n throw error;\n }\n }\n\n /**\n * Get the schema registry for this connection.\n * The registry contains all schemas that have been fetched or registered.\n *\n * @returns The schema registry\n */\n getSchemaRegistry(): SchemaRegistry {\n return this.schemaRegistry;\n }\n\n /**\n * Register a schema node locally.\n * This can be used to pre-populate the schema cache or add custom schemas.\n *\n * @param node - The schema node to register\n */\n registerSchema(node: SchemaNode): void {\n this.schemaRegistry.registerNode(node);\n this.schemaCache.set(node.id, node);\n }\n\n /**\n * Clear the schema cache.\n * This forces subsequent getDynamicSchema calls to fetch from the remote server.\n */\n clearSchemaCache(): void {\n this.schemaCache.clear();\n }\n\n /**\n * Check if a schema is cached locally.\n *\n * @param typeId - The type ID to check\n * @returns True if the schema is in the cache\n */\n hasCachedSchema(typeId: bigint): boolean {\n return this.schemaCache.has(typeId) || this.schemaRegistry.hasNode(typeId);\n }\n\n /**\n * Register a schema provider for serving schema requests.\n * This allows the connection to respond to schema requests from remote peers.\n *\n * @param provider - The schema capability server to register\n */\n registerSchemaProvider(provider: import('./schema-capability.js').SchemaCapabilityServer): void {\n this.schemaProvider = provider;\n }\n\n /**\n * List all available schemas from the remote vat.\n * This requires the remote to support the schema listing capability.\n *\n * @returns Array of available schema information\n * @throws Error if the request fails or is not supported\n */\n async listAvailableSchemas(): Promise<Array<{ typeId: bigint; displayName: string }>> {\n if (!this.running) {\n throw new Error('Connection is not running');\n }\n\n const questionId = this.schemaQuestionIdCounter++;\n\n // Create list schemas request\n const requestData = serializeSchemaRequest({\n questionId,\n targetSchema: { type: 'allSchemas' },\n });\n\n const listRequestMsg: RpcMessage = {\n type: 'call',\n call: {\n questionId,\n target: { type: 'importedCap', importId: 0 },\n interfaceId: BigInt('0x1234567890abcdef'),\n methodId: 1, // listSchemas method\n allowThirdPartyTailCall: false,\n noPromisePipelining: false,\n onlyPromisePipeline: false,\n params: {\n content: requestData,\n capTable: [],\n },\n sendResultsTo: { type: 'caller' },\n },\n };\n\n await this.sendWithLogging(listRequestMsg);\n\n const question = this.questions.create();\n (question as { id: number }).id = questionId;\n\n try {\n const result = await question.completionPromise;\n\n if (result && typeof result === 'object' && 'content' in result) {\n const response = deserializeSchemaResponse((result as { content: Uint8Array }).content);\n\n if (response.result.type === 'success') {\n // Parse the list of schemas from the payload\n const nodes = parseSchemaNodes(response.result.payload.schemaData);\n return nodes.map((node) => ({\n typeId: node.id,\n displayName: node.displayName,\n }));\n }\n throw new Error(`List schemas failed: ${response.result.exception.reason}`);\n }\n\n throw new Error('Invalid list schemas response format');\n } catch (error) {\n this.questions.remove(questionId);\n throw error;\n }\n }\n\n /** Send a message with debug logging */\n private async sendWithLogging(message: RpcMessage): Promise<void> {\n if (this.debugLogger.isEnabled()) {\n this.debugLogger.log(`[RPC:SEND] ${message.type}`);\n }\n await this.transport.send(message);\n }\n\n /** Receive a message with debug logging */\n private async receiveWithLogging(): Promise<RpcMessage | null> {\n const message = await this.transport.receive();\n if (message !== null && this.debugLogger.isEnabled()) {\n this.debugLogger.log(`[RPC:RECV] ${message.type}`);\n }\n return message;\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { t as RpcConnection } from "./rpc-connection-CHjKsrMC.js";
2
+
3
+ export { RpcConnection };