@naeemo/capnp 0.9.0 → 0.9.3

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.
@@ -1,177 +1,6 @@
1
1
  #!/usr/bin/env node
2
- //#region src/core/pointer.ts
3
- /**
4
- * Cap'n Proto 指针编解码
5
- * 纯 TypeScript 实现
6
- */
7
- let PointerTag = /* @__PURE__ */ function(PointerTag) {
8
- PointerTag[PointerTag["STRUCT"] = 0] = "STRUCT";
9
- PointerTag[PointerTag["LIST"] = 1] = "LIST";
10
- PointerTag[PointerTag["FAR"] = 2] = "FAR";
11
- PointerTag[PointerTag["OTHER"] = 3] = "OTHER";
12
- return PointerTag;
13
- }({});
14
- let ElementSize = /* @__PURE__ */ function(ElementSize) {
15
- ElementSize[ElementSize["VOID"] = 0] = "VOID";
16
- ElementSize[ElementSize["BIT"] = 1] = "BIT";
17
- ElementSize[ElementSize["BYTE"] = 2] = "BYTE";
18
- ElementSize[ElementSize["TWO_BYTES"] = 3] = "TWO_BYTES";
19
- ElementSize[ElementSize["FOUR_BYTES"] = 4] = "FOUR_BYTES";
20
- ElementSize[ElementSize["EIGHT_BYTES"] = 5] = "EIGHT_BYTES";
21
- ElementSize[ElementSize["POINTER"] = 6] = "POINTER";
22
- ElementSize[ElementSize["COMPOSITE"] = 7] = "COMPOSITE";
23
- ElementSize[ElementSize["INLINE_COMPOSITE"] = 7] = "INLINE_COMPOSITE";
24
- return ElementSize;
25
- }({});
26
- /**
27
- * 解码指针(64位)
28
- */
29
- function decodePointer(ptr) {
30
- const tag = Number(ptr & BigInt(3));
31
- switch (tag) {
32
- case PointerTag.STRUCT: {
33
- const offset = Number(ptr >> BigInt(2)) & 1073741823;
34
- return {
35
- tag,
36
- offset: offset >= 536870912 ? offset - 1073741824 : offset,
37
- dataWords: Number(ptr >> BigInt(32) & BigInt(65535)),
38
- pointerCount: Number(ptr >> BigInt(48) & BigInt(65535))
39
- };
40
- }
41
- case PointerTag.LIST: {
42
- const offset = Number(ptr >> BigInt(2)) & 1073741823;
43
- return {
44
- tag,
45
- offset: offset >= 536870912 ? offset - 1073741824 : offset,
46
- elementSize: Number(ptr >> BigInt(32) & BigInt(7)),
47
- elementCount: Number(ptr >> BigInt(35) & BigInt(536870911))
48
- };
49
- }
50
- case PointerTag.FAR: {
51
- const doubleFar = Boolean(ptr >> BigInt(2) & BigInt(1));
52
- const targetOffset = Number(ptr >> BigInt(3) & BigInt(536870911));
53
- return {
54
- tag,
55
- doubleFar,
56
- targetSegment: Number(ptr >> BigInt(32) & BigInt(4294967295)),
57
- targetOffset
58
- };
59
- }
60
- default: return { tag: PointerTag.OTHER };
61
- }
62
- }
63
- /**
64
- * 编码 Struct 指针
65
- */
66
- function encodeStructPointer(offset, dataWords, pointerCount) {
67
- return (BigInt(offset < 0 ? offset + 1073741824 : offset) & BigInt(1073741823)) << BigInt(2) | BigInt(dataWords) << BigInt(32) | BigInt(pointerCount) << BigInt(48);
68
- }
69
- /**
70
- * 编码 List 指针
71
- */
72
- function encodeListPointer(offset, elementSize, elementCount) {
73
- return (BigInt(offset < 0 ? offset + 1073741824 : offset) & BigInt(1073741823)) << BigInt(2) | BigInt(1) | BigInt(elementSize) << BigInt(32) | BigInt(elementCount) << BigInt(35);
74
- }
75
-
76
- //#endregion
77
- //#region src/core/segment.ts
78
- /**
79
- * Cap'n Proto Segment 管理
80
- * 纯 TypeScript 实现
81
- */
82
- const WORD_SIZE = 8;
83
- var Segment = class Segment {
84
- buffer;
85
- view;
86
- _size;
87
- constructor(initialCapacity = 1024) {
88
- this.buffer = new ArrayBuffer(initialCapacity);
89
- this.view = new DataView(this.buffer);
90
- this._size = 0;
91
- }
92
- /**
93
- * 从现有 buffer 创建(用于读取)
94
- */
95
- static fromBuffer(buffer) {
96
- const seg = new Segment(0);
97
- seg.buffer = buffer;
98
- seg.view = new DataView(buffer);
99
- seg._size = buffer.byteLength;
100
- return seg;
101
- }
102
- /**
103
- * 确保容量足够
104
- */
105
- ensureCapacity(minBytes) {
106
- if (this.buffer.byteLength >= minBytes) return;
107
- let newCapacity = this.buffer.byteLength * 2;
108
- while (newCapacity < minBytes) newCapacity *= 2;
109
- const newBuffer = new ArrayBuffer(newCapacity);
110
- new Uint8Array(newBuffer).set(new Uint8Array(this.buffer, 0, this._size));
111
- this.buffer = newBuffer;
112
- this.view = new DataView(newBuffer);
113
- }
114
- /**
115
- * 分配空间,返回字偏移
116
- */
117
- allocate(words) {
118
- const bytes = words * WORD_SIZE;
119
- const offset = this._size;
120
- this.ensureCapacity(offset + bytes);
121
- this._size = offset + bytes;
122
- return offset / WORD_SIZE;
123
- }
124
- /**
125
- * 获取字(64位)
126
- */
127
- getWord(wordOffset) {
128
- const byteOffset = wordOffset * WORD_SIZE;
129
- if (byteOffset + 8 > this._size) throw new Error(`Offset ${wordOffset} is outside the bounds of the segment (${this.wordCount} words)`);
130
- const low = BigInt(this.view.getUint32(byteOffset, true));
131
- return BigInt(this.view.getUint32(byteOffset + 4, true)) << BigInt(32) | low;
132
- }
133
- /**
134
- * 设置字(64位)
135
- */
136
- setWord(wordOffset, value) {
137
- const byteOffset = wordOffset * WORD_SIZE;
138
- if (byteOffset + 8 > this.buffer.byteLength) throw new Error(`Offset ${wordOffset} is outside the bounds of the segment`);
139
- this.view.setUint32(byteOffset, Number(value & BigInt(4294967295)), true);
140
- this.view.setUint32(byteOffset + 4, Number(value >> BigInt(32)), true);
141
- }
142
- /**
143
- * 获取原始 buffer(只读到 _size)
144
- */
145
- asUint8Array() {
146
- return new Uint8Array(this.buffer, 0, this._size);
147
- }
148
- /**
149
- * 获取底层 ArrayBuffer
150
- */
151
- getArrayBuffer() {
152
- return this.buffer;
153
- }
154
- /**
155
- * 获取字数量
156
- */
157
- get wordCount() {
158
- return this._size / WORD_SIZE;
159
- }
160
- /**
161
- * 获取字节数量
162
- */
163
- get byteLength() {
164
- return this._size;
165
- }
166
- /**
167
- * 获取 DataView
168
- */
169
- get dataView() {
170
- return this.view;
171
- }
172
- };
2
+ import { a as decodePointer, i as PointerTag, n as WORD_SIZE, o as encodeListPointer, r as ElementSize, s as encodeStructPointer, t as Segment } from "./segment-yid_PYS5.js";
173
3
 
174
- //#endregion
175
4
  //#region src/core/message-builder.ts
176
5
  /**
177
6
  * Cap'n Proto MessageBuilder
@@ -516,21 +345,38 @@ var ListBuilder = class {
516
345
  * Cap'n Proto MessageReader
517
346
  * 纯 TypeScript 实现
518
347
  */
