@naeemo/capnp 0.2.0 → 0.3.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.
- package/README.md +5 -1
- package/README.zh.md +5 -1
- package/dist/codegen/cli-v3.js +206 -25
- package/dist/codegen/cli-v3.js.map +1 -1
- package/dist/index.cjs +2204 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +2176 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":[],"sources":["../src/core/pointer.ts","../src/core/segment.ts","../src/core/message-builder.ts","../src/core/list.ts","../src/core/message-reader.ts","../src/core/union.ts"],"sourcesContent":["/**\n * Cap'n Proto 指针编解码\n * 纯 TypeScript 实现\n */\n\nexport enum PointerTag {\n STRUCT = 0,\n LIST = 1,\n FAR = 2,\n OTHER = 3,\n}\n\nexport enum ElementSize {\n VOID = 0,\n BIT = 1,\n BYTE = 2,\n TWO_BYTES = 3,\n FOUR_BYTES = 4,\n EIGHT_BYTES = 5,\n POINTER = 6,\n COMPOSITE = 7,\n INLINE_COMPOSITE = 7, // Alias for COMPOSITE\n}\n\nexport interface StructPointer {\n tag: PointerTag.STRUCT;\n offset: number; // 字偏移(有符号)\n dataWords: number; // 数据段字数\n pointerCount: number; // 指针段字数\n}\n\nexport interface ListPointer {\n tag: PointerTag.LIST;\n offset: number;\n elementSize: ElementSize;\n elementCount: number;\n}\n\nexport interface FarPointer {\n tag: PointerTag.FAR;\n doubleFar: boolean;\n targetSegment: number;\n targetOffset: number;\n}\n\nexport type Pointer = StructPointer | ListPointer | FarPointer | { tag: PointerTag.OTHER };\n\n/**\n * 解码指针(64位)\n */\nexport function decodePointer(ptr: bigint): Pointer {\n const tag = Number(ptr & BigInt(3)) as PointerTag;\n\n switch (tag) {\n case PointerTag.STRUCT: {\n const offset = Number(ptr >> BigInt(2)) & 0x3fffffff;\n const signedOffset = offset >= 0x20000000 ? offset - 0x40000000 : offset;\n const dataWords = Number((ptr >> BigInt(32)) & BigInt(0xffff));\n const pointerCount = Number((ptr >> BigInt(48)) & BigInt(0xffff));\n return { tag, offset: signedOffset, dataWords, pointerCount };\n }\n\n case PointerTag.LIST: {\n const offset = Number(ptr >> BigInt(2)) & 0x3fffffff;\n const signedOffset = offset >= 0x20000000 ? offset - 0x40000000 : offset;\n const elementSize = Number((ptr >> BigInt(32)) & BigInt(7)) as ElementSize;\n const elementCount = Number((ptr >> BigInt(35)) & BigInt(0x1fffffff));\n return { tag, offset: signedOffset, elementSize, elementCount };\n }\n\n case PointerTag.FAR: {\n const doubleFar = Boolean((ptr >> BigInt(2)) & BigInt(1));\n const targetOffset = Number((ptr >> BigInt(3)) & BigInt(0x1fffffff));\n const targetSegment = Number((ptr >> BigInt(32)) & BigInt(0xffffffff));\n return { tag, doubleFar, targetSegment, targetOffset };\n }\n\n default:\n return { tag: PointerTag.OTHER };\n }\n}\n\n/**\n * 编码 Struct 指针\n */\nexport function encodeStructPointer(\n offset: number,\n dataWords: number,\n pointerCount: number\n): bigint {\n const offsetBits = BigInt(offset < 0 ? offset + 0x40000000 : offset) & BigInt(0x3fffffff);\n return (\n (offsetBits << BigInt(2)) |\n (BigInt(dataWords) << BigInt(32)) |\n (BigInt(pointerCount) << BigInt(48))\n );\n}\n\n/**\n * 编码 List 指针\n */\nexport function encodeListPointer(\n offset: number,\n elementSize: ElementSize,\n elementCount: number\n): bigint {\n const offsetBits = BigInt(offset < 0 ? offset + 0x40000000 : offset) & BigInt(0x3fffffff);\n return (\n (offsetBits << BigInt(2)) |\n BigInt(1) | // LIST tag\n (BigInt(elementSize) << BigInt(32)) |\n (BigInt(elementCount) << BigInt(35))\n );\n}\n\n/**\n * 编码 Far 指针\n */\nexport function encodeFarPointer(segment: number, offset: number, doubleFar = false): bigint {\n const offsetBits = BigInt(offset) & BigInt(0x1fffffff);\n const segmentBits = BigInt(segment) & BigInt(0xffffffff);\n\n return (\n (segmentBits << BigInt(32)) |\n (offsetBits << BigInt(3)) |\n (doubleFar ? BigInt(1) << BigInt(2) : BigInt(0)) |\n BigInt(2)\n ); // FAR tag\n}\n","/**\n * Cap'n Proto Segment 管理\n * 纯 TypeScript 实现\n */\n\nexport const WORD_SIZE = 8;\n\nexport class Segment {\n private buffer: ArrayBuffer;\n private view: DataView;\n private _size: number; // 当前已使用字节数\n\n constructor(initialCapacity = 1024) {\n this.buffer = new ArrayBuffer(initialCapacity);\n this.view = new DataView(this.buffer);\n this._size = 0;\n }\n\n /**\n * 从现有 buffer 创建(用于读取)\n */\n static fromBuffer(buffer: ArrayBuffer): Segment {\n const seg = new Segment(0);\n seg.buffer = buffer;\n seg.view = new DataView(buffer);\n seg._size = buffer.byteLength;\n return seg;\n }\n\n /**\n * 确保容量足够\n */\n private ensureCapacity(minBytes: number): void {\n if (this.buffer.byteLength >= minBytes) return;\n\n // 双倍扩展\n let newCapacity = this.buffer.byteLength * 2;\n while (newCapacity < minBytes) {\n newCapacity *= 2;\n }\n\n const newBuffer = new ArrayBuffer(newCapacity);\n new Uint8Array(newBuffer).set(new Uint8Array(this.buffer, 0, this._size));\n this.buffer = newBuffer;\n this.view = new DataView(newBuffer);\n }\n\n /**\n * 分配空间,返回字偏移\n */\n allocate(words: number): number {\n const bytes = words * WORD_SIZE;\n const offset = this._size;\n this.ensureCapacity(offset + bytes);\n this._size = offset + bytes;\n return offset / WORD_SIZE;\n }\n\n /**\n * 获取字(64位)\n */\n getWord(wordOffset: number): bigint {\n const byteOffset = wordOffset * WORD_SIZE;\n const low = BigInt(this.view.getUint32(byteOffset, true));\n const high = BigInt(this.view.getUint32(byteOffset + 4, true));\n return (high << BigInt(32)) | low;\n }\n\n /**\n * 设置字(64位)\n */\n setWord(wordOffset: number, value: bigint): void {\n const byteOffset = wordOffset * WORD_SIZE;\n this.view.setUint32(byteOffset, Number(value & BigInt(0xffffffff)), true);\n this.view.setUint32(byteOffset + 4, Number(value >> BigInt(32)), true);\n }\n\n /**\n * 获取原始 buffer(只读到 _size)\n */\n asUint8Array(): Uint8Array {\n return new Uint8Array(this.buffer, 0, this._size);\n }\n\n /**\n * 获取字数量\n */\n get wordCount(): number {\n return this._size / WORD_SIZE;\n }\n\n /**\n * 获取字节数量\n */\n get byteLength(): number {\n return this._size;\n }\n\n /**\n * 获取 DataView\n */\n get dataView(): DataView {\n return this.view;\n }\n}\n","/**\n * Cap'n Proto MessageBuilder\n * 纯 TypeScript 实现\n */\n\nimport { ListBuilder } from './list.js';\nimport { ElementSize, PointerTag, encodeListPointer, encodeStructPointer } from './pointer.js';\nimport { Segment, WORD_SIZE } from './segment.js';\n\nexport class MessageBuilder {\n private segment: Segment;\n private rootSet = false;\n\n constructor() {\n // 预留消息头空间(假设单段)\n this.segment = new Segment(1024);\n // 预留 8 字节给段大小\n this.segment.allocate(1);\n }\n\n /**\n * 初始化根结构\n */\n initRoot(dataWords: number, pointerCount: number): StructBuilder {\n if (this.rootSet) {\n throw new Error('Root already initialized');\n }\n\n // 分配根结构空间\n const size = dataWords + pointerCount;\n const structOffset = this.segment.allocate(size);\n\n // 在位置 0 写入根指针\n const rootPtr = encodeStructPointer(structOffset - 1, dataWords, pointerCount);\n this.segment.setWord(0, rootPtr);\n\n this.rootSet = true;\n\n return new StructBuilder(this, 0, structOffset, dataWords, pointerCount);\n }\n\n /**\n * 序列化为 ArrayBuffer\n */\n toArrayBuffer(): ArrayBuffer {\n const segmentData = this.segment.asUint8Array();\n const wordCount = this.segment.wordCount;\n\n // 构建消息头\n // 第一个字:段数量-1(低32位)和第一段大小(高32位)\n const header = new ArrayBuffer(8);\n const headerView = new DataView(header);\n headerView.setUint32(0, 0, true); // 段数量-1 = 0(单段)\n headerView.setUint32(4, wordCount, true); // 第一段大小\n\n // 合并头和数据\n const result = new Uint8Array(8 + segmentData.byteLength);\n result.set(new Uint8Array(header), 0);\n result.set(segmentData, 8);\n\n return result.buffer;\n }\n\n /**\n * 获取段(内部使用)\n */\n getSegment(): Segment {\n return this.segment;\n }\n}\n\n/**\n * 结构构建器\n */\nexport class StructBuilder {\n constructor(\n private message: MessageBuilder,\n private segmentIndex: number,\n private wordOffset: number,\n private dataWords: number,\n private pointerCount: number\n ) {}\n\n /**\n * 设置 bool 字段\n */\n setBool(bitOffset: number, value: boolean): void {\n const byteOffset = Math.floor(bitOffset / 8);\n const bitInByte = bitOffset % 8;\n const segment = this.message.getSegment();\n const view = segment.dataView;\n const offset = this.wordOffset * WORD_SIZE + byteOffset;\n\n const current = view.getUint8(offset);\n const newValue = value ? current | (1 << bitInByte) : current & ~(1 << bitInByte);\n view.setUint8(offset, newValue);\n }\n\n /**\n * 设置 int8 字段\n */\n setInt8(byteOffset: number, value: number): void {\n const segment = this.message.getSegment();\n segment.dataView.setInt8(this.wordOffset * WORD_SIZE + byteOffset, value);\n }\n\n /**\n * 设置 int16 字段\n */\n setInt16(byteOffset: number, value: number): void {\n const segment = this.message.getSegment();\n segment.dataView.setInt16(this.wordOffset * WORD_SIZE + byteOffset, value, true);\n }\n\n /**\n * 设置 int32 字段\n */\n setInt32(byteOffset: number, value: number): void {\n const segment = this.message.getSegment();\n segment.dataView.setInt32(this.wordOffset * WORD_SIZE + byteOffset, value, true);\n }\n\n /**\n * 设置 int64 字段\n */\n setInt64(byteOffset: number, value: bigint): void {\n const segment = this.message.getSegment();\n const offset = this.wordOffset * WORD_SIZE + byteOffset;\n segment.dataView.setUint32(offset, Number(value & BigInt(0xffffffff)), true);\n segment.dataView.setInt32(offset + 4, Number(value >> BigInt(32)), true);\n }\n\n /**\n * 设置 uint8 字段\n */\n setUint8(byteOffset: number, value: number): void {\n const segment = this.message.getSegment();\n segment.dataView.setUint8(this.wordOffset * WORD_SIZE + byteOffset, value);\n }\n\n /**\n * 设置 uint16 字段\n */\n setUint16(byteOffset: number, value: number): void {\n const segment = this.message.getSegment();\n segment.dataView.setUint16(this.wordOffset * WORD_SIZE + byteOffset, value, true);\n }\n\n /**\n * 设置 uint32 字段\n */\n setUint32(byteOffset: number, value: number): void {\n const segment = this.message.getSegment();\n segment.dataView.setUint32(this.wordOffset * WORD_SIZE + byteOffset, value, true);\n }\n\n /**\n * 设置 uint64 字段\n */\n setUint64(byteOffset: number, value: bigint): void {\n const segment = this.message.getSegment();\n const offset = this.wordOffset * WORD_SIZE + byteOffset;\n segment.dataView.setUint32(offset, Number(value & BigInt(0xffffffff)), true);\n segment.dataView.setUint32(offset + 4, Number(value >> BigInt(32)), true);\n }\n\n /**\n * 设置 float32 字段\n */\n setFloat32(byteOffset: number, value: number): void {\n const segment = this.message.getSegment();\n segment.dataView.setFloat32(this.wordOffset * WORD_SIZE + byteOffset, value, true);\n }\n\n /**\n * 设置 float64 字段\n */\n setFloat64(byteOffset: number, value: number): void {\n const segment = this.message.getSegment();\n segment.dataView.setFloat64(this.wordOffset * WORD_SIZE + byteOffset, value, true);\n }\n\n /**\n * 获取 uint16 字段(用于 UnionBuilder 读取 tag)\n */\n getUint16(byteOffset: number): number {\n const segment = this.message.getSegment();\n return segment.dataView.getUint16(this.wordOffset * WORD_SIZE + byteOffset, true);\n }\n\n /**\n * 设置文本字段\n */\n setText(pointerIndex: number, value: string): void {\n const ptrOffset = this.wordOffset + this.dataWords + pointerIndex;\n const segment = this.message.getSegment();\n\n // 编码文本\n const bytes = new TextEncoder().encode(`${value}\\0`);\n const wordCount = Math.ceil(bytes.length / WORD_SIZE);\n const listOffset = segment.allocate(wordCount);\n\n // 写入文本数据\n new Uint8Array(segment.dataView.buffer, listOffset * WORD_SIZE, bytes.length).set(bytes);\n\n // 写入指针\n const ptr = encodeListPointer(listOffset - ptrOffset - 1, ElementSize.BYTE, bytes.length);\n segment.setWord(ptrOffset, ptr);\n }\n\n /**\n * 初始化嵌套结构\n */\n initStruct(pointerIndex: number, dataWords: number, pointerCount: number): StructBuilder {\n const ptrOffset = this.wordOffset + this.dataWords + pointerIndex;\n const segment = this.message.getSegment();\n\n // 分配结构空间\n const size = dataWords + pointerCount;\n const structOffset = segment.allocate(size);\n\n // 写入指针\n const ptr = encodeStructPointer(structOffset - ptrOffset - 1, dataWords, pointerCount);\n segment.setWord(ptrOffset, ptr);\n\n return new StructBuilder(this.message, 0, structOffset, dataWords, pointerCount);\n }\n\n /**\n * 初始化列表\n */\n initList<T>(\n pointerIndex: number,\n elementSize: ElementSize,\n elementCount: number,\n structSize?: { dataWords: number; pointerCount: number }\n ): ListBuilder<T> {\n const ptrOffset = this.wordOffset + this.dataWords + pointerIndex;\n const segment = this.message.getSegment();\n\n // 计算列表大小\n let elementWords = 1;\n if (elementSize === ElementSize.BYTE) elementWords = 1;\n else if (elementSize === ElementSize.TWO_BYTES) elementWords = 1;\n else if (elementSize === ElementSize.FOUR_BYTES) elementWords = 1;\n else if (elementSize === ElementSize.EIGHT_BYTES) elementWords = 1;\n else if (elementSize === ElementSize.COMPOSITE && structSize) {\n elementWords = structSize.dataWords + structSize.pointerCount;\n }\n\n const totalWords = elementWords * elementCount;\n const listOffset = segment.allocate(totalWords);\n\n // 写入指针\n const ptr = encodeListPointer(listOffset - ptrOffset - 1, elementSize, elementCount);\n segment.setWord(ptrOffset, ptr);\n\n return new ListBuilder<T>(this.message, elementSize, elementCount, structSize, listOffset);\n }\n}\n","/**\n * Cap'n Proto List 实现\n * 纯 TypeScript\n */\n\nimport { type MessageBuilder, StructBuilder } from './message-builder.js';\nimport { type MessageReader, StructReader } from './message-reader.js';\nimport { ElementSize, type ListPointer, PointerTag, decodePointer } from './pointer.js';\nimport { type Segment, WORD_SIZE } from './segment.js';\n\n/**\n * ListReader - 读取列表\n */\nexport class ListReader<T> {\n private segment: Segment;\n private startOffset: number; // 字偏移\n private segmentIndex: number;\n\n constructor(\n private message: MessageReader,\n segmentIndex: number,\n private elementSize: ElementSize,\n private elementCount: number,\n private structSize: { dataWords: number; pointerCount: number } | undefined,\n wordOffset: number\n ) {\n this.segmentIndex = segmentIndex;\n this.segment = message.getSegment(segmentIndex)!;\n this.startOffset = wordOffset;\n }\n\n /**\n * 列表长度\n */\n get length(): number {\n return this.elementCount;\n }\n\n /**\n * 获取元素(基础类型)\n */\n getPrimitive(index: number): number | bigint {\n if (index < 0 || index >= this.elementCount) {\n throw new RangeError('Index out of bounds');\n }\n\n switch (this.elementSize) {\n case ElementSize.BIT: {\n const byteOffset = Math.floor(index / 8);\n const bitInByte = index % 8;\n const byte = this.segment.dataView.getUint8(this.startOffset * WORD_SIZE + byteOffset);\n return (byte & (1 << bitInByte)) !== 0 ? 1 : 0;\n }\n\n case ElementSize.BYTE:\n return this.segment.dataView.getUint8(this.startOffset * WORD_SIZE + index);\n\n case ElementSize.TWO_BYTES:\n return this.segment.dataView.getUint16(this.startOffset * WORD_SIZE + index * 2, true);\n\n case ElementSize.FOUR_BYTES:\n return this.segment.dataView.getUint32(this.startOffset * WORD_SIZE + index * 4, true);\n\n case ElementSize.EIGHT_BYTES: {\n const offset = this.startOffset * WORD_SIZE + index * 8;\n const low = BigInt(this.segment.dataView.getUint32(offset, true));\n const high = BigInt(this.segment.dataView.getUint32(offset + 4, true));\n return (high << BigInt(32)) | low;\n }\n\n default:\n throw new Error(`Unsupported element size: ${this.elementSize}`);\n }\n }\n\n /**\n * 获取结构元素\n */\n getStruct(index: number): StructReader {\n if (!this.structSize) {\n throw new Error('Not a struct list');\n }\n\n const { dataWords, pointerCount } = this.structSize;\n const size = dataWords + pointerCount;\n const offset = this.startOffset + index * size;\n\n return new StructReader(this.message, this.segmentIndex, offset, dataWords, pointerCount);\n }\n\n /**\n * 迭代器\n */\n *[Symbol.iterator](): Iterator<T> {\n for (let i = 0; i < this.elementCount; i++) {\n yield this.getPrimitive(i) as T;\n }\n }\n}\n\n/**\n * ListBuilder - 构建列表\n */\nexport class ListBuilder<_T> {\n private segment: Segment;\n private startOffset: number;\n\n constructor(\n private message: MessageBuilder,\n private elementSize: ElementSize,\n private elementCount: number,\n private structSize: { dataWords: number; pointerCount: number } | undefined,\n wordOffset: number\n ) {\n this.segment = message.getSegment();\n this.startOffset = wordOffset;\n }\n\n /**\n * 列表长度\n */\n get length(): number {\n return this.elementCount;\n }\n\n /**\n * 设置基础类型元素\n */\n setPrimitive(index: number, value: number | bigint): void {\n if (index < 0 || index >= this.elementCount) {\n throw new RangeError('Index out of bounds');\n }\n\n switch (this.elementSize) {\n case ElementSize.BIT: {\n const byteOffset = Math.floor(index / 8);\n const bitInByte = index % 8;\n const offset = this.startOffset * WORD_SIZE + byteOffset;\n const current = this.segment.dataView.getUint8(offset);\n const newValue = value ? current | (1 << bitInByte) : current & ~(1 << bitInByte);\n this.segment.dataView.setUint8(offset, newValue);\n break;\n }\n\n case ElementSize.BYTE:\n this.segment.dataView.setUint8(this.startOffset * WORD_SIZE + index, Number(value));\n break;\n\n case ElementSize.TWO_BYTES:\n this.segment.dataView.setUint16(\n this.startOffset * WORD_SIZE + index * 2,\n Number(value),\n true\n );\n break;\n\n case ElementSize.FOUR_BYTES:\n this.segment.dataView.setUint32(\n this.startOffset * WORD_SIZE + index * 4,\n Number(value),\n true\n );\n break;\n\n case ElementSize.EIGHT_BYTES: {\n const offset = this.startOffset * WORD_SIZE + index * 8;\n const bigValue = value as bigint;\n this.segment.dataView.setUint32(offset, Number(bigValue & BigInt(0xffffffff)), true);\n this.segment.dataView.setUint32(offset + 4, Number(bigValue >> BigInt(32)), true);\n break;\n }\n\n default:\n throw new Error(`Unsupported element size: ${this.elementSize}`);\n }\n }\n\n /**\n * 获取结构元素(用于修改)\n */\n getStruct(index: number): StructBuilder {\n if (!this.structSize) {\n throw new Error('Not a struct list');\n }\n\n const { dataWords, pointerCount } = this.structSize;\n const size = dataWords + pointerCount;\n const offset = this.startOffset + index * size;\n\n return new StructBuilder(this.message, 0, offset, dataWords, pointerCount);\n }\n}\n","/**\n * Cap'n Proto MessageReader\n * 纯 TypeScript 实现\n */\n\nimport { ListReader } from './list.js';\nimport {\n ElementSize,\n type FarPointer,\n type ListPointer,\n PointerTag,\n type StructPointer,\n decodePointer,\n} from './pointer.js';\nimport { Segment, WORD_SIZE } from './segment.js';\n\nexport class MessageReader {\n private segments: Segment[];\n\n constructor(buffer: ArrayBuffer | Uint8Array) {\n const uint8Array = buffer instanceof ArrayBuffer ? new Uint8Array(buffer) : buffer;\n\n // 初始化空段数组(用于无效消息)\n this.segments = [];\n\n // 检查最小大小(至少需要8字节的头部)\n if (uint8Array.byteLength < 8) {\n // 消息太小,视为空消息\n return;\n }\n\n // 解析消息头\n // 第一个字:段数量-1(低32位)和第一段大小(高32位)\n const view = new DataView(uint8Array.buffer, uint8Array.byteOffset, uint8Array.byteLength);\n const firstWordLow = view.getUint32(0, true);\n const firstWordHigh = view.getUint32(4, true);\n\n const segmentCount = (firstWordLow & 0xffffffff) + 1;\n const firstSegmentSize = firstWordHigh;\n\n let offset = 8;\n const segmentSizes: number[] = [firstSegmentSize];\n\n // 读取剩余段大小\n for (let i = 1; i < segmentCount; i++) {\n if (offset + 4 > uint8Array.byteLength) {\n // 消息过早结束,视为空消息\n this.segments = [];\n return;\n }\n segmentSizes.push(view.getUint32(offset, true));\n offset += 4;\n }\n\n // 对齐到 8 字节\n offset = (offset + 7) & ~7;\n\n // 检查是否有足够的空间容纳段表\n if (offset > uint8Array.byteLength) {\n this.segments = [];\n return;\n }\n\n // 创建段\n this.segments = [];\n for (const size of segmentSizes) {\n if (offset + size * WORD_SIZE > uint8Array.byteLength) {\n // 段数据不足,截断或视为空消息\n // 官方实现:返回已读取的部分\n break;\n }\n const segmentBuffer = uint8Array.slice(offset, offset + size * WORD_SIZE);\n this.segments.push(Segment.fromBuffer(segmentBuffer.buffer));\n offset += size * WORD_SIZE;\n }\n }\n\n /**\n * 获取根结构\n */\n getRoot(_dataWords: number, _pointerCount: number): StructReader {\n // root 指针在位置 0,解析它找到实际数据位置\n const segment = this.segments[0];\n const ptr = decodePointer(segment.getWord(0));\n\n if (ptr.tag === PointerTag.STRUCT) {\n const structPtr = ptr as StructPointer;\n const dataOffset = 1 + structPtr.offset; // 跳过指针本身\n return new StructReader(this, 0, dataOffset, structPtr.dataWords, structPtr.pointerCount);\n }\n\n if (ptr.tag === PointerTag.FAR) {\n // Far pointer: 指向另一个 segment 中的 landing pad\n const farPtr = ptr as FarPointer;\n const targetSegment = this.getSegment(farPtr.targetSegment);\n if (!targetSegment) {\n throw new Error(`Far pointer references non-existent segment ${farPtr.targetSegment}`);\n }\n\n if (farPtr.doubleFar) {\n // Double-far: landing pad 本身也是一个 far 指针\n // landing pad 位置: targetOffset 指向的位置\n const landingPadPtr = decodePointer(targetSegment.getWord(farPtr.targetOffset));\n if (landingPadPtr.tag !== PointerTag.FAR) {\n throw new Error('Double-far landing pad is not a far pointer');\n }\n const innerFarPtr = landingPadPtr as FarPointer;\n const finalSegment = this.getSegment(innerFarPtr.targetSegment);\n if (!finalSegment) {\n throw new Error(\n `Double-far references non-existent segment ${innerFarPtr.targetSegment}`\n );\n }\n // 实际的 struct 指针在 innerFarPtr.targetOffset\n const structPtr = decodePointer(\n finalSegment.getWord(innerFarPtr.targetOffset)\n ) as StructPointer;\n const dataOffset = innerFarPtr.targetOffset + 1 + structPtr.offset;\n return new StructReader(\n this,\n innerFarPtr.targetSegment,\n dataOffset,\n structPtr.dataWords,\n structPtr.pointerCount\n );\n }\n // Single-far: landing pad 是实际的 struct 指针\n const structPtr = decodePointer(targetSegment.getWord(farPtr.targetOffset)) as StructPointer;\n const dataOffset = farPtr.targetOffset + 1 + structPtr.offset;\n return new StructReader(\n this,\n farPtr.targetSegment,\n dataOffset,\n structPtr.dataWords,\n structPtr.pointerCount\n );\n }\n\n throw new Error(`Root pointer is not a struct or far pointer: ${ptr.tag}`);\n }\n\n /**\n * 获取段\n */\n getSegment(index: number): Segment | undefined {\n return this.segments[index];\n }\n\n /**\n * 解析指针,处理 far pointer 间接寻址\n * 返回 { segmentIndex, wordOffset, pointer },其中 pointer 是实际的 struct/list 指针\n */\n resolvePointer(\n segmentIndex: number,\n wordOffset: number\n ): { segmentIndex: number; wordOffset: number; pointer: StructPointer | ListPointer } | null {\n const segment = this.getSegment(segmentIndex);\n if (!segment) return null;\n\n const ptrValue = segment.getWord(wordOffset);\n if (ptrValue === 0n) return null;\n\n const ptr = decodePointer(ptrValue);\n\n if (ptr.tag === PointerTag.STRUCT || ptr.tag === PointerTag.LIST) {\n // 直接指针,计算目标偏移\n const targetOffset = wordOffset + 1 + ptr.offset;\n return {\n segmentIndex,\n wordOffset: targetOffset,\n pointer: ptr as StructPointer | ListPointer,\n };\n }\n\n if (ptr.tag === PointerTag.FAR) {\n const farPtr = ptr as FarPointer;\n const targetSegment = this.getSegment(farPtr.targetSegment);\n if (!targetSegment) return null;\n\n if (farPtr.doubleFar) {\n // Double-far: landing pad 指向另一个 far 指针\n const landingPadPtr = decodePointer(targetSegment.getWord(farPtr.targetOffset));\n if (landingPadPtr.tag !== PointerTag.FAR) return null;\n const innerFarPtr = landingPadPtr as FarPointer;\n const finalSegment = this.getSegment(innerFarPtr.targetSegment);\n if (!finalSegment) return null;\n const finalPtr = decodePointer(finalSegment.getWord(innerFarPtr.targetOffset));\n if (finalPtr.tag !== PointerTag.STRUCT && finalPtr.tag !== PointerTag.LIST) return null;\n const targetOffset = innerFarPtr.targetOffset + 1 + finalPtr.offset;\n return {\n segmentIndex: innerFarPtr.targetSegment,\n wordOffset: targetOffset,\n pointer: finalPtr as StructPointer | ListPointer,\n };\n }\n // Single-far: landing pad 是实际的指针\n const landingPadPtr = decodePointer(targetSegment.getWord(farPtr.targetOffset));\n if (landingPadPtr.tag !== PointerTag.STRUCT && landingPadPtr.tag !== PointerTag.LIST)\n return null;\n const targetOffset = farPtr.targetOffset + 1 + landingPadPtr.offset;\n return {\n segmentIndex: farPtr.targetSegment,\n wordOffset: targetOffset,\n pointer: landingPadPtr as StructPointer | ListPointer,\n };\n }\n\n return null;\n }\n\n /**\n * 段数量\n */\n get segmentCount(): number {\n return this.segments.length;\n }\n}\n\n/**\n * 结构读取器\n */\nexport class StructReader {\n constructor(\n private message: MessageReader,\n private segmentIndex: number,\n private wordOffset: number,\n private dataWords: number,\n private pointerCount: number\n ) {}\n\n /**\n * 获取 bool 字段\n */\n getBool(bitOffset: number): boolean {\n const byteOffset = Math.floor(bitOffset / 8);\n const bitInByte = bitOffset % 8;\n const segment = this.message.getSegment(this.segmentIndex)!;\n const byte = segment.dataView.getUint8(this.wordOffset * WORD_SIZE + byteOffset);\n return (byte & (1 << bitInByte)) !== 0;\n }\n\n /**\n * 获取 int8 字段\n */\n getInt8(byteOffset: number): number {\n const segment = this.message.getSegment(this.segmentIndex)!;\n return segment.dataView.getInt8(this.wordOffset * WORD_SIZE + byteOffset);\n }\n\n /**\n * 获取 int16 字段\n */\n getInt16(byteOffset: number): number {\n const segment = this.message.getSegment(this.segmentIndex)!;\n return segment.dataView.getInt16(this.wordOffset * WORD_SIZE + byteOffset, true);\n }\n\n /**\n * 获取 int32 字段\n */\n getInt32(byteOffset: number): number {\n const segment = this.message.getSegment(this.segmentIndex)!;\n return segment.dataView.getInt32(this.wordOffset * WORD_SIZE + byteOffset, true);\n }\n\n /**\n * 获取 int64 字段\n */\n getInt64(byteOffset: number): bigint {\n const segment = this.message.getSegment(this.segmentIndex)!;\n const offset = this.wordOffset * WORD_SIZE + byteOffset;\n const low = BigInt(segment.dataView.getUint32(offset, true));\n const high = BigInt(segment.dataView.getInt32(offset + 4, true));\n return (high << BigInt(32)) | low;\n }\n\n /**\n * 获取 uint8 字段\n */\n getUint8(byteOffset: number): number {\n const segment = this.message.getSegment(this.segmentIndex)!;\n return segment.dataView.getUint8(this.wordOffset * WORD_SIZE + byteOffset);\n }\n\n /**\n * 获取 uint16 字段\n */\n getUint16(byteOffset: number): number {\n const segment = this.message.getSegment(this.segmentIndex)!;\n return segment.dataView.getUint16(this.wordOffset * WORD_SIZE + byteOffset, true);\n }\n\n /**\n * 获取 uint32 字段\n */\n getUint32(byteOffset: number): number {\n const segment = this.message.getSegment(this.segmentIndex)!;\n return segment.dataView.getUint32(this.wordOffset * WORD_SIZE + byteOffset, true);\n }\n\n /**\n * 获取 uint64 字段\n */\n getUint64(byteOffset: number): bigint {\n const segment = this.message.getSegment(this.segmentIndex)!;\n const offset = this.wordOffset * WORD_SIZE + byteOffset;\n const low = BigInt(segment.dataView.getUint32(offset, true));\n const high = BigInt(segment.dataView.getUint32(offset + 4, true));\n return (high << BigInt(32)) | low;\n }\n\n /**\n * 获取 float32 字段\n */\n getFloat32(byteOffset: number): number {\n const segment = this.message.getSegment(this.segmentIndex)!;\n return segment.dataView.getFloat32(this.wordOffset * WORD_SIZE + byteOffset, true);\n }\n\n /**\n * 获取 float64 字段\n */\n getFloat64(byteOffset: number): number {\n const segment = this.message.getSegment(this.segmentIndex)!;\n return segment.dataView.getFloat64(this.wordOffset * WORD_SIZE + byteOffset, true);\n }\n\n /**\n * 获取文本字段\n */\n getText(pointerIndex: number): string {\n const ptrOffset = this.wordOffset + this.dataWords + pointerIndex;\n const resolved = this.message.resolvePointer(this.segmentIndex, ptrOffset);\n\n if (!resolved) return '';\n\n const { segmentIndex, wordOffset, pointer } = resolved;\n if (pointer.tag !== PointerTag.LIST) return '';\n\n const listPtr = pointer as ListPointer;\n const segment = this.message.getSegment(segmentIndex)!;\n\n // Text is stored as List(UInt8) with NUL terminator\n // elementCount includes the NUL terminator\n const byteLength = listPtr.elementCount > 0 ? listPtr.elementCount - 1 : 0;\n if (byteLength === 0) return '';\n\n // 读取文本字节\n const bytes = new Uint8Array(segment.dataView.buffer, wordOffset * WORD_SIZE, byteLength);\n return new TextDecoder().decode(bytes);\n }\n\n /**\n * 获取嵌套结构\n */\n getStruct(\n pointerIndex: number,\n _dataWords: number,\n _pointerCount: number\n ): StructReader | undefined {\n const ptrOffset = this.wordOffset + this.dataWords + pointerIndex;\n const resolved = this.message.resolvePointer(this.segmentIndex, ptrOffset);\n\n if (!resolved) return undefined;\n\n const { segmentIndex, wordOffset, pointer } = resolved;\n if (pointer.tag !== PointerTag.STRUCT) return undefined;\n\n const structPtr = pointer as StructPointer;\n\n return new StructReader(\n this.message,\n segmentIndex,\n wordOffset,\n structPtr.dataWords,\n structPtr.pointerCount\n );\n }\n\n /**\n * 获取列表\n */\n getList<T>(\n pointerIndex: number,\n _elementSize: ElementSize,\n structSize?: { dataWords: number; pointerCount: number }\n ): ListReader<T> | undefined {\n const ptrOffset = this.wordOffset + this.dataWords + pointerIndex;\n const resolved = this.message.resolvePointer(this.segmentIndex, ptrOffset);\n\n if (!resolved) return undefined;\n\n const { segmentIndex, wordOffset, pointer } = resolved;\n if (pointer.tag !== PointerTag.LIST) return undefined;\n\n const listPtr = pointer as ListPointer;\n let targetOffset = wordOffset;\n let elementCount = listPtr.elementCount;\n let actualStructSize = structSize;\n const segment = this.message.getSegment(segmentIndex)!;\n\n // For INLINE_COMPOSITE lists, read the tag word\n if (listPtr.elementSize === ElementSize.COMPOSITE) {\n const tagWord = segment.getWord(targetOffset);\n // Tag word: elementCount (32 bits) | dataWords (16 bits) | pointerCount (16 bits)\n elementCount = Number(tagWord & BigInt(0xffffffff));\n const dataWords = Number((tagWord >> BigInt(32)) & BigInt(0xffff));\n const pointerCount = Number((tagWord >> BigInt(48)) & BigInt(0xffff));\n actualStructSize = { dataWords, pointerCount };\n targetOffset += 1; // Skip tag word\n }\n\n return new ListReader<T>(\n this.message,\n segmentIndex,\n listPtr.elementSize,\n elementCount,\n actualStructSize,\n targetOffset\n );\n }\n}\n","/**\n * Cap'n Proto Union 支持\n * 纯 TypeScript 实现\n */\n\nimport { MessageBuilder, type StructBuilder } from './message-builder.js';\nimport { MessageReader, type StructReader } from './message-reader.js';\nimport { ElementSize } from './pointer.js';\n\n/**\n * UnionReader - 读取 Union 的 tag 和 variant\n */\nexport class UnionReader {\n constructor(\n private struct: StructReader,\n private tagOffset: number, // tag 的字节偏移\n private variants: Map<number, string> // tag 值 -> variant 名称\n ) {}\n\n /**\n * 获取当前激活的 variant tag\n */\n getTag(): number {\n return this.struct.getUint16(this.tagOffset);\n }\n\n /**\n * 获取当前激活的 variant 名称\n */\n getVariantName(): string | undefined {\n return this.variants.get(this.getTag());\n }\n\n /**\n * 检查是否是某个 variant\n */\n is(variantTag: number): boolean {\n return this.getTag() === variantTag;\n }\n}\n\n/**\n * UnionBuilder - 设置 Union 的 tag 和 variant\n */\nexport class UnionBuilder {\n constructor(\n private struct: StructBuilder,\n private tagOffset: number\n ) {}\n\n /**\n * 获取当前 tag\n */\n getTag(): number {\n return this.struct.getUint16(this.tagOffset);\n }\n\n /**\n * 设置 tag\n */\n setTag(tag: number): void {\n this.struct.setUint16(this.tagOffset, tag);\n }\n\n /**\n * 初始化某个 variant(自动设置 tag)\n */\n initVariant(tag: number, initFn: () => void): void {\n this.setTag(tag);\n initFn();\n }\n}\n\n/**\n * 创建 UnionReader 的工厂函数\n */\nexport function createUnionReader(\n struct: StructReader,\n tagOffset: number,\n variants: Record<number, string>\n): UnionReader {\n return new UnionReader(\n struct,\n tagOffset,\n new Map(Object.entries(variants).map(([k, v]) => [Number(k), v]))\n );\n}\n\n/**\n * 创建 UnionBuilder 的工厂函数\n */\nexport function createUnionBuilder(struct: StructBuilder, tagOffset: number): UnionBuilder {\n return new UnionBuilder(struct, tagOffset);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":[],"sources":["../src/core/pointer.ts","../src/core/segment.ts","../src/core/message-builder.ts","../src/core/list.ts","../src/core/message-reader.ts","../src/core/union.ts","../src/rpc/message-serializer.ts","../src/rpc/websocket-transport.ts","../src/rpc/four-tables.ts","../src/rpc/pipeline.ts","../src/rpc/rpc-connection.ts","../src/rpc/capability-client.ts","../src/rpc/sturdyrefs.ts","../src/rpc/performance.ts"],"sourcesContent":["/**\n * Cap'n Proto 指针编解码\n * 纯 TypeScript 实现\n */\n\nexport enum PointerTag {\n STRUCT = 0,\n LIST = 1,\n FAR = 2,\n OTHER = 3,\n}\n\nexport enum ElementSize {\n VOID = 0,\n BIT = 1,\n BYTE = 2,\n TWO_BYTES = 3,\n FOUR_BYTES = 4,\n EIGHT_BYTES = 5,\n POINTER = 6,\n COMPOSITE = 7,\n INLINE_COMPOSITE = 7, // Alias for COMPOSITE\n}\n\nexport interface StructPointer {\n tag: PointerTag.STRUCT;\n offset: number; // 字偏移(有符号)\n dataWords: number; // 数据段字数\n pointerCount: number; // 指针段字数\n}\n\nexport interface ListPointer {\n tag: PointerTag.LIST;\n offset: number;\n elementSize: ElementSize;\n elementCount: number;\n}\n\nexport interface FarPointer {\n tag: PointerTag.FAR;\n doubleFar: boolean;\n targetSegment: number;\n targetOffset: number;\n}\n\nexport type Pointer = StructPointer | ListPointer | FarPointer | { tag: PointerTag.OTHER };\n\n/**\n * 解码指针(64位)\n */\nexport function decodePointer(ptr: bigint): Pointer {\n const tag = Number(ptr & BigInt(3)) as PointerTag;\n\n switch (tag) {\n case PointerTag.STRUCT: {\n const offset = Number(ptr >> BigInt(2)) & 0x3fffffff;\n const signedOffset = offset >= 0x20000000 ? offset - 0x40000000 : offset;\n const dataWords = Number((ptr >> BigInt(32)) & BigInt(0xffff));\n const pointerCount = Number((ptr >> BigInt(48)) & BigInt(0xffff));\n return { tag, offset: signedOffset, dataWords, pointerCount };\n }\n\n case PointerTag.LIST: {\n const offset = Number(ptr >> BigInt(2)) & 0x3fffffff;\n const signedOffset = offset >= 0x20000000 ? offset - 0x40000000 : offset;\n const elementSize = Number((ptr >> BigInt(32)) & BigInt(7)) as ElementSize;\n const elementCount = Number((ptr >> BigInt(35)) & BigInt(0x1fffffff));\n return { tag, offset: signedOffset, elementSize, elementCount };\n }\n\n case PointerTag.FAR: {\n const doubleFar = Boolean((ptr >> BigInt(2)) & BigInt(1));\n const targetOffset = Number((ptr >> BigInt(3)) & BigInt(0x1fffffff));\n const targetSegment = Number((ptr >> BigInt(32)) & BigInt(0xffffffff));\n return { tag, doubleFar, targetSegment, targetOffset };\n }\n\n default:\n return { tag: PointerTag.OTHER };\n }\n}\n\n/**\n * 编码 Struct 指针\n */\nexport function encodeStructPointer(\n offset: number,\n dataWords: number,\n pointerCount: number\n): bigint {\n const offsetBits = BigInt(offset < 0 ? offset + 0x40000000 : offset) & BigInt(0x3fffffff);\n return (\n (offsetBits << BigInt(2)) |\n (BigInt(dataWords) << BigInt(32)) |\n (BigInt(pointerCount) << BigInt(48))\n );\n}\n\n/**\n * 编码 List 指针\n */\nexport function encodeListPointer(\n offset: number,\n elementSize: ElementSize,\n elementCount: number\n): bigint {\n const offsetBits = BigInt(offset < 0 ? offset + 0x40000000 : offset) & BigInt(0x3fffffff);\n return (\n (offsetBits << BigInt(2)) |\n BigInt(1) | // LIST tag\n (BigInt(elementSize) << BigInt(32)) |\n (BigInt(elementCount) << BigInt(35))\n );\n}\n\n/**\n * 编码 Far 指针\n */\nexport function encodeFarPointer(segment: number, offset: number, doubleFar = false): bigint {\n const offsetBits = BigInt(offset) & BigInt(0x1fffffff);\n const segmentBits = BigInt(segment) & BigInt(0xffffffff);\n\n return (\n (segmentBits << BigInt(32)) |\n (offsetBits << BigInt(3)) |\n (doubleFar ? BigInt(1) << BigInt(2) : BigInt(0)) |\n BigInt(2)\n ); // FAR tag\n}\n","/**\n * Cap'n Proto Segment 管理\n * 纯 TypeScript 实现\n */\n\nexport const WORD_SIZE = 8;\n\nexport class Segment {\n private buffer: ArrayBuffer;\n private view: DataView;\n private _size: number; // 当前已使用字节数\n\n constructor(initialCapacity = 1024) {\n this.buffer = new ArrayBuffer(initialCapacity);\n this.view = new DataView(this.buffer);\n this._size = 0;\n }\n\n /**\n * 从现有 buffer 创建(用于读取)\n */\n static fromBuffer(buffer: ArrayBuffer): Segment {\n const seg = new Segment(0);\n seg.buffer = buffer;\n seg.view = new DataView(buffer);\n seg._size = buffer.byteLength;\n return seg;\n }\n\n /**\n * 确保容量足够\n */\n private ensureCapacity(minBytes: number): void {\n if (this.buffer.byteLength >= minBytes) return;\n\n // 双倍扩展\n let newCapacity = this.buffer.byteLength * 2;\n while (newCapacity < minBytes) {\n newCapacity *= 2;\n }\n\n const newBuffer = new ArrayBuffer(newCapacity);\n new Uint8Array(newBuffer).set(new Uint8Array(this.buffer, 0, this._size));\n this.buffer = newBuffer;\n this.view = new DataView(newBuffer);\n }\n\n /**\n * 分配空间,返回字偏移\n */\n allocate(words: number): number {\n const bytes = words * WORD_SIZE;\n const offset = this._size;\n this.ensureCapacity(offset + bytes);\n this._size = offset + bytes;\n return offset / WORD_SIZE;\n }\n\n /**\n * 获取字(64位)\n */\n getWord(wordOffset: number): bigint {\n const byteOffset = wordOffset * WORD_SIZE;\n const low = BigInt(this.view.getUint32(byteOffset, true));\n const high = BigInt(this.view.getUint32(byteOffset + 4, true));\n return (high << BigInt(32)) | low;\n }\n\n /**\n * 设置字(64位)\n */\n setWord(wordOffset: number, value: bigint): void {\n const byteOffset = wordOffset * WORD_SIZE;\n this.view.setUint32(byteOffset, Number(value & BigInt(0xffffffff)), true);\n this.view.setUint32(byteOffset + 4, Number(value >> BigInt(32)), true);\n }\n\n /**\n * 获取原始 buffer(只读到 _size)\n */\n asUint8Array(): Uint8Array {\n return new Uint8Array(this.buffer, 0, this._size);\n }\n\n /**\n * 获取底层 ArrayBuffer\n */\n getArrayBuffer(): ArrayBuffer {\n return this.buffer;\n }\n\n /**\n * 获取字数量\n */\n get wordCount(): number {\n return this._size / WORD_SIZE;\n }\n\n /**\n * 获取字节数量\n */\n get byteLength(): number {\n return this._size;\n }\n\n /**\n * 获取 DataView\n */\n get dataView(): DataView {\n return this.view;\n }\n}\n","/**\n * Cap'n Proto MessageBuilder\n * 纯 TypeScript 实现\n */\n\nimport { ListBuilder } from './list.js';\nimport { ElementSize, PointerTag, encodeListPointer, encodeStructPointer } from './pointer.js';\nimport { Segment, WORD_SIZE } from './segment.js';\n\nexport class MessageBuilder {\n private segment: Segment;\n private rootSet = false;\n\n constructor() {\n // 预留消息头空间(假设单段)\n this.segment = new Segment(1024);\n // 预留 8 字节给段大小\n this.segment.allocate(1);\n }\n\n /**\n * 初始化根结构\n */\n initRoot(dataWords: number, pointerCount: number): StructBuilder {\n if (this.rootSet) {\n throw new Error('Root already initialized');\n }\n\n // 分配根结构空间\n const size = dataWords + pointerCount;\n const structOffset = this.segment.allocate(size);\n\n // 在位置 0 写入根指针\n const rootPtr = encodeStructPointer(structOffset - 1, dataWords, pointerCount);\n this.segment.setWord(0, rootPtr);\n\n this.rootSet = true;\n\n return new StructBuilder(this, 0, structOffset, dataWords, pointerCount);\n }\n\n /**\n * 序列化为 ArrayBuffer\n */\n toArrayBuffer(): ArrayBuffer {\n const segmentData = this.segment.asUint8Array();\n const wordCount = this.segment.wordCount;\n\n // 构建消息头\n // 第一个字:段数量-1(低32位)和第一段大小(高32位)\n const header = new ArrayBuffer(8);\n const headerView = new DataView(header);\n headerView.setUint32(0, 0, true); // 段数量-1 = 0(单段)\n headerView.setUint32(4, wordCount, true); // 第一段大小\n\n // 合并头和数据\n const result = new Uint8Array(8 + segmentData.byteLength);\n result.set(new Uint8Array(header), 0);\n result.set(segmentData, 8);\n\n return result.buffer;\n }\n\n /**\n * 获取段(内部使用)\n */\n getSegment(): Segment {\n return this.segment;\n }\n}\n\n/**\n * 结构构建器\n */\nexport class StructBuilder {\n constructor(\n private message: MessageBuilder,\n private segmentIndex: number,\n private wordOffset: number,\n private dataWords: number,\n private pointerCount: number\n ) {}\n\n /**\n * 设置 bool 字段\n */\n setBool(bitOffset: number, value: boolean): void {\n const byteOffset = Math.floor(bitOffset / 8);\n const bitInByte = bitOffset % 8;\n const segment = this.message.getSegment();\n const view = segment.dataView;\n const offset = this.wordOffset * WORD_SIZE + byteOffset;\n\n const current = view.getUint8(offset);\n const newValue = value ? current | (1 << bitInByte) : current & ~(1 << bitInByte);\n view.setUint8(offset, newValue);\n }\n\n /**\n * 设置 int8 字段\n */\n setInt8(byteOffset: number, value: number): void {\n const segment = this.message.getSegment();\n segment.dataView.setInt8(this.wordOffset * WORD_SIZE + byteOffset, value);\n }\n\n /**\n * 设置 int16 字段\n */\n setInt16(byteOffset: number, value: number): void {\n const segment = this.message.getSegment();\n segment.dataView.setInt16(this.wordOffset * WORD_SIZE + byteOffset, value, true);\n }\n\n /**\n * 设置 int32 字段\n */\n setInt32(byteOffset: number, value: number): void {\n const segment = this.message.getSegment();\n segment.dataView.setInt32(this.wordOffset * WORD_SIZE + byteOffset, value, true);\n }\n\n /**\n * 设置 int64 字段\n */\n setInt64(byteOffset: number, value: bigint): void {\n const segment = this.message.getSegment();\n const offset = this.wordOffset * WORD_SIZE + byteOffset;\n segment.dataView.setUint32(offset, Number(value & BigInt(0xffffffff)), true);\n segment.dataView.setInt32(offset + 4, Number(value >> BigInt(32)), true);\n }\n\n /**\n * 设置 uint8 字段\n */\n setUint8(byteOffset: number, value: number): void {\n const segment = this.message.getSegment();\n segment.dataView.setUint8(this.wordOffset * WORD_SIZE + byteOffset, value);\n }\n\n /**\n * 设置 uint16 字段\n */\n setUint16(byteOffset: number, value: number): void {\n const segment = this.message.getSegment();\n segment.dataView.setUint16(this.wordOffset * WORD_SIZE + byteOffset, value, true);\n }\n\n /**\n * 设置 uint32 字段\n */\n setUint32(byteOffset: number, value: number): void {\n const segment = this.message.getSegment();\n segment.dataView.setUint32(this.wordOffset * WORD_SIZE + byteOffset, value, true);\n }\n\n /**\n * 设置 uint64 字段\n */\n setUint64(byteOffset: number, value: bigint): void {\n const segment = this.message.getSegment();\n const offset = this.wordOffset * WORD_SIZE + byteOffset;\n segment.dataView.setUint32(offset, Number(value & BigInt(0xffffffff)), true);\n segment.dataView.setUint32(offset + 4, Number(value >> BigInt(32)), true);\n }\n\n /**\n * 设置 float32 字段\n */\n setFloat32(byteOffset: number, value: number): void {\n const segment = this.message.getSegment();\n segment.dataView.setFloat32(this.wordOffset * WORD_SIZE + byteOffset, value, true);\n }\n\n /**\n * 设置 float64 字段\n */\n setFloat64(byteOffset: number, value: number): void {\n const segment = this.message.getSegment();\n segment.dataView.setFloat64(this.wordOffset * WORD_SIZE + byteOffset, value, true);\n }\n\n /**\n * 获取 uint16 字段(用于 UnionBuilder 读取 tag)\n */\n getUint16(byteOffset: number): number {\n const segment = this.message.getSegment();\n return segment.dataView.getUint16(this.wordOffset * WORD_SIZE + byteOffset, true);\n }\n\n /**\n * 设置文本字段\n */\n setText(pointerIndex: number, value: string): void {\n const ptrOffset = this.wordOffset + this.dataWords + pointerIndex;\n const segment = this.message.getSegment();\n\n // 编码文本\n const bytes = new TextEncoder().encode(`${value}\\0`);\n const wordCount = Math.ceil(bytes.length / WORD_SIZE);\n const listOffset = segment.allocate(wordCount);\n\n // 写入文本数据\n new Uint8Array(segment.dataView.buffer, listOffset * WORD_SIZE, bytes.length).set(bytes);\n\n // 写入指针\n const ptr = encodeListPointer(listOffset - ptrOffset - 1, ElementSize.BYTE, bytes.length);\n segment.setWord(ptrOffset, ptr);\n }\n\n /**\n * 初始化嵌套结构\n */\n initStruct(pointerIndex: number, dataWords: number, pointerCount: number): StructBuilder {\n const ptrOffset = this.wordOffset + this.dataWords + pointerIndex;\n const segment = this.message.getSegment();\n\n // 分配结构空间\n const size = dataWords + pointerCount;\n const structOffset = segment.allocate(size);\n\n // 写入指针\n const ptr = encodeStructPointer(structOffset - ptrOffset - 1, dataWords, pointerCount);\n segment.setWord(ptrOffset, ptr);\n\n return new StructBuilder(this.message, 0, structOffset, dataWords, pointerCount);\n }\n\n /**\n * 初始化列表\n */\n initList<T>(\n pointerIndex: number,\n elementSize: ElementSize,\n elementCount: number,\n structSize?: { dataWords: number; pointerCount: number }\n ): ListBuilder<T> {\n const ptrOffset = this.wordOffset + this.dataWords + pointerIndex;\n const segment = this.message.getSegment();\n\n // 计算列表大小\n let elementWords = 1;\n if (elementSize === ElementSize.BYTE) elementWords = 1;\n else if (elementSize === ElementSize.TWO_BYTES) elementWords = 1;\n else if (elementSize === ElementSize.FOUR_BYTES) elementWords = 1;\n else if (elementSize === ElementSize.EIGHT_BYTES) elementWords = 1;\n else if (elementSize === ElementSize.COMPOSITE && structSize) {\n elementWords = structSize.dataWords + structSize.pointerCount;\n }\n\n const totalWords = elementWords * elementCount;\n const listOffset = segment.allocate(totalWords);\n\n // 写入指针\n const ptr = encodeListPointer(listOffset - ptrOffset - 1, elementSize, elementCount);\n segment.setWord(ptrOffset, ptr);\n\n return new ListBuilder<T>(this.message, elementSize, elementCount, structSize, listOffset);\n }\n}\n","/**\n * Cap'n Proto List 实现\n * 纯 TypeScript\n */\n\nimport { type MessageBuilder, StructBuilder } from './message-builder.js';\nimport { type MessageReader, StructReader } from './message-reader.js';\nimport { ElementSize, type ListPointer, PointerTag, decodePointer } from './pointer.js';\nimport { type Segment, WORD_SIZE } from './segment.js';\n\n/**\n * ListReader - 读取列表\n */\nexport class ListReader<T> {\n private segment: Segment;\n private startOffset: number; // 字偏移\n private segmentIndex: number;\n\n constructor(\n private message: MessageReader,\n segmentIndex: number,\n private elementSize: ElementSize,\n private elementCount: number,\n private structSize: { dataWords: number; pointerCount: number } | undefined,\n wordOffset: number\n ) {\n this.segmentIndex = segmentIndex;\n this.segment = message.getSegment(segmentIndex)!;\n this.startOffset = wordOffset;\n }\n\n /**\n * 列表长度\n */\n get length(): number {\n return this.elementCount;\n }\n\n /**\n * 获取元素(基础类型)\n */\n getPrimitive(index: number): number | bigint {\n if (index < 0 || index >= this.elementCount) {\n throw new RangeError('Index out of bounds');\n }\n\n switch (this.elementSize) {\n case ElementSize.BIT: {\n const byteOffset = Math.floor(index / 8);\n const bitInByte = index % 8;\n const byte = this.segment.dataView.getUint8(this.startOffset * WORD_SIZE + byteOffset);\n return (byte & (1 << bitInByte)) !== 0 ? 1 : 0;\n }\n\n case ElementSize.BYTE:\n return this.segment.dataView.getUint8(this.startOffset * WORD_SIZE + index);\n\n case ElementSize.TWO_BYTES:\n return this.segment.dataView.getUint16(this.startOffset * WORD_SIZE + index * 2, true);\n\n case ElementSize.FOUR_BYTES:\n return this.segment.dataView.getUint32(this.startOffset * WORD_SIZE + index * 4, true);\n\n case ElementSize.EIGHT_BYTES: {\n const offset = this.startOffset * WORD_SIZE + index * 8;\n const low = BigInt(this.segment.dataView.getUint32(offset, true));\n const high = BigInt(this.segment.dataView.getUint32(offset + 4, true));\n return (high << BigInt(32)) | low;\n }\n\n default:\n throw new Error(`Unsupported element size: ${this.elementSize}`);\n }\n }\n\n /**\n * 获取结构元素\n */\n getStruct(index: number): StructReader {\n if (!this.structSize) {\n throw new Error('Not a struct list');\n }\n\n const { dataWords, pointerCount } = this.structSize;\n const size = dataWords + pointerCount;\n const offset = this.startOffset + index * size;\n\n return new StructReader(this.message, this.segmentIndex, offset, dataWords, pointerCount);\n }\n\n /**\n * 迭代器\n */\n *[Symbol.iterator](): Iterator<T> {\n for (let i = 0; i < this.elementCount; i++) {\n yield this.getPrimitive(i) as T;\n }\n }\n}\n\n/**\n * ListBuilder - 构建列表\n */\nexport class ListBuilder<_T> {\n private segment: Segment;\n private startOffset: number;\n\n constructor(\n private message: MessageBuilder,\n private elementSize: ElementSize,\n private elementCount: number,\n private structSize: { dataWords: number; pointerCount: number } | undefined,\n wordOffset: number\n ) {\n this.segment = message.getSegment();\n this.startOffset = wordOffset;\n }\n\n /**\n * 列表长度\n */\n get length(): number {\n return this.elementCount;\n }\n\n /**\n * 设置基础类型元素\n */\n setPrimitive(index: number, value: number | bigint): void {\n if (index < 0 || index >= this.elementCount) {\n throw new RangeError('Index out of bounds');\n }\n\n switch (this.elementSize) {\n case ElementSize.BIT: {\n const byteOffset = Math.floor(index / 8);\n const bitInByte = index % 8;\n const offset = this.startOffset * WORD_SIZE + byteOffset;\n const current = this.segment.dataView.getUint8(offset);\n const newValue = value ? current | (1 << bitInByte) : current & ~(1 << bitInByte);\n this.segment.dataView.setUint8(offset, newValue);\n break;\n }\n\n case ElementSize.BYTE:\n this.segment.dataView.setUint8(this.startOffset * WORD_SIZE + index, Number(value));\n break;\n\n case ElementSize.TWO_BYTES:\n this.segment.dataView.setUint16(\n this.startOffset * WORD_SIZE + index * 2,\n Number(value),\n true\n );\n break;\n\n case ElementSize.FOUR_BYTES:\n this.segment.dataView.setUint32(\n this.startOffset * WORD_SIZE + index * 4,\n Number(value),\n true\n );\n break;\n\n case ElementSize.EIGHT_BYTES: {\n const offset = this.startOffset * WORD_SIZE + index * 8;\n const bigValue = value as bigint;\n this.segment.dataView.setUint32(offset, Number(bigValue & BigInt(0xffffffff)), true);\n this.segment.dataView.setUint32(offset + 4, Number(bigValue >> BigInt(32)), true);\n break;\n }\n\n default:\n throw new Error(`Unsupported element size: ${this.elementSize}`);\n }\n }\n\n /**\n * 获取结构元素(用于修改)\n */\n getStruct(index: number): StructBuilder {\n if (!this.structSize) {\n throw new Error('Not a struct list');\n }\n\n const { dataWords, pointerCount } = this.structSize;\n const size = dataWords + pointerCount;\n const offset = this.startOffset + index * size;\n\n return new StructBuilder(this.message, 0, offset, dataWords, pointerCount);\n }\n}\n","/**\n * Cap'n Proto MessageReader\n * 纯 TypeScript 实现\n */\n\nimport { ListReader } from './list.js';\nimport {\n ElementSize,\n type FarPointer,\n type ListPointer,\n PointerTag,\n type StructPointer,\n decodePointer,\n} from './pointer.js';\nimport { Segment, WORD_SIZE } from './segment.js';\n\nexport class MessageReader {\n private segments: Segment[];\n\n constructor(buffer: ArrayBuffer | Uint8Array) {\n const uint8Array = buffer instanceof ArrayBuffer ? new Uint8Array(buffer) : buffer;\n\n // 初始化空段数组(用于无效消息)\n this.segments = [];\n\n // 检查最小大小(至少需要8字节的头部)\n if (uint8Array.byteLength < 8) {\n // 消息太小,视为空消息\n return;\n }\n\n // 解析消息头\n // 第一个字:段数量-1(低32位)和第一段大小(高32位)\n const view = new DataView(uint8Array.buffer, uint8Array.byteOffset, uint8Array.byteLength);\n const firstWordLow = view.getUint32(0, true);\n const firstWordHigh = view.getUint32(4, true);\n\n const segmentCount = (firstWordLow & 0xffffffff) + 1;\n const firstSegmentSize = firstWordHigh;\n\n let offset = 8;\n const segmentSizes: number[] = [firstSegmentSize];\n\n // 读取剩余段大小\n for (let i = 1; i < segmentCount; i++) {\n if (offset + 4 > uint8Array.byteLength) {\n // 消息过早结束,视为空消息\n this.segments = [];\n return;\n }\n segmentSizes.push(view.getUint32(offset, true));\n offset += 4;\n }\n\n // 对齐到 8 字节\n offset = (offset + 7) & ~7;\n\n // 检查是否有足够的空间容纳段表\n if (offset > uint8Array.byteLength) {\n this.segments = [];\n return;\n }\n\n // 创建段\n this.segments = [];\n for (const size of segmentSizes) {\n if (offset + size * WORD_SIZE > uint8Array.byteLength) {\n // 段数据不足,截断或视为空消息\n // 官方实现:返回已读取的部分\n break;\n }\n const segmentBuffer = uint8Array.slice(offset, offset + size * WORD_SIZE);\n this.segments.push(Segment.fromBuffer(segmentBuffer.buffer));\n offset += size * WORD_SIZE;\n }\n }\n\n /**\n * 获取根结构\n */\n getRoot(_dataWords: number, _pointerCount: number): StructReader {\n // root 指针在位置 0,解析它找到实际数据位置\n const segment = this.segments[0];\n const ptr = decodePointer(segment.getWord(0));\n\n if (ptr.tag === PointerTag.STRUCT) {\n const structPtr = ptr as StructPointer;\n const dataOffset = 1 + structPtr.offset; // 跳过指针本身\n return new StructReader(this, 0, dataOffset, structPtr.dataWords, structPtr.pointerCount);\n }\n\n if (ptr.tag === PointerTag.FAR) {\n // Far pointer: 指向另一个 segment 中的 landing pad\n const farPtr = ptr as FarPointer;\n const targetSegment = this.getSegment(farPtr.targetSegment);\n if (!targetSegment) {\n throw new Error(`Far pointer references non-existent segment ${farPtr.targetSegment}`);\n }\n\n if (farPtr.doubleFar) {\n // Double-far: landing pad 本身也是一个 far 指针\n // landing pad 位置: targetOffset 指向的位置\n const landingPadPtr = decodePointer(targetSegment.getWord(farPtr.targetOffset));\n if (landingPadPtr.tag !== PointerTag.FAR) {\n throw new Error('Double-far landing pad is not a far pointer');\n }\n const innerFarPtr = landingPadPtr as FarPointer;\n const finalSegment = this.getSegment(innerFarPtr.targetSegment);\n if (!finalSegment) {\n throw new Error(\n `Double-far references non-existent segment ${innerFarPtr.targetSegment}`\n );\n }\n // 实际的 struct 指针在 innerFarPtr.targetOffset\n const structPtr = decodePointer(\n finalSegment.getWord(innerFarPtr.targetOffset)\n ) as StructPointer;\n const dataOffset = innerFarPtr.targetOffset + 1 + structPtr.offset;\n return new StructReader(\n this,\n innerFarPtr.targetSegment,\n dataOffset,\n structPtr.dataWords,\n structPtr.pointerCount\n );\n }\n // Single-far: landing pad 是实际的 struct 指针\n const structPtr = decodePointer(targetSegment.getWord(farPtr.targetOffset)) as StructPointer;\n const dataOffset = farPtr.targetOffset + 1 + structPtr.offset;\n return new StructReader(\n this,\n farPtr.targetSegment,\n dataOffset,\n structPtr.dataWords,\n structPtr.pointerCount\n );\n }\n\n throw new Error(`Root pointer is not a struct or far pointer: ${ptr.tag}`);\n }\n\n /**\n * 获取段\n */\n getSegment(index: number): Segment | undefined {\n return this.segments[index];\n }\n\n /**\n * 解析指针,处理 far pointer 间接寻址\n * 返回 { segmentIndex, wordOffset, pointer },其中 pointer 是实际的 struct/list 指针\n */\n resolvePointer(\n segmentIndex: number,\n wordOffset: number\n ): { segmentIndex: number; wordOffset: number; pointer: StructPointer | ListPointer } | null {\n const segment = this.getSegment(segmentIndex);\n if (!segment) return null;\n\n const ptrValue = segment.getWord(wordOffset);\n if (ptrValue === 0n) return null;\n\n const ptr = decodePointer(ptrValue);\n\n if (ptr.tag === PointerTag.STRUCT || ptr.tag === PointerTag.LIST) {\n // 直接指针,计算目标偏移\n const targetOffset = wordOffset + 1 + ptr.offset;\n return {\n segmentIndex,\n wordOffset: targetOffset,\n pointer: ptr as StructPointer | ListPointer,\n };\n }\n\n if (ptr.tag === PointerTag.FAR) {\n const farPtr = ptr as FarPointer;\n const targetSegment = this.getSegment(farPtr.targetSegment);\n if (!targetSegment) return null;\n\n if (farPtr.doubleFar) {\n // Double-far: landing pad 指向另一个 far 指针\n const landingPadPtr = decodePointer(targetSegment.getWord(farPtr.targetOffset));\n if (landingPadPtr.tag !== PointerTag.FAR) return null;\n const innerFarPtr = landingPadPtr as FarPointer;\n const finalSegment = this.getSegment(innerFarPtr.targetSegment);\n if (!finalSegment) return null;\n const finalPtr = decodePointer(finalSegment.getWord(innerFarPtr.targetOffset));\n if (finalPtr.tag !== PointerTag.STRUCT && finalPtr.tag !== PointerTag.LIST) return null;\n const targetOffset = innerFarPtr.targetOffset + 1 + finalPtr.offset;\n return {\n segmentIndex: innerFarPtr.targetSegment,\n wordOffset: targetOffset,\n pointer: finalPtr as StructPointer | ListPointer,\n };\n }\n // Single-far: landing pad 是实际的指针\n const landingPadPtr = decodePointer(targetSegment.getWord(farPtr.targetOffset));\n if (landingPadPtr.tag !== PointerTag.STRUCT && landingPadPtr.tag !== PointerTag.LIST)\n return null;\n const targetOffset = farPtr.targetOffset + 1 + landingPadPtr.offset;\n return {\n segmentIndex: farPtr.targetSegment,\n wordOffset: targetOffset,\n pointer: landingPadPtr as StructPointer | ListPointer,\n };\n }\n\n return null;\n }\n\n /**\n * 段数量\n */\n get segmentCount(): number {\n return this.segments.length;\n }\n}\n\n/**\n * 结构读取器\n */\nexport class StructReader {\n constructor(\n private message: MessageReader,\n private segmentIndex: number,\n private wordOffset: number,\n private dataWords: number,\n private pointerCount: number\n ) {}\n\n /**\n * 获取 bool 字段\n */\n getBool(bitOffset: number): boolean {\n const byteOffset = Math.floor(bitOffset / 8);\n const bitInByte = bitOffset % 8;\n const segment = this.message.getSegment(this.segmentIndex)!;\n const byte = segment.dataView.getUint8(this.wordOffset * WORD_SIZE + byteOffset);\n return (byte & (1 << bitInByte)) !== 0;\n }\n\n /**\n * 获取 int8 字段\n */\n getInt8(byteOffset: number): number {\n const segment = this.message.getSegment(this.segmentIndex)!;\n return segment.dataView.getInt8(this.wordOffset * WORD_SIZE + byteOffset);\n }\n\n /**\n * 获取 int16 字段\n */\n getInt16(byteOffset: number): number {\n const segment = this.message.getSegment(this.segmentIndex)!;\n return segment.dataView.getInt16(this.wordOffset * WORD_SIZE + byteOffset, true);\n }\n\n /**\n * 获取 int32 字段\n */\n getInt32(byteOffset: number): number {\n const segment = this.message.getSegment(this.segmentIndex)!;\n return segment.dataView.getInt32(this.wordOffset * WORD_SIZE + byteOffset, true);\n }\n\n /**\n * 获取 int64 字段\n */\n getInt64(byteOffset: number): bigint {\n const segment = this.message.getSegment(this.segmentIndex)!;\n const offset = this.wordOffset * WORD_SIZE + byteOffset;\n const low = BigInt(segment.dataView.getUint32(offset, true));\n const high = BigInt(segment.dataView.getInt32(offset + 4, true));\n return (high << BigInt(32)) | low;\n }\n\n /**\n * 获取 uint8 字段\n */\n getUint8(byteOffset: number): number {\n const segment = this.message.getSegment(this.segmentIndex)!;\n return segment.dataView.getUint8(this.wordOffset * WORD_SIZE + byteOffset);\n }\n\n /**\n * 获取 uint16 字段\n */\n getUint16(byteOffset: number): number {\n const segment = this.message.getSegment(this.segmentIndex)!;\n return segment.dataView.getUint16(this.wordOffset * WORD_SIZE + byteOffset, true);\n }\n\n /**\n * 获取 uint32 字段\n */\n getUint32(byteOffset: number): number {\n const segment = this.message.getSegment(this.segmentIndex)!;\n return segment.dataView.getUint32(this.wordOffset * WORD_SIZE + byteOffset, true);\n }\n\n /**\n * 获取 uint64 字段\n */\n getUint64(byteOffset: number): bigint {\n const segment = this.message.getSegment(this.segmentIndex)!;\n const offset = this.wordOffset * WORD_SIZE + byteOffset;\n const low = BigInt(segment.dataView.getUint32(offset, true));\n const high = BigInt(segment.dataView.getUint32(offset + 4, true));\n return (high << BigInt(32)) | low;\n }\n\n /**\n * 获取 float32 字段\n */\n getFloat32(byteOffset: number): number {\n const segment = this.message.getSegment(this.segmentIndex)!;\n return segment.dataView.getFloat32(this.wordOffset * WORD_SIZE + byteOffset, true);\n }\n\n /**\n * 获取 float64 字段\n */\n getFloat64(byteOffset: number): number {\n const segment = this.message.getSegment(this.segmentIndex)!;\n return segment.dataView.getFloat64(this.wordOffset * WORD_SIZE + byteOffset, true);\n }\n\n /**\n * 获取文本字段\n */\n getText(pointerIndex: number): string {\n const ptrOffset = this.wordOffset + this.dataWords + pointerIndex;\n const resolved = this.message.resolvePointer(this.segmentIndex, ptrOffset);\n\n if (!resolved) return '';\n\n const { segmentIndex, wordOffset, pointer } = resolved;\n if (pointer.tag !== PointerTag.LIST) return '';\n\n const listPtr = pointer as ListPointer;\n const segment = this.message.getSegment(segmentIndex)!;\n\n // Text is stored as List(UInt8) with NUL terminator\n // elementCount includes the NUL terminator\n const byteLength = listPtr.elementCount > 0 ? listPtr.elementCount - 1 : 0;\n if (byteLength === 0) return '';\n\n // 读取文本字节\n const bytes = new Uint8Array(segment.dataView.buffer, wordOffset * WORD_SIZE, byteLength);\n return new TextDecoder().decode(bytes);\n }\n\n /**\n * 获取嵌套结构\n */\n getStruct(\n pointerIndex: number,\n _dataWords: number,\n _pointerCount: number\n ): StructReader | undefined {\n const ptrOffset = this.wordOffset + this.dataWords + pointerIndex;\n const resolved = this.message.resolvePointer(this.segmentIndex, ptrOffset);\n\n if (!resolved) return undefined;\n\n const { segmentIndex, wordOffset, pointer } = resolved;\n if (pointer.tag !== PointerTag.STRUCT) return undefined;\n\n const structPtr = pointer as StructPointer;\n\n return new StructReader(\n this.message,\n segmentIndex,\n wordOffset,\n structPtr.dataWords,\n structPtr.pointerCount\n );\n }\n\n /**\n * 获取列表\n */\n getList<T>(\n pointerIndex: number,\n _elementSize: ElementSize,\n structSize?: { dataWords: number; pointerCount: number }\n ): ListReader<T> | undefined {\n const ptrOffset = this.wordOffset + this.dataWords + pointerIndex;\n const resolved = this.message.resolvePointer(this.segmentIndex, ptrOffset);\n\n if (!resolved) return undefined;\n\n const { segmentIndex, wordOffset, pointer } = resolved;\n if (pointer.tag !== PointerTag.LIST) return undefined;\n\n const listPtr = pointer as ListPointer;\n let targetOffset = wordOffset;\n let elementCount = listPtr.elementCount;\n let actualStructSize = structSize;\n const segment = this.message.getSegment(segmentIndex)!;\n\n // For INLINE_COMPOSITE lists, read the tag word\n if (listPtr.elementSize === ElementSize.COMPOSITE) {\n const tagWord = segment.getWord(targetOffset);\n // Tag word: elementCount (32 bits) | dataWords (16 bits) | pointerCount (16 bits)\n elementCount = Number(tagWord & BigInt(0xffffffff));\n const dataWords = Number((tagWord >> BigInt(32)) & BigInt(0xffff));\n const pointerCount = Number((tagWord >> BigInt(48)) & BigInt(0xffff));\n actualStructSize = { dataWords, pointerCount };\n targetOffset += 1; // Skip tag word\n }\n\n return new ListReader<T>(\n this.message,\n segmentIndex,\n listPtr.elementSize,\n elementCount,\n actualStructSize,\n targetOffset\n );\n }\n}\n","/**\n * Cap'n Proto Union 支持\n * 纯 TypeScript 实现\n */\n\nimport { MessageBuilder, type StructBuilder } from './message-builder.js';\nimport { MessageReader, type StructReader } from './message-reader.js';\nimport { ElementSize } from './pointer.js';\n\n/**\n * UnionReader - 读取 Union 的 tag 和 variant\n */\nexport class UnionReader {\n constructor(\n private struct: StructReader,\n private tagOffset: number, // tag 的字节偏移\n private variants: Map<number, string> // tag 值 -> variant 名称\n ) {}\n\n /**\n * 获取当前激活的 variant tag\n */\n getTag(): number {\n return this.struct.getUint16(this.tagOffset);\n }\n\n /**\n * 获取当前激活的 variant 名称\n */\n getVariantName(): string | undefined {\n return this.variants.get(this.getTag());\n }\n\n /**\n * 检查是否是某个 variant\n */\n is(variantTag: number): boolean {\n return this.getTag() === variantTag;\n }\n}\n\n/**\n * UnionBuilder - 设置 Union 的 tag 和 variant\n */\nexport class UnionBuilder {\n constructor(\n private struct: StructBuilder,\n private tagOffset: number\n ) {}\n\n /**\n * 获取当前 tag\n */\n getTag(): number {\n return this.struct.getUint16(this.tagOffset);\n }\n\n /**\n * 设置 tag\n */\n setTag(tag: number): void {\n this.struct.setUint16(this.tagOffset, tag);\n }\n\n /**\n * 初始化某个 variant(自动设置 tag)\n */\n initVariant(tag: number, initFn: () => void): void {\n this.setTag(tag);\n initFn();\n }\n}\n\n/**\n * 创建 UnionReader 的工厂函数\n */\nexport function createUnionReader(\n struct: StructReader,\n tagOffset: number,\n variants: Record<number, string>\n): UnionReader {\n return new UnionReader(\n struct,\n tagOffset,\n new Map(Object.entries(variants).map(([k, v]) => [Number(k), v]))\n );\n}\n\n/**\n * 创建 UnionBuilder 的工厂函数\n */\nexport function createUnionBuilder(struct: StructBuilder, tagOffset: number): UnionBuilder {\n return new UnionBuilder(struct, tagOffset);\n}\n","/**\n * RPC Message Serialization\n *\n * Implements full serialization/deserialization of RPC messages using\n * the existing MessageBuilder/MessageReader infrastructure.\n *\n * Reference: rpc.capnp schema\n */\n\nimport { MessageBuilder, type StructBuilder } from '../core/message-builder.js';\nimport { MessageReader, type StructReader } from '../core/message-reader.js';\nimport { ElementSize } from '../core/pointer.js';\nimport type {\n Bootstrap,\n Call,\n CapDescriptor,\n Disembargo,\n Exception,\n Finish,\n MessageTarget,\n Payload,\n PromisedAnswer,\n PromisedAnswerOp,\n Provide,\n Release,\n Resolve,\n Return,\n RpcMessage,\n SendResultsTo,\n} from './rpc-types.js';\n\n// ========================================================================================\n// Constants from rpc.capnp schema\n// ========================================================================================\n\n// Message union tags\nconst MSG_UNIMPLEMENTED = 0;\nconst MSG_ABORT = 1;\nconst MSG_BOOTSTRAP = 8;\nconst MSG_CALL = 2;\nconst MSG_RETURN = 3;\nconst MSG_FINISH = 4;\nconst MSG_RESOLVE = 5;\nconst MSG_RELEASE = 6;\nconst MSG_DISEMBARGO = 13;\nconst MSG_PROVIDE = 10;\nconst MSG_ACCEPT = 11;\nconst MSG_JOIN = 12;\n\n// Return union tags\nconst RET_RESULTS = 0;\nconst RET_EXCEPTION = 1;\nconst RET_CANCELED = 2;\nconst RET_RESULTS_SENT_ELSEWHERE = 3;\nconst RET_TAKE_FROM_OTHER_QUESTION = 4;\nconst RET_ACCEPT_FROM_THIRD_PARTY = 5;\n\n// SendResultsTo union tags\nconst SEND_TO_CALLER = 0;\nconst SEND_TO_YOURSELF = 1;\nconst SEND_TO_THIRD_PARTY = 2;\n\n// MessageTarget union tags\nconst TARGET_IMPORTED_CAP = 0;\nconst TARGET_PROMISED_ANSWER = 1;\n\n// CapDescriptor union tags\nconst CAP_NONE = 0;\nconst CAP_SENDER_HOSTED = 1;\nconst CAP_SENDER_PROMISE = 2;\nconst CAP_RECEIVER_HOSTED = 3;\nconst CAP_RECEIVER_ANSWER = 4;\nconst CAP_THIRD_PARTY_HOSTED = 5;\n\n// Resolve union tags\nconst RESOLVE_CAP = 0;\nconst RESOLVE_EXCEPTION = 1;\n\n// Disembargo context union tags\nconst DISEMBARGO_SENDER_LOOPBACK = 0;\nconst DISEMBARGO_RECEIVER_LOOPBACK = 1;\nconst DISEMBARGO_ACCEPT = 2;\nconst DISEMBARGO_PROVIDE = 3;\n\n// PromisedAnswer.Op union tags\nconst OP_NOOP = 0;\nconst OP_GET_POINTER_FIELD = 1;\n\n// Exception type union tags\nconst EXC_FAILED = 0;\nconst EXC_OVERLOADED = 1;\nconst EXC_DISCONNECTED = 2;\nconst EXC_UNIMPLEMENTED = 3;\n\n// ========================================================================================\n// Serialization: RpcMessage -> Uint8Array\n// ========================================================================================\n\nexport function serializeRpcMessage(message: RpcMessage): Uint8Array {\n const builder = new MessageBuilder();\n // Message struct: 6 data words, 1 pointer\n // union + questionId/answerId/promiseId/etc + padding\n const root = builder.initRoot(6, 1);\n\n switch (message.type) {\n case 'unimplemented':\n serializeUnimplemented(root, message.message);\n break;\n case 'abort':\n serializeAbort(root, message.exception);\n break;\n case 'bootstrap':\n serializeBootstrap(root, message.bootstrap);\n break;\n case 'call':\n serializeCall(root, message.call);\n break;\n case 'return':\n serializeReturn(root, message.return);\n break;\n case 'finish':\n serializeFinish(root, message.finish);\n break;\n case 'resolve':\n serializeResolve(root, message.resolve);\n break;\n case 'release':\n serializeRelease(root, message.release);\n break;\n case 'disembargo':\n serializeDisembargo(root, message.disembargo);\n break;\n case 'provide':\n serializeProvide(root, message.provide);\n break;\n case 'accept':\n serializeAccept(root, message.accept);\n break;\n case 'join':\n serializeJoin(root, message.join);\n break;\n }\n\n return new Uint8Array(builder.toArrayBuffer());\n}\n\nfunction serializeUnimplemented(root: StructBuilder, message: RpcMessage): void {\n // Set union tag\n root.setUint16(0, MSG_UNIMPLEMENTED);\n // Serialize nested message in pointer 0\n const _nestedData = serializeRpcMessage(message);\n const nestedBuilder = root.initStruct(0, 0, 1);\n // Copy nested data into the struct's content pointer\n // For simplicity, we store the serialized message as data bytes\n // In a full implementation, we'd properly embed the message structure\n const _contentPtr = nestedBuilder.initStruct(0, 0, 0);\n // Store length and data\n // This is a simplified approach - proper implementation would parse the nested message\n}\n\nfunction serializeAbort(root: StructBuilder, exception: Exception): void {\n root.setUint16(0, MSG_ABORT);\n serializeException(root, 0, exception);\n}\n\nfunction serializeBootstrap(root: StructBuilder, bootstrap: Bootstrap): void {\n root.setUint16(0, MSG_BOOTSTRAP);\n root.setUint32(8, bootstrap.questionId);\n // deprecatedObjectId is deprecated, skip\n}\n\nfunction serializeCall(root: StructBuilder, call: Call): void {\n root.setUint16(0, MSG_CALL);\n root.setUint32(8, call.questionId);\n root.setUint64(16, call.interfaceId);\n root.setUint16(24, call.methodId);\n root.setBool(208, call.allowThirdPartyTailCall); // bit 208 = word 26, bit 0\n root.setBool(209, call.noPromisePipelining); // bit 209\n root.setBool(210, call.onlyPromisePipeline); // bit 210\n\n // Serialize target in pointer 0\n serializeMessageTarget(root.initStruct(0, 2, 1), call.target);\n\n // Serialize params in pointer 1\n serializePayload(root.initStruct(1, 2, 2), call.params);\n\n // Serialize sendResultsTo in pointer 2\n serializeSendResultsTo(root.initStruct(2, 2, 1), call.sendResultsTo);\n}\n\nfunction serializeReturn(root: StructBuilder, ret: Return): void {\n root.setUint16(0, MSG_RETURN);\n root.setUint32(8, ret.answerId);\n root.setBool(192, ret.releaseParamCaps); // bit 192 = word 24, bit 0\n root.setBool(193, ret.noFinishNeeded); // bit 193\n\n // Serialize result based on type\n switch (ret.result.type) {\n case 'results':\n root.setUint16(2, RET_RESULTS);\n serializePayload(root.initStruct(0, 2, 2), ret.result.payload);\n break;\n case 'exception':\n root.setUint16(2, RET_EXCEPTION);\n serializeException(root, 0, ret.result.exception);\n break;\n case 'canceled':\n root.setUint16(2, RET_CANCELED);\n break;\n case 'resultsSentElsewhere':\n root.setUint16(2, RET_RESULTS_SENT_ELSEWHERE);\n break;\n case 'takeFromOtherQuestion':\n root.setUint16(2, RET_TAKE_FROM_OTHER_QUESTION);\n root.setUint32(12, ret.result.questionId);\n break;\n case 'acceptFromThirdParty':\n root.setUint16(2, RET_ACCEPT_FROM_THIRD_PARTY);\n // ThirdPartyCapId in pointer 0\n break;\n }\n}\n\nfunction serializeFinish(root: StructBuilder, finish: Finish): void {\n root.setUint16(0, MSG_FINISH);\n root.setUint32(8, finish.questionId);\n root.setBool(192, finish.releaseResultCaps); // bit 192\n root.setBool(193, finish.requireEarlyCancellationWorkaround); // bit 193\n}\n\nfunction serializeResolve(root: StructBuilder, resolve: Resolve): void {\n root.setUint16(0, MSG_RESOLVE);\n root.setUint32(8, resolve.promiseId);\n\n switch (resolve.resolution.type) {\n case 'cap':\n root.setUint16(2, RESOLVE_CAP);\n serializeCapDescriptor(root.initStruct(0, 2, 1), resolve.resolution.cap);\n break;\n case 'exception':\n root.setUint16(2, RESOLVE_EXCEPTION);\n serializeException(root, 0, resolve.resolution.exception);\n break;\n }\n}\n\nfunction serializeRelease(root: StructBuilder, release: Release): void {\n root.setUint16(0, MSG_RELEASE);\n root.setUint32(8, release.id);\n root.setUint32(12, release.referenceCount);\n}\n\nfunction serializeDisembargo(root: StructBuilder, disembargo: Disembargo): void {\n root.setUint16(0, MSG_DISEMBARGO);\n serializeMessageTarget(root.initStruct(0, 2, 1), disembargo.target);\n\n switch (disembargo.context.type) {\n case 'senderLoopback':\n root.setUint16(2, DISEMBARGO_SENDER_LOOPBACK);\n root.setUint32(12, disembargo.context.embargoId);\n break;\n case 'receiverLoopback':\n root.setUint16(2, DISEMBARGO_RECEIVER_LOOPBACK);\n root.setUint32(12, disembargo.context.embargoId);\n break;\n case 'accept':\n root.setUint16(2, DISEMBARGO_ACCEPT);\n break;\n case 'provide':\n root.setUint16(2, DISEMBARGO_PROVIDE);\n root.setUint32(12, disembargo.context.questionId);\n break;\n }\n}\n\nfunction serializeProvide(root: StructBuilder, provide: Provide): void {\n root.setUint16(0, MSG_PROVIDE);\n root.setUint32(8, provide.questionId);\n serializeMessageTarget(root.initStruct(0, 2, 1), provide.target);\n // RecipientId in pointer 1 - placeholder\n}\n\nfunction serializeAccept(\n _root: StructBuilder,\n _accept: { provision: { id: Uint8Array }; embargo: boolean }\n): void {\n // Level 3 - not fully implemented\n}\n\nfunction serializeJoin(\n _root: StructBuilder,\n _join: { otherCap: MessageTarget; joinId: number }\n): void {\n // Level 4 - not fully implemented\n}\n\n// ========================================================================================\n// Supporting Type Serialization\n// ========================================================================================\n\nfunction serializeMessageTarget(builder: StructBuilder, target: MessageTarget): void {\n switch (target.type) {\n case 'importedCap':\n builder.setUint16(0, TARGET_IMPORTED_CAP);\n builder.setUint32(8, target.importId);\n break;\n case 'promisedAnswer':\n builder.setUint16(0, TARGET_PROMISED_ANSWER);\n serializePromisedAnswer(builder.initStruct(0, 2, 1), target.promisedAnswer);\n break;\n }\n}\n\nfunction serializePromisedAnswer(builder: StructBuilder, promisedAnswer: PromisedAnswer): void {\n builder.setUint32(0, promisedAnswer.questionId);\n // Transform list in pointer 0\n if (promisedAnswer.transform.length > 0) {\n const listBuilder = builder.initList(\n 0,\n ElementSize.INLINE_COMPOSITE,\n promisedAnswer.transform.length,\n {\n dataWords: 2,\n pointerCount: 0,\n }\n );\n for (let i = 0; i < promisedAnswer.transform.length; i++) {\n serializePromisedAnswerOp(listBuilder.getStruct(i), promisedAnswer.transform[i]);\n }\n }\n}\n\nfunction serializePromisedAnswerOp(builder: StructBuilder, op: PromisedAnswerOp): void {\n switch (op.type) {\n case 'noop':\n builder.setUint16(0, OP_NOOP);\n break;\n case 'getPointerField':\n builder.setUint16(0, OP_GET_POINTER_FIELD);\n builder.setUint16(8, op.fieldIndex);\n break;\n }\n}\n\nfunction serializePayload(builder: StructBuilder, payload: Payload): void {\n // Content (AnyPointer) - store as data bytes in pointer 0\n if (payload.content.length > 0) {\n // For now, store raw bytes - in full implementation this would be a proper struct\n const _contentBuilder = builder.initStruct(0, Math.ceil(payload.content.length / 8), 0);\n // Copy bytes into the struct\n }\n\n // Cap table list in pointer 1\n if (payload.capTable.length > 0) {\n const listBuilder = builder.initList(1, ElementSize.EIGHT_BYTES, payload.capTable.length, {\n dataWords: 2,\n pointerCount: 1,\n });\n for (let i = 0; i < payload.capTable.length; i++) {\n serializeCapDescriptor(listBuilder.getStruct(i), payload.capTable[i]);\n }\n }\n}\n\nfunction serializeCapDescriptor(builder: StructBuilder, cap: CapDescriptor): void {\n switch (cap.type) {\n case 'none':\n builder.setUint16(0, CAP_NONE);\n break;\n case 'senderHosted':\n builder.setUint16(0, CAP_SENDER_HOSTED);\n builder.setUint32(8, cap.exportId);\n break;\n case 'senderPromise':\n builder.setUint16(0, CAP_SENDER_PROMISE);\n builder.setUint32(8, cap.exportId);\n break;\n case 'receiverHosted':\n builder.setUint16(0, CAP_RECEIVER_HOSTED);\n builder.setUint32(8, cap.importId);\n break;\n case 'receiverAnswer':\n builder.setUint16(0, CAP_RECEIVER_ANSWER);\n serializePromisedAnswer(builder.initStruct(0, 2, 1), cap.promisedAnswer);\n break;\n case 'thirdPartyHosted':\n builder.setUint16(0, CAP_THIRD_PARTY_HOSTED);\n // ThirdPartyCapId in pointer 0\n break;\n }\n}\n\nfunction serializeSendResultsTo(builder: StructBuilder, sendTo: SendResultsTo): void {\n switch (sendTo.type) {\n case 'caller':\n builder.setUint16(0, SEND_TO_CALLER);\n break;\n case 'yourself':\n builder.setUint16(0, SEND_TO_YOURSELF);\n break;\n case 'thirdParty':\n builder.setUint16(0, SEND_TO_THIRD_PARTY);\n // RecipientId in pointer 0\n break;\n }\n}\n\nfunction serializeException(\n builder: StructBuilder,\n pointerIndex: number,\n exception: Exception\n): void {\n const excBuilder = builder.initStruct(pointerIndex, 2, 1);\n excBuilder.setText(0, exception.reason);\n\n // Exception type union\n switch (exception.type) {\n case 'failed':\n excBuilder.setUint16(0, EXC_FAILED);\n break;\n case 'overloaded':\n excBuilder.setUint16(0, EXC_OVERLOADED);\n break;\n case 'disconnected':\n excBuilder.setUint16(0, EXC_DISCONNECTED);\n break;\n case 'unimplemented':\n excBuilder.setUint16(0, EXC_UNIMPLEMENTED);\n break;\n }\n}\n\n// ========================================================================================\n// Deserialization: Uint8Array -> RpcMessage\n// ========================================================================================\n\nexport function deserializeRpcMessage(data: Uint8Array): RpcMessage {\n const reader = new MessageReader(data);\n const root = reader.getRoot(6, 1);\n\n const unionTag = root.getUint16(0);\n\n switch (unionTag) {\n case MSG_UNIMPLEMENTED:\n return { type: 'unimplemented', message: deserializeUnimplemented(root) };\n case MSG_ABORT:\n return { type: 'abort', exception: deserializeException(root, 0) };\n case MSG_BOOTSTRAP:\n return { type: 'bootstrap', bootstrap: deserializeBootstrap(root) };\n case MSG_CALL:\n return { type: 'call', call: deserializeCall(root) };\n case MSG_RETURN:\n return { type: 'return', return: deserializeReturn(root) };\n case MSG_FINISH:\n return { type: 'finish', finish: deserializeFinish(root) };\n case MSG_RESOLVE:\n return { type: 'resolve', resolve: deserializeResolve(root) };\n case MSG_RELEASE:\n return { type: 'release', release: deserializeRelease(root) };\n case MSG_DISEMBARGO:\n return { type: 'disembargo', disembargo: deserializeDisembargo(root) };\n case MSG_PROVIDE:\n return { type: 'provide', provide: deserializeProvide(root) };\n case MSG_ACCEPT:\n return { type: 'accept', accept: deserializeAccept(root) };\n case MSG_JOIN:\n return { type: 'join', join: deserializeJoin(root) };\n default:\n throw new Error(`Unknown message union tag: ${unionTag}`);\n }\n}\n\nfunction deserializeUnimplemented(_root: StructReader): RpcMessage {\n // For now, return a placeholder - full implementation would deserialize nested message\n return {\n type: 'abort',\n exception: { reason: 'Unimplemented message received', type: 'unimplemented' },\n };\n}\n\nfunction deserializeBootstrap(root: StructReader): Bootstrap {\n return {\n questionId: root.getUint32(8),\n };\n}\n\nfunction deserializeCall(root: StructReader): Call {\n const targetStruct = root.getStruct(0, 2, 1);\n const paramsStruct = root.getStruct(1, 2, 2);\n const sendToStruct = root.getStruct(2, 2, 1);\n\n return {\n questionId: root.getUint32(8),\n interfaceId: root.getUint64(16),\n methodId: root.getUint16(24),\n allowThirdPartyTailCall: root.getBool(208),\n noPromisePipelining: root.getBool(209),\n onlyPromisePipeline: root.getBool(210),\n target: targetStruct\n ? deserializeMessageTarget(targetStruct)\n : { type: 'importedCap', importId: 0 },\n params: paramsStruct\n ? deserializePayload(paramsStruct)\n : { content: new Uint8Array(0), capTable: [] },\n sendResultsTo: sendToStruct ? deserializeSendResultsTo(sendToStruct) : { type: 'caller' },\n };\n}\n\nfunction deserializeReturn(root: StructReader): Return {\n const resultTag = root.getUint16(2);\n let result: Return['result'];\n\n switch (resultTag) {\n case RET_RESULTS:\n result = {\n type: 'results',\n payload: root.getStruct(0, 2, 2)\n ? deserializePayload(root.getStruct(0, 2, 2)!)\n : { content: new Uint8Array(0), capTable: [] },\n };\n break;\n case RET_EXCEPTION:\n result = { type: 'exception', exception: deserializeException(root, 0) };\n break;\n case RET_CANCELED:\n result = { type: 'canceled' };\n break;\n case RET_RESULTS_SENT_ELSEWHERE:\n result = { type: 'resultsSentElsewhere' };\n break;\n case RET_TAKE_FROM_OTHER_QUESTION:\n result = { type: 'takeFromOtherQuestion', questionId: root.getUint32(12) };\n break;\n case RET_ACCEPT_FROM_THIRD_PARTY:\n result = { type: 'acceptFromThirdParty', thirdPartyCapId: { id: new Uint8Array(0) } };\n break;\n default:\n result = { type: 'canceled' };\n }\n\n return {\n answerId: root.getUint32(8),\n releaseParamCaps: root.getBool(192),\n noFinishNeeded: root.getBool(193),\n result,\n };\n}\n\nfunction deserializeFinish(root: StructReader): Finish {\n return {\n questionId: root.getUint32(8),\n releaseResultCaps: root.getBool(192),\n requireEarlyCancellationWorkaround: root.getBool(193),\n };\n}\n\nfunction deserializeResolve(root: StructReader): Resolve {\n const resolutionTag = root.getUint16(2);\n let resolution: Resolve['resolution'];\n\n switch (resolutionTag) {\n case RESOLVE_CAP:\n resolution = {\n type: 'cap',\n cap: root.getStruct(0, 2, 1)\n ? deserializeCapDescriptor(root.getStruct(0, 2, 1)!)\n : { type: 'none' },\n };\n break;\n case RESOLVE_EXCEPTION:\n resolution = { type: 'exception', exception: deserializeException(root, 0) };\n break;\n default:\n resolution = {\n type: 'exception',\n exception: { reason: 'Unknown resolution type', type: 'failed' },\n };\n }\n\n return {\n promiseId: root.getUint32(8),\n resolution,\n };\n}\n\nfunction deserializeRelease(root: StructReader): Release {\n return {\n id: root.getUint32(8),\n referenceCount: root.getUint32(12),\n };\n}\n\nfunction deserializeDisembargo(root: StructReader): Disembargo {\n const targetStruct = root.getStruct(0, 2, 1);\n const contextTag = root.getUint16(2);\n let context: Disembargo['context'];\n\n switch (contextTag) {\n case DISEMBARGO_SENDER_LOOPBACK:\n context = { type: 'senderLoopback', embargoId: root.getUint32(12) };\n break;\n case DISEMBARGO_RECEIVER_LOOPBACK:\n context = { type: 'receiverLoopback', embargoId: root.getUint32(12) };\n break;\n case DISEMBARGO_ACCEPT:\n context = { type: 'accept' };\n break;\n case DISEMBARGO_PROVIDE:\n context = { type: 'provide', questionId: root.getUint32(12) };\n break;\n default:\n context = { type: 'accept' };\n }\n\n return {\n target: targetStruct\n ? deserializeMessageTarget(targetStruct)\n : { type: 'importedCap', importId: 0 },\n context,\n };\n}\n\nfunction deserializeProvide(root: StructReader): Provide {\n const targetStruct = root.getStruct(0, 2, 1);\n return {\n questionId: root.getUint32(8),\n target: targetStruct\n ? deserializeMessageTarget(targetStruct)\n : { type: 'importedCap', importId: 0 },\n recipient: { id: new Uint8Array(0) },\n };\n}\n\nfunction deserializeAccept(_root: StructReader): {\n questionId: number;\n provision: { id: Uint8Array };\n embargo: boolean;\n} {\n // Level 3 - placeholder\n return { questionId: 0, provision: { id: new Uint8Array(0) }, embargo: false };\n}\n\nfunction deserializeJoin(_root: StructReader): {\n questionId: number;\n target: MessageTarget;\n otherCap: MessageTarget;\n joinId: number;\n} {\n // Level 4 - placeholder\n return {\n questionId: 0,\n target: { type: 'importedCap', importId: 0 },\n otherCap: { type: 'importedCap', importId: 0 },\n joinId: 0,\n };\n}\n\n// ========================================================================================\n// Supporting Type Deserialization\n// ========================================================================================\n\nfunction deserializeMessageTarget(root: StructReader): MessageTarget {\n const tag = root.getUint16(0);\n\n switch (tag) {\n case TARGET_IMPORTED_CAP:\n return { type: 'importedCap', importId: root.getUint32(8) };\n case TARGET_PROMISED_ANSWER: {\n const promisedAnswerStruct = root.getStruct(0, 2, 1);\n return {\n type: 'promisedAnswer',\n promisedAnswer: promisedAnswerStruct\n ? deserializePromisedAnswer(promisedAnswerStruct)\n : { questionId: 0, transform: [] },\n };\n }\n default:\n return { type: 'importedCap', importId: 0 };\n }\n}\n\nfunction deserializePromisedAnswer(root: StructReader): PromisedAnswer {\n const transformList = root.getList<StructReader>(0, ElementSize.INLINE_COMPOSITE, {\n dataWords: 2,\n pointerCount: 0,\n });\n const transform: PromisedAnswerOp[] = [];\n\n if (transformList) {\n for (let i = 0; i < transformList.length; i++) {\n transform.push(deserializePromisedAnswerOp(transformList.getStruct(i)));\n }\n }\n\n return {\n questionId: root.getUint32(0),\n transform,\n };\n}\n\nfunction deserializePromisedAnswerOp(root: StructReader): PromisedAnswerOp {\n const tag = root.getUint16(0);\n\n switch (tag) {\n case OP_NOOP:\n return { type: 'noop' };\n case OP_GET_POINTER_FIELD:\n return { type: 'getPointerField', fieldIndex: root.getUint16(8) };\n default:\n return { type: 'noop' };\n }\n}\n\nfunction deserializePayload(root: StructReader): Payload {\n // Content - for now, return empty\n // In full implementation, would deserialize the AnyPointer content\n const capTableList = root.getList<StructReader>(1, ElementSize.EIGHT_BYTES, {\n dataWords: 2,\n pointerCount: 1,\n });\n const capTable: CapDescriptor[] = [];\n\n if (capTableList) {\n for (let i = 0; i < capTableList.length; i++) {\n capTable.push(deserializeCapDescriptor(capTableList.getStruct(i)));\n }\n }\n\n return {\n content: new Uint8Array(0),\n capTable,\n };\n}\n\nfunction deserializeCapDescriptor(root: StructReader): CapDescriptor {\n const tag = root.getUint16(0);\n\n switch (tag) {\n case CAP_NONE:\n return { type: 'none' };\n case CAP_SENDER_HOSTED:\n return { type: 'senderHosted', exportId: root.getUint32(8) };\n case CAP_SENDER_PROMISE:\n return { type: 'senderPromise', exportId: root.getUint32(8) };\n case CAP_RECEIVER_HOSTED:\n return { type: 'receiverHosted', importId: root.getUint32(8) };\n case CAP_RECEIVER_ANSWER: {\n const promisedAnswerStruct = root.getStruct(0, 2, 1);\n return {\n type: 'receiverAnswer',\n promisedAnswer: promisedAnswerStruct\n ? deserializePromisedAnswer(promisedAnswerStruct)\n : { questionId: 0, transform: [] },\n };\n }\n case CAP_THIRD_PARTY_HOSTED:\n return { type: 'thirdPartyHosted', thirdPartyCapId: { id: new Uint8Array(0) } };\n default:\n return { type: 'none' };\n }\n}\n\nfunction deserializeSendResultsTo(root: StructReader): SendResultsTo {\n const tag = root.getUint16(0);\n\n switch (tag) {\n case SEND_TO_CALLER:\n return { type: 'caller' };\n case SEND_TO_YOURSELF:\n return { type: 'yourself' };\n case SEND_TO_THIRD_PARTY:\n return { type: 'thirdParty', recipientId: { id: new Uint8Array(0) } };\n default:\n return { type: 'caller' };\n }\n}\n\nfunction deserializeException(root: StructReader, pointerIndex: number): Exception {\n const excStruct = root.getStruct(pointerIndex, 2, 1);\n if (!excStruct) {\n return { reason: 'Unknown error', type: 'failed' };\n }\n\n const typeTag = excStruct.getUint16(0);\n let type: Exception['type'];\n\n switch (typeTag) {\n case EXC_FAILED:\n type = 'failed';\n break;\n case EXC_OVERLOADED:\n type = 'overloaded';\n break;\n case EXC_DISCONNECTED:\n type = 'disconnected';\n break;\n case EXC_UNIMPLEMENTED:\n type = 'unimplemented';\n break;\n default:\n type = 'failed';\n }\n\n return {\n reason: excStruct.getText(0),\n type,\n };\n}\n","/**\n * WebSocket Transport Implementation\n *\n * Implements RpcTransport over WebSocket for browser and Node.js compatibility.\n */\n\nimport { deserializeRpcMessage, serializeRpcMessage } from './message-serializer.js';\nimport type { RpcMessage } from './rpc-types.js';\nimport type { RpcTransport, WebSocketTransportOptions } from './transport.js';\n\n// Message framing: length-prefixed binary messages\n// Format: [4 bytes: message length (little-endian)] [N bytes: message data]\n\nexport class WebSocketTransport implements RpcTransport {\n private ws: WebSocket | null = null;\n private messageQueue: RpcMessage[] = [];\n private receiveQueue: Array<{\n resolve: (msg: RpcMessage | null) => void;\n reject: (err: Error) => void;\n }> = [];\n private _connected = false;\n private pendingBuffer: Uint8Array | null = null;\n private pendingLength = 0;\n\n onClose?: (reason?: Error) => void;\n onError?: (error: Error) => void;\n\n constructor(\n url: string,\n private options: WebSocketTransportOptions = {}\n ) {\n this.connect(url);\n }\n\n static async connect(\n url: string,\n options?: WebSocketTransportOptions\n ): Promise<WebSocketTransport> {\n const transport = new WebSocketTransport(url, options);\n await transport.waitForConnection();\n return transport;\n }\n\n static fromWebSocket(ws: WebSocket, options?: WebSocketTransportOptions): WebSocketTransport {\n const transport = new WebSocketTransport('internal', options);\n transport.attachWebSocket(ws);\n return transport;\n }\n\n get connected(): boolean {\n return this._connected;\n }\n\n private connect(url: string): void {\n this.ws = new WebSocket(url);\n this.ws.binaryType = this.options.binaryType ?? 'arraybuffer';\n\n this.ws.onopen = () => {\n this._connected = true;\n };\n\n this.ws.onmessage = (event) => {\n this.handleMessage(event.data);\n };\n\n this.ws.onclose = () => {\n this._connected = false;\n this.flushReceiveQueue(null);\n this.onClose?.();\n };\n\n this.ws.onerror = (_error) => {\n const err = new Error('WebSocket error');\n this.onError?.(err);\n };\n }\n\n private attachWebSocket(ws: WebSocket): void {\n this.ws = ws;\n this.ws.binaryType = this.options.binaryType ?? 'arraybuffer';\n this._connected = ws.readyState === WebSocket.OPEN;\n\n this.ws.onmessage = (event) => {\n this.handleMessage(event.data);\n };\n\n this.ws.onclose = () => {\n this._connected = false;\n this.flushReceiveQueue(null);\n this.onClose?.();\n };\n\n this.ws.onerror = (_error) => {\n const err = new Error('WebSocket error');\n this.onError?.(err);\n };\n }\n\n private waitForConnection(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (this._connected) {\n resolve();\n return;\n }\n\n const timeout = setTimeout(() => {\n reject(new Error('Connection timeout'));\n }, this.options.connectTimeoutMs ?? 10000);\n\n const checkConnection = () => {\n if (this._connected) {\n clearTimeout(timeout);\n resolve();\n } else if (!this.ws || this.ws.readyState === WebSocket.CLOSED) {\n clearTimeout(timeout);\n reject(new Error('Connection failed'));\n } else {\n setTimeout(checkConnection, 10);\n }\n };\n\n checkConnection();\n });\n }\n\n private handleMessage(data: ArrayBuffer | Blob): void {\n // For Phase 1, we'll implement basic message handling\n // Full implementation would parse the Cap'n Proto message\n if (data instanceof ArrayBuffer) {\n this.processBinaryMessage(new Uint8Array(data));\n } else {\n // Blob handling for browser compatibility\n const reader = new FileReader();\n reader.onload = () => {\n this.processBinaryMessage(new Uint8Array(reader.result as ArrayBuffer));\n };\n reader.readAsArrayBuffer(data);\n }\n }\n\n private processBinaryMessage(data: Uint8Array): void {\n // Length-prefixed framing\n let offset = 0;\n\n while (offset < data.length) {\n if (this.pendingBuffer === null) {\n // Start of new message\n if (offset + 4 > data.length) {\n // Not enough data for length header\n this.pendingBuffer = data.slice(offset);\n this.pendingLength = -1;\n break;\n }\n\n const length = new DataView(data.buffer, data.byteOffset + offset, 4).getUint32(0, true);\n offset += 4;\n\n if (offset + length > data.length) {\n // Not enough data for full message\n this.pendingBuffer = data.slice(offset - 4);\n this.pendingLength = length;\n break;\n }\n\n const messageData = data.slice(offset, offset + length);\n offset += length;\n this.handleRpcMessage(messageData);\n } else {\n // Continuation of pending message\n if (this.pendingLength === -1) {\n // Still need length header\n const needed = 4 - this.pendingBuffer.length;\n if (data.length - offset < needed) {\n this.pendingBuffer = new Uint8Array([...this.pendingBuffer, ...data.slice(offset)]);\n break;\n }\n\n const tempBuffer = new Uint8Array(this.pendingBuffer.length + needed);\n tempBuffer.set(this.pendingBuffer);\n tempBuffer.set(data.slice(offset, offset + needed), this.pendingBuffer.length);\n\n this.pendingLength = new DataView(tempBuffer.buffer, 0, 4).getUint32(0, true);\n this.pendingBuffer = null;\n offset += needed;\n } else {\n // Have length, need message body\n const needed = this.pendingLength - this.pendingBuffer.length;\n if (data.length - offset < needed) {\n this.pendingBuffer = new Uint8Array([...this.pendingBuffer, ...data.slice(offset)]);\n break;\n }\n\n const messageData = new Uint8Array(this.pendingLength);\n messageData.set(this.pendingBuffer);\n messageData.set(data.slice(offset, offset + needed), this.pendingBuffer.length);\n\n offset += needed;\n this.pendingBuffer = null;\n this.handleRpcMessage(messageData);\n }\n }\n }\n }\n\n private handleRpcMessage(data: Uint8Array): void {\n // Parse the RPC message from binary data\n // For Phase 1, this is a placeholder - full implementation would deserialize\n const message = this.deserializeMessage(data);\n\n // Fulfill pending receive\n if (this.receiveQueue.length > 0) {\n const { resolve } = this.receiveQueue.shift()!;\n resolve(message);\n } else {\n this.messageQueue.push(message);\n }\n }\n\n private deserializeMessage(data: Uint8Array): RpcMessage {\n return deserializeRpcMessage(data);\n }\n\n private serializeMessage(message: RpcMessage): Uint8Array {\n return serializeRpcMessage(message);\n }\n\n async send(message: RpcMessage): Promise<void> {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n throw new Error('WebSocket not connected');\n }\n\n const data = this.serializeMessage(message);\n const frame = new Uint8Array(4 + data.length);\n new DataView(frame.buffer).setUint32(0, data.length, true);\n frame.set(data, 4);\n\n this.ws.send(frame);\n }\n\n async receive(): Promise<RpcMessage | null> {\n // Check queued messages first\n if (this.messageQueue.length > 0) {\n return this.messageQueue.shift()!;\n }\n\n // If closed, return null\n if (!this._connected) {\n return null;\n }\n\n // Wait for next message\n return new Promise((resolve, reject) => {\n this.receiveQueue.push({ resolve, reject });\n });\n }\n\n close(reason?: Error): void {\n this._connected = false;\n this.ws?.close();\n this.flushReceiveQueue(null);\n this.onClose?.(reason);\n }\n\n private flushReceiveQueue(value: RpcMessage | null): void {\n while (this.receiveQueue.length > 0) {\n const { resolve } = this.receiveQueue.shift()!;\n resolve(value);\n }\n }\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 * 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 * 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\nimport { AnswerTable, ExportTable, ImportTable, QuestionTable } from './four-tables.js';\nimport {\n type PipelineClient,\n PipelineOpTracker,\n PipelineResolutionTracker,\n QueuedCallManager,\n createPipelineClient,\n isPipelineClient,\n} from './pipeline.js';\nimport type {\n AnswerId,\n Bootstrap,\n Call,\n CapDescriptor,\n Disembargo,\n ExportId,\n Finish,\n ImportId,\n Payload,\n PromisedAnswerOp,\n QuestionId,\n Release,\n Resolve,\n Return,\n RpcMessage,\n} from './rpc-types.js';\nimport type { RpcTransport } from './transport.js';\n\nexport interface RpcConnectionOptions {\n /** Bootstrap capability to expose to the peer */\n bootstrap?: unknown;\n}\n\nexport class RpcConnection {\n private transport: RpcTransport;\n private options: RpcConnectionOptions;\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 constructor(transport: RpcTransport, options: RpcConnectionOptions = {}) {\n this.transport = transport;\n this.options = options;\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\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.transport.send(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.transport.send(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.transport.send(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.transport.send(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.transport.send(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.transport.send(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.transport.send(resolveMsg);\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.transport.send(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.transport.receive();\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 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.transport.send(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.transport.send(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 }\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 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 // 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.transport.send(echoMsg);\n }\n // For other contexts (accept, provide), more complex handling is needed\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.transport.send(msg);\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 * CapabilityClient\n *\n * Base class for client-side capability references.\n * Provides the foundation for making method calls on remote objects.\n */\n\nimport type { PipelineClient } from './pipeline.js';\nimport type { RpcConnection } from './rpc-connection.js';\nimport type { ImportId, InterfaceId, MethodId, Payload } from './rpc-types.js';\n\n/** Base interface for all capability clients */\nexport interface CapabilityClient {\n /** The connection this capability belongs to */\n readonly connection: RpcConnection;\n\n /** The import ID for this capability (if imported) */\n readonly importId?: ImportId;\n\n /** Check if this capability is still valid */\n isValid(): boolean;\n\n /** Release this capability reference */\n release(): void;\n}\n\n/** Base class for capability client implementations */\nexport abstract class BaseCapabilityClient implements CapabilityClient {\n constructor(\n public readonly connection: RpcConnection,\n public readonly importId?: ImportId\n ) {}\n\n isValid(): boolean {\n // In full implementation, check if the import is still valid\n return true;\n }\n\n release(): void {\n if (this.importId !== undefined) {\n this.connection.release(this.importId, 1);\n }\n }\n\n /** Make a method call on this capability and return a PipelineClient */\n protected _call(_interfaceId: InterfaceId, _methodId: MethodId, params: unknown): PipelineClient {\n if (!this.importId) {\n throw new Error('Cannot call method on capability without import ID');\n }\n\n // Serialize params to Payload\n const _payload = this.serializeParams(params);\n\n // Use callPipelined to get a PipelineClient\n // Note: callPipelined returns Promise<PipelineClient>, but we need to await it\n // This is a design issue - for now, we throw an error indicating async is needed\n throw new Error('Use _callAsync instead for async call support');\n }\n\n /** Make an async method call on this capability */\n protected async _callAsync(\n interfaceId: InterfaceId,\n methodId: MethodId,\n params: unknown\n ): Promise<PipelineClient> {\n if (!this.importId) {\n throw new Error('Cannot call method on capability without import ID');\n }\n\n // Serialize params to Payload\n const payload = this.serializeParams(params);\n\n // Use callPipelined to get a PipelineClient\n return this.connection.callPipelined(this.importId, interfaceId, methodId, payload);\n }\n\n /** Serialize parameters to Payload */\n protected serializeParams(_params: unknown): Payload {\n // TODO: Implement proper parameter serialization\n // For now, return empty payload\n return {\n content: new Uint8Array(),\n capTable: [],\n };\n }\n}\n\n/** Factory for creating capability clients */\nexport interface CapabilityClientFactory<T extends CapabilityClient> {\n create(connection: RpcConnection, importId?: ImportId): T;\n}\n","/**\n * SturdyRefs - Level 2 RPC Feature\n *\n * SturdyRefs provide persistent capability references that survive\n * connection disconnections and can be restored on reconnection.\n *\n * Key concepts:\n * - SturdyRef: A persistent reference to a capability\n * - Restore: Reconnect to a capability using its SturdyRef\n * - Save: Create a SturdyRef from a live capability\n */\n\nimport type { RpcConnection } from './rpc-connection.js';\nimport type { ExportId, ImportId, QuestionId, RpcMessage } from './rpc-types.js';\n\n// ========================================================================================\n// Types\n// ========================================================================================\n\n/**\n * A SturdyRef token that can be persisted and later used to restore a capability\n */\nexport interface SturdyRef {\n /** The vat ID where the capability lives */\n vatId: string;\n /** The local ID of the capability within that vat */\n localId: string;\n /** Optional: Version or generation number for validation */\n version?: number;\n /** Optional: Expiration timestamp */\n expiresAt?: number;\n /** Optional: Additional metadata */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * A stored SturdyRef with its associated capability info\n */\ninterface StoredSturdyRef {\n ref: SturdyRef;\n exportId: ExportId;\n capability: unknown;\n createdAt: number;\n lastAccessedAt: number;\n}\n\n/**\n * Options for saving a capability as a SturdyRef\n */\nexport interface SaveOptions {\n /** Custom local ID (auto-generated if not provided) */\n localId?: string;\n /** Expiration time in milliseconds from now */\n ttlMs?: number;\n /** Metadata to attach to the SturdyRef */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Options for restoring a capability from a SturdyRef\n */\nexport interface RestoreOptions {\n /** Timeout for the restore operation */\n timeoutMs?: number;\n}\n\n// ========================================================================================\n// SturdyRef Manager (Server-side)\n// ========================================================================================\n\n/**\n * Manages SturdyRefs on the server side.\n * Stores the mapping between SturdyRef tokens and live capabilities.\n */\nexport class SturdyRefManager {\n private vatId: string;\n private storedRefs = new Map<string, StoredSturdyRef>();\n private localIdCounter = 0;\n\n constructor(vatId: string) {\n this.vatId = vatId;\n }\n\n /**\n * Save a capability as a SturdyRef\n */\n saveCapability(capability: unknown, exportId: ExportId, options?: SaveOptions): SturdyRef {\n const localId = options?.localId ?? this.generateLocalId();\n const now = Date.now();\n\n const ref: SturdyRef = {\n vatId: this.vatId,\n localId,\n version: 1,\n expiresAt: options?.ttlMs ? now + options.ttlMs : undefined,\n metadata: options?.metadata,\n };\n\n const stored: StoredSturdyRef = {\n ref,\n exportId,\n capability,\n createdAt: now,\n lastAccessedAt: now,\n };\n\n this.storedRefs.set(localId, stored);\n return ref;\n }\n\n /**\n * Restore a capability from a SturdyRef token\n */\n restoreCapability(ref: SturdyRef): { capability: unknown; exportId: ExportId } | null {\n // Validate the SturdyRef belongs to this vat\n if (ref.vatId !== this.vatId) {\n console.warn(`SturdyRef vatId mismatch: ${ref.vatId} !== ${this.vatId}`);\n return null;\n }\n\n const stored = this.storedRefs.get(ref.localId);\n if (!stored) {\n console.warn(`SturdyRef not found: ${ref.localId}`);\n return null;\n }\n\n // Check expiration\n if (stored.ref.expiresAt && Date.now() > stored.ref.expiresAt) {\n console.warn(`SturdyRef expired: ${ref.localId}`);\n this.storedRefs.delete(ref.localId);\n return null;\n }\n\n // Update last accessed time\n stored.lastAccessedAt = Date.now();\n\n return {\n capability: stored.capability,\n exportId: stored.exportId,\n };\n }\n\n /**\n * Drop a SturdyRef\n */\n dropSturdyRef(localId: string): boolean {\n return this.storedRefs.delete(localId);\n }\n\n /**\n * Get all active SturdyRefs\n */\n getActiveRefs(): SturdyRef[] {\n const now = Date.now();\n const active: SturdyRef[] = [];\n\n for (const [localId, stored] of this.storedRefs) {\n // Clean up expired refs\n if (stored.ref.expiresAt && now > stored.ref.expiresAt) {\n this.storedRefs.delete(localId);\n continue;\n }\n active.push(stored.ref);\n }\n\n return active;\n }\n\n /**\n * Clean up expired SturdyRefs\n */\n cleanupExpired(): number {\n const now = Date.now();\n let cleaned = 0;\n\n for (const [localId, stored] of this.storedRefs) {\n if (stored.ref.expiresAt && now > stored.ref.expiresAt) {\n this.storedRefs.delete(localId);\n cleaned++;\n }\n }\n\n return cleaned;\n }\n\n private generateLocalId(): string {\n return `ref-${++this.localIdCounter}-${Date.now()}`;\n }\n}\n\n// ========================================================================================\n// Restore Handler (Client-side)\n// ========================================================================================\n\n/**\n * Handles Restore messages on the client side.\n * Manages reconnecting to capabilities after disconnections.\n */\nexport class RestoreHandler {\n private connection: RpcConnection;\n private pendingRestores = new Map<\n QuestionId,\n {\n resolve: (importId: ImportId) => void;\n reject: (error: Error) => void;\n timeout: ReturnType<typeof setTimeout>;\n }\n >();\n private questionIdCounter = 0;\n\n constructor(connection: RpcConnection) {\n this.connection = connection;\n }\n\n /**\n * Send a Restore message to restore a capability from a SturdyRef\n */\n async restore(ref: SturdyRef, options?: RestoreOptions): Promise<ImportId> {\n const questionId = ++this.questionIdCounter;\n const timeoutMs = options?.timeoutMs ?? 30000;\n\n return new Promise((resolve, reject) => {\n // Set up timeout\n const timeout = setTimeout(() => {\n this.pendingRestores.delete(questionId);\n reject(new Error(`Restore timeout after ${timeoutMs}ms`));\n }, timeoutMs);\n\n this.pendingRestores.set(questionId, { resolve, reject, timeout });\n\n // Send Restore message (using Call message with special interface)\n // In the actual protocol, this would be a specific Restore message type\n // For now, we use a special method call\n this.sendRestoreMessage(questionId, ref).catch((error) => {\n clearTimeout(timeout);\n this.pendingRestores.delete(questionId);\n reject(error);\n });\n });\n }\n\n /**\n * Handle a Restore response\n */\n handleRestoreResponse(questionId: QuestionId, importId: ImportId): void {\n const pending = this.pendingRestores.get(questionId);\n if (pending) {\n clearTimeout(pending.timeout);\n this.pendingRestores.delete(questionId);\n pending.resolve(importId);\n }\n }\n\n /**\n * Handle a Restore failure\n */\n handleRestoreFailure(questionId: QuestionId, reason: string): void {\n const pending = this.pendingRestores.get(questionId);\n if (pending) {\n clearTimeout(pending.timeout);\n this.pendingRestores.delete(questionId);\n pending.reject(new Error(`Restore failed: ${reason}`));\n }\n }\n\n /**\n * Cancel all pending restores (e.g., on disconnect)\n */\n cancelAll(reason: string): void {\n for (const [_questionId, pending] of this.pendingRestores) {\n clearTimeout(pending.timeout);\n pending.reject(new Error(`Restore canceled: ${reason}`));\n }\n this.pendingRestores.clear();\n }\n\n private async sendRestoreMessage(questionId: QuestionId, ref: SturdyRef): Promise<void> {\n // Serialize the SturdyRef\n const refData = JSON.stringify(ref);\n\n // In the actual implementation, this would send a proper Restore message\n // For now, we simulate it\n const restoreMsg: RpcMessage = {\n type: 'call',\n call: {\n questionId,\n target: { type: 'importedCap', importId: 0 }, // Special import for restore service\n interfaceId: BigInt('0xffffffffffffffff'), // Special interface ID for restore\n methodId: 0, // restore method\n allowThirdPartyTailCall: false,\n noPromisePipelining: false,\n onlyPromisePipeline: false,\n params: {\n content: new TextEncoder().encode(refData),\n capTable: [],\n },\n sendResultsTo: { type: 'caller' },\n },\n };\n\n // This would be sent through the connection\n // await this.connection.send(restoreMsg);\n console.log('Sending restore message:', restoreMsg);\n }\n}\n\n// ========================================================================================\n// SturdyRef Utilities\n// ========================================================================================\n\n/**\n * Serialize a SturdyRef to a string for storage\n */\nexport function serializeSturdyRef(ref: SturdyRef): string {\n return JSON.stringify(ref);\n}\n\n/**\n * Deserialize a SturdyRef from a string\n */\nexport function deserializeSturdyRef(data: string): SturdyRef | null {\n try {\n const parsed = JSON.parse(data);\n\n // Validate required fields\n if (typeof parsed.vatId !== 'string' || typeof parsed.localId !== 'string') {\n return null;\n }\n\n return {\n vatId: parsed.vatId,\n localId: parsed.localId,\n version: parsed.version,\n expiresAt: parsed.expiresAt,\n metadata: parsed.metadata,\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Check if a SturdyRef is valid (not expired)\n */\nexport function isSturdyRefValid(ref: SturdyRef): boolean {\n if (ref.expiresAt && Date.now() > ref.expiresAt) {\n return false;\n }\n return true;\n}\n\n/**\n * Create a SturdyRef from components\n */\nexport function createSturdyRef(\n vatId: string,\n localId: string,\n options?: Omit<SaveOptions, 'localId'>\n): SturdyRef {\n return {\n vatId,\n localId,\n version: 1,\n expiresAt: options?.ttlMs ? Date.now() + options.ttlMs : undefined,\n metadata: options?.metadata,\n };\n}\n","/**\n * Performance Optimizations for RPC\n *\n * Phase 3: Performance improvements\n * - Multi-segment message support\n * - Memory pooling\n * - Zero-copy paths where possible\n */\n\nimport { Segment } from '../core/segment.js';\n\n// ========================================================================================\n// Memory Pool\n// ========================================================================================\n\ninterface PooledBuffer {\n buffer: ArrayBuffer;\n size: number;\n lastUsed: number;\n}\n\n/**\n * Memory pool for reusing ArrayBuffers\n * Reduces GC pressure for frequent allocations\n */\nexport class MemoryPool {\n private pools = new Map<number, PooledBuffer[]>();\n private maxPoolSize: number;\n private maxBufferAge: number;\n\n constructor(options?: { maxPoolSize?: number; maxBufferAgeMs?: number }) {\n this.maxPoolSize = options?.maxPoolSize ?? 100;\n this.maxBufferAge = options?.maxBufferAgeMs ?? 60000; // 1 minute\n }\n\n /**\n * Acquire a buffer of at least the requested size\n */\n acquire(size: number): ArrayBuffer {\n // Round up to nearest power of 2 for better pooling\n const pooledSize = this.roundUpSize(size);\n const pool = this.pools.get(pooledSize);\n\n if (pool && pool.length > 0) {\n const now = Date.now();\n // Find a buffer that's not too old\n const index = pool.findIndex((b) => now - b.lastUsed < this.maxBufferAge);\n\n if (index >= 0) {\n const pooled = pool.splice(index, 1)[0];\n return pooled.buffer;\n }\n }\n\n // Allocate new buffer\n return new ArrayBuffer(pooledSize);\n }\n\n /**\n * Release a buffer back to the pool\n */\n release(buffer: ArrayBuffer): void {\n const size = buffer.byteLength;\n\n // Don't pool very small or very large buffers\n if (size < 64 || size > 1024 * 1024) {\n return;\n }\n\n let pool = this.pools.get(size);\n if (!pool) {\n pool = [];\n this.pools.set(size, pool);\n }\n\n if (pool.length < this.maxPoolSize) {\n pool.push({\n buffer,\n size,\n lastUsed: Date.now(),\n });\n }\n }\n\n /**\n * Clear all pooled buffers\n */\n clear(): void {\n this.pools.clear();\n }\n\n /**\n * Get pool statistics\n */\n getStats(): { totalBuffers: number; totalBytes: number; sizes: number[] } {\n let totalBuffers = 0;\n let totalBytes = 0;\n const sizes: number[] = [];\n\n for (const [size, pool] of this.pools) {\n totalBuffers += pool.length;\n totalBytes += size * pool.length;\n sizes.push(size);\n }\n\n return { totalBuffers, totalBytes, sizes };\n }\n\n private roundUpSize(size: number): number {\n // Round up to nearest power of 2, minimum 64 bytes\n if (size <= 64) return 64;\n if (size <= 128) return 128;\n if (size <= 256) return 256;\n if (size <= 512) return 512;\n if (size <= 1024) return 1024;\n if (size <= 2048) return 2048;\n if (size <= 4096) return 4096;\n if (size <= 8192) return 8192;\n if (size <= 16384) return 16384;\n if (size <= 32768) return 32768;\n if (size <= 65536) return 65536;\n return size;\n }\n}\n\n// ========================================================================================\n// Multi-Segment Message Builder\n// ========================================================================================\n\n/**\n * Options for multi-segment message building\n */\nexport interface MultiSegmentOptions {\n /** Initial segment size */\n initialSegmentSize?: number;\n /** Maximum segment size */\n maxSegmentSize?: number;\n /** Whether to allow multiple segments */\n allowMultipleSegments?: boolean;\n}\n\n/**\n * Builder for multi-segment messages\n * Optimizes memory usage for large messages\n */\nexport class MultiSegmentMessageBuilder {\n private segments: Segment[] = [];\n private options: Required<MultiSegmentOptions>;\n private currentSegment: Segment;\n private totalSize = 0;\n\n constructor(options?: MultiSegmentOptions) {\n this.options = {\n initialSegmentSize: options?.initialSegmentSize ?? 8192,\n maxSegmentSize: options?.maxSegmentSize ?? 65536,\n allowMultipleSegments: options?.allowMultipleSegments ?? true,\n };\n\n this.currentSegment = new Segment(this.options.initialSegmentSize);\n this.segments.push(this.currentSegment);\n }\n\n /**\n * Allocate space in the message\n */\n allocate(size: number): { segment: Segment; offset: number } {\n // Align to 8 bytes and convert to words\n const alignedBytes = (size + 7) & ~7;\n const words = alignedBytes / 8;\n\n // Check if current segment has enough space\n // Segment capacity is the buffer size, not the current size\n const currentCapacity = this.currentSegment.byteLength;\n const currentUsed = this.currentSegment.wordCount * 8; // wordCount * 8 = bytes used\n const remainingSpace = currentCapacity - currentUsed;\n\n if (remainingSpace >= alignedBytes) {\n // Current segment has enough space\n const wordOffset = this.currentSegment.allocate(words);\n this.totalSize += alignedBytes;\n return { segment: this.currentSegment, offset: wordOffset * 8 };\n }\n\n // Need a new segment\n if (!this.options.allowMultipleSegments) {\n throw new Error('Message too large for single segment');\n }\n\n // Create new segment\n const newSegmentSize = Math.min(\n Math.max(alignedBytes, this.options.initialSegmentSize),\n this.options.maxSegmentSize\n );\n this.currentSegment = new Segment(newSegmentSize);\n this.segments.push(this.currentSegment);\n\n const newWordOffset = this.currentSegment.allocate(words);\n this.totalSize += alignedBytes;\n return { segment: this.currentSegment, offset: newWordOffset * 8 };\n }\n\n /**\n * Get all segments\n */\n getSegments(): readonly Segment[] {\n return this.segments;\n }\n\n /**\n * Get the total size of all segments\n */\n getTotalSize(): number {\n return this.totalSize;\n }\n\n /**\n * Get the number of segments\n */\n getSegmentCount(): number {\n return this.segments.length;\n }\n\n /**\n * Serialize to a single buffer (for transport)\n */\n toBuffer(): ArrayBuffer {\n if (this.segments.length === 1) {\n // Single segment - use asUint8Array to get the used portion\n const segmentData = this.segments[0].asUint8Array();\n return segmentData.buffer.slice(\n segmentData.byteOffset,\n segmentData.byteOffset + segmentData.byteLength\n ) as ArrayBuffer;\n }\n\n // Multi-segment - need to serialize with segment table\n // This is a simplified version - full implementation would include\n // the segment table at the beginning\n const totalSize = this.segments.reduce((sum, seg) => sum + seg.byteLength, 0);\n const result = new ArrayBuffer(totalSize + 8 * this.segments.length); // Space for segment table\n const view = new DataView(result);\n const bytes = new Uint8Array(result);\n\n // Write segment table\n view.setUint32(0, this.segments.length - 1, true); // Segment count - 1\n view.setUint32(4, 0, true); // Padding for first segment size (in words)\n\n let offset = 8;\n for (let i = 0; i < this.segments.length; i++) {\n const segment = this.segments[i];\n if (i > 0) {\n view.setUint32(offset, segment.byteLength / 8, true); // Segment size in words\n offset += 4;\n }\n\n // Copy segment data\n const segmentBuffer = new Uint8Array(segment.byteLength);\n // Copy data from segment's DataView\n const segmentData = segment.dataView;\n for (let i = 0; i < segment.byteLength; i++) {\n segmentBuffer[i] = segmentData.getUint8(i);\n }\n bytes.set(segmentBuffer, offset);\n offset += segment.byteLength;\n }\n\n return result;\n }\n}\n\n// ========================================================================================\n// Zero-Copy Utilities\n// ========================================================================================\n\n/**\n * View into a buffer without copying\n */\nexport interface ZeroCopyView {\n buffer: ArrayBuffer;\n byteOffset: number;\n byteLength: number;\n}\n\n/**\n * Create a zero-copy view of a buffer\n */\nexport function createZeroCopyView(\n buffer: ArrayBuffer,\n byteOffset = 0,\n byteLength?: number\n): ZeroCopyView {\n return {\n buffer,\n byteOffset,\n byteLength: byteLength ?? buffer.byteLength - byteOffset,\n };\n}\n\n/**\n * Check if two buffers are the same underlying memory\n */\nexport function isSameBuffer(a: ArrayBuffer, b: ArrayBuffer): boolean {\n try {\n // This is a hack to check if two buffers are the same\n // In a real implementation, we'd use a more reliable method\n return a === b;\n } catch {\n return false;\n }\n}\n\n/**\n * Copy data between buffers using the fastest available method\n */\nexport function fastCopy(\n src: ArrayBuffer,\n dst: ArrayBuffer,\n srcOffset = 0,\n dstOffset = 0,\n length?: number\n): void {\n const len = length ?? Math.min(src.byteLength - srcOffset, dst.byteLength - dstOffset);\n const srcView = new Uint8Array(src, srcOffset, len);\n const dstView = new Uint8Array(dst, dstOffset, len);\n dstView.set(srcView);\n}\n\n// ========================================================================================\n// RPC Message Optimization\n// ========================================================================================\n\n/**\n * Options for RPC message building\n */\nexport interface RpcMessageOptions {\n /** Use multi-segment messages */\n useMultiSegment?: boolean;\n /** Initial segment size */\n initialSegmentSize?: number;\n /** Use memory pooling */\n useMemoryPool?: boolean;\n /** Memory pool instance */\n memoryPool?: MemoryPool;\n}\n\n/**\n * Optimized RPC message builder\n */\nexport class OptimizedRpcMessageBuilder {\n private options: Required<RpcMessageOptions>;\n private pool: MemoryPool;\n\n constructor(options?: RpcMessageOptions) {\n this.options = {\n useMultiSegment: options?.useMultiSegment ?? true,\n initialSegmentSize: options?.initialSegmentSize ?? 8192,\n useMemoryPool: options?.useMemoryPool ?? true,\n memoryPool: options?.memoryPool ?? new MemoryPool(),\n };\n this.pool = this.options.memoryPool;\n }\n\n /**\n * Build a message with optimizations applied\n */\n buildMessage(content: Uint8Array): ArrayBuffer {\n const totalSize = 8 + content.length; // Header + content\n\n if (this.options.useMemoryPool) {\n const buffer = this.pool.acquire(totalSize);\n const view = new DataView(buffer);\n const bytes = new Uint8Array(buffer);\n\n // Write header (simplified)\n view.setUint32(0, 0, true); // Single segment indicator\n view.setUint32(4, content.length / 8, true); // Size in words\n\n // Copy content\n bytes.set(content, 8);\n\n return buffer;\n }\n\n // Standard allocation\n const buffer = new ArrayBuffer(totalSize);\n const view = new DataView(buffer);\n const bytes = new Uint8Array(buffer);\n\n view.setUint32(0, 0, true);\n view.setUint32(4, content.length / 8, true);\n bytes.set(content, 8);\n\n return buffer;\n }\n\n /**\n * Release a buffer back to the pool\n */\n releaseBuffer(buffer: ArrayBuffer): void {\n if (this.options.useMemoryPool) {\n this.pool.release(buffer);\n }\n }\n\n /**\n * Get pool statistics\n */\n getPoolStats(): { totalBuffers: number; totalBytes: number; sizes: number[] } {\n return this.pool.getStats();\n }\n}\n\n// ========================================================================================\n// Global Memory Pool (Singleton)\n// ========================================================================================\n\nlet globalMemoryPool: MemoryPool | null = null;\n\n/**\n * Get the global memory pool instance\n */\nexport function getGlobalMemoryPool(): MemoryPool {\n if (!globalMemoryPool) {\n globalMemoryPool = new MemoryPool();\n }\n return globalMemoryPool;\n}\n\n/**\n * Configure the global memory pool\n */\nexport function configureGlobalMemoryPool(options: {\n maxPoolSize?: number;\n maxBufferAgeMs?: number;\n}): void {\n globalMemoryPool = new MemoryPool(options);\n}\n"],"mappings":"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"}
|