@naeemo/capnp 0.6.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +19 -0
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +43 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +41 -3
- package/dist/index.js.map +1 -1
- package/dist/{rpc-connection-C3-uEtpd.js → rpc-connection-CHjKsrMC.js} +366 -20
- package/dist/rpc-connection-CHjKsrMC.js.map +1 -0
- package/dist/rpc-connection-DWwgwaUX.js +3 -0
- package/dist/{rpc-connection-_eHtWsk2.js → rpc-connection-OuadMfAW.js} +383 -19
- package/dist/rpc-connection-OuadMfAW.js.map +1 -0
- package/dist/rpc-connection-uazTSCEw.js +3 -0
- package/package.json +1 -1
- package/dist/rpc-connection-C3-uEtpd.js.map +0 -1
- package/dist/rpc-connection-CDzawjwJ.js +0 -3
- package/dist/rpc-connection-_eHtWsk2.js.map +0 -1
- package/dist/rpc-connection-jIPnPyT6.js +0 -3
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","names":[],"sources":["../src/codegen/generator.ts","../src/core/pointer.ts","../src/core/segment.ts","../src/core/list.ts","../src/core/message-reader.ts","../src/schema/schema-reader.ts","../src/cli.ts"],"sourcesContent":["/**\n * 基于 Binary Schema 的 TypeScript 代码生成器\n *\n * 使用官方 capnp 编译器生成的二进制 schema 来生成 TypeScript 代码\n */\n\nimport type {\n CodeGeneratorRequestReader,\n FieldReader,\n Id,\n NodeReader,\n TypeKind,\n TypeReader,\n} from '../schema/schema-reader.js';\n\n// 导入运行时类型用于代码生成\nimport type { StructBuilder, StructReader } from '../core/index.js';\n\nexport interface GeneratorOptions {\n /** 运行时库导入路径 */\n runtimeImportPath?: string;\n}\n\nconst DEFAULT_OPTIONS: GeneratorOptions = {\n runtimeImportPath: '@naeemo/capnp',\n};\n\n/**\n * Union 字段分组\n */\ninterface UnionGroup {\n discriminantOffset: number;\n fields: FieldReader[];\n}\n\n/**\n * 从 CodeGeneratorRequest 生成 TypeScript 代码\n */\nexport function generateFromRequest(\n request: CodeGeneratorRequestReader,\n options?: GeneratorOptions\n): Map<string, string> {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n const files = new Map<string, string>();\n\n const nodes = request.nodes;\n const requestedFiles = request.requestedFiles;\n\n // 为每个请求的文件生成代码\n for (const file of requestedFiles) {\n const filename = file.filename.replace(/\\.capnp$/, '.ts');\n const code = generateFile(file.id, nodes, opts);\n files.set(filename, code);\n }\n\n return files;\n}\n\n/**\n * 生成单个文件的 TypeScript 代码\n */\nfunction generateFile(fileId: Id, allNodes: NodeReader[], options: GeneratorOptions): string {\n const lines: string[] = [];\n\n // 文件头\n lines.push('// Generated by @naeemo/capnp');\n lines.push('// DO NOT EDIT MANUALLY');\n lines.push('');\n lines.push(\n `import { MessageReader, MessageBuilder, StructReader, StructBuilder, createUnionReader, createUnionBuilder } from \"${options.runtimeImportPath}\";`\n );\n lines.push('');\n\n // 添加 XOR 辅助函数(用于 float 默认值)\n lines.push('// XOR helpers for default value encoding');\n lines.push('function xorFloat32(a: number, b: number): number {');\n lines.push(' const view = new DataView(new ArrayBuffer(4));');\n lines.push(' view.setFloat32(0, a, true);');\n lines.push(' const aBits = view.getUint32(0, true);');\n lines.push(' view.setFloat32(0, b, true);');\n lines.push(' const bBits = view.getUint32(0, true);');\n lines.push(' view.setUint32(0, aBits ^ bBits, true);');\n lines.push(' return view.getFloat32(0, true);');\n lines.push('}');\n lines.push('');\n lines.push('function xorFloat64(a: number, b: number): number {');\n lines.push(' const view = new DataView(new ArrayBuffer(8));');\n lines.push(' view.setFloat64(0, a, true);');\n lines.push(' const aBits = view.getBigUint64(0, true);');\n lines.push(' view.setFloat64(0, b, true);');\n lines.push(' const bBits = view.getBigUint64(0, true);');\n lines.push(' view.setBigUint64(0, aBits ^ bBits, true);');\n lines.push(' return view.getFloat64(0, true);');\n lines.push('}');\n lines.push('');\n\n // 找到属于这个文件的所有节点\n // 包括:\n // 1. scopeId === fileId 的节点(正常定义的 struct/enum/interface)\n // 2. scopeId === 0 且 displayName 包含文件名的节点(auto-generated method params/results)\n let filePrefix = '';\n try {\n const fileNode = allNodes.find((n) => n.id === fileId);\n filePrefix = fileNode?.displayName || '';\n } catch (_e) {\n // Ignore errors reading file node\n }\n\n const fileNodes = allNodes.filter((n) => {\n try {\n if (n.scopeId === fileId) return true;\n // Auto-generated method params/results have scopeId = 0\n if (n.scopeId === 0n && filePrefix && n.displayName.startsWith(`${filePrefix}:`)) {\n // Check if it's a method params/results struct\n const shortName = n.displayName.substring(filePrefix.length + 1);\n return shortName.includes('$');\n }\n } catch (_e) {\n // Skip nodes that can't be read\n }\n return false;\n });\n\n // 生成每个节点的代码\n for (const node of fileNodes) {\n if (node.isStruct) {\n lines.push(generateStruct(node, allNodes));\n } else if (node.isEnum) {\n lines.push(generateEnum(node));\n } else if (node.isInterface) {\n lines.push(generateInterface(node, allNodes));\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\n/**\n * 生成 Struct 的 TypeScript 代码\n */\nfunction generateStruct(node: NodeReader, allNodes: NodeReader[]): string {\n const lines: string[] = [];\n const structName = getShortName(node.displayName);\n\n // 分析字段:分离 Union 字段、普通字段和 Group 字段\n let unionGroups: UnionGroup[] = [];\n let regularFields: FieldReader[] = [];\n let groupFields: { field: FieldReader; groupNode: NodeReader }[] = [];\n\n try {\n const analysis = analyzeFields(node, allNodes);\n unionGroups = analysis.unionGroups;\n regularFields = analysis.regularFields;\n groupFields = analysis.groupFields;\n } catch (_e) {\n // Some auto-generated structs may have invalid field data\n // Return a minimal struct definition in this case\n lines.push(`export interface ${structName} {`);\n lines.push(' // Note: Could not parse struct fields');\n lines.push('}');\n lines.push('');\n lines.push(`export class ${structName}Reader {`);\n lines.push(' constructor(private reader: StructReader) {}');\n lines.push('}');\n lines.push('');\n lines.push(`export class ${structName}Builder {`);\n lines.push(' constructor(private builder: StructBuilder) {}');\n lines.push('}');\n return lines.join('\\n');\n }\n\n // 生成接口定义\n lines.push(`export interface ${structName} {`);\n\n // 普通字段\n for (const field of regularFields) {\n if (!field.isSlot) continue;\n const tsType = getTypeScriptType(field.slotType, allNodes);\n lines.push(` ${field.name}: ${tsType};`);\n }\n\n // Group 字段 - 内联 Group 的字段\n for (const { field: groupField, groupNode } of groupFields) {\n const groupName = groupField.name;\n try {\n for (const field of groupNode.structFields) {\n if (!field.isSlot) continue;\n const tsType = getTypeScriptType(field.slotType, allNodes);\n lines.push(` ${groupName}${capitalize(field.name)}: ${tsType};`);\n }\n } catch (_e) {\n // Skip invalid group fields\n }\n }\n\n // Union 字段 - 生成 discriminant 和 variant 类型\n for (const [groupIndex, group] of unionGroups.entries()) {\n const unionName =\n group.fields.length > 0 ? `${capitalize(group.fields[0].name)}Union` : `Union${groupIndex}`;\n lines.push(` ${unionName}: ${generateUnionVariantType(group, allNodes)};`);\n }\n\n lines.push('}');\n lines.push('');\n\n // 生成 Reader 类\n lines.push(`export class ${structName}Reader {`);\n lines.push(' constructor(private reader: StructReader) {}');\n lines.push('');\n\n // 普通字段 getters\n for (const field of regularFields) {\n if (!field.isSlot) continue;\n const getter = generateFieldGetter(field);\n lines.push(` ${getter}`);\n lines.push('');\n }\n\n // Group 字段 getters - 内联 Group 的字段\n for (const { field: groupField, groupNode } of groupFields) {\n const groupName = groupField.name;\n try {\n for (const field of groupNode.structFields) {\n if (!field.isSlot) continue;\n const getter = generateGroupFieldGetter(field, groupName);\n lines.push(` ${getter}`);\n lines.push('');\n }\n } catch (_e) {\n // Skip invalid group fields\n }\n }\n\n // Union 方法\n for (const [groupIndex, group] of unionGroups.entries()) {\n const unionName =\n group.fields.length > 0 ? `${capitalize(group.fields[0].name)}Union` : `Union${groupIndex}`;\n const variants: Record<number, string> = {};\n for (const field of group.fields) {\n variants[field.discriminantValue] = field.name;\n }\n const variantsStr = JSON.stringify(variants).replace(/\"/g, \"'\");\n\n lines.push(` get${unionName}Tag(): number {`);\n lines.push(` return this.reader.getUint16(${group.discriminantOffset * 2});`);\n lines.push(' }');\n lines.push('');\n\n lines.push(` get${unionName}Variant(): string | undefined {`);\n lines.push(` const tag = this.get${unionName}Tag();`);\n lines.push(` const variants = ${variantsStr};`);\n lines.push(' return variants[tag];');\n lines.push(' }');\n lines.push('');\n\n // 每个 variant 的 getter\n for (const field of group.fields) {\n const getter = generateUnionFieldGetter(field, unionName, field.discriminantValue);\n lines.push(` ${getter}`);\n lines.push('');\n }\n\n // 每个 variant 的 setter\n for (const field of group.fields) {\n const setter = generateUnionFieldSetter(\n field,\n unionName,\n field.discriminantValue,\n group.discriminantOffset * 2\n );\n lines.push(` ${setter}`);\n lines.push('');\n }\n }\n\n lines.push('}');\n lines.push('');\n\n // 生成 Builder 类\n lines.push(`export class ${structName}Builder {`);\n lines.push(' constructor(private builder: StructBuilder) {}');\n lines.push('');\n\n // 普通字段 setters\n for (const field of regularFields) {\n if (!field.isSlot) continue;\n const setter = generateFieldSetter(field);\n lines.push(` ${setter}`);\n lines.push('');\n }\n\n // Group 字段 setters\n for (const { field: groupField, groupNode } of groupFields) {\n const groupName = groupField.name;\n try {\n for (const field of groupNode.structFields) {\n if (!field.isSlot) continue;\n const setter = generateGroupFieldSetter(field, groupName);\n lines.push(` ${setter}`);\n lines.push('');\n }\n } catch (_e) {\n // Skip invalid group fields\n }\n }\n\n // Union setters\n for (const [groupIndex, group] of unionGroups.entries()) {\n const unionName =\n group.fields.length > 0 ? `${capitalize(group.fields[0].name)}Union` : `Union${groupIndex}`;\n for (const field of group.fields) {\n const setter = generateUnionFieldSetter(\n field,\n unionName,\n field.discriminantValue,\n group.discriminantOffset * 2\n );\n lines.push(` ${setter}`);\n lines.push('');\n }\n }\n\n lines.push('}');\n\n return lines.join('\\n');\n}\n\n/**\n * 分析字段,分离 Union 字段和普通字段,展开 Group 字段\n */\nfunction analyzeFields(\n node: NodeReader,\n allNodes: NodeReader[]\n): {\n unionGroups: UnionGroup[];\n regularFields: FieldReader[];\n groupFields: { field: FieldReader; groupNode: NodeReader }[];\n} {\n const fields = node.structFields;\n const unionGroups: Map<number, UnionGroup> = new Map();\n const regularFields: FieldReader[] = [];\n const groupFields: { field: FieldReader; groupNode: NodeReader }[] = [];\n\n for (const field of fields) {\n // 处理 Group 字段\n if (field.isGroup) {\n const groupNode = allNodes.find((n) => n.id === field.groupTypeId);\n if (groupNode?.isStruct) {\n groupFields.push({ field, groupNode });\n }\n continue;\n }\n\n // 处理 Union 字段\n if (\n node.structDiscriminantCount > 0 &&\n field.discriminantValue !== 65535 &&\n field.discriminantValue !== 0\n ) {\n const discriminantOffset = node.structDiscriminantOffset;\n\n if (!unionGroups.has(discriminantOffset)) {\n unionGroups.set(discriminantOffset, { discriminantOffset, fields: [] });\n }\n unionGroups.get(discriminantOffset)!.fields.push(field);\n } else {\n // 普通字段\n regularFields.push(field);\n }\n }\n\n return {\n unionGroups: Array.from(unionGroups.values()),\n regularFields,\n groupFields,\n };\n}\n\n/**\n * 生成 Union variant 类型\n */\nfunction generateUnionVariantType(group: UnionGroup, allNodes: NodeReader[]): string {\n const variants = group.fields.map((f) => {\n const tsType = f.isSlot ? getTypeScriptType(f.slotType, allNodes) : 'unknown';\n return `{ tag: ${f.discriminantValue}; variant: '${f.name}'; value: ${tsType} }`;\n });\n return variants.join(' | ');\n}\n\n/**\n * 生成 Union 字段的 getter\n */\nfunction generateUnionFieldGetter(\n field: FieldReader,\n unionName: string,\n discriminantValue: number\n): string {\n const name = field.name;\n const type = field.slotType;\n\n if (!type || !field.isSlot) {\n return `get${capitalize(name)}(): unknown | undefined { return this.get${unionName}Tag() === ${discriminantValue} ? undefined : undefined; }`;\n }\n\n const returnType = getTypeScriptTypeForSetter(type);\n\n let body: string;\n switch (type.kind) {\n case 'void':\n body = 'return undefined;';\n break;\n case 'bool':\n body = `return this.reader.getBool(${field.slotOffset * 8});`;\n break;\n case 'int8':\n body = `return this.reader.getInt8(${field.slotOffset});`;\n break;\n case 'int16':\n body = `return this.reader.getInt16(${field.slotOffset * 2});`;\n break;\n case 'int32':\n body = `return this.reader.getInt32(${field.slotOffset * 4});`;\n break;\n case 'int64':\n body = `return this.reader.getInt64(${field.slotOffset * 8});`;\n break;\n case 'uint8':\n body = `return this.reader.getUint8(${field.slotOffset});`;\n break;\n case 'uint16':\n body = `return this.reader.getUint16(${field.slotOffset * 2});`;\n break;\n case 'uint32':\n body = `return this.reader.getUint32(${field.slotOffset * 4});`;\n break;\n case 'uint64':\n body = `return this.reader.getUint64(${field.slotOffset * 8});`;\n break;\n case 'float32':\n body = `return this.reader.getFloat32(${field.slotOffset * 4});`;\n break;\n case 'float64':\n body = `return this.reader.getFloat64(${field.slotOffset * 8});`;\n break;\n case 'text':\n body = `return this.reader.getText(${field.slotOffset});`;\n break;\n case 'data':\n body = `return this.reader.getData(${field.slotOffset});`;\n break;\n default:\n body = 'return undefined;';\n }\n\n return `get${capitalize(name)}(): ${returnType} | undefined {\n if (this.get${unionName}Tag() !== ${discriminantValue}) return undefined;\n ${body}\n }`;\n}\n\n/**\n * 生成 Group 字段的 getter\n * Group 字段在父 struct 的 data/pointer section 中,但命名空间是 Group 的名字\n */\nfunction generateGroupFieldGetter(field: FieldReader, groupName: string): string {\n const name = field.name;\n const type = field.slotType;\n\n if (!type) {\n return `get${capitalize(groupName)}${capitalize(name)}(): unknown { return undefined; }`;\n }\n\n switch (type.kind) {\n case 'void':\n return `get${capitalize(groupName)}${capitalize(name)}(): void { return undefined; }`;\n case 'bool':\n return `get${capitalize(groupName)}${capitalize(name)}(): boolean { return this.reader.getBool(${field.slotOffset * 8}); }`;\n case 'int8':\n return `get${capitalize(groupName)}${capitalize(name)}(): number { return this.reader.getInt8(${field.slotOffset}); }`;\n case 'int16':\n return `get${capitalize(groupName)}${capitalize(name)}(): number { return this.reader.getInt16(${field.slotOffset * 2}); }`;\n case 'int32':\n return `get${capitalize(groupName)}${capitalize(name)}(): number { return this.reader.getInt32(${field.slotOffset * 4}); }`;\n case 'int64':\n return `get${capitalize(groupName)}${capitalize(name)}(): bigint { return this.reader.getInt64(${field.slotOffset * 8}); }`;\n case 'uint8':\n return `get${capitalize(groupName)}${capitalize(name)}(): number { return this.reader.getUint8(${field.slotOffset}); }`;\n case 'uint16':\n return `get${capitalize(groupName)}${capitalize(name)}(): number { return this.reader.getUint16(${field.slotOffset * 2}); }`;\n case 'uint32':\n return `get${capitalize(groupName)}${capitalize(name)}(): number { return this.reader.getUint32(${field.slotOffset * 4}); }`;\n case 'uint64':\n return `get${capitalize(groupName)}${capitalize(name)}(): bigint { return this.reader.getUint64(${field.slotOffset * 8}); }`;\n case 'float32':\n return `get${capitalize(groupName)}${capitalize(name)}(): number { return this.reader.getFloat32(${field.slotOffset * 4}); }`;\n case 'float64':\n return `get${capitalize(groupName)}${capitalize(name)}(): number { return this.reader.getFloat64(${field.slotOffset * 8}); }`;\n case 'text':\n return `get${capitalize(groupName)}${capitalize(name)}(): string { return this.reader.getText(${field.slotOffset}); }`;\n case 'data':\n return `get${capitalize(groupName)}${capitalize(name)}(): Uint8Array { return this.reader.getData(${field.slotOffset}); }`;\n default:\n return `get${capitalize(groupName)}${capitalize(name)}(): unknown { return undefined; }`;\n }\n}\n\n/**\n * 生成 Group 字段的 setter\n */\nfunction generateGroupFieldSetter(field: FieldReader, groupName: string): string {\n const name = field.name;\n const type = field.slotType;\n const paramType = getTypeScriptTypeForSetter(type);\n\n if (!type || !field.isSlot) {\n return `set${capitalize(groupName)}${capitalize(name)}(value: ${paramType}): void { /* TODO */ }`;\n }\n\n switch (type.kind) {\n case 'void':\n return `set${capitalize(groupName)}${capitalize(name)}(value: ${paramType}): void { }`;\n case 'bool':\n return `set${capitalize(groupName)}${capitalize(name)}(value: ${paramType}): void { this.builder.setBool(${field.slotOffset * 8}, value); }`;\n case 'int8':\n return `set${capitalize(groupName)}${capitalize(name)}(value: ${paramType}): void { this.builder.setInt8(${field.slotOffset}, value); }`;\n case 'int16':\n return `set${capitalize(groupName)}${capitalize(name)}(value: ${paramType}): void { this.builder.setInt16(${field.slotOffset * 2}, value); }`;\n case 'int32':\n return `set${capitalize(groupName)}${capitalize(name)}(value: ${paramType}): void { this.builder.setInt32(${field.slotOffset * 4}, value); }`;\n case 'int64':\n return `set${capitalize(groupName)}${capitalize(name)}(value: ${paramType}): void { this.builder.setInt64(${field.slotOffset * 8}, value); }`;\n case 'uint8':\n return `set${capitalize(groupName)}${capitalize(name)}(value: ${paramType}): void { this.builder.setUint8(${field.slotOffset}, value); }`;\n case 'uint16':\n return `set${capitalize(groupName)}${capitalize(name)}(value: ${paramType}): void { this.builder.setUint16(${field.slotOffset * 2}, value); }`;\n case 'uint32':\n return `set${capitalize(groupName)}${capitalize(name)}(value: ${paramType}): void { this.builder.setUint32(${field.slotOffset * 4}, value); }`;\n case 'uint64':\n return `set${capitalize(groupName)}${capitalize(name)}(value: ${paramType}): void { this.builder.setUint64(${field.slotOffset * 8}, value); }`;\n case 'float32':\n return `set${capitalize(groupName)}${capitalize(name)}(value: ${paramType}): void { this.builder.setFloat32(${field.slotOffset * 4}, value); }`;\n case 'float64':\n return `set${capitalize(groupName)}${capitalize(name)}(value: ${paramType}): void { this.builder.setFloat64(${field.slotOffset * 8}, value); }`;\n case 'text':\n return `set${capitalize(groupName)}${capitalize(name)}(value: ${paramType}): void { this.builder.setText(${field.slotOffset}, value); }`;\n case 'data':\n return `set${capitalize(groupName)}${capitalize(name)}(value: ${paramType}): void { this.builder.setData(${field.slotOffset}, value); }`;\n default:\n return `set${capitalize(groupName)}${capitalize(name)}(value: ${paramType}): void { /* TODO */ }`;\n }\n}\n\n/**\n * 生成 Union 字段的 setter\n */\nfunction generateUnionFieldSetter(\n field: FieldReader,\n _unionName: string,\n discriminantValue: number,\n discriminantOffset: number\n): string {\n const name = field.name;\n const type = field.slotType;\n const paramType = getTypeScriptTypeForSetter(type);\n\n if (!type || !field.isSlot) {\n return `set${capitalize(name)}(value: ${paramType}): void {\n this.builder.setUint16(${discriminantOffset}, ${discriminantValue});\n }`;\n }\n\n let body: string;\n switch (type.kind) {\n case 'void':\n body = '';\n break;\n case 'bool':\n body = `this.builder.setBool(${field.slotOffset * 8}, value);`;\n break;\n case 'int8':\n body = `this.builder.setInt8(${field.slotOffset}, value);`;\n break;\n case 'int16':\n body = `this.builder.setInt16(${field.slotOffset * 2}, value);`;\n break;\n case 'int32':\n body = `this.builder.setInt32(${field.slotOffset * 4}, value);`;\n break;\n case 'int64':\n body = `this.builder.setInt64(${field.slotOffset * 8}, value);`;\n break;\n case 'uint8':\n body = `this.builder.setUint8(${field.slotOffset}, value);`;\n break;\n case 'uint16':\n body = `this.builder.setUint16(${field.slotOffset * 2}, value);`;\n break;\n case 'uint32':\n body = `this.builder.setUint32(${field.slotOffset * 4}, value);`;\n break;\n case 'uint64':\n body = `this.builder.setUint64(${field.slotOffset * 8}, value);`;\n break;\n case 'float32':\n body = `this.builder.setFloat32(${field.slotOffset * 4}, value);`;\n break;\n case 'float64':\n body = `this.builder.setFloat64(${field.slotOffset * 8}, value);`;\n break;\n case 'text':\n body = `this.builder.setText(${field.slotOffset}, value);`;\n break;\n case 'data':\n body = `this.builder.setData(${field.slotOffset}, value);`;\n break;\n default:\n body = '';\n }\n\n return `set${capitalize(name)}(value: ${paramType}): void {\n this.builder.setUint16(${discriminantOffset}, ${discriminantValue});\n ${body}\n }`;\n}\n\n/**\n * 从 ValueReader 提取默认值,用于代码生成\n */\nfunction extractDefaultValue(field: FieldReader): string | undefined {\n const defaultValue = field.defaultValue;\n if (!defaultValue) return undefined;\n\n const type = field.slotType;\n if (!type) return undefined;\n\n switch (type.kind) {\n case 'bool':\n if (defaultValue.isBool) return defaultValue.boolValue ? 'true' : 'false';\n return undefined;\n case 'int8':\n if (defaultValue.isInt8) return `${defaultValue.int8Value}`;\n return undefined;\n case 'int16':\n if (defaultValue.isInt16) return `${defaultValue.int16Value}`;\n return undefined;\n case 'int32':\n if (defaultValue.isInt32) return `${defaultValue.int32Value}`;\n return undefined;\n case 'int64':\n if (defaultValue.isInt64) return `${defaultValue.int64Value}n`;\n return undefined;\n case 'uint8':\n if (defaultValue.isUint8) return `${defaultValue.uint8Value}`;\n return undefined;\n case 'uint16':\n if (defaultValue.isUint16) return `${defaultValue.uint16Value}`;\n return undefined;\n case 'uint32':\n if (defaultValue.isUint32) return `${defaultValue.uint32Value}`;\n return undefined;\n case 'uint64':\n if (defaultValue.isUint64) return `${defaultValue.uint64Value}n`;\n return undefined;\n case 'float32':\n if (defaultValue.isFloat32) {\n const val = defaultValue.float32Value;\n if (Number.isNaN(val)) return 'NaN';\n if (val === Number.POSITIVE_INFINITY) return 'Infinity';\n if (val === Number.NEGATIVE_INFINITY) return '-Infinity';\n return `${val}`;\n }\n return undefined;\n case 'float64':\n if (defaultValue.isFloat64) {\n const val = defaultValue.float64Value;\n if (Number.isNaN(val)) return 'NaN';\n if (val === Number.POSITIVE_INFINITY) return 'Infinity';\n if (val === Number.NEGATIVE_INFINITY) return '-Infinity';\n return `${val}`;\n }\n return undefined;\n case 'enum':\n if (defaultValue.isEnum) return `${defaultValue.enumValue}`;\n return undefined;\n default:\n return undefined;\n }\n}\n\n/**\n * 生成 XOR 解码表达式(用于 getter)\n * stored ^ default = actual\n */\nfunction generateXorDecode(expr: string, defaultValue: string, typeKind: TypeKind): string {\n switch (typeKind) {\n case 'bool':\n // bool: stored !== default\n return `${expr} !== ${defaultValue}`;\n case 'int8':\n case 'int16':\n case 'int32':\n // 有符号整数:先转无符号 XOR,再转回有符号\n return `(${expr} ^ ${defaultValue}) | 0`;\n case 'uint8':\n case 'uint16':\n case 'uint32':\n // 无符号整数:直接 XOR\n return `${expr} ^ ${defaultValue}`;\n case 'int64':\n case 'uint64':\n // bigint:直接 XOR\n return `${expr} ^ ${defaultValue}`;\n case 'float32':\n // float32: 需要位操作转换\n return `xorFloat32(${expr}, ${defaultValue})`;\n case 'float64':\n // float64: 需要位操作转换\n return `xorFloat64(${expr}, ${defaultValue})`;\n case 'enum':\n // enum 作为 uint16 处理\n return `${expr} ^ ${defaultValue}`;\n default:\n return expr;\n }\n}\n\n/**\n * 生成 XOR 编码表达式(用于 setter)\n * actual ^ default = stored\n */\nfunction generateXorEncode(valueExpr: string, defaultValue: string, typeKind: TypeKind): string {\n switch (typeKind) {\n case 'bool':\n // bool: value !== default\n return `${valueExpr} !== ${defaultValue}`;\n case 'int8':\n case 'int16':\n case 'int32':\n // 有符号整数:先转无符号 XOR\n return `(${valueExpr} >>> 0) ^ ${defaultValue}`;\n case 'uint8':\n case 'uint16':\n case 'uint32':\n // 无符号整数:直接 XOR\n return `${valueExpr} ^ ${defaultValue}`;\n case 'int64':\n case 'uint64':\n // bigint:直接 XOR\n return `${valueExpr} ^ ${defaultValue}`;\n case 'float32':\n // float32: 需要位操作转换\n return `xorFloat32(${valueExpr}, ${defaultValue})`;\n case 'float64':\n // float64: 需要位操作转换\n return `xorFloat64(${valueExpr}, ${defaultValue})`;\n case 'enum':\n // enum 作为 uint16 处理\n return `${valueExpr} ^ ${defaultValue}`;\n default:\n return valueExpr;\n }\n}\n\n/**\n * 生成字段 getter\n */\nfunction generateFieldGetter(field: FieldReader): string {\n const name = field.name;\n const type = field.slotType;\n const defaultValue = extractDefaultValue(field);\n\n if (!type) {\n return `get ${name}(): unknown { return undefined; }`;\n }\n\n // 如果有默认值,使用 XOR 解码\n if (defaultValue !== undefined && type.kind !== 'text' && type.kind !== 'data') {\n const readExpr = `this.reader.get${capitalize(type.kind)}(${getByteOffset(field, type.kind)})`;\n const decodedExpr = generateXorDecode(readExpr, defaultValue, type.kind);\n return `get ${name}(): ${getTypeScriptTypeForSetter(type)} { return ${decodedExpr}; }`;\n }\n\n switch (type.kind) {\n case 'void':\n return `get ${name}(): void { return undefined; }`;\n case 'bool':\n return `get ${name}(): boolean { return this.reader.getBool(${field.slotOffset * 8}); }`;\n case 'int8':\n return `get ${name}(): number { return this.reader.getInt8(${field.slotOffset}); }`;\n case 'int16':\n return `get ${name}(): number { return this.reader.getInt16(${field.slotOffset * 2}); }`;\n case 'int32':\n return `get ${name}(): number { return this.reader.getInt32(${field.slotOffset * 4}); }`;\n case 'int64':\n return `get ${name}(): bigint { return this.reader.getInt64(${field.slotOffset * 8}); }`;\n case 'uint8':\n return `get ${name}(): number { return this.reader.getUint8(${field.slotOffset}); }`;\n case 'uint16':\n return `get ${name}(): number { return this.reader.getUint16(${field.slotOffset * 2}); }`;\n case 'uint32':\n return `get ${name}(): number { return this.reader.getUint32(${field.slotOffset * 4}); }`;\n case 'uint64':\n return `get ${name}(): bigint { return this.reader.getUint64(${field.slotOffset * 8}); }`;\n case 'float32':\n return `get ${name}(): number { return this.reader.getFloat32(${field.slotOffset * 4}); }`;\n case 'float64':\n return `get ${name}(): number { return this.reader.getFloat64(${field.slotOffset * 8}); }`;\n case 'text':\n return `get ${name}(): string { return this.reader.getText(${field.slotOffset}); }`;\n case 'data':\n return `get ${name}(): Uint8Array { return this.reader.getData(${field.slotOffset}); }`;\n default:\n return `get ${name}(): unknown { return undefined; }`;\n }\n}\n\n/**\n * 获取字节偏移量\n */\nfunction getByteOffset(field: FieldReader, typeKind: TypeKind): number {\n switch (typeKind) {\n case 'bool':\n return field.slotOffset * 8; // bit offset\n case 'int8':\n case 'uint8':\n return field.slotOffset;\n case 'int16':\n case 'uint16':\n case 'enum':\n return field.slotOffset * 2;\n case 'int32':\n case 'uint32':\n case 'float32':\n return field.slotOffset * 4;\n case 'int64':\n case 'uint64':\n case 'float64':\n return field.slotOffset * 8;\n default:\n return field.slotOffset;\n }\n}\n\n/**\n * 生成字段 setter\n */\nfunction generateFieldSetter(field: FieldReader): string {\n const name = field.name;\n const type = field.slotType;\n const paramType = getTypeScriptTypeForSetter(type);\n const defaultValue = extractDefaultValue(field);\n\n if (!type) {\n return `set${capitalize(name)}(value: unknown): void { /* TODO */ }`;\n }\n\n // 如果有默认值,使用 XOR 编码\n if (defaultValue !== undefined && type.kind !== 'text' && type.kind !== 'data') {\n const encodedExpr = generateXorEncode('value', defaultValue, type.kind);\n const setterMethod = `set${capitalize(type.kind)}`;\n return `set${capitalize(name)}(value: ${paramType}): void { this.builder.${setterMethod}(${getByteOffset(field, type.kind)}, ${encodedExpr}); }`;\n }\n\n switch (type.kind) {\n case 'void':\n return `set${capitalize(name)}(value: void): void { /* void */ }`;\n case 'bool':\n return `set${capitalize(name)}(value: ${paramType}): void { this.builder.setBool(${field.slotOffset * 8}, value); }`;\n case 'int8':\n return `set${capitalize(name)}(value: ${paramType}): void { this.builder.setInt8(${field.slotOffset}, value); }`;\n case 'int16':\n return `set${capitalize(name)}(value: ${paramType}): void { this.builder.setInt16(${field.slotOffset * 2}, value); }`;\n case 'int32':\n return `set${capitalize(name)}(value: ${paramType}): void { this.builder.setInt32(${field.slotOffset * 4}, value); }`;\n case 'int64':\n return `set${capitalize(name)}(value: ${paramType}): void { this.builder.setInt64(${field.slotOffset * 8}, value); }`;\n case 'uint8':\n return `set${capitalize(name)}(value: ${paramType}): void { this.builder.setUint8(${field.slotOffset}, value); }`;\n case 'uint16':\n return `set${capitalize(name)}(value: ${paramType}): void { this.builder.setUint16(${field.slotOffset * 2}, value); }`;\n case 'uint32':\n return `set${capitalize(name)}(value: ${paramType}): void { this.builder.setUint32(${field.slotOffset * 4}, value); }`;\n case 'uint64':\n return `set${capitalize(name)}(value: ${paramType}): void { this.builder.setUint64(${field.slotOffset * 8}, value); }`;\n case 'float32':\n return `set${capitalize(name)}(value: ${paramType}): void { this.builder.setFloat32(${field.slotOffset * 4}, value); }`;\n case 'float64':\n return `set${capitalize(name)}(value: ${paramType}): void { this.builder.setFloat64(${field.slotOffset * 8}, value); }`;\n case 'text':\n return `set${capitalize(name)}(value: ${paramType}): void { this.builder.setText(${field.slotOffset}, value); }`;\n case 'data':\n return `set${capitalize(name)}(value: ${paramType}): void { this.builder.setData(${field.slotOffset}, value); }`;\n default:\n return `set${capitalize(name)}(value: ${paramType}): void { /* TODO */ }`;\n }\n}\n\n/**\n * 获取 TypeScript setter 参数类型\n */\nfunction getTypeScriptTypeForSetter(type: TypeReader | null): string {\n if (!type) return 'unknown';\n\n switch (type.kind) {\n case 'void':\n return 'void';\n case 'bool':\n return 'boolean';\n case 'int8':\n case 'int16':\n case 'int32':\n case 'uint8':\n case 'uint16':\n case 'uint32':\n case 'float32':\n case 'float64':\n return 'number';\n case 'int64':\n case 'uint64':\n return 'bigint';\n case 'text':\n return 'string';\n case 'data':\n return 'Uint8Array';\n default:\n return 'unknown';\n }\n}\n\n/**\n * 首字母大写\n */\nfunction capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n/**\n * 生成 Enum 的 TypeScript 代码\n */\nfunction generateEnum(node: NodeReader): string {\n const lines: string[] = [];\n const enumName = getShortName(node.displayName);\n\n lines.push(`export enum ${enumName} {`);\n for (const enumerant of node.enumEnumerants) {\n lines.push(` ${enumerant.name} = ${enumerant.codeOrder},`);\n }\n lines.push('}');\n\n return lines.join('\\n');\n}\n\n/**\n * 获取 TypeScript 类型字符串\n */\nfunction getTypeScriptType(type: TypeReader | null, allNodes: NodeReader[]): string {\n if (!type) return 'unknown';\n\n switch (type.kind) {\n case 'void':\n return 'void';\n case 'bool':\n return 'boolean';\n case 'int8':\n case 'int16':\n case 'int32':\n case 'uint8':\n case 'uint16':\n case 'uint32':\n case 'float32':\n case 'float64':\n return 'number';\n case 'int64':\n case 'uint64':\n return 'bigint';\n case 'text':\n return 'string';\n case 'data':\n return 'Uint8Array';\n case 'list': {\n const elementType = type.listElementType;\n if (!elementType) return 'unknown[]';\n const elemTsType = getTypeScriptType(elementType, allNodes);\n return `${elemTsType}[]`;\n }\n case 'struct': {\n const structNode = allNodes.find((n) => n.id === type.typeId);\n if (structNode) {\n return getShortName(structNode.displayName);\n }\n return 'unknown';\n }\n case 'enum': {\n const enumNode = allNodes.find((n) => n.id === type.typeId);\n if (enumNode) {\n return getShortName(enumNode.displayName);\n }\n return 'unknown';\n }\n default:\n return 'unknown';\n }\n}\n\n/**\n * 从 displayName 获取短名称\n * 例如 \"test-schema.capnp:Person\" -> \"Person\"\n * 处理 auto-generated 名称如 \"Calculator.evaluate$Params\" -> \"EvaluateParams\"\n */\nfunction getShortName(displayName: string): string {\n // Handle empty or undefined display names\n if (!displayName) {\n return 'Unknown';\n }\n const colonIndex = displayName.lastIndexOf(':');\n let name = colonIndex >= 0 ? displayName.substring(colonIndex + 1) : displayName;\n\n // Replace invalid characters for TypeScript identifiers\n // Handle auto-generated names like \"Calculator.evaluate$Params\" -> \"EvaluateParams\"\n if (name.includes('.')) {\n const parts = name.split('.');\n if (parts.length === 2 && parts[1].includes('$')) {\n // Interface method params/results: \"Interface.method$Params\" -> \"MethodParams\"\n const methodPart = parts[1];\n const dollarIndex = methodPart.indexOf('$');\n if (dollarIndex > 0) {\n const methodName = methodPart.substring(0, dollarIndex);\n const suffix = methodPart.substring(dollarIndex + 1);\n name = capitalize(methodName) + suffix;\n } else {\n name = capitalize(parts[1]);\n }\n } else {\n name = parts[parts.length - 1];\n }\n }\n\n // Remove any remaining invalid characters\n name = name.replace(/[^a-zA-Z0-9_]/g, '_');\n\n return name;\n}\n\n/**\n * 生成 Interface 的 TypeScript 代码\n * 包括:Method Constants、Client Class、Server Interface、Server Stub\n */\nfunction generateInterface(node: NodeReader, allNodes: NodeReader[]): string {\n const lines: string[] = [];\n const interfaceName = getShortName(node.displayName);\n const methods = node.interfaceMethods;\n\n if (methods.length === 0) {\n return `// Interface ${interfaceName} has no methods`;\n }\n\n // 1. 生成 Method ID 常量\n lines.push(`// ${interfaceName} Method IDs`);\n lines.push(`export const ${interfaceName}InterfaceId = ${node.id}n;`);\n lines.push(`export const ${interfaceName}MethodIds = {`);\n for (const method of methods) {\n lines.push(` ${method.name}: ${method.codeOrder},`);\n }\n lines.push('} as const;');\n lines.push('');\n\n // 2. 生成 Server Interface\n lines.push(`// ${interfaceName} Server Interface`);\n lines.push(`export interface ${interfaceName}Server {`);\n for (const method of methods) {\n const paramType = getTypeNameById(method.paramStructType, allNodes, 'unknown');\n const resultType = getTypeNameById(method.resultStructType, allNodes, 'unknown');\n lines.push(\n ` ${method.name}(context: CallContext<${paramType}Reader, ${resultType}Builder>): Promise<void> | void;`\n );\n }\n lines.push('}');\n lines.push('');\n\n // 3. 生成 Server Stub\n lines.push(`// ${interfaceName} Server Stub`);\n lines.push(`export class ${interfaceName}Stub {`);\n lines.push(` private server: ${interfaceName}Server;`);\n lines.push('');\n lines.push(` constructor(server: ${interfaceName}Server) {`);\n lines.push(' this.server = server;');\n lines.push(' }');\n lines.push('');\n lines.push(` static readonly interfaceId = ${node.id}n;`);\n lines.push('');\n lines.push(' /** Dispatch a method call to the appropriate handler */');\n lines.push(\n ' async dispatch(methodId: number, context: CallContext<unknown, unknown>): Promise<void> {'\n );\n lines.push(' switch (methodId) {');\n\n for (const method of methods) {\n const paramType = getTypeNameById(method.paramStructType, allNodes, 'unknown');\n const resultType = getTypeNameById(method.resultStructType, allNodes, 'unknown');\n lines.push(` case ${interfaceName}MethodIds.${method.name}:`);\n lines.push(\n ` return this.server.${method.name}(context as CallContext<${paramType}Reader, ${resultType}Builder>);`\n );\n }\n\n lines.push(' default:');\n lines.push(' throw new Error(`Unknown method ID: ${methodId}`);');\n lines.push(' }');\n lines.push(' }');\n lines.push('');\n lines.push(' /** Check if a method ID is valid */');\n lines.push(' isValidMethod(methodId: number): boolean {');\n lines.push(' return [');\n for (const method of methods) {\n lines.push(` ${interfaceName}MethodIds.${method.name},`);\n }\n lines.push(' ].includes(methodId);');\n lines.push(' }');\n lines.push('}');\n lines.push('');\n\n // 4. 生成 Client Class\n lines.push(`// ${interfaceName} Client Class`);\n lines.push(`export class ${interfaceName}Client extends BaseCapabilityClient {`);\n lines.push(` static readonly interfaceId = ${node.id}n;`);\n lines.push('');\n\n for (const method of methods) {\n const paramType = getTypeNameById(method.paramStructType, allNodes, 'unknown');\n const resultType = getTypeNameById(method.resultStructType, allNodes, 'unknown');\n\n // 生成方法文档注释\n lines.push(' /**');\n lines.push(` * ${method.name}`);\n lines.push(` * @param params - ${paramType}`);\n lines.push(` * @returns PipelineClient<${resultType}Reader>`);\n lines.push(' */');\n\n // 生成方法签名\n lines.push(\n ` ${method.name}(params: ${paramType}Builder): PipelineClient<${resultType}Reader> {`\n );\n lines.push(' return this._call(');\n lines.push(` ${interfaceName}Client.interfaceId,`);\n lines.push(` ${interfaceName}MethodIds.${method.name},`);\n lines.push(' params');\n lines.push(` ) as PipelineClient<${resultType}Reader>;`);\n lines.push(' }');\n lines.push('');\n }\n\n lines.push('}');\n\n return lines.join('\\n');\n}\n\n/**\n * 根据类型 ID 获取类型名称\n */\nfunction getTypeNameById(id: bigint, allNodes: NodeReader[], fallback: string): string {\n const node = allNodes.find((n) => n.id === id);\n if (!node) return fallback;\n return getShortName(node.displayName);\n}\n","/**\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 if (byteOffset + 8 > this._size) {\n throw new Error(\n `Offset ${wordOffset} is outside the bounds of the segment (${this.wordCount} words)`\n );\n }\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 if (byteOffset + 8 > this.buffer.byteLength) {\n throw new Error(`Offset ${wordOffset} is outside the bounds of the segment`);\n }\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 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 dataOffset = this.wordOffset * WORD_SIZE + byteOffset;\n\n // 边界检查:确保在 data section 内\n const dataSectionEnd = this.wordOffset * WORD_SIZE + this.dataWords * WORD_SIZE;\n if (dataOffset < 0 || dataOffset >= dataSectionEnd) {\n return false; // 越界返回默认值\n }\n\n const byte = segment.dataView.getUint8(dataOffset);\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 const dataOffset = this.wordOffset * WORD_SIZE + byteOffset;\n\n // 边界检查\n const dataSectionEnd = this.wordOffset * WORD_SIZE + this.dataWords * WORD_SIZE;\n if (dataOffset < 0 || dataOffset >= dataSectionEnd) {\n return 0;\n }\n\n return segment.dataView.getInt8(dataOffset);\n }\n\n /**\n * 获取 int16 字段\n */\n getInt16(byteOffset: number): number {\n const segment = this.message.getSegment(this.segmentIndex)!;\n const dataOffset = this.wordOffset * WORD_SIZE + byteOffset;\n\n // 边界检查\n const dataSectionEnd = this.wordOffset * WORD_SIZE + this.dataWords * WORD_SIZE;\n if (dataOffset < 0 || dataOffset + 2 > dataSectionEnd) {\n return 0;\n }\n\n return segment.dataView.getInt16(dataOffset, true);\n }\n\n /**\n * 获取 int32 字段\n */\n getInt32(byteOffset: number): number {\n const segment = this.message.getSegment(this.segmentIndex)!;\n const dataOffset = this.wordOffset * WORD_SIZE + byteOffset;\n\n // 边界检查\n const dataSectionEnd = this.wordOffset * WORD_SIZE + this.dataWords * WORD_SIZE;\n if (dataOffset < 0 || dataOffset + 4 > dataSectionEnd) {\n return 0;\n }\n\n return segment.dataView.getInt32(dataOffset, true);\n }\n\n /**\n * 获取 int64 字段\n */\n getInt64(byteOffset: number): bigint {\n const segment = this.message.getSegment(this.segmentIndex)!;\n const dataOffset = this.wordOffset * WORD_SIZE + byteOffset;\n\n // 边界检查\n const dataSectionEnd = this.wordOffset * WORD_SIZE + this.dataWords * WORD_SIZE;\n if (dataOffset < 0 || dataOffset + 8 > dataSectionEnd) {\n return BigInt(0);\n }\n\n const low = BigInt(segment.dataView.getUint32(dataOffset, true));\n const high = BigInt(segment.dataView.getInt32(dataOffset + 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 const dataOffset = this.wordOffset * WORD_SIZE + byteOffset;\n\n // 边界检查\n const dataSectionEnd = this.wordOffset * WORD_SIZE + this.dataWords * WORD_SIZE;\n if (dataOffset < 0 || dataOffset >= dataSectionEnd) {\n return 0;\n }\n\n return segment.dataView.getUint8(dataOffset);\n }\n\n /**\n * 获取 uint16 字段\n */\n getUint16(byteOffset: number): number {\n const segment = this.message.getSegment(this.segmentIndex)!;\n const dataOffset = this.wordOffset * WORD_SIZE + byteOffset;\n\n // 边界检查\n const dataSectionEnd = this.wordOffset * WORD_SIZE + this.dataWords * WORD_SIZE;\n if (dataOffset < 0 || dataOffset + 2 > dataSectionEnd) {\n return 0;\n }\n\n return segment.dataView.getUint16(dataOffset, true);\n }\n\n /**\n * 获取 uint32 字段\n */\n getUint32(byteOffset: number): number {\n const segment = this.message.getSegment(this.segmentIndex)!;\n const dataOffset = this.wordOffset * WORD_SIZE + byteOffset;\n\n // 边界检查\n const dataSectionEnd = this.wordOffset * WORD_SIZE + this.dataWords * WORD_SIZE;\n if (dataOffset < 0 || dataOffset + 4 > dataSectionEnd) {\n return 0;\n }\n\n return segment.dataView.getUint32(dataOffset, true);\n }\n\n /**\n * 获取 uint64 字段\n */\n getUint64(byteOffset: number): bigint {\n const segment = this.message.getSegment(this.segmentIndex)!;\n const dataOffset = this.wordOffset * WORD_SIZE + byteOffset;\n\n // 边界检查\n const dataSectionEnd = this.wordOffset * WORD_SIZE + this.dataWords * WORD_SIZE;\n if (dataOffset < 0 || dataOffset + 8 > dataSectionEnd) {\n return BigInt(0);\n }\n\n const low = BigInt(segment.dataView.getUint32(dataOffset, true));\n const high = BigInt(segment.dataView.getUint32(dataOffset + 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 const dataOffset = this.wordOffset * WORD_SIZE + byteOffset;\n\n // 边界检查\n const dataSectionEnd = this.wordOffset * WORD_SIZE + this.dataWords * WORD_SIZE;\n if (dataOffset < 0 || dataOffset + 4 > dataSectionEnd) {\n return 0;\n }\n\n return segment.dataView.getFloat32(dataOffset, true);\n }\n\n /**\n * 获取 float64 字段\n */\n getFloat64(byteOffset: number): number {\n const segment = this.message.getSegment(this.segmentIndex)!;\n const dataOffset = this.wordOffset * WORD_SIZE + byteOffset;\n\n // 边界检查\n const dataSectionEnd = this.wordOffset * WORD_SIZE + this.dataWords * WORD_SIZE;\n if (dataOffset < 0 || dataOffset + 8 > dataSectionEnd) {\n return 0;\n }\n\n return segment.dataView.getFloat64(dataOffset, 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 // 边界检查:确保有足够的空间读取 tag word\n if (targetOffset < 0 || targetOffset >= segment.wordCount) {\n return undefined;\n }\n\n try {\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 } catch {\n return undefined;\n }\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 编译后 Schema 的 TypeScript Reader\n * 基于官方 schema.capnp 手动编写\n *\n * 这是自举的基础:我们需要先能读取 schema 才能生成 schema 的代码\n *\n * 结构信息来自: capnp compile -ocapnp schema.capnp\n */\n\nimport { MessageReader, type StructReader } from '../core/index.js';\nimport { ElementSize } from '../core/pointer.js';\n\n// ============================================================================\n// 基础类型\n// ============================================================================\n\n/** UInt64 作为 bigint */\nexport type Id = bigint;\n\n// ============================================================================\n// Node\n// ============================================================================\n\nexport class NodeReader {\n constructor(private reader: StructReader) {}\n\n get id(): Id {\n return this.reader.getUint64(0);\n }\n\n get displayName(): string {\n return this.reader.getText(0);\n }\n\n get displayNamePrefixLength(): number {\n return this.reader.getUint32(8);\n }\n\n get scopeId(): Id {\n return this.reader.getUint64(16);\n }\n\n /** union tag 在 bits [96, 112) = bytes [12, 14) */\n private get unionTag(): number {\n return this.reader.getUint16(12);\n }\n\n get isFile(): boolean {\n return this.unionTag === 0;\n }\n\n get isStruct(): boolean {\n return this.unionTag === 1;\n }\n\n get isEnum(): boolean {\n return this.unionTag === 2;\n }\n\n get isInterface(): boolean {\n return this.unionTag === 3;\n }\n\n get isConst(): boolean {\n return this.unionTag === 4;\n }\n\n get isAnnotation(): boolean {\n return this.unionTag === 5;\n }\n\n // --- Struct 相关字段 (union tag = 1) ---\n // struct group 从 bit 112 = byte 14 开始\n\n get structDataWordCount(): number {\n return this.reader.getUint16(14);\n }\n\n get structPointerCount(): number {\n return this.reader.getUint16(24);\n }\n\n get structPreferredListEncoding(): number {\n return this.reader.getUint16(26);\n }\n\n get structIsGroup(): boolean {\n // isGroup @10 :Bool; 在 bit 224 = byte 28\n return this.reader.getBool(224);\n }\n\n get structDiscriminantCount(): number {\n return this.reader.getUint16(30);\n }\n\n get structDiscriminantOffset(): number {\n return this.reader.getUint32(32);\n }\n\n get structFields(): FieldReader[] {\n // fields @13 :List(Field); 是 ptr[3]\n // Field: 24 bytes = 3 words data, 4 pointers\n const listReader = this.reader.getList(3, ElementSize.INLINE_COMPOSITE, {\n dataWords: 3,\n pointerCount: 4,\n });\n if (!listReader) return [];\n\n const fields: FieldReader[] = [];\n for (let i = 0; i < listReader.length; i++) {\n const itemReader = listReader.getStruct(i);\n const field = new FieldReader(itemReader);\n // Stop if we encounter a field with empty name (likely past the actual fields)\n if (!field.name && i > 0) break;\n fields.push(field);\n }\n return fields;\n }\n\n // --- Enum 相关字段 (union tag = 2) ---\n\n get enumEnumerants(): EnumerantReader[] {\n // enumerants @14 :List(Enumerant); 在 enum group 内,ptr[3]\n const listReader = this.reader.getList(3, ElementSize.INLINE_COMPOSITE, {\n dataWords: 1,\n pointerCount: 2,\n });\n if (!listReader) return [];\n\n const enumerants: EnumerantReader[] = [];\n for (let i = 0; i < Math.min(listReader.length, 10); i++) {\n try {\n const itemReader = listReader.getStruct(i);\n const enumerant = new EnumerantReader(itemReader);\n // Stop if we encounter an enumerant with empty name\n if (!enumerant.name) break;\n enumerants.push(enumerant);\n } catch (_e) {\n // Stop on any error (likely past the actual enumerants)\n break;\n }\n }\n return enumerants;\n }\n\n // --- Interface 相关字段 (union tag = 3) ---\n\n get interfaceMethods(): MethodReader[] {\n // methods @15 :List(Method); 在 interface group 内,ptr[3]\n // Method: 5 words data, 2 pointers\n const listReader = this.reader.getList(3, ElementSize.INLINE_COMPOSITE, {\n dataWords: 5,\n pointerCount: 2,\n });\n if (!listReader) return [];\n\n const methods: MethodReader[] = [];\n for (let i = 0; i < listReader.length; i++) {\n try {\n const itemReader = listReader.getStruct(i);\n const method = new MethodReader(itemReader);\n if (!method.name && i > 0) break;\n methods.push(method);\n } catch (_e) {\n break;\n }\n }\n return methods;\n }\n\n // --- NestedNodes ---\n\n get nestedNodes(): NestedNodeReader[] {\n // nestedNodes @4 :List(NestedNode); 是 ptr[1]\n const listReader = this.reader.getList(1, ElementSize.INLINE_COMPOSITE, {\n dataWords: 1,\n pointerCount: 1,\n });\n if (!listReader) return [];\n\n const nodes: NestedNodeReader[] = [];\n for (let i = 0; i < listReader.length; i++) {\n const itemReader = listReader.getStruct(i);\n nodes.push(new NestedNodeReader(itemReader));\n }\n return nodes;\n }\n}\n\n// ============================================================================\n// Field\n// ============================================================================\n\nexport class FieldReader {\n constructor(private reader: StructReader) {}\n\n get name(): string {\n return this.reader.getText(0);\n }\n\n get codeOrder(): number {\n return this.reader.getUint16(0);\n }\n\n get discriminantValue(): number {\n return this.reader.getUint16(2);\n }\n\n /** union tag 在 bits [64, 80) = bytes [8, 10) */\n private get unionTag(): number {\n return this.reader.getUint16(8);\n }\n\n get isSlot(): boolean {\n return this.unionTag === 0;\n }\n\n get isGroup(): boolean {\n return this.unionTag === 1;\n }\n\n // --- Slot 相关 ---\n\n get slotOffset(): number {\n return this.reader.getUint32(4);\n }\n\n get slotType(): TypeReader | null {\n // type @5 :Type; 是 ptr[2]\n const typeReader = this.reader.getStruct(2, 3, 1); // Type: 24 bytes = 3 words, 1 pointer\n return typeReader ? new TypeReader(typeReader) : null;\n }\n\n // --- Group 相关 ---\n\n get groupTypeId(): Id {\n // typeId @7 :UInt64; 在 group group 内,bits [128, 192) = bytes [16, 24)\n return this.reader.getUint64(16);\n }\n\n // --- Default Value ---\n\n get defaultValue(): ValueReader | null {\n // defaultValue @6 :Value; 是 ptr[3]\n const valueReader = this.reader.getStruct(3, 2, 1); // Value: 16 bytes = 2 words, 1 pointer\n return valueReader ? new ValueReader(valueReader) : null;\n }\n}\n\n// ============================================================================\n// Type\n// ============================================================================\n\nexport class TypeReader {\n constructor(private reader: StructReader) {}\n\n get kind(): TypeKind {\n const tag = this.reader.getUint16(0);\n return TYPE_KIND_MAP[tag] ?? 'unknown';\n }\n\n get isPrimitive(): boolean {\n const k = this.kind;\n return (\n k !== 'list' && k !== 'enum' && k !== 'struct' && k !== 'interface' && k !== 'anyPointer'\n );\n }\n\n // --- List ---\n\n get listElementType(): TypeReader | null {\n if (this.kind !== 'list') return null;\n // elementType @14 :Type; 是 ptr[0]\n const elementReader = this.reader.getStruct(0, 3, 1);\n return elementReader ? new TypeReader(elementReader) : null;\n }\n\n // --- Enum/Struct/Interface ---\n\n get typeId(): Id | null {\n const k = this.kind;\n if (k === 'enum' || k === 'struct' || k === 'interface') {\n // typeId 在 bits [64, 128) = bytes [8, 16)\n return this.reader.getUint64(8);\n }\n return null;\n }\n}\n\nexport type TypeKind =\n | 'void'\n | 'bool'\n | 'int8'\n | 'int16'\n | 'int32'\n | 'int64'\n | 'uint8'\n | 'uint16'\n | 'uint32'\n | 'uint64'\n | 'float32'\n | 'float64'\n | 'text'\n | 'data'\n | 'list'\n | 'enum'\n | 'struct'\n | 'interface'\n | 'anyPointer'\n | 'unknown';\n\nconst TYPE_KIND_MAP: Record<number, TypeKind> = {\n 0: 'void',\n 1: 'bool',\n 2: 'int8',\n 3: 'int16',\n 4: 'int32',\n 5: 'int64',\n 6: 'uint8',\n 7: 'uint16',\n 8: 'uint32',\n 9: 'uint64',\n 10: 'float32',\n 11: 'float64',\n 12: 'text',\n 13: 'data',\n 14: 'list',\n 15: 'enum',\n 16: 'struct',\n 17: 'interface',\n 18: 'anyPointer',\n};\n\n// ============================================================================\n// Value - 默认值\n// ============================================================================\n\nexport class ValueReader {\n constructor(private reader: StructReader) {}\n\n /** union tag 在 bits [0, 16) = bytes [0, 2) */\n private get unionTag(): number {\n return this.reader.getUint16(0);\n }\n\n get isVoid(): boolean {\n return this.unionTag === 0;\n }\n get isBool(): boolean {\n return this.unionTag === 1;\n }\n get isInt8(): boolean {\n return this.unionTag === 2;\n }\n get isInt16(): boolean {\n return this.unionTag === 3;\n }\n get isInt32(): boolean {\n return this.unionTag === 4;\n }\n get isInt64(): boolean {\n return this.unionTag === 5;\n }\n get isUint8(): boolean {\n return this.unionTag === 6;\n }\n get isUint16(): boolean {\n return this.unionTag === 7;\n }\n get isUint32(): boolean {\n return this.unionTag === 8;\n }\n get isUint64(): boolean {\n return this.unionTag === 9;\n }\n get isFloat32(): boolean {\n return this.unionTag === 10;\n }\n get isFloat64(): boolean {\n return this.unionTag === 11;\n }\n get isText(): boolean {\n return this.unionTag === 12;\n }\n get isData(): boolean {\n return this.unionTag === 13;\n }\n get isList(): boolean {\n return this.unionTag === 14;\n }\n get isEnum(): boolean {\n return this.unionTag === 15;\n }\n get isStruct(): boolean {\n return this.unionTag === 16;\n }\n get isInterface(): boolean {\n return this.unionTag === 17;\n }\n get isAnyPointer(): boolean {\n return this.unionTag === 18;\n }\n\n // --- 原始值读取 ---\n\n get boolValue(): boolean {\n // boolValue @1 :Bool; 在 bit 16\n return this.reader.getBool(16);\n }\n\n get int8Value(): number {\n // int8Value @2 :Int8; 在 byte 2\n return this.reader.getInt8(2);\n }\n\n get int16Value(): number {\n // int16Value @3 :Int16; 在 bytes [2, 4)\n return this.reader.getInt16(2);\n }\n\n get int32Value(): number {\n // int32Value @4 :Int32; 在 bytes [4, 8)\n return this.reader.getInt32(4);\n }\n\n get int64Value(): bigint {\n // int64Value @5 :Int64; 在 bytes [8, 16)\n return this.reader.getInt64(8);\n }\n\n get uint8Value(): number {\n // uint8Value @6 :UInt8; 在 byte 2\n return this.reader.getUint8(2);\n }\n\n get uint16Value(): number {\n // uint16Value @7 :UInt16; 在 bytes [2, 4)\n return this.reader.getUint16(2);\n }\n\n get uint32Value(): number {\n // uint32Value @8 :UInt32; 在 bytes [4, 8)\n return this.reader.getUint32(4);\n }\n\n get uint64Value(): bigint {\n // uint64Value @9 :UInt64; 在 bytes [8, 16)\n return this.reader.getUint64(8);\n }\n\n get float32Value(): number {\n // float32Value @10 :Float32; 在 bytes [4, 8)\n return this.reader.getFloat32(4);\n }\n\n get float64Value(): number {\n // float64Value @11 :Float64; 在 bytes [8, 16)\n return this.reader.getFloat64(8);\n }\n\n get enumValue(): number {\n // enumValue @15 :UInt16; 在 bytes [2, 4)\n return this.reader.getUint16(2);\n }\n\n // --- 便捷方法:获取特定类型的默认值 ---\n\n getAsNumber(): number | undefined {\n if (this.isInt8) return this.int8Value;\n if (this.isInt16) return this.int16Value;\n if (this.isInt32) return this.int32Value;\n if (this.isUint8) return this.uint8Value;\n if (this.isUint16) return this.uint16Value;\n if (this.isUint32) return this.uint32Value;\n if (this.isFloat32) return this.float32Value;\n if (this.isFloat64) return this.float64Value;\n if (this.isEnum) return this.enumValue;\n return undefined;\n }\n\n getAsBigint(): bigint | undefined {\n if (this.isInt64) return this.int64Value;\n if (this.isUint64) return this.uint64Value;\n return undefined;\n }\n\n getAsBoolean(): boolean | undefined {\n if (this.isBool) return this.boolValue;\n return undefined;\n }\n}\n\n// ============================================================================\n// Method - Interface 方法\n// ============================================================================\n\nexport class MethodReader {\n constructor(private reader: StructReader) {}\n\n get name(): string {\n return this.reader.getText(0);\n }\n\n get codeOrder(): number {\n return this.reader.getUint16(0);\n }\n\n get paramStructType(): Id {\n // paramStructType @2 :Id; 在 bytes [8, 16)\n return this.reader.getUint64(8);\n }\n\n get resultStructType(): Id {\n // resultStructType @3 :Id; 在 bytes [16, 24)\n return this.reader.getUint64(16);\n }\n}\n\n// ============================================================================\n// Enumerant\n// ============================================================================\n\nexport class EnumerantReader {\n constructor(private reader: StructReader) {}\n\n get name(): string {\n return this.reader.getText(0);\n }\n\n get codeOrder(): number {\n return this.reader.getUint16(0);\n }\n}\n\n// ============================================================================\n// NestedNode\n// ============================================================================\n\nexport class NestedNodeReader {\n constructor(private reader: StructReader) {}\n\n get name(): string {\n return this.reader.getText(0);\n }\n\n get id(): Id {\n return this.reader.getUint64(0);\n }\n}\n\n// ============================================================================\n// CodeGeneratorRequest\n// ============================================================================\n\nexport class CodeGeneratorRequestReader {\n constructor(private message: MessageReader) {}\n\n static fromBuffer(buffer: ArrayBuffer): CodeGeneratorRequestReader {\n const message = new MessageReader(buffer);\n return new CodeGeneratorRequestReader(message);\n }\n\n get nodes(): NodeReader[] {\n // CodeGeneratorRequest: 0 data words, 4 pointers\n const root = this.message.getRoot(0, 4);\n // nodes @0 :List(Node);\n const listReader = root.getList(0, ElementSize.INLINE_COMPOSITE, {\n dataWords: 6,\n pointerCount: 6,\n });\n if (!listReader) return [];\n\n const nodes: NodeReader[] = [];\n for (let i = 0; i < listReader.length; i++) {\n const nodeReader = listReader.getStruct(i);\n nodes.push(new NodeReader(nodeReader));\n }\n return nodes;\n }\n\n get requestedFiles(): RequestedFileReader[] {\n const root = this.message.getRoot(0, 4);\n // requestedFiles @1 :List(RequestedFile);\n const listReader = root.getList(1, ElementSize.INLINE_COMPOSITE, {\n dataWords: 1,\n pointerCount: 2,\n });\n if (!listReader) return [];\n\n const files: RequestedFileReader[] = [];\n for (let i = 0; i < listReader.length; i++) {\n try {\n const fileReader = listReader.getStruct(i);\n const file = new RequestedFileReader(fileReader);\n // Stop if we encounter a file with empty filename\n if (!file.filename && files.length > 0) break;\n files.push(file);\n } catch (_e) {\n // Stop on any error (likely past the actual files)\n break;\n }\n }\n return files;\n }\n}\n\n// ============================================================================\n// RequestedFile\n// ============================================================================\n\nexport class RequestedFileReader {\n constructor(private reader: StructReader) {}\n\n get id(): Id {\n return this.reader.getUint64(0);\n }\n\n get filename(): string {\n return this.reader.getText(0);\n }\n}\n","#!/usr/bin/env node\n\n/**\n * Cap'n Proto CLI\n *\n * Usage:\n * capnp gen schema.capnp -o types.ts\n */\n\nimport { execSync } from 'node:child_process';\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { mkdirSync, mkdtempSync, rmSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { basename, dirname, join } from 'node:path';\nimport { parseArgs } from 'node:util';\nimport { type GeneratorOptions, generateFromRequest } from './codegen/generator.js';\nimport { CodeGeneratorRequestReader } from './schema/schema-reader.js';\n\nconst { values, positionals } = parseArgs({\n args: process.argv.slice(2),\n options: {\n output: { type: 'string', short: 'o' },\n outDir: { type: 'string', short: 'd' },\n runtimePath: { type: 'string', short: 'r' },\n dynamic: { type: 'boolean', short: 'D' },\n interactive: { type: 'boolean', short: 'i' },\n help: { type: 'boolean', short: 'h' },\n version: { type: 'boolean', short: 'v' },\n },\n allowPositionals: true,\n});\n\nconst VERSION = '3.0.0';\n\nif (values.version) {\n console.log(VERSION);\n process.exit(0);\n}\n\nif (values.help || positionals.length === 0) {\n console.log(`\nCap'n Proto TypeScript Code Generator v3\n\nUsage: capnp-ts-codegen <schema.capnp> [options]\n\nOptions:\n -o, --output Output file (default: stdout for single file)\n -d, --outDir Output directory for multiple files\n -r, --runtimePath Runtime library import path (default: @naeemo/capnp)\n -D, --dynamic Generate dynamic schema loading code\n -i, --interactive Start interactive schema query tool\n -h, --help Show this help\n -v, --version Show version\n\nExamples:\n capnp-ts-codegen schema.capnp -o schema.ts\n capnp-ts-codegen schema.capnp -d ./generated\n capnp-ts-codegen schema.capnp -o schema.ts -r ../runtime\n capnp-ts-codegen schema.capnp -D -o schema-dynamic.ts\n capnp-ts-codegen schema.capnp -i\n\nFeatures:\n - Struct with all primitive types\n - Enum\n - List<T>\n - Text, Data\n - Nested struct references\n - Union (discriminant handling)\n - Group\n - Default values (XOR encoding)\n - Multi-segment messages\n - Interface (RPC client/server generation)\n - Dynamic schema loading (Phase 7)\n\nNot yet supported:\n - Const\n - Advanced RPC features (Level 2-4)\n`);\n process.exit(0);\n}\n\nconst inputFile = positionals[0];\n\n// Validate input file\nif (!existsSync(inputFile)) {\n console.error(`Error: File not found: ${inputFile}`);\n process.exit(1);\n}\n\n// Check if capnp tool is available\nfunction checkCapnpTool(): boolean {\n try {\n execSync('capnp --version', { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n}\n\nasync function main() {\n // Handle interactive mode\n if (values.interactive) {\n await runInteractiveMode(inputFile);\n return;\n }\n\n if (!checkCapnpTool()) {\n console.error(\"Error: capnp tool not found. Please install Cap'n Proto.\");\n console.error(' macOS: brew install capnp');\n console.error(' Ubuntu/Debian: apt-get install capnproto');\n console.error(' Other: https://capnproto.org/install.html');\n process.exit(1);\n }\n\n const tmpDir = mkdtempSync(join(tmpdir(), 'capnp-ts-'));\n const binFile = join(tmpDir, 'schema.bin');\n\n try {\n console.error(`Compiling ${inputFile}...`);\n\n // Get input file directory as include path\n const inputDir = dirname(inputFile);\n\n // Compile to binary schema\n execSync(`capnp compile -o- \"${inputFile}\" > \"${binFile}\"`, {\n cwd: inputDir,\n stdio: ['ignore', 'ignore', 'pipe'],\n });\n\n console.error('Reading binary schema...');\n const buffer = readFileSync(binFile);\n // Create a proper ArrayBuffer copy to avoid issues with Node.js Buffer pooling\n const arrayBuffer = new Uint8Array(buffer.byteLength);\n arrayBuffer.set(new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength));\n\n // Handle dynamic mode\n if (values.dynamic) {\n console.error('Generating dynamic schema loading code...');\n const dynamicCode = generateDynamicLoadingCode(inputFile, arrayBuffer.buffer);\n\n if (values.output) {\n writeFileSync(values.output, dynamicCode);\n console.error(`Dynamic loading code written to ${values.output}`);\n } else {\n console.log(dynamicCode);\n }\n return;\n }\n\n console.error('Generating TypeScript code...');\n const request = CodeGeneratorRequestReader.fromBuffer(arrayBuffer.buffer);\n\n const options: GeneratorOptions = {\n runtimeImportPath: values.runtimePath || '@naeemo/capnp',\n };\n\n const files = generateFromRequest(request, options);\n\n // Output handling\n if (values.outDir) {\n // Multi-file output to directory\n mkdirSync(values.outDir, { recursive: true });\n for (const [filename, code] of files) {\n const outPath = join(values.outDir, filename);\n mkdirSync(dirname(outPath), { recursive: true });\n writeFileSync(outPath, code);\n console.error(`Generated: ${outPath}`);\n }\n } else if (values.output) {\n // Single file output\n const firstFile = files.values().next().value;\n if (firstFile) {\n writeFileSync(values.output, firstFile);\n console.error(`Output written to ${values.output}`);\n } else {\n console.error('Error: No files generated');\n process.exit(1);\n }\n } else {\n // Output to stdout\n const firstFile = files.values().next().value;\n if (firstFile) {\n console.log(firstFile);\n } else {\n console.error('Error: No files generated');\n process.exit(1);\n }\n }\n } catch (err: any) {\n console.error('Error:', err.message);\n if (err.stderr) {\n console.error(err.stderr.toString());\n }\n process.exit(1);\n } finally {\n // Cleanup temp files\n rmSync(tmpDir, { recursive: true, force: true });\n }\n}\n\nmain();\n\n// =============================================================================\n// Phase 7: Dynamic Schema Loading Support\n// =============================================================================\n\n/**\n * Generate dynamic schema loading code for the given schema file\n */\nfunction generateDynamicLoadingCode(inputFile: string, buffer: ArrayBuffer): string {\n const request = CodeGeneratorRequestReader.fromBuffer(buffer);\n const nodes = request.nodes;\n\n const runtimePath = values.runtimePath || '@naeemo/capnp';\n const schemaName = basename(inputFile, '.capnp');\n\n // Collect struct and interface types\n const structTypes: Array<{ id: string; name: string; displayName: string }> = [];\n const interfaceTypes: Array<{ id: string; name: string; displayName: string }> = [];\n\n for (const node of nodes) {\n const id = node.id;\n const displayName = node.displayName;\n const shortName = displayName.split('.').pop() || displayName;\n\n if (node.isStruct) {\n structTypes.push({ id: `0x${id.toString(16)}n`, name: shortName, displayName });\n } else if (node.isInterface) {\n interfaceTypes.push({ id: `0x${id.toString(16)}n`, name: shortName, displayName });\n }\n }\n\n const code = `/**\n * Dynamic Schema Loading for ${schemaName}.capnp\n * \n * This file provides runtime schema loading capabilities for ${schemaName}.capnp\n * Generated by capnp-ts-codegen --dynamic\n * \n * Usage:\n * import { load${toPascalCase(schemaName)}Schema, ${structTypes.map((t) => t.name).join(', ')} } from './${schemaName}-dynamic';\n * \n * // Load schema from remote connection\n * const schema = await load${toPascalCase(schemaName)}Schema(connection);\n * \n * // Use dynamic reader\n * const reader = createDynamicReader(schema.Person, buffer);\n * console.log(reader.get('name'));\n */\n\nimport { \n RpcConnection,\n createDynamicReader, \n createDynamicWriter,\n dumpDynamicReader,\n type SchemaNode,\n type SchemaRegistry,\n} from '${runtimePath}';\n\n// =============================================================================\n// Type IDs\n// =============================================================================\n\n${structTypes.map((t) => `/** Type ID for ${t.displayName} */\\nexport const ${t.name}TypeId = ${t.id};`).join('\\n')}\n\n${interfaceTypes.map((t) => `/** Interface ID for ${t.displayName} */\\nexport const ${t.name}InterfaceId = ${t.id};`).join('\\n')}\n\n// =============================================================================\n// Schema Cache\n// =============================================================================\n\nlet cachedSchemaRegistry: SchemaRegistry | null = null;\n\n// =============================================================================\n// Schema Loading Functions\n// =============================================================================\n\n/**\n * Load all schemas for ${schemaName}.capnp from a remote connection.\n * This fetches schema information dynamically and caches it for reuse.\n * \n * @param connection - The RPC connection to fetch schemas from\n * @returns A registry containing all loaded schemas\n */\nexport async function load${toPascalCase(schemaName)}Schema(connection: RpcConnection): Promise<SchemaRegistry> {\n if (cachedSchemaRegistry) {\n return cachedSchemaRegistry;\n }\n\n // Fetch all schemas\n const typeIds = [\n ${structTypes.map((t) => `${t.name}TypeId`).join(',\\n ')}\n ];\n\n for (const typeId of typeIds) {\n try {\n await connection.getDynamicSchema(typeId);\n } catch (err) {\n console.warn(\\`Failed to load schema for type \\${typeId}:\\`, err);\n }\n }\n\n cachedSchemaRegistry = connection.getSchemaRegistry();\n return cachedSchemaRegistry;\n}\n\n/**\n * Get a specific schema node by type ID.\n * Loads from remote if not already cached.\n * \n * @param connection - The RPC connection\n * @param typeId - The type ID to fetch\n * @returns The schema node\n */\nexport async function getSchema(connection: RpcConnection, typeId: bigint): Promise<SchemaNode> {\n return connection.getDynamicSchema(typeId);\n}\n\n/**\n * Clear the schema cache.\n * Call this if you need to re-fetch schemas from the remote server.\n */\nexport function clearSchemaCache(): void {\n cachedSchemaRegistry = null;\n}\n\n// =============================================================================\n// Dynamic Reader Helpers\n// =============================================================================\n\n${structTypes\n .map(\n (t) => `\n/**\n * Create a dynamic reader for ${t.name}\n * \n * @param buffer - The Cap'n Proto message buffer\n * @param registry - Optional schema registry (will use cached if available)\n * @returns A DynamicReader for the message\n */\nexport function create${toPascalCase(t.name)}Reader(\n buffer: ArrayBuffer | Uint8Array,\n registry?: SchemaRegistry\n): DynamicReader {\n const reg = registry || cachedSchemaRegistry;\n if (!reg) {\n throw new Error('Schema registry not loaded. Call load${toPascalCase(schemaName)}Schema first.');\n }\n \n const schema = reg.getNode(${t.name}TypeId);\n if (!schema) {\n throw new Error('Schema for ${t.name} not found in registry');\n }\n \n return createDynamicReader(schema, buffer);\n}\n`\n )\n .join('\\n')}\n\n// =============================================================================\n// Utility Functions\n// =============================================================================\n\n/**\n * Dump all fields from a dynamic reader for debugging\n */\nexport { dumpDynamicReader };\n\n/**\n * List all available types in this schema\n */\nexport function listTypes(): Array<{ name: string; typeId: string; kind: 'struct' | 'interface' }> {\n return [\n ${structTypes.map((t) => `{ name: '${t.name}', typeId: '${t.id}', kind: 'struct' as const }`).join(',\\n ')},\n ${interfaceTypes.map((t) => `{ name: '${t.name}', typeId: '${t.id}', kind: 'interface' as const }`).join(',\\n ')},\n ];\n}\n`;\n\n return code;\n}\n\n/**\n * Run interactive schema query tool\n */\nasync function runInteractiveMode(inputFile: string): Promise<void> {\n if (!checkCapnpTool()) {\n console.error(\"Error: capnp tool not found. Please install Cap'n Proto.\");\n process.exit(1);\n }\n\n const tmpDir = mkdtempSync(join(tmpdir(), 'capnp-ts-'));\n const binFile = join(tmpDir, 'schema.bin');\n\n try {\n console.log(`\\n🔍 Loading schema: ${inputFile}...\\n`);\n\n const inputDir = dirname(inputFile);\n execSync(`capnp compile -o- \"${inputFile}\" > \"${binFile}\"`, {\n cwd: inputDir,\n stdio: ['ignore', 'ignore', 'pipe'],\n });\n\n const buffer = readFileSync(binFile);\n const arrayBuffer = new Uint8Array(buffer.byteLength);\n arrayBuffer.set(new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength));\n\n const request = CodeGeneratorRequestReader.fromBuffer(arrayBuffer.buffer);\n const nodes = request.nodes;\n\n // Build type index\n const typeIndex = new Map<\n string,\n { id: bigint; displayName: string; kind: string; node: unknown }\n >();\n\n for (const node of nodes) {\n const id = node.id;\n const displayName = node.displayName;\n const shortName = displayName.split('.').pop() || displayName;\n\n let kind = 'unknown';\n if (node.isStruct) kind = 'struct';\n else if (node.isInterface) kind = 'interface';\n else if (node.isEnum) kind = 'enum';\n else if (node.isConst) kind = 'const';\n\n typeIndex.set(shortName, { id, displayName, kind, node });\n typeIndex.set(displayName, { id, displayName, kind, node });\n typeIndex.set(id.toString(16), { id, displayName, kind, node });\n }\n\n console.log('📋 Available types:');\n console.log('─'.repeat(60));\n\n const structs: string[] = [];\n const interfaces: string[] = [];\n const enums: string[] = [];\n\n for (const [name, info] of typeIndex) {\n if (name.includes('.')) continue; // Skip full names for summary\n\n if (info.kind === 'struct') structs.push(name);\n else if (info.kind === 'interface') interfaces.push(name);\n else if (info.kind === 'enum') enums.push(name);\n }\n\n if (structs.length > 0) {\n console.log('\\n🏗️ Structs:');\n for (const name of structs.sort()) {\n const info = typeIndex.get(name)!;\n console.log(` ${name.padEnd(30)} (0x${info.id.toString(16)})`);\n }\n }\n\n if (interfaces.length > 0) {\n console.log('\\n🔌 Interfaces:');\n for (const name of interfaces.sort()) {\n const info = typeIndex.get(name)!;\n console.log(` ${name.padEnd(30)} (0x${info.id.toString(16)})`);\n }\n }\n\n if (enums.length > 0) {\n console.log('\\n📊 Enums:');\n for (const name of enums.sort()) {\n const info = typeIndex.get(name)!;\n console.log(` ${name.padEnd(30)} (0x${info.id.toString(16)})`);\n }\n }\n\n console.log(`\\n${'─'.repeat(60)}`);\n console.log('💡 Commands:');\n console.log(' inspect <type> - Show detailed information about a type');\n console.log(' ids - List all type IDs');\n console.log(' export - Export schema info as JSON');\n console.log(' quit - Exit interactive mode');\n console.log('');\n\n // Simple command loop using stdin\n const stdin = process.stdin;\n const stdout = process.stdout;\n\n stdin.setEncoding('utf8');\n stdin.resume();\n\n stdout.write('> ');\n\n stdin.on('data', (data: string) => {\n const line = data.trim();\n const parts = line.split(/\\s+/);\n const command = parts[0];\n const arg = parts[1];\n\n switch (command) {\n case 'quit':\n case 'exit':\n case 'q':\n console.log('👋 Goodbye!');\n process.exit(0);\n break;\n\n case 'inspect':\n if (!arg) {\n console.log('❌ Usage: inspect <type-name>');\n } else {\n const info = typeIndex.get(arg);\n if (info) {\n console.log(`\\n🔍 ${info.displayName}`);\n console.log(` ${'─'.repeat(50)}`);\n console.log(` Type ID: 0x${info.id.toString(16)}`);\n console.log(` Kind: ${info.kind}`);\n\n // In a full implementation, we'd show field details here\n // by parsing the node structure more deeply\n\n console.log('');\n } else {\n console.log(`❌ Type \"${arg}\" not found`);\n }\n }\n break;\n\n case 'ids':\n console.log('\\n📋 All Type IDs:');\n console.log(` ${'─'.repeat(50)}`);\n for (const [name, info] of typeIndex) {\n if (name.includes('.')) continue;\n console.log(` 0x${info.id.toString(16).padStart(16, '0')} ${info.displayName}`);\n }\n console.log('');\n break;\n\n case 'export': {\n const exportData = {\n sourceFile: inputFile,\n types: Array.from(typeIndex.entries())\n .filter(([name]) => !name.includes('.'))\n .map(([name, info]) => ({\n name,\n displayName: info.displayName,\n typeId: `0x${info.id.toString(16)}`,\n kind: info.kind,\n })),\n };\n console.log(JSON.stringify(exportData, null, 2));\n break;\n }\n\n case 'help':\n case 'h':\n console.log('\\n💡 Commands:');\n console.log(' inspect <type> - Show detailed information about a type');\n console.log(' ids - List all type IDs');\n console.log(' export - Export schema info as JSON');\n console.log(' quit - Exit interactive mode');\n console.log('');\n break;\n\n default:\n if (line) {\n console.log(`❌ Unknown command: ${command}`);\n console.log(' Type \"help\" for available commands');\n }\n }\n\n stdout.write('> ');\n });\n\n // Keep the process alive\n await new Promise(() => {});\n } catch (err: any) {\n console.error('Error:', err.message);\n process.exit(1);\n } finally {\n rmSync(tmpDir, { recursive: true, force: true });\n }\n}\n\n/**\n * Convert string to PascalCase\n */\nfunction toPascalCase(str: string): string {\n return str\n .split(/[-_]/)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1).toLowerCase())\n .join('');\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.js","names":[],"sources":["../src/codegen/generator.ts","../src/core/pointer.ts","../src/core/segment.ts","../src/core/list.ts","../src/core/message-reader.ts","../src/schema/schema-reader.ts","../src/cli.ts"],"sourcesContent":["/**\n * 基于 Binary Schema 的 TypeScript 代码生成器\n *\n * 使用官方 capnp 编译器生成的二进制 schema 来生成 TypeScript 代码\n */\n\nimport type {\n CodeGeneratorRequestReader,\n FieldReader,\n Id,\n NodeReader,\n TypeKind,\n TypeReader,\n} from '../schema/schema-reader.js';\n\n// 导入运行时类型用于代码生成\nimport type { StructBuilder, StructReader } from '../core/index.js';\n\nexport interface GeneratorOptions {\n /** 运行时库导入路径 */\n runtimeImportPath?: string;\n}\n\nconst DEFAULT_OPTIONS: GeneratorOptions = {\n runtimeImportPath: '@naeemo/capnp',\n};\n\n/**\n * Union 字段分组\n */\ninterface UnionGroup {\n discriminantOffset: number;\n fields: FieldReader[];\n}\n\n/**\n * 从 CodeGeneratorRequest 生成 TypeScript 代码\n */\nexport function generateFromRequest(\n request: CodeGeneratorRequestReader,\n options?: GeneratorOptions\n): Map<string, string> {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n const files = new Map<string, string>();\n\n const nodes = request.nodes;\n const requestedFiles = request.requestedFiles;\n\n // 为每个请求的文件生成代码\n for (const file of requestedFiles) {\n const filename = file.filename.replace(/\\.capnp$/, '.ts');\n const code = generateFile(file.id, nodes, opts);\n files.set(filename, code);\n }\n\n return files;\n}\n\n/**\n * 生成单个文件的 TypeScript 代码\n */\nfunction generateFile(fileId: Id, allNodes: NodeReader[], options: GeneratorOptions): string {\n const lines: string[] = [];\n\n // 文件头\n lines.push('// Generated by @naeemo/capnp');\n lines.push('// DO NOT EDIT MANUALLY');\n lines.push('');\n lines.push(\n `import { MessageReader, MessageBuilder, StructReader, StructBuilder, createUnionReader, createUnionBuilder } from \"${options.runtimeImportPath}\";`\n );\n lines.push('');\n\n // 添加 XOR 辅助函数(用于 float 默认值)\n lines.push('// XOR helpers for default value encoding');\n lines.push('function xorFloat32(a: number, b: number): number {');\n lines.push(' const view = new DataView(new ArrayBuffer(4));');\n lines.push(' view.setFloat32(0, a, true);');\n lines.push(' const aBits = view.getUint32(0, true);');\n lines.push(' view.setFloat32(0, b, true);');\n lines.push(' const bBits = view.getUint32(0, true);');\n lines.push(' view.setUint32(0, aBits ^ bBits, true);');\n lines.push(' return view.getFloat32(0, true);');\n lines.push('}');\n lines.push('');\n lines.push('function xorFloat64(a: number, b: number): number {');\n lines.push(' const view = new DataView(new ArrayBuffer(8));');\n lines.push(' view.setFloat64(0, a, true);');\n lines.push(' const aBits = view.getBigUint64(0, true);');\n lines.push(' view.setFloat64(0, b, true);');\n lines.push(' const bBits = view.getBigUint64(0, true);');\n lines.push(' view.setBigUint64(0, aBits ^ bBits, true);');\n lines.push(' return view.getFloat64(0, true);');\n lines.push('}');\n lines.push('');\n\n // 找到属于这个文件的所有节点\n // 包括:\n // 1. scopeId === fileId 的节点(正常定义的 struct/enum/interface)\n // 2. scopeId === 0 且 displayName 包含文件名的节点(auto-generated method params/results)\n let filePrefix = '';\n try {\n const fileNode = allNodes.find((n) => n.id === fileId);\n filePrefix = fileNode?.displayName || '';\n } catch (_e) {\n // Ignore errors reading file node\n }\n\n const fileNodes = allNodes.filter((n) => {\n try {\n if (n.scopeId === fileId) return true;\n // Auto-generated method params/results have scopeId = 0\n if (n.scopeId === 0n && filePrefix && n.displayName.startsWith(`${filePrefix}:`)) {\n // Check if it's a method params/results struct\n const shortName = n.displayName.substring(filePrefix.length + 1);\n return shortName.includes('$');\n }\n } catch (_e) {\n // Skip nodes that can't be read\n }\n return false;\n });\n\n // 生成每个节点的代码\n for (const node of fileNodes) {\n if (node.isStruct) {\n lines.push(generateStruct(node, allNodes));\n } else if (node.isEnum) {\n lines.push(generateEnum(node));\n } else if (node.isInterface) {\n lines.push(generateInterface(node, allNodes));\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\n/**\n * 生成 Struct 的 TypeScript 代码\n */\nfunction generateStruct(node: NodeReader, allNodes: NodeReader[]): string {\n const lines: string[] = [];\n const structName = getShortName(node.displayName);\n\n // 分析字段:分离 Union 字段、普通字段和 Group 字段\n let unionGroups: UnionGroup[] = [];\n let regularFields: FieldReader[] = [];\n let groupFields: { field: FieldReader; groupNode: NodeReader }[] = [];\n\n try {\n const analysis = analyzeFields(node, allNodes);\n unionGroups = analysis.unionGroups;\n regularFields = analysis.regularFields;\n groupFields = analysis.groupFields;\n } catch (_e) {\n // Some auto-generated structs may have invalid field data\n // Return a minimal struct definition in this case\n lines.push(`export interface ${structName} {`);\n lines.push(' // Note: Could not parse struct fields');\n lines.push('}');\n lines.push('');\n lines.push(`export class ${structName}Reader {`);\n lines.push(' constructor(private reader: StructReader) {}');\n lines.push('}');\n lines.push('');\n lines.push(`export class ${structName}Builder {`);\n lines.push(' constructor(private builder: StructBuilder) {}');\n lines.push('}');\n return lines.join('\\n');\n }\n\n // 生成接口定义\n lines.push(`export interface ${structName} {`);\n\n // 普通字段\n for (const field of regularFields) {\n if (!field.isSlot) continue;\n const tsType = getTypeScriptType(field.slotType, allNodes);\n lines.push(` ${field.name}: ${tsType};`);\n }\n\n // Group 字段 - 内联 Group 的字段\n for (const { field: groupField, groupNode } of groupFields) {\n const groupName = groupField.name;\n try {\n for (const field of groupNode.structFields) {\n if (!field.isSlot) continue;\n const tsType = getTypeScriptType(field.slotType, allNodes);\n lines.push(` ${groupName}${capitalize(field.name)}: ${tsType};`);\n }\n } catch (_e) {\n // Skip invalid group fields\n }\n }\n\n // Union 字段 - 生成 discriminant 和 variant 类型\n for (const [groupIndex, group] of unionGroups.entries()) {\n const unionName =\n group.fields.length > 0 ? `${capitalize(group.fields[0].name)}Union` : `Union${groupIndex}`;\n lines.push(` ${unionName}: ${generateUnionVariantType(group, allNodes)};`);\n }\n\n lines.push('}');\n lines.push('');\n\n // 生成 Reader 类\n lines.push(`export class ${structName}Reader {`);\n lines.push(' constructor(private reader: StructReader) {}');\n lines.push('');\n\n // 普通字段 getters\n for (const field of regularFields) {\n if (!field.isSlot) continue;\n const getter = generateFieldGetter(field);\n lines.push(` ${getter}`);\n lines.push('');\n }\n\n // Group 字段 getters - 内联 Group 的字段\n for (const { field: groupField, groupNode } of groupFields) {\n const groupName = groupField.name;\n try {\n for (const field of groupNode.structFields) {\n if (!field.isSlot) continue;\n const getter = generateGroupFieldGetter(field, groupName);\n lines.push(` ${getter}`);\n lines.push('');\n }\n } catch (_e) {\n // Skip invalid group fields\n }\n }\n\n // Union 方法\n for (const [groupIndex, group] of unionGroups.entries()) {\n const unionName =\n group.fields.length > 0 ? `${capitalize(group.fields[0].name)}Union` : `Union${groupIndex}`;\n const variants: Record<number, string> = {};\n for (const field of group.fields) {\n variants[field.discriminantValue] = field.name;\n }\n const variantsStr = JSON.stringify(variants).replace(/\"/g, \"'\");\n\n lines.push(` get${unionName}Tag(): number {`);\n lines.push(` return this.reader.getUint16(${group.discriminantOffset * 2});`);\n lines.push(' }');\n lines.push('');\n\n lines.push(` get${unionName}Variant(): string | undefined {`);\n lines.push(` const tag = this.get${unionName}Tag();`);\n lines.push(` const variants = ${variantsStr};`);\n lines.push(' return variants[tag];');\n lines.push(' }');\n lines.push('');\n\n // 每个 variant 的 getter\n for (const field of group.fields) {\n const getter = generateUnionFieldGetter(field, unionName, field.discriminantValue);\n lines.push(` ${getter}`);\n lines.push('');\n }\n\n // 每个 variant 的 setter\n for (const field of group.fields) {\n const setter = generateUnionFieldSetter(\n field,\n unionName,\n field.discriminantValue,\n group.discriminantOffset * 2\n );\n lines.push(` ${setter}`);\n lines.push('');\n }\n }\n\n lines.push('}');\n lines.push('');\n\n // 生成 Builder 类\n lines.push(`export class ${structName}Builder {`);\n lines.push(' constructor(private builder: StructBuilder) {}');\n lines.push('');\n\n // 普通字段 setters\n for (const field of regularFields) {\n if (!field.isSlot) continue;\n const setter = generateFieldSetter(field);\n lines.push(` ${setter}`);\n lines.push('');\n }\n\n // Group 字段 setters\n for (const { field: groupField, groupNode } of groupFields) {\n const groupName = groupField.name;\n try {\n for (const field of groupNode.structFields) {\n if (!field.isSlot) continue;\n const setter = generateGroupFieldSetter(field, groupName);\n lines.push(` ${setter}`);\n lines.push('');\n }\n } catch (_e) {\n // Skip invalid group fields\n }\n }\n\n // Union setters\n for (const [groupIndex, group] of unionGroups.entries()) {\n const unionName =\n group.fields.length > 0 ? `${capitalize(group.fields[0].name)}Union` : `Union${groupIndex}`;\n for (const field of group.fields) {\n const setter = generateUnionFieldSetter(\n field,\n unionName,\n field.discriminantValue,\n group.discriminantOffset * 2\n );\n lines.push(` ${setter}`);\n lines.push('');\n }\n }\n\n lines.push('}');\n\n return lines.join('\\n');\n}\n\n/**\n * 分析字段,分离 Union 字段和普通字段,展开 Group 字段\n */\nfunction analyzeFields(\n node: NodeReader,\n allNodes: NodeReader[]\n): {\n unionGroups: UnionGroup[];\n regularFields: FieldReader[];\n groupFields: { field: FieldReader; groupNode: NodeReader }[];\n} {\n const fields = node.structFields;\n const unionGroups: Map<number, UnionGroup> = new Map();\n const regularFields: FieldReader[] = [];\n const groupFields: { field: FieldReader; groupNode: NodeReader }[] = [];\n\n for (const field of fields) {\n // 处理 Group 字段\n if (field.isGroup) {\n const groupNode = allNodes.find((n) => n.id === field.groupTypeId);\n if (groupNode?.isStruct) {\n groupFields.push({ field, groupNode });\n }\n continue;\n }\n\n // 处理 Union 字段\n if (\n node.structDiscriminantCount > 0 &&\n field.discriminantValue !== 65535 &&\n field.discriminantValue !== 0\n ) {\n const discriminantOffset = node.structDiscriminantOffset;\n\n if (!unionGroups.has(discriminantOffset)) {\n unionGroups.set(discriminantOffset, { discriminantOffset, fields: [] });\n }\n unionGroups.get(discriminantOffset)!.fields.push(field);\n } else {\n // 普通字段\n regularFields.push(field);\n }\n }\n\n return {\n unionGroups: Array.from(unionGroups.values()),\n regularFields,\n groupFields,\n };\n}\n\n/**\n * 生成 Union variant 类型\n */\nfunction generateUnionVariantType(group: UnionGroup, allNodes: NodeReader[]): string {\n const variants = group.fields.map((f) => {\n const tsType = f.isSlot ? getTypeScriptType(f.slotType, allNodes) : 'unknown';\n return `{ tag: ${f.discriminantValue}; variant: '${f.name}'; value: ${tsType} }`;\n });\n return variants.join(' | ');\n}\n\n/**\n * 生成 Union 字段的 getter\n */\nfunction generateUnionFieldGetter(\n field: FieldReader,\n unionName: string,\n discriminantValue: number\n): string {\n const name = field.name;\n const type = field.slotType;\n\n if (!type || !field.isSlot) {\n return `get${capitalize(name)}(): unknown | undefined { return this.get${unionName}Tag() === ${discriminantValue} ? undefined : undefined; }`;\n }\n\n const returnType = getTypeScriptTypeForSetter(type);\n\n let body: string;\n switch (type.kind) {\n case 'void':\n body = 'return undefined;';\n break;\n case 'bool':\n body = `return this.reader.getBool(${field.slotOffset * 8});`;\n break;\n case 'int8':\n body = `return this.reader.getInt8(${field.slotOffset});`;\n break;\n case 'int16':\n body = `return this.reader.getInt16(${field.slotOffset * 2});`;\n break;\n case 'int32':\n body = `return this.reader.getInt32(${field.slotOffset * 4});`;\n break;\n case 'int64':\n body = `return this.reader.getInt64(${field.slotOffset * 8});`;\n break;\n case 'uint8':\n body = `return this.reader.getUint8(${field.slotOffset});`;\n break;\n case 'uint16':\n body = `return this.reader.getUint16(${field.slotOffset * 2});`;\n break;\n case 'uint32':\n body = `return this.reader.getUint32(${field.slotOffset * 4});`;\n break;\n case 'uint64':\n body = `return this.reader.getUint64(${field.slotOffset * 8});`;\n break;\n case 'float32':\n body = `return this.reader.getFloat32(${field.slotOffset * 4});`;\n break;\n case 'float64':\n body = `return this.reader.getFloat64(${field.slotOffset * 8});`;\n break;\n case 'text':\n body = `return this.reader.getText(${field.slotOffset});`;\n break;\n case 'data':\n body = `return this.reader.getData(${field.slotOffset});`;\n break;\n default:\n body = 'return undefined;';\n }\n\n return `get${capitalize(name)}(): ${returnType} | undefined {\n if (this.get${unionName}Tag() !== ${discriminantValue}) return undefined;\n ${body}\n }`;\n}\n\n/**\n * 生成 Group 字段的 getter\n * Group 字段在父 struct 的 data/pointer section 中,但命名空间是 Group 的名字\n */\nfunction generateGroupFieldGetter(field: FieldReader, groupName: string): string {\n const name = field.name;\n const type = field.slotType;\n\n if (!type) {\n return `get${capitalize(groupName)}${capitalize(name)}(): unknown { return undefined; }`;\n }\n\n switch (type.kind) {\n case 'void':\n return `get${capitalize(groupName)}${capitalize(name)}(): void { return undefined; }`;\n case 'bool':\n return `get${capitalize(groupName)}${capitalize(name)}(): boolean { return this.reader.getBool(${field.slotOffset * 8}); }`;\n case 'int8':\n return `get${capitalize(groupName)}${capitalize(name)}(): number { return this.reader.getInt8(${field.slotOffset}); }`;\n case 'int16':\n return `get${capitalize(groupName)}${capitalize(name)}(): number { return this.reader.getInt16(${field.slotOffset * 2}); }`;\n case 'int32':\n return `get${capitalize(groupName)}${capitalize(name)}(): number { return this.reader.getInt32(${field.slotOffset * 4}); }`;\n case 'int64':\n return `get${capitalize(groupName)}${capitalize(name)}(): bigint { return this.reader.getInt64(${field.slotOffset * 8}); }`;\n case 'uint8':\n return `get${capitalize(groupName)}${capitalize(name)}(): number { return this.reader.getUint8(${field.slotOffset}); }`;\n case 'uint16':\n return `get${capitalize(groupName)}${capitalize(name)}(): number { return this.reader.getUint16(${field.slotOffset * 2}); }`;\n case 'uint32':\n return `get${capitalize(groupName)}${capitalize(name)}(): number { return this.reader.getUint32(${field.slotOffset * 4}); }`;\n case 'uint64':\n return `get${capitalize(groupName)}${capitalize(name)}(): bigint { return this.reader.getUint64(${field.slotOffset * 8}); }`;\n case 'float32':\n return `get${capitalize(groupName)}${capitalize(name)}(): number { return this.reader.getFloat32(${field.slotOffset * 4}); }`;\n case 'float64':\n return `get${capitalize(groupName)}${capitalize(name)}(): number { return this.reader.getFloat64(${field.slotOffset * 8}); }`;\n case 'text':\n return `get${capitalize(groupName)}${capitalize(name)}(): string { return this.reader.getText(${field.slotOffset}); }`;\n case 'data':\n return `get${capitalize(groupName)}${capitalize(name)}(): Uint8Array { return this.reader.getData(${field.slotOffset}); }`;\n default:\n return `get${capitalize(groupName)}${capitalize(name)}(): unknown { return undefined; }`;\n }\n}\n\n/**\n * 生成 Group 字段的 setter\n */\nfunction generateGroupFieldSetter(field: FieldReader, groupName: string): string {\n const name = field.name;\n const type = field.slotType;\n const paramType = getTypeScriptTypeForSetter(type);\n\n if (!type || !field.isSlot) {\n return `set${capitalize(groupName)}${capitalize(name)}(value: ${paramType}): void { /* TODO */ }`;\n }\n\n switch (type.kind) {\n case 'void':\n return `set${capitalize(groupName)}${capitalize(name)}(value: ${paramType}): void { }`;\n case 'bool':\n return `set${capitalize(groupName)}${capitalize(name)}(value: ${paramType}): void { this.builder.setBool(${field.slotOffset * 8}, value); }`;\n case 'int8':\n return `set${capitalize(groupName)}${capitalize(name)}(value: ${paramType}): void { this.builder.setInt8(${field.slotOffset}, value); }`;\n case 'int16':\n return `set${capitalize(groupName)}${capitalize(name)}(value: ${paramType}): void { this.builder.setInt16(${field.slotOffset * 2}, value); }`;\n case 'int32':\n return `set${capitalize(groupName)}${capitalize(name)}(value: ${paramType}): void { this.builder.setInt32(${field.slotOffset * 4}, value); }`;\n case 'int64':\n return `set${capitalize(groupName)}${capitalize(name)}(value: ${paramType}): void { this.builder.setInt64(${field.slotOffset * 8}, value); }`;\n case 'uint8':\n return `set${capitalize(groupName)}${capitalize(name)}(value: ${paramType}): void { this.builder.setUint8(${field.slotOffset}, value); }`;\n case 'uint16':\n return `set${capitalize(groupName)}${capitalize(name)}(value: ${paramType}): void { this.builder.setUint16(${field.slotOffset * 2}, value); }`;\n case 'uint32':\n return `set${capitalize(groupName)}${capitalize(name)}(value: ${paramType}): void { this.builder.setUint32(${field.slotOffset * 4}, value); }`;\n case 'uint64':\n return `set${capitalize(groupName)}${capitalize(name)}(value: ${paramType}): void { this.builder.setUint64(${field.slotOffset * 8}, value); }`;\n case 'float32':\n return `set${capitalize(groupName)}${capitalize(name)}(value: ${paramType}): void { this.builder.setFloat32(${field.slotOffset * 4}, value); }`;\n case 'float64':\n return `set${capitalize(groupName)}${capitalize(name)}(value: ${paramType}): void { this.builder.setFloat64(${field.slotOffset * 8}, value); }`;\n case 'text':\n return `set${capitalize(groupName)}${capitalize(name)}(value: ${paramType}): void { this.builder.setText(${field.slotOffset}, value); }`;\n case 'data':\n return `set${capitalize(groupName)}${capitalize(name)}(value: ${paramType}): void { this.builder.setData(${field.slotOffset}, value); }`;\n default:\n return `set${capitalize(groupName)}${capitalize(name)}(value: ${paramType}): void { /* TODO */ }`;\n }\n}\n\n/**\n * 生成 Union 字段的 setter\n */\nfunction generateUnionFieldSetter(\n field: FieldReader,\n _unionName: string,\n discriminantValue: number,\n discriminantOffset: number\n): string {\n const name = field.name;\n const type = field.slotType;\n const paramType = getTypeScriptTypeForSetter(type);\n\n if (!type || !field.isSlot) {\n return `set${capitalize(name)}(value: ${paramType}): void {\n this.builder.setUint16(${discriminantOffset}, ${discriminantValue});\n }`;\n }\n\n let body: string;\n switch (type.kind) {\n case 'void':\n body = '';\n break;\n case 'bool':\n body = `this.builder.setBool(${field.slotOffset * 8}, value);`;\n break;\n case 'int8':\n body = `this.builder.setInt8(${field.slotOffset}, value);`;\n break;\n case 'int16':\n body = `this.builder.setInt16(${field.slotOffset * 2}, value);`;\n break;\n case 'int32':\n body = `this.builder.setInt32(${field.slotOffset * 4}, value);`;\n break;\n case 'int64':\n body = `this.builder.setInt64(${field.slotOffset * 8}, value);`;\n break;\n case 'uint8':\n body = `this.builder.setUint8(${field.slotOffset}, value);`;\n break;\n case 'uint16':\n body = `this.builder.setUint16(${field.slotOffset * 2}, value);`;\n break;\n case 'uint32':\n body = `this.builder.setUint32(${field.slotOffset * 4}, value);`;\n break;\n case 'uint64':\n body = `this.builder.setUint64(${field.slotOffset * 8}, value);`;\n break;\n case 'float32':\n body = `this.builder.setFloat32(${field.slotOffset * 4}, value);`;\n break;\n case 'float64':\n body = `this.builder.setFloat64(${field.slotOffset * 8}, value);`;\n break;\n case 'text':\n body = `this.builder.setText(${field.slotOffset}, value);`;\n break;\n case 'data':\n body = `this.builder.setData(${field.slotOffset}, value);`;\n break;\n default:\n body = '';\n }\n\n return `set${capitalize(name)}(value: ${paramType}): void {\n this.builder.setUint16(${discriminantOffset}, ${discriminantValue});\n ${body}\n }`;\n}\n\n/**\n * 从 ValueReader 提取默认值,用于代码生成\n */\nfunction extractDefaultValue(field: FieldReader): string | undefined {\n const defaultValue = field.defaultValue;\n if (!defaultValue) return undefined;\n\n const type = field.slotType;\n if (!type) return undefined;\n\n switch (type.kind) {\n case 'bool':\n if (defaultValue.isBool) return defaultValue.boolValue ? 'true' : 'false';\n return undefined;\n case 'int8':\n if (defaultValue.isInt8) return `${defaultValue.int8Value}`;\n return undefined;\n case 'int16':\n if (defaultValue.isInt16) return `${defaultValue.int16Value}`;\n return undefined;\n case 'int32':\n if (defaultValue.isInt32) return `${defaultValue.int32Value}`;\n return undefined;\n case 'int64':\n if (defaultValue.isInt64) return `${defaultValue.int64Value}n`;\n return undefined;\n case 'uint8':\n if (defaultValue.isUint8) return `${defaultValue.uint8Value}`;\n return undefined;\n case 'uint16':\n if (defaultValue.isUint16) return `${defaultValue.uint16Value}`;\n return undefined;\n case 'uint32':\n if (defaultValue.isUint32) return `${defaultValue.uint32Value}`;\n return undefined;\n case 'uint64':\n if (defaultValue.isUint64) return `${defaultValue.uint64Value}n`;\n return undefined;\n case 'float32':\n if (defaultValue.isFloat32) {\n const val = defaultValue.float32Value;\n if (Number.isNaN(val)) return 'NaN';\n if (val === Number.POSITIVE_INFINITY) return 'Infinity';\n if (val === Number.NEGATIVE_INFINITY) return '-Infinity';\n return `${val}`;\n }\n return undefined;\n case 'float64':\n if (defaultValue.isFloat64) {\n const val = defaultValue.float64Value;\n if (Number.isNaN(val)) return 'NaN';\n if (val === Number.POSITIVE_INFINITY) return 'Infinity';\n if (val === Number.NEGATIVE_INFINITY) return '-Infinity';\n return `${val}`;\n }\n return undefined;\n case 'enum':\n if (defaultValue.isEnum) return `${defaultValue.enumValue}`;\n return undefined;\n default:\n return undefined;\n }\n}\n\n/**\n * 生成 XOR 解码表达式(用于 getter)\n * stored ^ default = actual\n */\nfunction generateXorDecode(expr: string, defaultValue: string, typeKind: TypeKind): string {\n switch (typeKind) {\n case 'bool':\n // bool: stored !== default\n return `${expr} !== ${defaultValue}`;\n case 'int8':\n case 'int16':\n case 'int32':\n // 有符号整数:先转无符号 XOR,再转回有符号\n return `(${expr} ^ ${defaultValue}) | 0`;\n case 'uint8':\n case 'uint16':\n case 'uint32':\n // 无符号整数:直接 XOR\n return `${expr} ^ ${defaultValue}`;\n case 'int64':\n case 'uint64':\n // bigint:直接 XOR\n return `${expr} ^ ${defaultValue}`;\n case 'float32':\n // float32: 需要位操作转换\n return `xorFloat32(${expr}, ${defaultValue})`;\n case 'float64':\n // float64: 需要位操作转换\n return `xorFloat64(${expr}, ${defaultValue})`;\n case 'enum':\n // enum 作为 uint16 处理\n return `${expr} ^ ${defaultValue}`;\n default:\n return expr;\n }\n}\n\n/**\n * 生成 XOR 编码表达式(用于 setter)\n * actual ^ default = stored\n */\nfunction generateXorEncode(valueExpr: string, defaultValue: string, typeKind: TypeKind): string {\n switch (typeKind) {\n case 'bool':\n // bool: value !== default\n return `${valueExpr} !== ${defaultValue}`;\n case 'int8':\n case 'int16':\n case 'int32':\n // 有符号整数:先转无符号 XOR\n return `(${valueExpr} >>> 0) ^ ${defaultValue}`;\n case 'uint8':\n case 'uint16':\n case 'uint32':\n // 无符号整数:直接 XOR\n return `${valueExpr} ^ ${defaultValue}`;\n case 'int64':\n case 'uint64':\n // bigint:直接 XOR\n return `${valueExpr} ^ ${defaultValue}`;\n case 'float32':\n // float32: 需要位操作转换\n return `xorFloat32(${valueExpr}, ${defaultValue})`;\n case 'float64':\n // float64: 需要位操作转换\n return `xorFloat64(${valueExpr}, ${defaultValue})`;\n case 'enum':\n // enum 作为 uint16 处理\n return `${valueExpr} ^ ${defaultValue}`;\n default:\n return valueExpr;\n }\n}\n\n/**\n * 生成字段 getter\n */\nfunction generateFieldGetter(field: FieldReader): string {\n const name = field.name;\n const type = field.slotType;\n const defaultValue = extractDefaultValue(field);\n\n if (!type) {\n return `get ${name}(): unknown { return undefined; }`;\n }\n\n // 如果有默认值,使用 XOR 解码\n if (defaultValue !== undefined && type.kind !== 'text' && type.kind !== 'data') {\n const readExpr = `this.reader.get${capitalize(type.kind)}(${getByteOffset(field, type.kind)})`;\n const decodedExpr = generateXorDecode(readExpr, defaultValue, type.kind);\n return `get ${name}(): ${getTypeScriptTypeForSetter(type)} { return ${decodedExpr}; }`;\n }\n\n switch (type.kind) {\n case 'void':\n return `get ${name}(): void { return undefined; }`;\n case 'bool':\n return `get ${name}(): boolean { return this.reader.getBool(${field.slotOffset * 8}); }`;\n case 'int8':\n return `get ${name}(): number { return this.reader.getInt8(${field.slotOffset}); }`;\n case 'int16':\n return `get ${name}(): number { return this.reader.getInt16(${field.slotOffset * 2}); }`;\n case 'int32':\n return `get ${name}(): number { return this.reader.getInt32(${field.slotOffset * 4}); }`;\n case 'int64':\n return `get ${name}(): bigint { return this.reader.getInt64(${field.slotOffset * 8}); }`;\n case 'uint8':\n return `get ${name}(): number { return this.reader.getUint8(${field.slotOffset}); }`;\n case 'uint16':\n return `get ${name}(): number { return this.reader.getUint16(${field.slotOffset * 2}); }`;\n case 'uint32':\n return `get ${name}(): number { return this.reader.getUint32(${field.slotOffset * 4}); }`;\n case 'uint64':\n return `get ${name}(): bigint { return this.reader.getUint64(${field.slotOffset * 8}); }`;\n case 'float32':\n return `get ${name}(): number { return this.reader.getFloat32(${field.slotOffset * 4}); }`;\n case 'float64':\n return `get ${name}(): number { return this.reader.getFloat64(${field.slotOffset * 8}); }`;\n case 'text':\n return `get ${name}(): string { return this.reader.getText(${field.slotOffset}); }`;\n case 'data':\n return `get ${name}(): Uint8Array { return this.reader.getData(${field.slotOffset}); }`;\n default:\n return `get ${name}(): unknown { return undefined; }`;\n }\n}\n\n/**\n * 获取字节偏移量\n */\nfunction getByteOffset(field: FieldReader, typeKind: TypeKind): number {\n switch (typeKind) {\n case 'bool':\n return field.slotOffset * 8; // bit offset\n case 'int8':\n case 'uint8':\n return field.slotOffset;\n case 'int16':\n case 'uint16':\n case 'enum':\n return field.slotOffset * 2;\n case 'int32':\n case 'uint32':\n case 'float32':\n return field.slotOffset * 4;\n case 'int64':\n case 'uint64':\n case 'float64':\n return field.slotOffset * 8;\n default:\n return field.slotOffset;\n }\n}\n\n/**\n * 生成字段 setter\n */\nfunction generateFieldSetter(field: FieldReader): string {\n const name = field.name;\n const type = field.slotType;\n const paramType = getTypeScriptTypeForSetter(type);\n const defaultValue = extractDefaultValue(field);\n\n if (!type) {\n return `set${capitalize(name)}(value: unknown): void { /* TODO */ }`;\n }\n\n // 如果有默认值,使用 XOR 编码\n if (defaultValue !== undefined && type.kind !== 'text' && type.kind !== 'data') {\n const encodedExpr = generateXorEncode('value', defaultValue, type.kind);\n const setterMethod = `set${capitalize(type.kind)}`;\n return `set${capitalize(name)}(value: ${paramType}): void { this.builder.${setterMethod}(${getByteOffset(field, type.kind)}, ${encodedExpr}); }`;\n }\n\n switch (type.kind) {\n case 'void':\n return `set${capitalize(name)}(value: void): void { /* void */ }`;\n case 'bool':\n return `set${capitalize(name)}(value: ${paramType}): void { this.builder.setBool(${field.slotOffset * 8}, value); }`;\n case 'int8':\n return `set${capitalize(name)}(value: ${paramType}): void { this.builder.setInt8(${field.slotOffset}, value); }`;\n case 'int16':\n return `set${capitalize(name)}(value: ${paramType}): void { this.builder.setInt16(${field.slotOffset * 2}, value); }`;\n case 'int32':\n return `set${capitalize(name)}(value: ${paramType}): void { this.builder.setInt32(${field.slotOffset * 4}, value); }`;\n case 'int64':\n return `set${capitalize(name)}(value: ${paramType}): void { this.builder.setInt64(${field.slotOffset * 8}, value); }`;\n case 'uint8':\n return `set${capitalize(name)}(value: ${paramType}): void { this.builder.setUint8(${field.slotOffset}, value); }`;\n case 'uint16':\n return `set${capitalize(name)}(value: ${paramType}): void { this.builder.setUint16(${field.slotOffset * 2}, value); }`;\n case 'uint32':\n return `set${capitalize(name)}(value: ${paramType}): void { this.builder.setUint32(${field.slotOffset * 4}, value); }`;\n case 'uint64':\n return `set${capitalize(name)}(value: ${paramType}): void { this.builder.setUint64(${field.slotOffset * 8}, value); }`;\n case 'float32':\n return `set${capitalize(name)}(value: ${paramType}): void { this.builder.setFloat32(${field.slotOffset * 4}, value); }`;\n case 'float64':\n return `set${capitalize(name)}(value: ${paramType}): void { this.builder.setFloat64(${field.slotOffset * 8}, value); }`;\n case 'text':\n return `set${capitalize(name)}(value: ${paramType}): void { this.builder.setText(${field.slotOffset}, value); }`;\n case 'data':\n return `set${capitalize(name)}(value: ${paramType}): void { this.builder.setData(${field.slotOffset}, value); }`;\n default:\n return `set${capitalize(name)}(value: ${paramType}): void { /* TODO */ }`;\n }\n}\n\n/**\n * 获取 TypeScript setter 参数类型\n */\nfunction getTypeScriptTypeForSetter(type: TypeReader | null): string {\n if (!type) return 'unknown';\n\n switch (type.kind) {\n case 'void':\n return 'void';\n case 'bool':\n return 'boolean';\n case 'int8':\n case 'int16':\n case 'int32':\n case 'uint8':\n case 'uint16':\n case 'uint32':\n case 'float32':\n case 'float64':\n return 'number';\n case 'int64':\n case 'uint64':\n return 'bigint';\n case 'text':\n return 'string';\n case 'data':\n return 'Uint8Array';\n default:\n return 'unknown';\n }\n}\n\n/**\n * 首字母大写\n */\nfunction capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n/**\n * 生成 Enum 的 TypeScript 代码\n */\nfunction generateEnum(node: NodeReader): string {\n const lines: string[] = [];\n const enumName = getShortName(node.displayName);\n\n lines.push(`export enum ${enumName} {`);\n for (const enumerant of node.enumEnumerants) {\n lines.push(` ${enumerant.name} = ${enumerant.codeOrder},`);\n }\n lines.push('}');\n\n return lines.join('\\n');\n}\n\n/**\n * 获取 TypeScript 类型字符串\n */\nfunction getTypeScriptType(type: TypeReader | null, allNodes: NodeReader[]): string {\n if (!type) return 'unknown';\n\n switch (type.kind) {\n case 'void':\n return 'void';\n case 'bool':\n return 'boolean';\n case 'int8':\n case 'int16':\n case 'int32':\n case 'uint8':\n case 'uint16':\n case 'uint32':\n case 'float32':\n case 'float64':\n return 'number';\n case 'int64':\n case 'uint64':\n return 'bigint';\n case 'text':\n return 'string';\n case 'data':\n return 'Uint8Array';\n case 'list': {\n const elementType = type.listElementType;\n if (!elementType) return 'unknown[]';\n const elemTsType = getTypeScriptType(elementType, allNodes);\n return `${elemTsType}[]`;\n }\n case 'struct': {\n const structNode = allNodes.find((n) => n.id === type.typeId);\n if (structNode) {\n return getShortName(structNode.displayName);\n }\n return 'unknown';\n }\n case 'enum': {\n const enumNode = allNodes.find((n) => n.id === type.typeId);\n if (enumNode) {\n return getShortName(enumNode.displayName);\n }\n return 'unknown';\n }\n default:\n return 'unknown';\n }\n}\n\n/**\n * 从 displayName 获取短名称\n * 例如 \"test-schema.capnp:Person\" -> \"Person\"\n * 处理 auto-generated 名称如 \"Calculator.evaluate$Params\" -> \"EvaluateParams\"\n */\nfunction getShortName(displayName: string): string {\n // Handle empty or undefined display names\n if (!displayName) {\n return 'Unknown';\n }\n const colonIndex = displayName.lastIndexOf(':');\n let name = colonIndex >= 0 ? displayName.substring(colonIndex + 1) : displayName;\n\n // Replace invalid characters for TypeScript identifiers\n // Handle auto-generated names like \"Calculator.evaluate$Params\" -> \"EvaluateParams\"\n if (name.includes('.')) {\n const parts = name.split('.');\n if (parts.length === 2 && parts[1].includes('$')) {\n // Interface method params/results: \"Interface.method$Params\" -> \"MethodParams\"\n const methodPart = parts[1];\n const dollarIndex = methodPart.indexOf('$');\n if (dollarIndex > 0) {\n const methodName = methodPart.substring(0, dollarIndex);\n const suffix = methodPart.substring(dollarIndex + 1);\n name = capitalize(methodName) + suffix;\n } else {\n name = capitalize(parts[1]);\n }\n } else {\n name = parts[parts.length - 1];\n }\n }\n\n // Remove any remaining invalid characters\n name = name.replace(/[^a-zA-Z0-9_]/g, '_');\n\n return name;\n}\n\n/**\n * 生成 Interface 的 TypeScript 代码\n * 包括:Method Constants、Client Class、Server Interface、Server Stub\n */\nfunction generateInterface(node: NodeReader, allNodes: NodeReader[]): string {\n const lines: string[] = [];\n const interfaceName = getShortName(node.displayName);\n const methods = node.interfaceMethods;\n\n if (methods.length === 0) {\n return `// Interface ${interfaceName} has no methods`;\n }\n\n // 1. 生成 Method ID 常量\n lines.push(`// ${interfaceName} Method IDs`);\n lines.push(`export const ${interfaceName}InterfaceId = ${node.id}n;`);\n lines.push(`export const ${interfaceName}MethodIds = {`);\n for (const method of methods) {\n lines.push(` ${method.name}: ${method.codeOrder},`);\n }\n lines.push('} as const;');\n lines.push('');\n\n // 2. 生成 Server Interface\n lines.push(`// ${interfaceName} Server Interface`);\n lines.push(`export interface ${interfaceName}Server {`);\n for (const method of methods) {\n const paramType = getTypeNameById(method.paramStructType, allNodes, 'unknown');\n const resultType = getTypeNameById(method.resultStructType, allNodes, 'unknown');\n lines.push(\n ` ${method.name}(context: CallContext<${paramType}Reader, ${resultType}Builder>): Promise<void> | void;`\n );\n }\n lines.push('}');\n lines.push('');\n\n // 3. 生成 Server Stub\n lines.push(`// ${interfaceName} Server Stub`);\n lines.push(`export class ${interfaceName}Stub {`);\n lines.push(` private server: ${interfaceName}Server;`);\n lines.push('');\n lines.push(` constructor(server: ${interfaceName}Server) {`);\n lines.push(' this.server = server;');\n lines.push(' }');\n lines.push('');\n lines.push(` static readonly interfaceId = ${node.id}n;`);\n lines.push('');\n lines.push(' /** Dispatch a method call to the appropriate handler */');\n lines.push(\n ' async dispatch(methodId: number, context: CallContext<unknown, unknown>): Promise<void> {'\n );\n lines.push(' switch (methodId) {');\n\n for (const method of methods) {\n const paramType = getTypeNameById(method.paramStructType, allNodes, 'unknown');\n const resultType = getTypeNameById(method.resultStructType, allNodes, 'unknown');\n lines.push(` case ${interfaceName}MethodIds.${method.name}:`);\n lines.push(\n ` return this.server.${method.name}(context as CallContext<${paramType}Reader, ${resultType}Builder>);`\n );\n }\n\n lines.push(' default:');\n lines.push(' throw new Error(`Unknown method ID: ${methodId}`);');\n lines.push(' }');\n lines.push(' }');\n lines.push('');\n lines.push(' /** Check if a method ID is valid */');\n lines.push(' isValidMethod(methodId: number): boolean {');\n lines.push(' return [');\n for (const method of methods) {\n lines.push(` ${interfaceName}MethodIds.${method.name},`);\n }\n lines.push(' ].includes(methodId);');\n lines.push(' }');\n lines.push('}');\n lines.push('');\n\n // 4. 生成 Client Class\n lines.push(`// ${interfaceName} Client Class`);\n lines.push(`export class ${interfaceName}Client extends BaseCapabilityClient {`);\n lines.push(` static readonly interfaceId = ${node.id}n;`);\n lines.push('');\n\n for (const method of methods) {\n const paramType = getTypeNameById(method.paramStructType, allNodes, 'unknown');\n const resultType = getTypeNameById(method.resultStructType, allNodes, 'unknown');\n\n // 生成方法文档注释\n lines.push(' /**');\n lines.push(` * ${method.name}`);\n lines.push(` * @param params - ${paramType}`);\n lines.push(` * @returns PipelineClient<${resultType}Reader>`);\n lines.push(' */');\n\n // 生成方法签名\n lines.push(\n ` ${method.name}(params: ${paramType}Builder): PipelineClient<${resultType}Reader> {`\n );\n lines.push(' return this._call(');\n lines.push(` ${interfaceName}Client.interfaceId,`);\n lines.push(` ${interfaceName}MethodIds.${method.name},`);\n lines.push(' params');\n lines.push(` ) as PipelineClient<${resultType}Reader>;`);\n lines.push(' }');\n lines.push('');\n }\n\n lines.push('}');\n\n return lines.join('\\n');\n}\n\n/**\n * 根据类型 ID 获取类型名称\n */\nfunction getTypeNameById(id: bigint, allNodes: NodeReader[], fallback: string): string {\n const node = allNodes.find((n) => n.id === id);\n if (!node) return fallback;\n return getShortName(node.displayName);\n}\n","/**\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 if (byteOffset + 8 > this._size) {\n throw new Error(\n `Offset ${wordOffset} is outside the bounds of the segment (${this.wordCount} words)`\n );\n }\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 if (byteOffset + 8 > this.buffer.byteLength) {\n throw new Error(`Offset ${wordOffset} is outside the bounds of the segment`);\n }\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 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 dataOffset = this.wordOffset * WORD_SIZE + byteOffset;\n\n // 边界检查:确保在 data section 内\n const dataSectionEnd = this.wordOffset * WORD_SIZE + this.dataWords * WORD_SIZE;\n if (dataOffset < 0 || dataOffset >= dataSectionEnd) {\n return false; // 越界返回默认值\n }\n\n const byte = segment.dataView.getUint8(dataOffset);\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 const dataOffset = this.wordOffset * WORD_SIZE + byteOffset;\n\n // 边界检查\n const dataSectionEnd = this.wordOffset * WORD_SIZE + this.dataWords * WORD_SIZE;\n if (dataOffset < 0 || dataOffset >= dataSectionEnd) {\n return 0;\n }\n\n return segment.dataView.getInt8(dataOffset);\n }\n\n /**\n * 获取 int16 字段\n */\n getInt16(byteOffset: number): number {\n const segment = this.message.getSegment(this.segmentIndex)!;\n const dataOffset = this.wordOffset * WORD_SIZE + byteOffset;\n\n // 边界检查\n const dataSectionEnd = this.wordOffset * WORD_SIZE + this.dataWords * WORD_SIZE;\n if (dataOffset < 0 || dataOffset + 2 > dataSectionEnd) {\n return 0;\n }\n\n return segment.dataView.getInt16(dataOffset, true);\n }\n\n /**\n * 获取 int32 字段\n */\n getInt32(byteOffset: number): number {\n const segment = this.message.getSegment(this.segmentIndex)!;\n const dataOffset = this.wordOffset * WORD_SIZE + byteOffset;\n\n // 边界检查\n const dataSectionEnd = this.wordOffset * WORD_SIZE + this.dataWords * WORD_SIZE;\n if (dataOffset < 0 || dataOffset + 4 > dataSectionEnd) {\n return 0;\n }\n\n return segment.dataView.getInt32(dataOffset, true);\n }\n\n /**\n * 获取 int64 字段\n */\n getInt64(byteOffset: number): bigint {\n const segment = this.message.getSegment(this.segmentIndex)!;\n const dataOffset = this.wordOffset * WORD_SIZE + byteOffset;\n\n // 边界检查\n const dataSectionEnd = this.wordOffset * WORD_SIZE + this.dataWords * WORD_SIZE;\n if (dataOffset < 0 || dataOffset + 8 > dataSectionEnd) {\n return BigInt(0);\n }\n\n const low = BigInt(segment.dataView.getUint32(dataOffset, true));\n const high = BigInt(segment.dataView.getInt32(dataOffset + 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 const dataOffset = this.wordOffset * WORD_SIZE + byteOffset;\n\n // 边界检查\n const dataSectionEnd = this.wordOffset * WORD_SIZE + this.dataWords * WORD_SIZE;\n if (dataOffset < 0 || dataOffset >= dataSectionEnd) {\n return 0;\n }\n\n return segment.dataView.getUint8(dataOffset);\n }\n\n /**\n * 获取 uint16 字段\n */\n getUint16(byteOffset: number): number {\n const segment = this.message.getSegment(this.segmentIndex)!;\n const dataOffset = this.wordOffset * WORD_SIZE + byteOffset;\n\n // 边界检查\n const dataSectionEnd = this.wordOffset * WORD_SIZE + this.dataWords * WORD_SIZE;\n if (dataOffset < 0 || dataOffset + 2 > dataSectionEnd) {\n return 0;\n }\n\n return segment.dataView.getUint16(dataOffset, true);\n }\n\n /**\n * 获取 uint32 字段\n */\n getUint32(byteOffset: number): number {\n const segment = this.message.getSegment(this.segmentIndex)!;\n const dataOffset = this.wordOffset * WORD_SIZE + byteOffset;\n\n // 边界检查\n const dataSectionEnd = this.wordOffset * WORD_SIZE + this.dataWords * WORD_SIZE;\n if (dataOffset < 0 || dataOffset + 4 > dataSectionEnd) {\n return 0;\n }\n\n return segment.dataView.getUint32(dataOffset, true);\n }\n\n /**\n * 获取 uint64 字段\n */\n getUint64(byteOffset: number): bigint {\n const segment = this.message.getSegment(this.segmentIndex)!;\n const dataOffset = this.wordOffset * WORD_SIZE + byteOffset;\n\n // 边界检查\n const dataSectionEnd = this.wordOffset * WORD_SIZE + this.dataWords * WORD_SIZE;\n if (dataOffset < 0 || dataOffset + 8 > dataSectionEnd) {\n return BigInt(0);\n }\n\n const low = BigInt(segment.dataView.getUint32(dataOffset, true));\n const high = BigInt(segment.dataView.getUint32(dataOffset + 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 const dataOffset = this.wordOffset * WORD_SIZE + byteOffset;\n\n // 边界检查\n const dataSectionEnd = this.wordOffset * WORD_SIZE + this.dataWords * WORD_SIZE;\n if (dataOffset < 0 || dataOffset + 4 > dataSectionEnd) {\n return 0;\n }\n\n return segment.dataView.getFloat32(dataOffset, true);\n }\n\n /**\n * 获取 float64 字段\n */\n getFloat64(byteOffset: number): number {\n const segment = this.message.getSegment(this.segmentIndex)!;\n const dataOffset = this.wordOffset * WORD_SIZE + byteOffset;\n\n // 边界检查\n const dataSectionEnd = this.wordOffset * WORD_SIZE + this.dataWords * WORD_SIZE;\n if (dataOffset < 0 || dataOffset + 8 > dataSectionEnd) {\n return 0;\n }\n\n return segment.dataView.getFloat64(dataOffset, 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 * Data is stored as List(UInt8) without NUL terminator\n * @param pointerIndex - The index of the pointer in the pointer section\n * @returns Uint8Array of the data content, or undefined if null pointer\n */\n getData(pointerIndex: number): Uint8Array | 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 const segment = this.message.getSegment(segmentIndex)!;\n\n // Data is stored as List(UInt8) without NUL terminator\n const byteLength = listPtr.elementCount;\n if (byteLength === 0) return new Uint8Array(0);\n\n // Return a copy of the raw bytes\n const bytes = new Uint8Array(segment.dataView.buffer, wordOffset * WORD_SIZE, byteLength);\n return new Uint8Array(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 // 边界检查:确保有足够的空间读取 tag word\n if (targetOffset < 0 || targetOffset >= segment.wordCount) {\n return undefined;\n }\n\n try {\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 } catch {\n return undefined;\n }\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 编译后 Schema 的 TypeScript Reader\n * 基于官方 schema.capnp 手动编写\n *\n * 这是自举的基础:我们需要先能读取 schema 才能生成 schema 的代码\n *\n * 结构信息来自: capnp compile -ocapnp schema.capnp\n */\n\nimport { MessageReader, type StructReader } from '../core/index.js';\nimport { ElementSize } from '../core/pointer.js';\n\n// ============================================================================\n// 基础类型\n// ============================================================================\n\n/** UInt64 作为 bigint */\nexport type Id = bigint;\n\n// ============================================================================\n// Node\n// ============================================================================\n\nexport class NodeReader {\n constructor(private reader: StructReader) {}\n\n get id(): Id {\n return this.reader.getUint64(0);\n }\n\n get displayName(): string {\n return this.reader.getText(0);\n }\n\n get displayNamePrefixLength(): number {\n return this.reader.getUint32(8);\n }\n\n get scopeId(): Id {\n return this.reader.getUint64(16);\n }\n\n /** union tag 在 bits [96, 112) = bytes [12, 14) */\n private get unionTag(): number {\n return this.reader.getUint16(12);\n }\n\n get isFile(): boolean {\n return this.unionTag === 0;\n }\n\n get isStruct(): boolean {\n return this.unionTag === 1;\n }\n\n get isEnum(): boolean {\n return this.unionTag === 2;\n }\n\n get isInterface(): boolean {\n return this.unionTag === 3;\n }\n\n get isConst(): boolean {\n return this.unionTag === 4;\n }\n\n get isAnnotation(): boolean {\n return this.unionTag === 5;\n }\n\n // --- Struct 相关字段 (union tag = 1) ---\n // struct group 从 bit 112 = byte 14 开始\n\n get structDataWordCount(): number {\n return this.reader.getUint16(14);\n }\n\n get structPointerCount(): number {\n return this.reader.getUint16(24);\n }\n\n get structPreferredListEncoding(): number {\n return this.reader.getUint16(26);\n }\n\n get structIsGroup(): boolean {\n // isGroup @10 :Bool; 在 bit 224 = byte 28\n return this.reader.getBool(224);\n }\n\n get structDiscriminantCount(): number {\n return this.reader.getUint16(30);\n }\n\n get structDiscriminantOffset(): number {\n return this.reader.getUint32(32);\n }\n\n get structFields(): FieldReader[] {\n // fields @13 :List(Field); 是 ptr[3]\n // Field: 24 bytes = 3 words data, 4 pointers\n const listReader = this.reader.getList(3, ElementSize.INLINE_COMPOSITE, {\n dataWords: 3,\n pointerCount: 4,\n });\n if (!listReader) return [];\n\n const fields: FieldReader[] = [];\n for (let i = 0; i < listReader.length; i++) {\n const itemReader = listReader.getStruct(i);\n const field = new FieldReader(itemReader);\n // Stop if we encounter a field with empty name (likely past the actual fields)\n if (!field.name && i > 0) break;\n fields.push(field);\n }\n return fields;\n }\n\n // --- Enum 相关字段 (union tag = 2) ---\n\n get enumEnumerants(): EnumerantReader[] {\n // enumerants @14 :List(Enumerant); 在 enum group 内,ptr[3]\n const listReader = this.reader.getList(3, ElementSize.INLINE_COMPOSITE, {\n dataWords: 1,\n pointerCount: 2,\n });\n if (!listReader) return [];\n\n const enumerants: EnumerantReader[] = [];\n for (let i = 0; i < Math.min(listReader.length, 10); i++) {\n try {\n const itemReader = listReader.getStruct(i);\n const enumerant = new EnumerantReader(itemReader);\n // Stop if we encounter an enumerant with empty name\n if (!enumerant.name) break;\n enumerants.push(enumerant);\n } catch (_e) {\n // Stop on any error (likely past the actual enumerants)\n break;\n }\n }\n return enumerants;\n }\n\n // --- Interface 相关字段 (union tag = 3) ---\n\n get interfaceMethods(): MethodReader[] {\n // methods @15 :List(Method); 在 interface group 内,ptr[3]\n // Method: 5 words data, 2 pointers\n const listReader = this.reader.getList(3, ElementSize.INLINE_COMPOSITE, {\n dataWords: 5,\n pointerCount: 2,\n });\n if (!listReader) return [];\n\n const methods: MethodReader[] = [];\n for (let i = 0; i < listReader.length; i++) {\n try {\n const itemReader = listReader.getStruct(i);\n const method = new MethodReader(itemReader);\n if (!method.name && i > 0) break;\n methods.push(method);\n } catch (_e) {\n break;\n }\n }\n return methods;\n }\n\n // --- NestedNodes ---\n\n get nestedNodes(): NestedNodeReader[] {\n // nestedNodes @4 :List(NestedNode); 是 ptr[1]\n const listReader = this.reader.getList(1, ElementSize.INLINE_COMPOSITE, {\n dataWords: 1,\n pointerCount: 1,\n });\n if (!listReader) return [];\n\n const nodes: NestedNodeReader[] = [];\n for (let i = 0; i < listReader.length; i++) {\n const itemReader = listReader.getStruct(i);\n nodes.push(new NestedNodeReader(itemReader));\n }\n return nodes;\n }\n}\n\n// ============================================================================\n// Field\n// ============================================================================\n\nexport class FieldReader {\n constructor(private reader: StructReader) {}\n\n get name(): string {\n return this.reader.getText(0);\n }\n\n get codeOrder(): number {\n return this.reader.getUint16(0);\n }\n\n get discriminantValue(): number {\n return this.reader.getUint16(2);\n }\n\n /** union tag 在 bits [64, 80) = bytes [8, 10) */\n private get unionTag(): number {\n return this.reader.getUint16(8);\n }\n\n get isSlot(): boolean {\n return this.unionTag === 0;\n }\n\n get isGroup(): boolean {\n return this.unionTag === 1;\n }\n\n // --- Slot 相关 ---\n\n get slotOffset(): number {\n return this.reader.getUint32(4);\n }\n\n get slotType(): TypeReader | null {\n // type @5 :Type; 是 ptr[2]\n const typeReader = this.reader.getStruct(2, 3, 1); // Type: 24 bytes = 3 words, 1 pointer\n return typeReader ? new TypeReader(typeReader) : null;\n }\n\n // --- Group 相关 ---\n\n get groupTypeId(): Id {\n // typeId @7 :UInt64; 在 group group 内,bits [128, 192) = bytes [16, 24)\n return this.reader.getUint64(16);\n }\n\n // --- Default Value ---\n\n get defaultValue(): ValueReader | null {\n // defaultValue @6 :Value; 是 ptr[3]\n const valueReader = this.reader.getStruct(3, 2, 1); // Value: 16 bytes = 2 words, 1 pointer\n return valueReader ? new ValueReader(valueReader) : null;\n }\n}\n\n// ============================================================================\n// Type\n// ============================================================================\n\nexport class TypeReader {\n constructor(private reader: StructReader) {}\n\n get kind(): TypeKind {\n const tag = this.reader.getUint16(0);\n return TYPE_KIND_MAP[tag] ?? 'unknown';\n }\n\n get isPrimitive(): boolean {\n const k = this.kind;\n return (\n k !== 'list' && k !== 'enum' && k !== 'struct' && k !== 'interface' && k !== 'anyPointer'\n );\n }\n\n // --- List ---\n\n get listElementType(): TypeReader | null {\n if (this.kind !== 'list') return null;\n // elementType @14 :Type; 是 ptr[0]\n const elementReader = this.reader.getStruct(0, 3, 1);\n return elementReader ? new TypeReader(elementReader) : null;\n }\n\n // --- Enum/Struct/Interface ---\n\n get typeId(): Id | null {\n const k = this.kind;\n if (k === 'enum' || k === 'struct' || k === 'interface') {\n // typeId 在 bits [64, 128) = bytes [8, 16)\n return this.reader.getUint64(8);\n }\n return null;\n }\n}\n\nexport type TypeKind =\n | 'void'\n | 'bool'\n | 'int8'\n | 'int16'\n | 'int32'\n | 'int64'\n | 'uint8'\n | 'uint16'\n | 'uint32'\n | 'uint64'\n | 'float32'\n | 'float64'\n | 'text'\n | 'data'\n | 'list'\n | 'enum'\n | 'struct'\n | 'interface'\n | 'anyPointer'\n | 'unknown';\n\nconst TYPE_KIND_MAP: Record<number, TypeKind> = {\n 0: 'void',\n 1: 'bool',\n 2: 'int8',\n 3: 'int16',\n 4: 'int32',\n 5: 'int64',\n 6: 'uint8',\n 7: 'uint16',\n 8: 'uint32',\n 9: 'uint64',\n 10: 'float32',\n 11: 'float64',\n 12: 'text',\n 13: 'data',\n 14: 'list',\n 15: 'enum',\n 16: 'struct',\n 17: 'interface',\n 18: 'anyPointer',\n};\n\n// ============================================================================\n// Value - 默认值\n// ============================================================================\n\nexport class ValueReader {\n constructor(private reader: StructReader) {}\n\n /** union tag 在 bits [0, 16) = bytes [0, 2) */\n private get unionTag(): number {\n return this.reader.getUint16(0);\n }\n\n get isVoid(): boolean {\n return this.unionTag === 0;\n }\n get isBool(): boolean {\n return this.unionTag === 1;\n }\n get isInt8(): boolean {\n return this.unionTag === 2;\n }\n get isInt16(): boolean {\n return this.unionTag === 3;\n }\n get isInt32(): boolean {\n return this.unionTag === 4;\n }\n get isInt64(): boolean {\n return this.unionTag === 5;\n }\n get isUint8(): boolean {\n return this.unionTag === 6;\n }\n get isUint16(): boolean {\n return this.unionTag === 7;\n }\n get isUint32(): boolean {\n return this.unionTag === 8;\n }\n get isUint64(): boolean {\n return this.unionTag === 9;\n }\n get isFloat32(): boolean {\n return this.unionTag === 10;\n }\n get isFloat64(): boolean {\n return this.unionTag === 11;\n }\n get isText(): boolean {\n return this.unionTag === 12;\n }\n get isData(): boolean {\n return this.unionTag === 13;\n }\n get isList(): boolean {\n return this.unionTag === 14;\n }\n get isEnum(): boolean {\n return this.unionTag === 15;\n }\n get isStruct(): boolean {\n return this.unionTag === 16;\n }\n get isInterface(): boolean {\n return this.unionTag === 17;\n }\n get isAnyPointer(): boolean {\n return this.unionTag === 18;\n }\n\n // --- 原始值读取 ---\n\n get boolValue(): boolean {\n // boolValue @1 :Bool; 在 bit 16\n return this.reader.getBool(16);\n }\n\n get int8Value(): number {\n // int8Value @2 :Int8; 在 byte 2\n return this.reader.getInt8(2);\n }\n\n get int16Value(): number {\n // int16Value @3 :Int16; 在 bytes [2, 4)\n return this.reader.getInt16(2);\n }\n\n get int32Value(): number {\n // int32Value @4 :Int32; 在 bytes [4, 8)\n return this.reader.getInt32(4);\n }\n\n get int64Value(): bigint {\n // int64Value @5 :Int64; 在 bytes [8, 16)\n return this.reader.getInt64(8);\n }\n\n get uint8Value(): number {\n // uint8Value @6 :UInt8; 在 byte 2\n return this.reader.getUint8(2);\n }\n\n get uint16Value(): number {\n // uint16Value @7 :UInt16; 在 bytes [2, 4)\n return this.reader.getUint16(2);\n }\n\n get uint32Value(): number {\n // uint32Value @8 :UInt32; 在 bytes [4, 8)\n return this.reader.getUint32(4);\n }\n\n get uint64Value(): bigint {\n // uint64Value @9 :UInt64; 在 bytes [8, 16)\n return this.reader.getUint64(8);\n }\n\n get float32Value(): number {\n // float32Value @10 :Float32; 在 bytes [4, 8)\n return this.reader.getFloat32(4);\n }\n\n get float64Value(): number {\n // float64Value @11 :Float64; 在 bytes [8, 16)\n return this.reader.getFloat64(8);\n }\n\n get enumValue(): number {\n // enumValue @15 :UInt16; 在 bytes [2, 4)\n return this.reader.getUint16(2);\n }\n\n // --- 便捷方法:获取特定类型的默认值 ---\n\n getAsNumber(): number | undefined {\n if (this.isInt8) return this.int8Value;\n if (this.isInt16) return this.int16Value;\n if (this.isInt32) return this.int32Value;\n if (this.isUint8) return this.uint8Value;\n if (this.isUint16) return this.uint16Value;\n if (this.isUint32) return this.uint32Value;\n if (this.isFloat32) return this.float32Value;\n if (this.isFloat64) return this.float64Value;\n if (this.isEnum) return this.enumValue;\n return undefined;\n }\n\n getAsBigint(): bigint | undefined {\n if (this.isInt64) return this.int64Value;\n if (this.isUint64) return this.uint64Value;\n return undefined;\n }\n\n getAsBoolean(): boolean | undefined {\n if (this.isBool) return this.boolValue;\n return undefined;\n }\n}\n\n// ============================================================================\n// Method - Interface 方法\n// ============================================================================\n\nexport class MethodReader {\n constructor(private reader: StructReader) {}\n\n get name(): string {\n return this.reader.getText(0);\n }\n\n get codeOrder(): number {\n return this.reader.getUint16(0);\n }\n\n get paramStructType(): Id {\n // paramStructType @2 :Id; 在 bytes [8, 16)\n return this.reader.getUint64(8);\n }\n\n get resultStructType(): Id {\n // resultStructType @3 :Id; 在 bytes [16, 24)\n return this.reader.getUint64(16);\n }\n}\n\n// ============================================================================\n// Enumerant\n// ============================================================================\n\nexport class EnumerantReader {\n constructor(private reader: StructReader) {}\n\n get name(): string {\n return this.reader.getText(0);\n }\n\n get codeOrder(): number {\n return this.reader.getUint16(0);\n }\n}\n\n// ============================================================================\n// NestedNode\n// ============================================================================\n\nexport class NestedNodeReader {\n constructor(private reader: StructReader) {}\n\n get name(): string {\n return this.reader.getText(0);\n }\n\n get id(): Id {\n return this.reader.getUint64(0);\n }\n}\n\n// ============================================================================\n// CodeGeneratorRequest\n// ============================================================================\n\nexport class CodeGeneratorRequestReader {\n constructor(private message: MessageReader) {}\n\n static fromBuffer(buffer: ArrayBuffer): CodeGeneratorRequestReader {\n const message = new MessageReader(buffer);\n return new CodeGeneratorRequestReader(message);\n }\n\n get nodes(): NodeReader[] {\n // CodeGeneratorRequest: 0 data words, 4 pointers\n const root = this.message.getRoot(0, 4);\n // nodes @0 :List(Node);\n const listReader = root.getList(0, ElementSize.INLINE_COMPOSITE, {\n dataWords: 6,\n pointerCount: 6,\n });\n if (!listReader) return [];\n\n const nodes: NodeReader[] = [];\n for (let i = 0; i < listReader.length; i++) {\n const nodeReader = listReader.getStruct(i);\n nodes.push(new NodeReader(nodeReader));\n }\n return nodes;\n }\n\n get requestedFiles(): RequestedFileReader[] {\n const root = this.message.getRoot(0, 4);\n // requestedFiles @1 :List(RequestedFile);\n const listReader = root.getList(1, ElementSize.INLINE_COMPOSITE, {\n dataWords: 1,\n pointerCount: 2,\n });\n if (!listReader) return [];\n\n const files: RequestedFileReader[] = [];\n for (let i = 0; i < listReader.length; i++) {\n try {\n const fileReader = listReader.getStruct(i);\n const file = new RequestedFileReader(fileReader);\n // Stop if we encounter a file with empty filename\n if (!file.filename && files.length > 0) break;\n files.push(file);\n } catch (_e) {\n // Stop on any error (likely past the actual files)\n break;\n }\n }\n return files;\n }\n}\n\n// ============================================================================\n// RequestedFile\n// ============================================================================\n\nexport class RequestedFileReader {\n constructor(private reader: StructReader) {}\n\n get id(): Id {\n return this.reader.getUint64(0);\n }\n\n get filename(): string {\n return this.reader.getText(0);\n }\n}\n","#!/usr/bin/env node\n\n/**\n * Cap'n Proto CLI\n *\n * Usage:\n * capnp gen schema.capnp -o types.ts\n */\n\nimport { execSync } from 'node:child_process';\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { mkdirSync, mkdtempSync, rmSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { basename, dirname, join } from 'node:path';\nimport { parseArgs } from 'node:util';\nimport { type GeneratorOptions, generateFromRequest } from './codegen/generator.js';\nimport { CodeGeneratorRequestReader } from './schema/schema-reader.js';\n\nconst { values, positionals } = parseArgs({\n args: process.argv.slice(2),\n options: {\n output: { type: 'string', short: 'o' },\n outDir: { type: 'string', short: 'd' },\n runtimePath: { type: 'string', short: 'r' },\n dynamic: { type: 'boolean', short: 'D' },\n interactive: { type: 'boolean', short: 'i' },\n help: { type: 'boolean', short: 'h' },\n version: { type: 'boolean', short: 'v' },\n },\n allowPositionals: true,\n});\n\nconst VERSION = '3.0.0';\n\nif (values.version) {\n console.log(VERSION);\n process.exit(0);\n}\n\nif (values.help || positionals.length === 0) {\n console.log(`\nCap'n Proto TypeScript Code Generator v3\n\nUsage: capnp-ts-codegen <schema.capnp> [options]\n\nOptions:\n -o, --output Output file (default: stdout for single file)\n -d, --outDir Output directory for multiple files\n -r, --runtimePath Runtime library import path (default: @naeemo/capnp)\n -D, --dynamic Generate dynamic schema loading code\n -i, --interactive Start interactive schema query tool\n -h, --help Show this help\n -v, --version Show version\n\nExamples:\n capnp-ts-codegen schema.capnp -o schema.ts\n capnp-ts-codegen schema.capnp -d ./generated\n capnp-ts-codegen schema.capnp -o schema.ts -r ../runtime\n capnp-ts-codegen schema.capnp -D -o schema-dynamic.ts\n capnp-ts-codegen schema.capnp -i\n\nFeatures:\n - Struct with all primitive types\n - Enum\n - List<T>\n - Text, Data\n - Nested struct references\n - Union (discriminant handling)\n - Group\n - Default values (XOR encoding)\n - Multi-segment messages\n - Interface (RPC client/server generation)\n - Dynamic schema loading (Phase 7)\n\nNot yet supported:\n - Const\n - Advanced RPC features (Level 2-4)\n`);\n process.exit(0);\n}\n\nconst inputFile = positionals[0];\n\n// Validate input file\nif (!existsSync(inputFile)) {\n console.error(`Error: File not found: ${inputFile}`);\n process.exit(1);\n}\n\n// Check if capnp tool is available\nfunction checkCapnpTool(): boolean {\n try {\n execSync('capnp --version', { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n}\n\nasync function main() {\n // Handle interactive mode\n if (values.interactive) {\n await runInteractiveMode(inputFile);\n return;\n }\n\n if (!checkCapnpTool()) {\n console.error(\"Error: capnp tool not found. Please install Cap'n Proto.\");\n console.error(' macOS: brew install capnp');\n console.error(' Ubuntu/Debian: apt-get install capnproto');\n console.error(' Other: https://capnproto.org/install.html');\n process.exit(1);\n }\n\n const tmpDir = mkdtempSync(join(tmpdir(), 'capnp-ts-'));\n const binFile = join(tmpDir, 'schema.bin');\n\n try {\n console.error(`Compiling ${inputFile}...`);\n\n // Get input file directory as include path\n const inputDir = dirname(inputFile);\n\n // Compile to binary schema\n execSync(`capnp compile -o- \"${inputFile}\" > \"${binFile}\"`, {\n cwd: inputDir,\n stdio: ['ignore', 'ignore', 'pipe'],\n });\n\n console.error('Reading binary schema...');\n const buffer = readFileSync(binFile);\n // Create a proper ArrayBuffer copy to avoid issues with Node.js Buffer pooling\n const arrayBuffer = new Uint8Array(buffer.byteLength);\n arrayBuffer.set(new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength));\n\n // Handle dynamic mode\n if (values.dynamic) {\n console.error('Generating dynamic schema loading code...');\n const dynamicCode = generateDynamicLoadingCode(inputFile, arrayBuffer.buffer);\n\n if (values.output) {\n writeFileSync(values.output, dynamicCode);\n console.error(`Dynamic loading code written to ${values.output}`);\n } else {\n console.log(dynamicCode);\n }\n return;\n }\n\n console.error('Generating TypeScript code...');\n const request = CodeGeneratorRequestReader.fromBuffer(arrayBuffer.buffer);\n\n const options: GeneratorOptions = {\n runtimeImportPath: values.runtimePath || '@naeemo/capnp',\n };\n\n const files = generateFromRequest(request, options);\n\n // Output handling\n if (values.outDir) {\n // Multi-file output to directory\n mkdirSync(values.outDir, { recursive: true });\n for (const [filename, code] of files) {\n const outPath = join(values.outDir, filename);\n mkdirSync(dirname(outPath), { recursive: true });\n writeFileSync(outPath, code);\n console.error(`Generated: ${outPath}`);\n }\n } else if (values.output) {\n // Single file output\n const firstFile = files.values().next().value;\n if (firstFile) {\n writeFileSync(values.output, firstFile);\n console.error(`Output written to ${values.output}`);\n } else {\n console.error('Error: No files generated');\n process.exit(1);\n }\n } else {\n // Output to stdout\n const firstFile = files.values().next().value;\n if (firstFile) {\n console.log(firstFile);\n } else {\n console.error('Error: No files generated');\n process.exit(1);\n }\n }\n } catch (err: any) {\n console.error('Error:', err.message);\n if (err.stderr) {\n console.error(err.stderr.toString());\n }\n process.exit(1);\n } finally {\n // Cleanup temp files\n rmSync(tmpDir, { recursive: true, force: true });\n }\n}\n\nmain();\n\n// =============================================================================\n// Phase 7: Dynamic Schema Loading Support\n// =============================================================================\n\n/**\n * Generate dynamic schema loading code for the given schema file\n */\nfunction generateDynamicLoadingCode(inputFile: string, buffer: ArrayBuffer): string {\n const request = CodeGeneratorRequestReader.fromBuffer(buffer);\n const nodes = request.nodes;\n\n const runtimePath = values.runtimePath || '@naeemo/capnp';\n const schemaName = basename(inputFile, '.capnp');\n\n // Collect struct and interface types\n const structTypes: Array<{ id: string; name: string; displayName: string }> = [];\n const interfaceTypes: Array<{ id: string; name: string; displayName: string }> = [];\n\n for (const node of nodes) {\n const id = node.id;\n const displayName = node.displayName;\n const shortName = displayName.split('.').pop() || displayName;\n\n if (node.isStruct) {\n structTypes.push({ id: `0x${id.toString(16)}n`, name: shortName, displayName });\n } else if (node.isInterface) {\n interfaceTypes.push({ id: `0x${id.toString(16)}n`, name: shortName, displayName });\n }\n }\n\n const code = `/**\n * Dynamic Schema Loading for ${schemaName}.capnp\n * \n * This file provides runtime schema loading capabilities for ${schemaName}.capnp\n * Generated by capnp-ts-codegen --dynamic\n * \n * Usage:\n * import { load${toPascalCase(schemaName)}Schema, ${structTypes.map((t) => t.name).join(', ')} } from './${schemaName}-dynamic';\n * \n * // Load schema from remote connection\n * const schema = await load${toPascalCase(schemaName)}Schema(connection);\n * \n * // Use dynamic reader\n * const reader = createDynamicReader(schema.Person, buffer);\n * console.log(reader.get('name'));\n */\n\nimport { \n RpcConnection,\n createDynamicReader, \n createDynamicWriter,\n dumpDynamicReader,\n type SchemaNode,\n type SchemaRegistry,\n} from '${runtimePath}';\n\n// =============================================================================\n// Type IDs\n// =============================================================================\n\n${structTypes.map((t) => `/** Type ID for ${t.displayName} */\\nexport const ${t.name}TypeId = ${t.id};`).join('\\n')}\n\n${interfaceTypes.map((t) => `/** Interface ID for ${t.displayName} */\\nexport const ${t.name}InterfaceId = ${t.id};`).join('\\n')}\n\n// =============================================================================\n// Schema Cache\n// =============================================================================\n\nlet cachedSchemaRegistry: SchemaRegistry | null = null;\n\n// =============================================================================\n// Schema Loading Functions\n// =============================================================================\n\n/**\n * Load all schemas for ${schemaName}.capnp from a remote connection.\n * This fetches schema information dynamically and caches it for reuse.\n * \n * @param connection - The RPC connection to fetch schemas from\n * @returns A registry containing all loaded schemas\n */\nexport async function load${toPascalCase(schemaName)}Schema(connection: RpcConnection): Promise<SchemaRegistry> {\n if (cachedSchemaRegistry) {\n return cachedSchemaRegistry;\n }\n\n // Fetch all schemas\n const typeIds = [\n ${structTypes.map((t) => `${t.name}TypeId`).join(',\\n ')}\n ];\n\n for (const typeId of typeIds) {\n try {\n await connection.getDynamicSchema(typeId);\n } catch (err) {\n console.warn(\\`Failed to load schema for type \\${typeId}:\\`, err);\n }\n }\n\n cachedSchemaRegistry = connection.getSchemaRegistry();\n return cachedSchemaRegistry;\n}\n\n/**\n * Get a specific schema node by type ID.\n * Loads from remote if not already cached.\n * \n * @param connection - The RPC connection\n * @param typeId - The type ID to fetch\n * @returns The schema node\n */\nexport async function getSchema(connection: RpcConnection, typeId: bigint): Promise<SchemaNode> {\n return connection.getDynamicSchema(typeId);\n}\n\n/**\n * Clear the schema cache.\n * Call this if you need to re-fetch schemas from the remote server.\n */\nexport function clearSchemaCache(): void {\n cachedSchemaRegistry = null;\n}\n\n// =============================================================================\n// Dynamic Reader Helpers\n// =============================================================================\n\n${structTypes\n .map(\n (t) => `\n/**\n * Create a dynamic reader for ${t.name}\n * \n * @param buffer - The Cap'n Proto message buffer\n * @param registry - Optional schema registry (will use cached if available)\n * @returns A DynamicReader for the message\n */\nexport function create${toPascalCase(t.name)}Reader(\n buffer: ArrayBuffer | Uint8Array,\n registry?: SchemaRegistry\n): DynamicReader {\n const reg = registry || cachedSchemaRegistry;\n if (!reg) {\n throw new Error('Schema registry not loaded. Call load${toPascalCase(schemaName)}Schema first.');\n }\n \n const schema = reg.getNode(${t.name}TypeId);\n if (!schema) {\n throw new Error('Schema for ${t.name} not found in registry');\n }\n \n return createDynamicReader(schema, buffer);\n}\n`\n )\n .join('\\n')}\n\n// =============================================================================\n// Utility Functions\n// =============================================================================\n\n/**\n * Dump all fields from a dynamic reader for debugging\n */\nexport { dumpDynamicReader };\n\n/**\n * List all available types in this schema\n */\nexport function listTypes(): Array<{ name: string; typeId: string; kind: 'struct' | 'interface' }> {\n return [\n ${structTypes.map((t) => `{ name: '${t.name}', typeId: '${t.id}', kind: 'struct' as const }`).join(',\\n ')},\n ${interfaceTypes.map((t) => `{ name: '${t.name}', typeId: '${t.id}', kind: 'interface' as const }`).join(',\\n ')},\n ];\n}\n`;\n\n return code;\n}\n\n/**\n * Run interactive schema query tool\n */\nasync function runInteractiveMode(inputFile: string): Promise<void> {\n if (!checkCapnpTool()) {\n console.error(\"Error: capnp tool not found. Please install Cap'n Proto.\");\n process.exit(1);\n }\n\n const tmpDir = mkdtempSync(join(tmpdir(), 'capnp-ts-'));\n const binFile = join(tmpDir, 'schema.bin');\n\n try {\n console.log(`\\n🔍 Loading schema: ${inputFile}...\\n`);\n\n const inputDir = dirname(inputFile);\n execSync(`capnp compile -o- \"${inputFile}\" > \"${binFile}\"`, {\n cwd: inputDir,\n stdio: ['ignore', 'ignore', 'pipe'],\n });\n\n const buffer = readFileSync(binFile);\n const arrayBuffer = new Uint8Array(buffer.byteLength);\n arrayBuffer.set(new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength));\n\n const request = CodeGeneratorRequestReader.fromBuffer(arrayBuffer.buffer);\n const nodes = request.nodes;\n\n // Build type index\n const typeIndex = new Map<\n string,\n { id: bigint; displayName: string; kind: string; node: unknown }\n >();\n\n for (const node of nodes) {\n const id = node.id;\n const displayName = node.displayName;\n const shortName = displayName.split('.').pop() || displayName;\n\n let kind = 'unknown';\n if (node.isStruct) kind = 'struct';\n else if (node.isInterface) kind = 'interface';\n else if (node.isEnum) kind = 'enum';\n else if (node.isConst) kind = 'const';\n\n typeIndex.set(shortName, { id, displayName, kind, node });\n typeIndex.set(displayName, { id, displayName, kind, node });\n typeIndex.set(id.toString(16), { id, displayName, kind, node });\n }\n\n console.log('📋 Available types:');\n console.log('─'.repeat(60));\n\n const structs: string[] = [];\n const interfaces: string[] = [];\n const enums: string[] = [];\n\n for (const [name, info] of typeIndex) {\n if (name.includes('.')) continue; // Skip full names for summary\n\n if (info.kind === 'struct') structs.push(name);\n else if (info.kind === 'interface') interfaces.push(name);\n else if (info.kind === 'enum') enums.push(name);\n }\n\n if (structs.length > 0) {\n console.log('\\n🏗️ Structs:');\n for (const name of structs.sort()) {\n const info = typeIndex.get(name)!;\n console.log(` ${name.padEnd(30)} (0x${info.id.toString(16)})`);\n }\n }\n\n if (interfaces.length > 0) {\n console.log('\\n🔌 Interfaces:');\n for (const name of interfaces.sort()) {\n const info = typeIndex.get(name)!;\n console.log(` ${name.padEnd(30)} (0x${info.id.toString(16)})`);\n }\n }\n\n if (enums.length > 0) {\n console.log('\\n📊 Enums:');\n for (const name of enums.sort()) {\n const info = typeIndex.get(name)!;\n console.log(` ${name.padEnd(30)} (0x${info.id.toString(16)})`);\n }\n }\n\n console.log(`\\n${'─'.repeat(60)}`);\n console.log('💡 Commands:');\n console.log(' inspect <type> - Show detailed information about a type');\n console.log(' ids - List all type IDs');\n console.log(' export - Export schema info as JSON');\n console.log(' quit - Exit interactive mode');\n console.log('');\n\n // Simple command loop using stdin\n const stdin = process.stdin;\n const stdout = process.stdout;\n\n stdin.setEncoding('utf8');\n stdin.resume();\n\n stdout.write('> ');\n\n stdin.on('data', (data: string) => {\n const line = data.trim();\n const parts = line.split(/\\s+/);\n const command = parts[0];\n const arg = parts[1];\n\n switch (command) {\n case 'quit':\n case 'exit':\n case 'q':\n console.log('👋 Goodbye!');\n process.exit(0);\n break;\n\n case 'inspect':\n if (!arg) {\n console.log('❌ Usage: inspect <type-name>');\n } else {\n const info = typeIndex.get(arg);\n if (info) {\n console.log(`\\n🔍 ${info.displayName}`);\n console.log(` ${'─'.repeat(50)}`);\n console.log(` Type ID: 0x${info.id.toString(16)}`);\n console.log(` Kind: ${info.kind}`);\n\n // In a full implementation, we'd show field details here\n // by parsing the node structure more deeply\n\n console.log('');\n } else {\n console.log(`❌ Type \"${arg}\" not found`);\n }\n }\n break;\n\n case 'ids':\n console.log('\\n📋 All Type IDs:');\n console.log(` ${'─'.repeat(50)}`);\n for (const [name, info] of typeIndex) {\n if (name.includes('.')) continue;\n console.log(` 0x${info.id.toString(16).padStart(16, '0')} ${info.displayName}`);\n }\n console.log('');\n break;\n\n case 'export': {\n const exportData = {\n sourceFile: inputFile,\n types: Array.from(typeIndex.entries())\n .filter(([name]) => !name.includes('.'))\n .map(([name, info]) => ({\n name,\n displayName: info.displayName,\n typeId: `0x${info.id.toString(16)}`,\n kind: info.kind,\n })),\n };\n console.log(JSON.stringify(exportData, null, 2));\n break;\n }\n\n case 'help':\n case 'h':\n console.log('\\n💡 Commands:');\n console.log(' inspect <type> - Show detailed information about a type');\n console.log(' ids - List all type IDs');\n console.log(' export - Export schema info as JSON');\n console.log(' quit - Exit interactive mode');\n console.log('');\n break;\n\n default:\n if (line) {\n console.log(`❌ Unknown command: ${command}`);\n console.log(' Type \"help\" for available commands');\n }\n }\n\n stdout.write('> ');\n });\n\n // Keep the process alive\n await new Promise(() => {});\n } catch (err: any) {\n console.error('Error:', err.message);\n process.exit(1);\n } finally {\n rmSync(tmpDir, { recursive: true, force: true });\n }\n}\n\n/**\n * Convert string to PascalCase\n */\nfunction toPascalCase(str: string): string {\n return str\n .split(/[-_]/)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1).toLowerCase())\n .join('');\n}\n"],"mappings":"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"}
|