348
+ /** 默认安全选项 */
349
+ const DEFAULT_SECURITY_OPTIONS = {
350
+ maxSegments: 64,
351
+ maxTotalSize: 64 * 1024 * 1024,
352
+ strictMode: false
353
+ };
519
354
  var MessageReader = class {
520
355
  segments;
521
- constructor(buffer) {
356
+ securityOptions;
357
+ constructor(buffer, securityOptions) {
358
+ this.securityOptions = {
359
+ ...DEFAULT_SECURITY_OPTIONS,
360
+ ...securityOptions
361
+ };
522
362
  const uint8Array = buffer instanceof ArrayBuffer ? new Uint8Array(buffer) : buffer;
523
363
  this.segments = [];
364
+ if (this.securityOptions.strictMode && uint8Array.byteLength > this.securityOptions.maxTotalSize) throw new Error(`Message size (${uint8Array.byteLength} bytes) exceeds maximum allowed size (${this.securityOptions.maxTotalSize} bytes)`);
524
365
  if (uint8Array.byteLength < 8) return;
525
366
  const view = new DataView(uint8Array.buffer, uint8Array.byteOffset, uint8Array.byteLength);
526
367
  const firstWordLow = view.getUint32(0, true);
527
368
  const firstWordHigh = view.getUint32(4, true);
528
369
  const segmentCount = (firstWordLow & 4294967295) + 1;
529
370
  const firstSegmentSize = firstWordHigh;
371
+ if (segmentCount > this.securityOptions.maxSegments) {
372
+ if (this.securityOptions.strictMode) throw new Error(`Segment count (${segmentCount}) exceeds maximum allowed (${this.securityOptions.maxSegments})`);
373
+ return;
374
+ }
530
375
  let offset = 8;
531
376
  const segmentSizes = [firstSegmentSize];
532
377
  for (let i = 1; i < segmentCount; i++) {
533
378
  if (offset + 4 > uint8Array.byteLength) {
379
+ if (this.securityOptions.strictMode) throw new Error(`Message ended prematurely while reading segment ${i} size (offset: ${offset}, length: ${uint8Array.byteLength})`);
534
380
  this.segments = [];
535
381
  return;
536
382
  }
@@ -539,12 +385,24 @@ var MessageReader = class {
539
385
  }
540
386
  offset = offset + 7 & -8;
541
387
  if (offset > uint8Array.byteLength) {
388
+ if (this.securityOptions.strictMode) throw new Error(`Insufficient data for segment table (offset: ${offset}, length: ${uint8Array.byteLength})`);
542
389
  this.segments = [];
543
390
  return;
544
391
  }
392
+ const headerSize = offset;
393
+ let totalBodySize = 0;
394
+ for (const size of segmentSizes) totalBodySize += size * WORD_SIZE;
395
+ const expectedTotalSize = headerSize + totalBodySize;
396
+ if (expectedTotalSize > this.securityOptions.maxTotalSize) {
397
+ if (this.securityOptions.strictMode) throw new Error(`Total message size (${expectedTotalSize} bytes) exceeds maximum allowed size (${this.securityOptions.maxTotalSize} bytes)`);
398
+ return;
399
+ }
545
400
  this.segments = [];
546
401
  for (const size of segmentSizes) {
547
- if (offset + size * WORD_SIZE > uint8Array.byteLength) break;
402
+ if (offset + size * WORD_SIZE > uint8Array.byteLength) {
403
+ if (this.securityOptions.strictMode) throw new Error(`Insufficient data for segment (expected ${size * WORD_SIZE} bytes at offset ${offset}, but message is ${uint8Array.byteLength} bytes)`);
404
+ break;
405
+ }
548
406
  const segmentBuffer = uint8Array.slice(offset, offset + size * WORD_SIZE);
549
407
  this.segments.push(Segment.fromBuffer(segmentBuffer.buffer));
550
408
  offset += size * WORD_SIZE;
@@ -638,6 +496,12 @@ var MessageReader = class {
638
496
  get segmentCount() {
639
497
  return this.segments.length;
640
498
  }
499
+ /**
500
+ * 获取当前安全选项配置
501
+ */
502
+ getSecurityOptions() {
503
+ return { ...this.securityOptions };
504
+ }
641
505
  };
642
506
  /**
643
507
  * 结构读取器
@@ -844,5 +708,5 @@ var StructReader = class StructReader {
844
708
  };
845
709
 
846
710
  //#endregion
847
- export { MessageBuilder as n, ElementSize as r, MessageReader as t };
848
- //# sourceMappingURL=message-reader-fw2PY8sU.js.map
711
+ export { MessageBuilder as n, MessageReader as t };
712
+ //# sourceMappingURL=message-reader-_TCBf61G.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-reader-_TCBf61G.js","names":[],"sources":["../src/core/message-builder.ts","../src/core/list.ts","../src/core/message-reader.ts"],"sourcesContent":["/**\n * Cap'n Proto MessageBuilder\n * 纯 TypeScript 实现\n */\n\nimport { ListBuilder } from './list.js';\nimport { ElementSize, PointerTag, encodeListPointer, encodeStructPointer } from './pointer.js';\nimport { Segment, WORD_SIZE } from './segment.js';\n\nexport class MessageBuilder {\n private segment: Segment;\n private rootSet = false;\n\n constructor() {\n // 预留消息头空间(假设单段)\n this.segment = new Segment(1024);\n // 预留 8 字节给段大小\n this.segment.allocate(1);\n }\n\n /**\n * 初始化根结构\n */\n initRoot(dataWords: number, pointerCount: number): StructBuilder {\n if (this.rootSet) {\n throw new Error('Root already initialized');\n }\n\n // 分配根结构空间\n const size = dataWords + pointerCount;\n const structOffset = this.segment.allocate(size);\n\n // 在位置 0 写入根指针\n const rootPtr = encodeStructPointer(structOffset - 1, dataWords, pointerCount);\n this.segment.setWord(0, rootPtr);\n\n this.rootSet = true;\n\n return new StructBuilder(this, 0, structOffset, dataWords, pointerCount);\n }\n\n /**\n * 序列化为 ArrayBuffer\n */\n toArrayBuffer(): ArrayBuffer {\n const segmentData = this.segment.asUint8Array();\n const wordCount = this.segment.wordCount;\n\n // 构建消息头\n // 第一个字:段数量-1(低32位)和第一段大小(高32位)\n const header = new ArrayBuffer(8);\n const headerView = new DataView(header);\n headerView.setUint32(0, 0, true); // 段数量-1 = 0(单段)\n headerView.setUint32(4, wordCount, true); // 第一段大小\n\n // 合并头和数据\n const result = new Uint8Array(8 + segmentData.byteLength);\n result.set(new Uint8Array(header), 0);\n result.set(segmentData, 8);\n\n return result.buffer;\n }\n\n /**\n * 获取段(内部使用)\n */\n getSegment(): Segment {\n return this.segment;\n }\n}\n\n/**\n * 结构构建器\n */\nexport class StructBuilder {\n constructor(\n private message: MessageBuilder,\n private segmentIndex: number,\n private wordOffset: number,\n private dataWords: number,\n private pointerCount: number\n ) {}\n\n /**\n * 设置 bool 字段\n */\n setBool(bitOffset: number, value: boolean): void {\n const byteOffset = Math.floor(bitOffset / 8);\n const bitInByte = bitOffset % 8;\n const segment = this.message.getSegment();\n const view = segment.dataView;\n const offset = this.wordOffset * WORD_SIZE + byteOffset;\n\n const current = view.getUint8(offset);\n const newValue = value ? current | (1 << bitInByte) : current & ~(1 << bitInByte);\n view.setUint8(offset, newValue);\n }\n\n /**\n * 设置 int8 字段\n */\n setInt8(byteOffset: number, value: number): void {\n const segment = this.message.getSegment();\n segment.dataView.setInt8(this.wordOffset * WORD_SIZE + byteOffset, value);\n }\n\n /**\n * 设置 int16 字段\n */\n setInt16(byteOffset: number, value: number): void {\n const segment = this.message.getSegment();\n segment.dataView.setInt16(this.wordOffset * WORD_SIZE + byteOffset, value, true);\n }\n\n /**\n * 设置 int32 字段\n */\n setInt32(byteOffset: number, value: number): void {\n const segment = this.message.getSegment();\n segment.dataView.setInt32(this.wordOffset * WORD_SIZE + byteOffset, value, true);\n }\n\n /**\n * 设置 int64 字段\n */\n setInt64(byteOffset: number, value: bigint): void {\n const segment = this.message.getSegment();\n const offset = this.wordOffset * WORD_SIZE + byteOffset;\n segment.dataView.setUint32(offset, Number(value & BigInt(0xffffffff)), true);\n segment.dataView.setInt32(offset + 4, Number(value >> BigInt(32)), true);\n }\n\n /**\n * 设置 uint8 字段\n */\n setUint8(byteOffset: number, value: number): void {\n const segment = this.message.getSegment();\n segment.dataView.setUint8(this.wordOffset * WORD_SIZE + byteOffset, value);\n }\n\n /**\n * 设置 uint16 字段\n */\n setUint16(byteOffset: number, value: number): void {\n const segment = this.message.getSegment();\n segment.dataView.setUint16(this.wordOffset * WORD_SIZE + byteOffset, value, true);\n }\n\n /**\n * 设置 uint32 字段\n */\n setUint32(byteOffset: number, value: number): void {\n const segment = this.message.getSegment();\n segment.dataView.setUint32(this.wordOffset * WORD_SIZE + byteOffset, value, true);\n }\n\n /**\n * 设置 uint64 字段\n */\n setUint64(byteOffset: number, value: bigint): void {\n const segment = this.message.getSegment();\n const offset = this.wordOffset * WORD_SIZE + byteOffset;\n segment.dataView.setUint32(offset, Number(value & BigInt(0xffffffff)), true);\n segment.dataView.setUint32(offset + 4, Number(value >> BigInt(32)), true);\n }\n\n /**\n * 设置 float32 字段\n */\n setFloat32(byteOffset: number, value: number): void {\n const segment = this.message.getSegment();\n segment.dataView.setFloat32(this.wordOffset * WORD_SIZE + byteOffset, value, true);\n }\n\n /**\n * 设置 float64 字段\n */\n setFloat64(byteOffset: number, value: number): void {\n const segment = this.message.getSegment();\n segment.dataView.setFloat64(this.wordOffset * WORD_SIZE + byteOffset, value, true);\n }\n\n /**\n * 获取 uint16 字段(用于 UnionBuilder 读取 tag)\n */\n getUint16(byteOffset: number): number {\n const segment = this.message.getSegment();\n return segment.dataView.getUint16(this.wordOffset * WORD_SIZE + byteOffset, true);\n }\n\n /**\n * 设置文本字段\n */\n setText(pointerIndex: number, value: string): void {\n const ptrOffset = this.wordOffset + this.dataWords + pointerIndex;\n const segment = this.message.getSegment();\n\n // 编码文本\n const bytes = new TextEncoder().encode(`${value}\\0`);\n const wordCount = Math.ceil(bytes.length / WORD_SIZE);\n const listOffset = segment.allocate(wordCount);\n\n // 写入文本数据\n new Uint8Array(segment.dataView.buffer, listOffset * WORD_SIZE, bytes.length).set(bytes);\n\n // 写入指针\n const ptr = encodeListPointer(listOffset - ptrOffset - 1, ElementSize.BYTE, bytes.length);\n segment.setWord(ptrOffset, ptr);\n }\n\n /**\n * 设置数据字段(Uint8Array)\n * @param pointerIndex - 指针索引\n * @param value - Uint8Array 数据\n */\n setData(pointerIndex: number, value: Uint8Array): void {\n const ptrOffset = this.wordOffset + this.dataWords + pointerIndex;\n const segment = this.message.getSegment();\n\n // 处理空数组\n if (value.length === 0) {\n const ptr = encodeListPointer(0, ElementSize.BYTE, 0);\n segment.setWord(ptrOffset, ptr);\n return;\n }\n\n const wordCount = Math.ceil(value.length / WORD_SIZE);\n const listOffset = segment.allocate(wordCount);\n\n // 写入数据\n new Uint8Array(segment.dataView.buffer, listOffset * WORD_SIZE, value.length).set(value);\n\n // 写入指针\n const ptr = encodeListPointer(listOffset - ptrOffset - 1, ElementSize.BYTE, value.length);\n segment.setWord(ptrOffset, ptr);\n }\n\n /**\n * 初始化嵌套结构\n */\n initStruct(pointerIndex: number, dataWords: number, pointerCount: number): StructBuilder {\n const ptrOffset = this.wordOffset + this.dataWords + pointerIndex;\n const segment = this.message.getSegment();\n\n // 分配结构空间\n const size = dataWords + pointerCount;\n const structOffset = segment.allocate(size);\n\n // 写入指针\n const ptr = encodeStructPointer(structOffset - ptrOffset - 1, dataWords, pointerCount);\n segment.setWord(ptrOffset, ptr);\n\n return new StructBuilder(this.message, 0, structOffset, dataWords, pointerCount);\n }\n\n /**\n * 初始化列表\n */\n initList<T>(\n pointerIndex: number,\n elementSize: ElementSize,\n elementCount: number,\n structSize?: { dataWords: number; pointerCount: number }\n ): ListBuilder<T> {\n const ptrOffset = this.wordOffset + this.dataWords + pointerIndex;\n const segment = this.message.getSegment();\n\n // 计算列表大小\n let elementWords = 1;\n if (elementSize === ElementSize.BYTE) elementWords = 1;\n else if (elementSize === ElementSize.TWO_BYTES) elementWords = 1;\n else if (elementSize === ElementSize.FOUR_BYTES) elementWords = 1;\n else if (elementSize === ElementSize.EIGHT_BYTES) elementWords = 1;\n else if (elementSize === ElementSize.COMPOSITE && structSize) {\n elementWords = structSize.dataWords + structSize.pointerCount;\n }\n\n const totalWords = elementWords * elementCount;\n const listOffset = segment.allocate(totalWords);\n\n // 写入指针\n const ptr = encodeListPointer(listOffset - ptrOffset - 1, elementSize, elementCount);\n segment.setWord(ptrOffset, ptr);\n\n return new ListBuilder<T>(this.message, elementSize, elementCount, structSize, listOffset);\n }\n}\n","/**\n * Cap'n Proto List 实现\n * 纯 TypeScript\n */\n\nimport { type MessageBuilder, StructBuilder } from './message-builder.js';\nimport { type MessageReader, StructReader } from './message-reader.js';\nimport { ElementSize, type ListPointer, PointerTag, decodePointer } from './pointer.js';\nimport { type Segment, WORD_SIZE } from './segment.js';\n\n/**\n * ListReader - 读取列表\n */\nexport class ListReader<T> {\n private segment: Segment;\n private startOffset: number; // 字偏移\n private segmentIndex: number;\n\n constructor(\n private message: MessageReader,\n segmentIndex: number,\n private elementSize: ElementSize,\n private elementCount: number,\n private structSize: { dataWords: number; pointerCount: number } | undefined,\n wordOffset: number\n ) {\n this.segmentIndex = segmentIndex;\n this.segment = message.getSegment(segmentIndex)!;\n this.startOffset = wordOffset;\n }\n\n /**\n * 列表长度\n */\n get length(): number {\n return this.elementCount;\n }\n\n /**\n * 获取元素(基础类型)\n */\n getPrimitive(index: number): number | bigint {\n if (index < 0 || index >= this.elementCount) {\n throw new RangeError('Index out of bounds');\n }\n\n switch (this.elementSize) {\n case ElementSize.BIT: {\n const byteOffset = Math.floor(index / 8);\n const bitInByte = index % 8;\n const byte = this.segment.dataView.getUint8(this.startOffset * WORD_SIZE + byteOffset);\n return (byte & (1 << bitInByte)) !== 0 ? 1 : 0;\n }\n\n case ElementSize.BYTE:\n return this.segment.dataView.getUint8(this.startOffset * WORD_SIZE + index);\n\n case ElementSize.TWO_BYTES:\n return this.segment.dataView.getUint16(this.startOffset * WORD_SIZE + index * 2, true);\n\n case ElementSize.FOUR_BYTES:\n return this.segment.dataView.getUint32(this.startOffset * WORD_SIZE + index * 4, true);\n\n case ElementSize.EIGHT_BYTES: {\n const offset = this.startOffset * WORD_SIZE + index * 8;\n const low = BigInt(this.segment.dataView.getUint32(offset, true));\n const high = BigInt(this.segment.dataView.getUint32(offset + 4, true));\n return (high << BigInt(32)) | low;\n }\n\n default:\n throw new Error(`Unsupported element size: ${this.elementSize}`);\n }\n }\n\n /**\n * 获取结构元素\n */\n getStruct(index: number): StructReader {\n if (!this.structSize) {\n throw new Error('Not a struct list');\n }\n\n const { dataWords, pointerCount } = this.structSize;\n const size = dataWords + pointerCount;\n const offset = this.startOffset + index * size;\n\n return new StructReader(this.message, this.segmentIndex, offset, dataWords, pointerCount);\n }\n\n /**\n * 迭代器\n */\n *[Symbol.iterator](): Iterator<T> {\n for (let i = 0; i < this.elementCount; i++) {\n yield this.getPrimitive(i) as T;\n }\n }\n}\n\n/**\n * ListBuilder - 构建列表\n */\nexport class ListBuilder<_T> {\n private segment: Segment;\n private startOffset: number;\n\n constructor(\n private message: MessageBuilder,\n private elementSize: ElementSize,\n private elementCount: number,\n private structSize: { dataWords: number; pointerCount: number } | undefined,\n wordOffset: number\n ) {\n this.segment = message.getSegment();\n this.startOffset = wordOffset;\n }\n\n /**\n * 列表长度\n */\n get length(): number {\n return this.elementCount;\n }\n\n /**\n * 设置基础类型元素\n */\n setPrimitive(index: number, value: number | bigint): void {\n if (index < 0 || index >= this.elementCount) {\n throw new RangeError('Index out of bounds');\n }\n\n switch (this.elementSize) {\n case ElementSize.BIT: {\n const byteOffset = Math.floor(index / 8);\n const bitInByte = index % 8;\n const offset = this.startOffset * WORD_SIZE + byteOffset;\n const current = this.segment.dataView.getUint8(offset);\n const newValue = value ? current | (1 << bitInByte) : current & ~(1 << bitInByte);\n this.segment.dataView.setUint8(offset, newValue);\n break;\n }\n\n case ElementSize.BYTE:\n this.segment.dataView.setUint8(this.startOffset * WORD_SIZE + index, Number(value));\n break;\n\n case ElementSize.TWO_BYTES:\n this.segment.dataView.setUint16(\n this.startOffset * WORD_SIZE + index * 2,\n Number(value),\n true\n );\n break;\n\n case ElementSize.FOUR_BYTES:\n this.segment.dataView.setUint32(\n this.startOffset * WORD_SIZE + index * 4,\n Number(value),\n true\n );\n break;\n\n case ElementSize.EIGHT_BYTES: {\n const offset = this.startOffset * WORD_SIZE + index * 8;\n const bigValue = value as bigint;\n this.segment.dataView.setUint32(offset, Number(bigValue & BigInt(0xffffffff)), true);\n this.segment.dataView.setUint32(offset + 4, Number(bigValue >> BigInt(32)), true);\n break;\n }\n\n default:\n throw new Error(`Unsupported element size: ${this.elementSize}`);\n }\n }\n\n /**\n * 获取结构元素(用于修改)\n */\n getStruct(index: number): StructBuilder {\n if (!this.structSize) {\n throw new Error('Not a struct list');\n }\n\n const { dataWords, pointerCount } = this.structSize;\n const size = dataWords + pointerCount;\n const offset = this.startOffset + index * size;\n\n return new StructBuilder(this.message, 0, offset, dataWords, pointerCount);\n }\n}\n","/**\n * Cap'n Proto MessageReader\n * 纯 TypeScript 实现\n */\n\nimport { ListReader } from './list.js';\nimport {\n ElementSize,\n type FarPointer,\n type ListPointer,\n PointerTag,\n type StructPointer,\n decodePointer,\n} from './pointer.js';\nimport { Segment, WORD_SIZE } from './segment.js';\n\n/**\n * 安全选项配置\n */\nexport interface SecurityOptions {\n /** 最大段数限制(默认64) */\n maxSegments?: number;\n /** 消息总大小限制,单位字节(默认64MB) */\n maxTotalSize?: number;\n /** 严格模式,遇到异常立即抛出而非静默处理(默认false) */\n strictMode?: boolean;\n}\n\n/** 默认安全选项 */\nconst DEFAULT_SECURITY_OPTIONS: Required<SecurityOptions> = {\n maxSegments: 64,\n maxTotalSize: 64 * 1024 * 1024, // 64MB\n strictMode: false,\n};\n\nexport class MessageReader {\n private segments: Segment[];\n private securityOptions: Required<SecurityOptions>;\n\n constructor(buffer: ArrayBuffer | Uint8Array, securityOptions?: SecurityOptions) {\n // 合并安全选项\n this.securityOptions = {\n ...DEFAULT_SECURITY_OPTIONS,\n ...securityOptions,\n };\n\n const uint8Array = buffer instanceof ArrayBuffer ? new Uint8Array(buffer) : buffer;\n\n // 初始化空段数组(用于无效消息)\n this.segments = [];\n\n // 检查消息总大小限制\n if (\n this.securityOptions.strictMode &&\n uint8Array.byteLength > this.securityOptions.maxTotalSize\n ) {\n throw new Error(\n `Message size (${uint8Array.byteLength} bytes) exceeds maximum allowed size (${this.securityOptions.maxTotalSize} bytes)`\n );\n }\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 // 检查段数限制\n if (segmentCount > this.securityOptions.maxSegments) {\n if (this.securityOptions.strictMode) {\n throw new Error(\n `Segment count (${segmentCount}) exceeds maximum allowed (${this.securityOptions.maxSegments})`\n );\n }\n // 非严格模式下:截断段数到最大限制\n return;\n }\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 if (this.securityOptions.strictMode) {\n throw new Error(\n `Message ended prematurely while reading segment ${i} size (offset: ${offset}, length: ${uint8Array.byteLength})`\n );\n }\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 if (this.securityOptions.strictMode) {\n throw new Error(\n `Insufficient data for segment table (offset: ${offset}, length: ${uint8Array.byteLength})`\n );\n }\n this.segments = [];\n return;\n }\n\n // 计算预期总大小并验证\n const headerSize = offset;\n let totalBodySize = 0;\n for (const size of segmentSizes) {\n totalBodySize += size * WORD_SIZE;\n }\n const expectedTotalSize = headerSize + totalBodySize;\n\n if (expectedTotalSize > this.securityOptions.maxTotalSize) {\n if (this.securityOptions.strictMode) {\n throw new Error(\n `Total message size (${expectedTotalSize} bytes) exceeds maximum allowed size (${this.securityOptions.maxTotalSize} bytes)`\n );\n }\n // 非严格模式下:截断处理\n return;\n }\n\n // 创建段\n this.segments = [];\n for (const size of segmentSizes) {\n if (offset + size * WORD_SIZE > uint8Array.byteLength) {\n // 段数据不足\n if (this.securityOptions.strictMode) {\n throw new Error(\n `Insufficient data for segment (expected ${size * WORD_SIZE} bytes at offset ${offset}, ` +\n `but message is ${uint8Array.byteLength} bytes)`\n );\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 getSecurityOptions(): SecurityOptions {\n return { ...this.securityOptions };\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"],"mappings":"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"}
@@ -15,4 +15,4 @@ let SchemaNodeType = /* @__PURE__ */ function(SchemaNodeType) {
15
15
 
16
16
  //#endregion
17
17
  export { SchemaNodeType as t };
18
- //# sourceMappingURL=schema-types-B6M2jsM7.js.map
18
+ //# sourceMappingURL=schema-types-GVRD1pwE.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema-types-B6M2jsM7.js","names":[],"sources":["../src/rpc/schema-types.ts"],"sourcesContent":["/**\n * Phase 7: Dynamic Schema Transfer Protocol - Type Definitions\n *\n * This module provides TypeScript types for the Dynamic Schema extension\n * to the Cap'n Proto RPC protocol.\n */\n\nimport type { Exception, MessageTarget, Payload } from './rpc-types';\n\n/**\n * Question ID for schema requests\n */\nexport type SchemaQuestionId = number;\n\n/**\n * Answer ID for schema responses\n */\nexport type SchemaAnswerId = number;\n\n/**\n * Schema request message - sent to fetch schema information from remote vat\n */\nexport interface SchemaRequest {\n /** Question ID identifying this request */\n questionId: SchemaQuestionId;\n\n /** Specifies which schema(s) to fetch */\n targetSchema: SchemaTarget;\n}\n\n/**\n * Schema target - specifies what schema information is being requested\n */\nexport type SchemaTarget =\n | { type: 'allSchemas' }\n | { type: 'byTypeId'; typeId: bigint }\n | { type: 'byTypeName'; typeName: string }\n | { type: 'byFileId'; fileId: bigint }\n | { type: 'byFileName'; fileName: string }\n | { type: 'bootstrapInterface' };\n\n/**\n * Schema response message - contains requested schema information or error\n */\nexport interface SchemaResponse {\n /** Answer ID corresponding to the SchemaRequest */\n answerId: SchemaAnswerId;\n\n /** Response result */\n result: SchemaResponseResult;\n}\n\n/**\n * Schema response result variants\n */\nexport type SchemaResponseResult =\n | { type: 'success'; payload: SchemaPayload }\n | { type: 'exception'; exception: Exception };\n\n/**\n * Schema payload containing serialized schema information\n */\nexport interface SchemaPayload {\n /** Serialized schema nodes in Cap'n Proto binary format */\n schemaData: Uint8Array;\n\n /** Format of the schema data */\n format: SchemaFormat;\n\n /** Optional source information (doc comments, source locations) */\n sourceInfo?: Uint8Array;\n\n /** List of imported schemas needed to understand the returned schema */\n dependencies: SchemaDependency[];\n}\n\n/**\n * Supported schema serialization formats\n */\nexport enum SchemaFormat {\n /** Standard Cap'n Proto binary format (schema.capnp structs) */\n BINARY = 0,\n\n /** JSON representation of the schema */\n JSON = 1,\n\n /** Cap'n Proto schema language text format */\n CAPNP = 2,\n}\n\n/**\n * Schema dependency information\n */\nexport interface SchemaDependency {\n /** ID of the imported file */\n fileId: bigint;\n\n /** Name/path of the imported file */\n fileName: string;\n\n /** Optional hash of schema content for caching/versioning */\n schemaHash?: Uint8Array;\n}\n\n/**\n * Available schema information (for schema listing)\n */\nexport interface AvailableSchema {\n /** Type ID */\n typeId: bigint;\n\n /** Display name */\n displayName: string;\n\n /** File ID */\n fileId: bigint;\n\n /** File name */\n fileName: string;\n\n /** Type flags */\n isInterface: boolean;\n isStruct: boolean;\n isEnum: boolean;\n}\n\n/**\n * Schema capability interface - for dedicated schema providers\n */\nexport interface SchemaCapability {\n /**\n * Fetch schema information\n */\n getSchema(params: GetSchemaParams): Promise<GetSchemaResults>;\n\n /**\n * List all available schemas\n */\n listAvailableSchemas(): Promise<ListSchemasResults>;\n}\n\n/**\n * Parameters for getSchema call\n */\nexport interface GetSchemaParams {\n /** Schema target specification */\n target: SchemaTarget;\n\n /** Desired format (defaults to binary) */\n format?: SchemaFormat;\n}\n\n/**\n * Results from getSchema call\n */\nexport interface GetSchemaResults {\n /** Schema payload */\n payload: SchemaPayload;\n}\n\n/**\n * Results from listAvailableSchemas call\n */\nexport interface ListSchemasResults {\n /** List of available schemas */\n schemas: AvailableSchema[];\n}\n\n/**\n * Schema node types (mirroring schema.capnp Node union)\n */\nexport enum SchemaNodeType {\n FILE = 0,\n STRUCT = 1,\n ENUM = 2,\n INTERFACE = 3,\n CONST = 4,\n ANNOTATION = 5,\n}\n\n/**\n * Type reference (mirroring schema.capnp Type)\n */\nexport interface SchemaType {\n kind: SchemaTypeKind;\n}\n\nexport type SchemaTypeKind =\n | { type: 'void' }\n | { type: 'bool' }\n | { type: 'int8' }\n | { type: 'int16' }\n | { type: 'int32' }\n | { type: 'int64' }\n | { type: 'uint8' }\n | { type: 'uint16' }\n | { type: 'uint32' }\n | { type: 'uint64' }\n | { type: 'float32' }\n | { type: 'float64' }\n | { type: 'text' }\n | { type: 'data' }\n | { type: 'list'; elementType: SchemaType }\n | { type: 'enum'; typeId: bigint; brand?: SchemaBrand }\n | { type: 'struct'; typeId: bigint; brand?: SchemaBrand }\n | { type: 'interface'; typeId: bigint; brand?: SchemaBrand }\n | { type: 'anyPointer'; constraint?: AnyPointerConstraint };\n\nexport type AnyPointerConstraint =\n | { type: 'unconstrained'; kind: 'anyKind' | 'struct' | 'list' | 'capability' }\n | { type: 'parameter'; scopeId: bigint; parameterIndex: number }\n | { type: 'implicitMethodParameter'; parameterIndex: number };\n\n/**\n * Brand for generic type parameters\n */\nexport interface SchemaBrand {\n scopes: SchemaBrandScope[];\n}\n\nexport interface SchemaBrandScope {\n scopeId: bigint;\n bindings: SchemaBrandBinding[];\n}\n\nexport type SchemaBrandBinding = { type: 'unbound' } | { type: 'type'; value: SchemaType };\n\n/**\n * Field definition (mirroring schema.capnp Field)\n */\nexport interface SchemaField {\n name: string;\n codeOrder: number;\n discriminantValue: number;\n offset: number;\n type: SchemaType;\n defaultValue?: SchemaValue;\n hadExplicitDefault: boolean;\n}\n\n/**\n * Value representation (mirroring schema.capnp Value)\n */\nexport type SchemaValue =\n | { type: 'void' }\n | { type: 'bool'; value: boolean }\n | { type: 'int8'; value: number }\n | { type: 'int16'; value: number }\n | { type: 'int32'; value: number }\n | { type: 'int64'; value: bigint }\n | { type: 'uint8'; value: number }\n | { type: 'uint16'; value: number }\n | { type: 'uint32'; value: number }\n | { type: 'uint64'; value: bigint }\n | { type: 'float32'; value: number }\n | { type: 'float64'; value: number }\n | { type: 'text'; value: string }\n | { type: 'data'; value: Uint8Array }\n | { type: 'list'; value: unknown }\n | { type: 'enum'; value: number }\n | { type: 'struct'; value: unknown }\n | { type: 'interface' }\n | { type: 'anyPointer'; value: unknown };\n\n/**\n * Method definition (mirroring schema.capnp Method)\n */\nexport interface SchemaMethod {\n name: string;\n codeOrder: number;\n paramStructType: bigint;\n resultStructType: bigint;\n annotations: SchemaAnnotation[];\n}\n\n/**\n * Annotation definition\n */\nexport interface SchemaAnnotation {\n id: bigint;\n value: SchemaValue;\n brand?: SchemaBrand;\n}\n\n/**\n * Parsed schema node\n */\nexport interface SchemaNode {\n id: bigint;\n displayName: string;\n displayNamePrefixLength: number;\n scopeId: bigint;\n nestedNodes: Array<{ name: string; id: bigint }>;\n annotations: SchemaAnnotation[];\n type: SchemaNodeType;\n\n // Type-specific fields\n structInfo?: {\n dataWordCount: number;\n pointerCount: number;\n preferredListEncoding: number;\n isGroup: boolean;\n discriminantCount: number;\n discriminantOffset: number;\n fields: SchemaField[];\n };\n\n enumInfo?: {\n enumerants: Array<{ name: string; codeOrder: number; annotations: SchemaAnnotation[] }>;\n };\n\n interfaceInfo?: {\n methods: SchemaMethod[];\n superclasses: Array<{ id: bigint; brand: SchemaBrand }>;\n };\n\n constInfo?: {\n type: SchemaType;\n value: SchemaValue;\n };\n\n annotationInfo?: {\n type: SchemaType;\n targetsFile: boolean;\n targetsConst: boolean;\n targetsEnum: boolean;\n targetsEnumerant: boolean;\n targetsStruct: boolean;\n targetsField: boolean;\n targetsUnion: boolean;\n targetsGroup: boolean;\n targetsInterface: boolean;\n targetsMethod: boolean;\n targetsParam: boolean;\n targetsAnnotation: boolean;\n };\n}\n\n/**\n * Schema registry interface for managing parsed schemas\n */\nexport interface SchemaRegistry {\n /**\n * Register a schema node\n */\n registerNode(node: SchemaNode): void;\n\n /**\n * Get a schema node by ID\n */\n getNode(id: bigint): SchemaNode | undefined;\n\n /**\n * Get a schema node by fully qualified name\n */\n getNodeByName(name: string): SchemaNode | undefined;\n\n /**\n * Get all nodes in a file\n */\n getNodesByFile(fileId: bigint): SchemaNode[];\n\n /**\n * Check if a node exists\n */\n hasNode(id: bigint): boolean;\n\n /**\n * Clear all registered schemas\n */\n clear(): void;\n}\n\n/**\n * Dynamic schema loader interface\n */\nexport interface DynamicSchemaLoader {\n /**\n * Load schema from remote vat\n */\n loadSchema(target: SchemaTarget): Promise<SchemaPayload>;\n\n /**\n * Parse binary schema data into SchemaNode objects\n */\n parseSchema(data: Uint8Array): SchemaNode[];\n\n /**\n * Get the schema registry\n */\n getRegistry(): SchemaRegistry;\n}\n"],"mappings":";;;;AA2KA,IAAY,iBAAL;AACL;AACA;AACA;AACA;AACA;AACA;;KACD"}
1
+ {"version":3,"file":"schema-types-GVRD1pwE.js","names":[],"sources":["../src/rpc/schema-types.ts"],"sourcesContent":["/**\n * Phase 7: Dynamic Schema Transfer Protocol - Type Definitions\n *\n * This module provides TypeScript types for the Dynamic Schema extension\n * to the Cap'n Proto RPC protocol.\n */\n\nimport type { Exception, MessageTarget, Payload } from './rpc-types';\n\n/**\n * Question ID for schema requests\n */\nexport type SchemaQuestionId = number;\n\n/**\n * Answer ID for schema responses\n */\nexport type SchemaAnswerId = number;\n\n/**\n * Schema request message - sent to fetch schema information from remote vat\n */\nexport interface SchemaRequest {\n /** Question ID identifying this request */\n questionId: SchemaQuestionId;\n\n /** Specifies which schema(s) to fetch */\n targetSchema: SchemaTarget;\n}\n\n/**\n * Schema target - specifies what schema information is being requested\n */\nexport type SchemaTarget =\n | { type: 'allSchemas' }\n | { type: 'byTypeId'; typeId: bigint }\n | { type: 'byTypeName'; typeName: string }\n | { type: 'byFileId'; fileId: bigint }\n | { type: 'byFileName'; fileName: string }\n | { type: 'bootstrapInterface' };\n\n/**\n * Schema response message - contains requested schema information or error\n */\nexport interface SchemaResponse {\n /** Answer ID corresponding to the SchemaRequest */\n answerId: SchemaAnswerId;\n\n /** Response result */\n result: SchemaResponseResult;\n}\n\n/**\n * Schema response result variants\n */\nexport type SchemaResponseResult =\n | { type: 'success'; payload: SchemaPayload }\n | { type: 'exception'; exception: Exception };\n\n/**\n * Schema payload containing serialized schema information\n */\nexport interface SchemaPayload {\n /** Serialized schema nodes in Cap'n Proto binary format */\n schemaData: Uint8Array;\n\n /** Format of the schema data */\n format: SchemaFormat;\n\n /** Optional source information (doc comments, source locations) */\n sourceInfo?: Uint8Array;\n\n /** List of imported schemas needed to understand the returned schema */\n dependencies: SchemaDependency[];\n}\n\n/**\n * Supported schema serialization formats\n */\nexport enum SchemaFormat {\n /** Standard Cap'n Proto binary format (schema.capnp structs) */\n BINARY = 0,\n\n /** JSON representation of the schema */\n JSON = 1,\n\n /** Cap'n Proto schema language text format */\n CAPNP = 2,\n}\n\n/**\n * Schema dependency information\n */\nexport interface SchemaDependency {\n /** ID of the imported file */\n fileId: bigint;\n\n /** Name/path of the imported file */\n fileName: string;\n\n /** Optional hash of schema content for caching/versioning */\n schemaHash?: Uint8Array;\n}\n\n/**\n * Available schema information (for schema listing)\n */\nexport interface AvailableSchema {\n /** Type ID */\n typeId: bigint;\n\n /** Display name */\n displayName: string;\n\n /** File ID */\n fileId: bigint;\n\n /** File name */\n fileName: string;\n\n /** Type flags */\n isInterface: boolean;\n isStruct: boolean;\n isEnum: boolean;\n}\n\n/**\n * Schema capability interface - for dedicated schema providers\n */\nexport interface SchemaCapability {\n /**\n * Fetch schema information\n */\n getSchema(params: GetSchemaParams): Promise<GetSchemaResults>;\n\n /**\n * List all available schemas\n */\n listAvailableSchemas(): Promise<ListSchemasResults>;\n}\n\n/**\n * Parameters for getSchema call\n */\nexport interface GetSchemaParams {\n /** Schema target specification */\n target: SchemaTarget;\n\n /** Desired format (defaults to binary) */\n format?: SchemaFormat;\n}\n\n/**\n * Results from getSchema call\n */\nexport interface GetSchemaResults {\n /** Schema payload */\n payload: SchemaPayload;\n}\n\n/**\n * Results from listAvailableSchemas call\n */\nexport interface ListSchemasResults {\n /** List of available schemas */\n schemas: AvailableSchema[];\n}\n\n/**\n * Schema node types (mirroring schema.capnp Node union)\n */\nexport enum SchemaNodeType {\n FILE = 0,\n STRUCT = 1,\n ENUM = 2,\n INTERFACE = 3,\n CONST = 4,\n ANNOTATION = 5,\n}\n\n/**\n * Type reference (mirroring schema.capnp Type)\n */\nexport interface SchemaType {\n kind: SchemaTypeKind;\n}\n\nexport type SchemaTypeKind =\n | { type: 'void' }\n | { type: 'bool' }\n | { type: 'int8' }\n | { type: 'int16' }\n | { type: 'int32' }\n | { type: 'int64' }\n | { type: 'uint8' }\n | { type: 'uint16' }\n | { type: 'uint32' }\n | { type: 'uint64' }\n | { type: 'float32' }\n | { type: 'float64' }\n | { type: 'text' }\n | { type: 'data' }\n | { type: 'list'; elementType: SchemaType }\n | { type: 'enum'; typeId: bigint; brand?: SchemaBrand }\n | { type: 'struct'; typeId: bigint; brand?: SchemaBrand }\n | { type: 'interface'; typeId: bigint; brand?: SchemaBrand }\n | { type: 'anyPointer'; constraint?: AnyPointerConstraint };\n\nexport type AnyPointerConstraint =\n | { type: 'unconstrained'; kind: 'anyKind' | 'struct' | 'list' | 'capability' }\n | { type: 'parameter'; scopeId: bigint; parameterIndex: number }\n | { type: 'implicitMethodParameter'; parameterIndex: number };\n\n/**\n * Brand for generic type parameters\n */\nexport interface SchemaBrand {\n scopes: SchemaBrandScope[];\n}\n\nexport interface SchemaBrandScope {\n scopeId: bigint;\n bindings: SchemaBrandBinding[];\n}\n\nexport type SchemaBrandBinding = { type: 'unbound' } | { type: 'type'; value: SchemaType };\n\n/**\n * Field definition (mirroring schema.capnp Field)\n */\nexport interface SchemaField {\n name: string;\n codeOrder: number;\n discriminantValue: number;\n offset: number;\n type: SchemaType;\n defaultValue?: SchemaValue;\n hadExplicitDefault: boolean;\n}\n\n/**\n * Value representation (mirroring schema.capnp Value)\n */\nexport type SchemaValue =\n | { type: 'void' }\n | { type: 'bool'; value: boolean }\n | { type: 'int8'; value: number }\n | { type: 'int16'; value: number }\n | { type: 'int32'; value: number }\n | { type: 'int64'; value: bigint }\n | { type: 'uint8'; value: number }\n | { type: 'uint16'; value: number }\n | { type: 'uint32'; value: number }\n | { type: 'uint64'; value: bigint }\n | { type: 'float32'; value: number }\n | { type: 'float64'; value: number }\n | { type: 'text'; value: string }\n | { type: 'data'; value: Uint8Array }\n | { type: 'list'; value: unknown }\n | { type: 'enum'; value: number }\n | { type: 'struct'; value: unknown }\n | { type: 'interface' }\n | { type: 'anyPointer'; value: unknown };\n\n/**\n * Method definition (mirroring schema.capnp Method)\n */\nexport interface SchemaMethod {\n name: string;\n codeOrder: number;\n paramStructType: bigint;\n resultStructType: bigint;\n annotations: SchemaAnnotation[];\n}\n\n/**\n * Annotation definition\n */\nexport interface SchemaAnnotation {\n id: bigint;\n value: SchemaValue;\n brand?: SchemaBrand;\n}\n\n/**\n * Parsed schema node\n */\nexport interface SchemaNode {\n id: bigint;\n displayName: string;\n displayNamePrefixLength: number;\n scopeId: bigint;\n nestedNodes: Array<{ name: string; id: bigint }>;\n annotations: SchemaAnnotation[];\n type: SchemaNodeType;\n\n // Type-specific fields\n structInfo?: {\n dataWordCount: number;\n pointerCount: number;\n preferredListEncoding: number;\n isGroup: boolean;\n discriminantCount: number;\n discriminantOffset: number;\n fields: SchemaField[];\n };\n\n enumInfo?: {\n enumerants: Array<{ name: string; codeOrder: number; annotations: SchemaAnnotation[] }>;\n };\n\n interfaceInfo?: {\n methods: SchemaMethod[];\n superclasses: Array<{ id: bigint; brand: SchemaBrand }>;\n };\n\n constInfo?: {\n type: SchemaType;\n value: SchemaValue;\n };\n\n annotationInfo?: {\n type: SchemaType;\n targetsFile: boolean;\n targetsConst: boolean;\n targetsEnum: boolean;\n targetsEnumerant: boolean;\n targetsStruct: boolean;\n targetsField: boolean;\n targetsUnion: boolean;\n targetsGroup: boolean;\n targetsInterface: boolean;\n targetsMethod: boolean;\n targetsParam: boolean;\n targetsAnnotation: boolean;\n };\n}\n\n/**\n * Schema registry interface for managing parsed schemas\n */\nexport interface SchemaRegistry {\n /**\n * Register a schema node\n */\n registerNode(node: SchemaNode): void;\n\n /**\n * Get a schema node by ID\n */\n getNode(id: bigint): SchemaNode | undefined;\n\n /**\n * Get a schema node by fully qualified name\n */\n getNodeByName(name: string): SchemaNode | undefined;\n\n /**\n * Get all nodes in a file\n */\n getNodesByFile(fileId: bigint): SchemaNode[];\n\n /**\n * Check if a node exists\n */\n hasNode(id: bigint): boolean;\n\n /**\n * Clear all registered schemas\n */\n clear(): void;\n}\n\n/**\n * Dynamic schema loader interface\n */\nexport interface DynamicSchemaLoader {\n /**\n * Load schema from remote vat\n */\n loadSchema(target: SchemaTarget): Promise<SchemaPayload>;\n\n /**\n * Parse binary schema data into SchemaNode objects\n */\n parseSchema(data: Uint8Array): SchemaNode[];\n\n /**\n * Get the schema registry\n */\n getRegistry(): SchemaRegistry;\n}\n"],"mappings":";;;;AA2KA,IAAY,iBAAL;AACL;AACA;AACA;AACA;AACA;AACA;;KACD"}
@@ -0,0 +1,176 @@
1
+ #!/usr/bin/env node
2
+ //#region src/core/pointer.ts
3
+ /**
4
+ * Cap'n Proto 指针编解码
5
+ * 纯 TypeScript 实现
6
+ */
7
+ let PointerTag = /* @__PURE__ */ function(PointerTag) {
8
+ PointerTag[PointerTag["STRUCT"] = 0] = "STRUCT";
9
+ PointerTag[PointerTag["LIST"] = 1] = "LIST";
10
+ PointerTag[PointerTag["FAR"] = 2] = "FAR";
11
+ PointerTag[PointerTag["OTHER"] = 3] = "OTHER";
12
+ return PointerTag;
13
+ }({});
14
+ let ElementSize = /* @__PURE__ */ function(ElementSize) {
15
+ ElementSize[ElementSize["VOID"] = 0] = "VOID";
16
+ ElementSize[ElementSize["BIT"] = 1] = "BIT";
17
+ ElementSize[ElementSize["BYTE"] = 2] = "BYTE";
18
+ ElementSize[ElementSize["TWO_BYTES"] = 3] = "TWO_BYTES";
19
+ ElementSize[ElementSize["FOUR_BYTES"] = 4] = "FOUR_BYTES";
20
+ ElementSize[ElementSize["EIGHT_BYTES"] = 5] = "EIGHT_BYTES";
21
+ ElementSize[ElementSize["POINTER"] = 6] = "POINTER";
22
+ ElementSize[ElementSize["COMPOSITE"] = 7] = "COMPOSITE";
23
+ ElementSize[ElementSize["INLINE_COMPOSITE"] = 7] = "INLINE_COMPOSITE";
24
+ return ElementSize;
25
+ }({});
26
+ /**
27
+ * 解码指针(64位)
28
+ */
29
+ function decodePointer(ptr) {
30
+ const tag = Number(ptr & BigInt(3));
31
+ switch (tag) {
32
+ case PointerTag.STRUCT: {
33
+ const offset = Number(ptr >> BigInt(2)) & 1073741823;
34
+ return {
35
+ tag,
36
+ offset: offset >= 536870912 ? offset - 1073741824 : offset,
37
+ dataWords: Number(ptr >> BigInt(32) & BigInt(65535)),
38
+ pointerCount: Number(ptr >> BigInt(48) & BigInt(65535))
39
+ };
40
+ }
41
+ case PointerTag.LIST: {
42
+ const offset = Number(ptr >> BigInt(2)) & 1073741823;
43
+ return {
44
+ tag,
45
+ offset: offset >= 536870912 ? offset - 1073741824 : offset,
46
+ elementSize: Number(ptr >> BigInt(32) & BigInt(7)),
47
+ elementCount: Number(ptr >> BigInt(35) & BigInt(536870911))
48
+ };
49
+ }
50
+ case PointerTag.FAR: {
51
+ const doubleFar = Boolean(ptr >> BigInt(2) & BigInt(1));
52
+ const targetOffset = Number(ptr >> BigInt(3) & BigInt(536870911));
53
+ return {
54
+ tag,
55
+ doubleFar,
56
+ targetSegment: Number(ptr >> BigInt(32) & BigInt(4294967295)),
57
+ targetOffset
58
+ };
59
+ }
60
+ default: return { tag: PointerTag.OTHER };
61
+ }
62
+ }
63
+ /**
64
+ * 编码 Struct 指针
65
+ */
66
+ function encodeStructPointer(offset, dataWords, pointerCount) {
67
+ return (BigInt(offset < 0 ? offset + 1073741824 : offset) & BigInt(1073741823)) << BigInt(2) | BigInt(dataWords) << BigInt(32) | BigInt(pointerCount) << BigInt(48);
68
+ }
69
+ /**
70
+ * 编码 List 指针
71
+ */
72
+ function encodeListPointer(offset, elementSize, elementCount) {
73
+ return (BigInt(offset < 0 ? offset + 1073741824 : offset) & BigInt(1073741823)) << BigInt(2) | BigInt(1) | BigInt(elementSize) << BigInt(32) | BigInt(elementCount) << BigInt(35);
74
+ }
75
+
76
+ //#endregion
77
+ //#region src/core/segment.ts
78
+ /**
79
+ * Cap'n Proto Segment 管理
80
+ * 纯 TypeScript 实现
81
+ */
82
+ const WORD_SIZE = 8;
83
+ var Segment = class Segment {
84
+ buffer;
85
+ view;
86
+ _size;
87
+ constructor(initialCapacity = 1024) {
88
+ this.buffer = new ArrayBuffer(initialCapacity);
89
+ this.view = new DataView(this.buffer);
90
+ this._size = 0;
91
+ }
92
+ /**
93
+ * 从现有 buffer 创建(用于读取)
94
+ */
95
+ static fromBuffer(buffer) {
96
+ const seg = new Segment(0);
97
+ seg.buffer = buffer;
98
+ seg.view = new DataView(buffer);
99
+ seg._size = buffer.byteLength;
100
+ return seg;
101
+ }
102
+ /**
103
+ * 确保容量足够
104
+ */
105
+ ensureCapacity(minBytes) {
106
+ if (this.buffer.byteLength >= minBytes) return;
107
+ let newCapacity = this.buffer.byteLength * 2;
108
+ while (newCapacity < minBytes) newCapacity *= 2;
109
+ const newBuffer = new ArrayBuffer(newCapacity);
110
+ new Uint8Array(newBuffer).set(new Uint8Array(this.buffer, 0, this._size));
111
+ this.buffer = newBuffer;
112
+ this.view = new DataView(newBuffer);
113
+ }
114
+ /**
115
+ * 分配空间,返回字偏移
116
+ */
117
+ allocate(words) {
118
+ const bytes = words * WORD_SIZE;
119
+ const offset = this._size;
120
+ this.ensureCapacity(offset + bytes);
121
+ this._size = offset + bytes;
122
+ return offset / WORD_SIZE;
123
+ }
124
+ /**
125
+ * 获取字(64位)
126
+ */
127
+ getWord(wordOffset) {
128
+ const byteOffset = wordOffset * WORD_SIZE;
129
+ if (byteOffset + 8 > this._size) throw new Error(`Offset ${wordOffset} is outside the bounds of the segment (${this.wordCount} words)`);
130
+ const low = BigInt(this.view.getUint32(byteOffset, true));
131
+ return BigInt(this.view.getUint32(byteOffset + 4, true)) << BigInt(32) | low;
132
+ }
133
+ /**
134
+ * 设置字(64位)
135
+ */
136
+ setWord(wordOffset, value) {
137
+ const byteOffset = wordOffset * WORD_SIZE;
138
+ if (byteOffset + 8 > this.buffer.byteLength) throw new Error(`Offset ${wordOffset} is outside the bounds of the segment`);
139
+ this.view.setUint32(byteOffset, Number(value & BigInt(4294967295)), true);
140
+ this.view.setUint32(byteOffset + 4, Number(value >> BigInt(32)), true);
141
+ }
142
+ /**
143
+ * 获取原始 buffer(只读到 _size)
144
+ */
145
+ asUint8Array() {
146
+ return new Uint8Array(this.buffer, 0, this._size);
147
+ }
148
+ /**
149
+ * 获取底层 ArrayBuffer
150
+ */
151
+ getArrayBuffer() {
152
+ return this.buffer;
153
+ }
154
+ /**
155
+ * 获取字数量
156
+ */
157
+ get wordCount() {
158
+ return this._size / WORD_SIZE;
159
+ }
160
+ /**
161
+ * 获取字节数量
162
+ */
163
+ get byteLength() {
164
+ return this._size;
165
+ }
166
+ /**
167
+ * 获取 DataView
168
+ */
169
+ get dataView() {
170
+ return this.view;
171
+ }
172
+ };
173
+
174
+ //#endregion
175
+ export { decodePointer as a, PointerTag as i, WORD_SIZE as n, encodeListPointer as o, ElementSize as r, encodeStructPointer as s, Segment as t };
176
+ //# sourceMappingURL=segment-yid_PYS5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"segment-yid_PYS5.js","names":[],"sources":["../src/core/pointer.ts","../src/core/segment.ts"],"sourcesContent":["/**\n * Cap'n Proto 指针编解码\n * 纯 TypeScript 实现\n */\n\nexport enum PointerTag {\n STRUCT = 0,\n LIST = 1,\n FAR = 2,\n OTHER = 3,\n}\n\nexport enum ElementSize {\n VOID = 0,\n BIT = 1,\n BYTE = 2,\n TWO_BYTES = 3,\n FOUR_BYTES = 4,\n EIGHT_BYTES = 5,\n POINTER = 6,\n COMPOSITE = 7,\n INLINE_COMPOSITE = 7, // Alias for COMPOSITE\n}\n\nexport interface StructPointer {\n tag: PointerTag.STRUCT;\n offset: number; // 字偏移(有符号)\n dataWords: number; // 数据段字数\n pointerCount: number; // 指针段字数\n}\n\nexport interface ListPointer {\n tag: PointerTag.LIST;\n offset: number;\n elementSize: ElementSize;\n elementCount: number;\n}\n\nexport interface FarPointer {\n tag: PointerTag.FAR;\n doubleFar: boolean;\n targetSegment: number;\n targetOffset: number;\n}\n\nexport type Pointer = StructPointer | ListPointer | FarPointer | { tag: PointerTag.OTHER };\n\n/**\n * 解码指针(64位)\n */\nexport function decodePointer(ptr: bigint): Pointer {\n const tag = Number(ptr & BigInt(3)) as PointerTag;\n\n switch (tag) {\n case PointerTag.STRUCT: {\n const offset = Number(ptr >> BigInt(2)) & 0x3fffffff;\n const signedOffset = offset >= 0x20000000 ? offset - 0x40000000 : offset;\n const dataWords = Number((ptr >> BigInt(32)) & BigInt(0xffff));\n const pointerCount = Number((ptr >> BigInt(48)) & BigInt(0xffff));\n return { tag, offset: signedOffset, dataWords, pointerCount };\n }\n\n case PointerTag.LIST: {\n const offset = Number(ptr >> BigInt(2)) & 0x3fffffff;\n const signedOffset = offset >= 0x20000000 ? offset - 0x40000000 : offset;\n const elementSize = Number((ptr >> BigInt(32)) & BigInt(7)) as ElementSize;\n const elementCount = Number((ptr >> BigInt(35)) & BigInt(0x1fffffff));\n return { tag, offset: signedOffset, elementSize, elementCount };\n }\n\n case PointerTag.FAR: {\n const doubleFar = Boolean((ptr >> BigInt(2)) & BigInt(1));\n const targetOffset = Number((ptr >> BigInt(3)) & BigInt(0x1fffffff));\n const targetSegment = Number((ptr >> BigInt(32)) & BigInt(0xffffffff));\n return { tag, doubleFar, targetSegment, targetOffset };\n }\n\n default:\n return { tag: PointerTag.OTHER };\n }\n}\n\n/**\n * 编码 Struct 指针\n */\nexport function encodeStructPointer(\n offset: number,\n dataWords: number,\n pointerCount: number\n): bigint {\n const offsetBits = BigInt(offset < 0 ? offset + 0x40000000 : offset) & BigInt(0x3fffffff);\n return (\n (offsetBits << BigInt(2)) |\n (BigInt(dataWords) << BigInt(32)) |\n (BigInt(pointerCount) << BigInt(48))\n );\n}\n\n/**\n * 编码 List 指针\n */\nexport function encodeListPointer(\n offset: number,\n elementSize: ElementSize,\n elementCount: number\n): bigint {\n const offsetBits = BigInt(offset < 0 ? offset + 0x40000000 : offset) & BigInt(0x3fffffff);\n return (\n (offsetBits << BigInt(2)) |\n BigInt(1) | // LIST tag\n (BigInt(elementSize) << BigInt(32)) |\n (BigInt(elementCount) << BigInt(35))\n );\n}\n\n/**\n * 编码 Far 指针\n */\nexport function encodeFarPointer(segment: number, offset: number, doubleFar = false): bigint {\n const offsetBits = BigInt(offset) & BigInt(0x1fffffff);\n const segmentBits = BigInt(segment) & BigInt(0xffffffff);\n\n return (\n (segmentBits << BigInt(32)) |\n (offsetBits << BigInt(3)) |\n (doubleFar ? BigInt(1) << BigInt(2) : BigInt(0)) |\n BigInt(2)\n ); // FAR tag\n}\n","/**\n * Cap'n Proto Segment 管理\n * 纯 TypeScript 实现\n */\n\nexport const WORD_SIZE = 8;\n\nexport class Segment {\n private buffer: ArrayBuffer;\n private view: DataView;\n private _size: number; // 当前已使用字节数\n\n constructor(initialCapacity = 1024) {\n this.buffer = new ArrayBuffer(initialCapacity);\n this.view = new DataView(this.buffer);\n this._size = 0;\n }\n\n /**\n * 从现有 buffer 创建(用于读取)\n */\n static fromBuffer(buffer: ArrayBuffer): Segment {\n const seg = new Segment(0);\n seg.buffer = buffer;\n seg.view = new DataView(buffer);\n seg._size = buffer.byteLength;\n return seg;\n }\n\n /**\n * 确保容量足够\n */\n private ensureCapacity(minBytes: number): void {\n if (this.buffer.byteLength >= minBytes) return;\n\n // 双倍扩展\n let newCapacity = this.buffer.byteLength * 2;\n while (newCapacity < minBytes) {\n newCapacity *= 2;\n }\n\n const newBuffer = new ArrayBuffer(newCapacity);\n new Uint8Array(newBuffer).set(new Uint8Array(this.buffer, 0, this._size));\n this.buffer = newBuffer;\n this.view = new DataView(newBuffer);\n }\n\n /**\n * 分配空间,返回字偏移\n */\n allocate(words: number): number {\n const bytes = words * WORD_SIZE;\n const offset = this._size;\n this.ensureCapacity(offset + bytes);\n this._size = offset + bytes;\n return offset / WORD_SIZE;\n }\n\n /**\n * 获取字(64位)\n */\n getWord(wordOffset: number): bigint {\n const byteOffset = wordOffset * WORD_SIZE;\n 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"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@naeemo/capnp",
3
- "version": "0.9.0",
3
+ "version": "0.9.3",
4
4
  "description": "Pure TypeScript Cap'n Proto implementation with RPC support",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -50,6 +50,10 @@
50
50
  "@biomejs/biome": "^1.9.4",
51
51
  "@types/node": "^22.19.13",
52
52
  "@types/ws": "^8.5.14",
53
+ "@vitest/coverage-v8": "3.2.4",
54
+ "glob": "^10.5.0",
55
+ "lz4js": "^0.2.0",
56
+ "protobufjs": "^7.4.0",
53
57
  "rolldown": "1.0.0-rc.6",
54
58
  "tsx": "^4.21.0",
55
59
  "typescript": "^5.9.3",