@naeemo/capnp 0.8.1 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,712 @@
1
+ #!/usr/bin/env node
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";
3
+
4
+ //#region src/core/message-builder.ts
5
+ /**
6
+ * Cap'n Proto MessageBuilder
7
+ * 纯 TypeScript 实现
8
+ */
9
+ var MessageBuilder = class {
10
+ segment;
11
+ rootSet = false;
12
+ constructor() {
13
+ this.segment = new Segment(1024);
14
+ this.segment.allocate(1);
15
+ }
16
+ /**
17
+ * 初始化根结构
18
+ */
19
+ initRoot(dataWords, pointerCount) {
20
+ if (this.rootSet) throw new Error("Root already initialized");
21
+ const size = dataWords + pointerCount;
22
+ const structOffset = this.segment.allocate(size);
23
+ const rootPtr = encodeStructPointer(structOffset - 1, dataWords, pointerCount);
24
+ this.segment.setWord(0, rootPtr);
25
+ this.rootSet = true;
26
+ return new StructBuilder(this, 0, structOffset, dataWords, pointerCount);
27
+ }
28
+ /**
29
+ * 序列化为 ArrayBuffer
30
+ */
31
+ toArrayBuffer() {
32
+ const segmentData = this.segment.asUint8Array();
33
+ const wordCount = this.segment.wordCount;
34
+ const header = /* @__PURE__ */ new ArrayBuffer(8);
35
+ const headerView = new DataView(header);
36
+ headerView.setUint32(0, 0, true);
37
+ headerView.setUint32(4, wordCount, true);
38
+ const result = new Uint8Array(8 + segmentData.byteLength);
39
+ result.set(new Uint8Array(header), 0);
40
+ result.set(segmentData, 8);
41
+ return result.buffer;
42
+ }
43
+ /**
44
+ * 获取段(内部使用)
45
+ */
46
+ getSegment() {
47
+ return this.segment;
48
+ }
49
+ };
50
+ /**
51
+ * 结构构建器
52
+ */
53
+ var StructBuilder = class StructBuilder {
54
+ constructor(message, segmentIndex, wordOffset, dataWords, pointerCount) {
55
+ this.message = message;
56
+ this.segmentIndex = segmentIndex;
57
+ this.wordOffset = wordOffset;
58
+ this.dataWords = dataWords;
59
+ this.pointerCount = pointerCount;
60
+ }
61
+ /**
62
+ * 设置 bool 字段
63
+ */
64
+ setBool(bitOffset, value) {
65
+ const byteOffset = Math.floor(bitOffset / 8);
66
+ const bitInByte = bitOffset % 8;
67
+ const view = this.message.getSegment().dataView;
68
+ const offset = this.wordOffset * WORD_SIZE + byteOffset;
69
+ const current = view.getUint8(offset);
70
+ const newValue = value ? current | 1 << bitInByte : current & ~(1 << bitInByte);
71
+ view.setUint8(offset, newValue);
72
+ }
73
+ /**
74
+ * 设置 int8 字段
75
+ */
76
+ setInt8(byteOffset, value) {
77
+ this.message.getSegment().dataView.setInt8(this.wordOffset * WORD_SIZE + byteOffset, value);
78
+ }
79
+ /**
80
+ * 设置 int16 字段
81
+ */
82
+ setInt16(byteOffset, value) {
83
+ this.message.getSegment().dataView.setInt16(this.wordOffset * WORD_SIZE + byteOffset, value, true);
84
+ }
85
+ /**
86
+ * 设置 int32 字段
87
+ */
88
+ setInt32(byteOffset, value) {
89
+ this.message.getSegment().dataView.setInt32(this.wordOffset * WORD_SIZE + byteOffset, value, true);
90
+ }
91
+ /**
92
+ * 设置 int64 字段
93
+ */
94
+ setInt64(byteOffset, value) {
95
+ const segment = this.message.getSegment();
96
+ const offset = this.wordOffset * WORD_SIZE + byteOffset;
97
+ segment.dataView.setUint32(offset, Number(value & BigInt(4294967295)), true);
98
+ segment.dataView.setInt32(offset + 4, Number(value >> BigInt(32)), true);
99
+ }
100
+ /**
101
+ * 设置 uint8 字段
102
+ */
103
+ setUint8(byteOffset, value) {
104
+ this.message.getSegment().dataView.setUint8(this.wordOffset * WORD_SIZE + byteOffset, value);
105
+ }
106
+ /**
107
+ * 设置 uint16 字段
108
+ */
109
+ setUint16(byteOffset, value) {
110
+ this.message.getSegment().dataView.setUint16(this.wordOffset * WORD_SIZE + byteOffset, value, true);
111
+ }
112
+ /**
113
+ * 设置 uint32 字段
114
+ */
115
+ setUint32(byteOffset, value) {
116
+ this.message.getSegment().dataView.setUint32(this.wordOffset * WORD_SIZE + byteOffset, value, true);
117
+ }
118
+ /**
119
+ * 设置 uint64 字段
120
+ */
121
+ setUint64(byteOffset, value) {
122
+ const segment = this.message.getSegment();
123
+ const offset = this.wordOffset * WORD_SIZE + byteOffset;
124
+ segment.dataView.setUint32(offset, Number(value & BigInt(4294967295)), true);
125
+ segment.dataView.setUint32(offset + 4, Number(value >> BigInt(32)), true);
126
+ }
127
+ /**
128
+ * 设置 float32 字段
129
+ */
130
+ setFloat32(byteOffset, value) {
131
+ this.message.getSegment().dataView.setFloat32(this.wordOffset * WORD_SIZE + byteOffset, value, true);
132
+ }
133
+ /**
134
+ * 设置 float64 字段
135
+ */
136
+ setFloat64(byteOffset, value) {
137
+ this.message.getSegment().dataView.setFloat64(this.wordOffset * WORD_SIZE + byteOffset, value, true);
138
+ }
139
+ /**
140
+ * 获取 uint16 字段(用于 UnionBuilder 读取 tag)
141
+ */
142
+ getUint16(byteOffset) {
143
+ return this.message.getSegment().dataView.getUint16(this.wordOffset * WORD_SIZE + byteOffset, true);
144
+ }
145
+ /**
146
+ * 设置文本字段
147
+ */
148
+ setText(pointerIndex, value) {
149
+ const ptrOffset = this.wordOffset + this.dataWords + pointerIndex;
150
+ const segment = this.message.getSegment();
151
+ const bytes = new TextEncoder().encode(`${value}\0`);
152
+ const wordCount = Math.ceil(bytes.length / WORD_SIZE);
153
+ const listOffset = segment.allocate(wordCount);
154
+ new Uint8Array(segment.dataView.buffer, listOffset * WORD_SIZE, bytes.length).set(bytes);
155
+ const ptr = encodeListPointer(listOffset - ptrOffset - 1, ElementSize.BYTE, bytes.length);
156
+ segment.setWord(ptrOffset, ptr);
157
+ }
158
+ /**
159
+ * 设置数据字段(Uint8Array)
160
+ * @param pointerIndex - 指针索引
161
+ * @param value - Uint8Array 数据
162
+ */
163
+ setData(pointerIndex, value) {
164
+ const ptrOffset = this.wordOffset + this.dataWords + pointerIndex;
165
+ const segment = this.message.getSegment();
166
+ if (value.length === 0) {
167
+ const ptr = encodeListPointer(0, ElementSize.BYTE, 0);
168
+ segment.setWord(ptrOffset, ptr);
169
+ return;
170
+ }
171
+ const wordCount = Math.ceil(value.length / WORD_SIZE);
172
+ const listOffset = segment.allocate(wordCount);
173
+ new Uint8Array(segment.dataView.buffer, listOffset * WORD_SIZE, value.length).set(value);
174
+ const ptr = encodeListPointer(listOffset - ptrOffset - 1, ElementSize.BYTE, value.length);
175
+ segment.setWord(ptrOffset, ptr);
176
+ }
177
+ /**
178
+ * 初始化嵌套结构
179
+ */
180
+ initStruct(pointerIndex, dataWords, pointerCount) {
181
+ const ptrOffset = this.wordOffset + this.dataWords + pointerIndex;
182
+ const segment = this.message.getSegment();
183
+ const size = dataWords + pointerCount;
184
+ const structOffset = segment.allocate(size);
185
+ const ptr = encodeStructPointer(structOffset - ptrOffset - 1, dataWords, pointerCount);
186
+ segment.setWord(ptrOffset, ptr);
187
+ return new StructBuilder(this.message, 0, structOffset, dataWords, pointerCount);
188
+ }
189
+ /**
190
+ * 初始化列表
191
+ */
192
+ initList(pointerIndex, elementSize, elementCount, structSize) {
193
+ const ptrOffset = this.wordOffset + this.dataWords + pointerIndex;
194
+ const segment = this.message.getSegment();
195
+ let elementWords = 1;
196
+ if (elementSize === ElementSize.BYTE) elementWords = 1;
197
+ else if (elementSize === ElementSize.TWO_BYTES) elementWords = 1;
198
+ else if (elementSize === ElementSize.FOUR_BYTES) elementWords = 1;
199
+ else if (elementSize === ElementSize.EIGHT_BYTES) elementWords = 1;
200
+ else if (elementSize === ElementSize.COMPOSITE && structSize) elementWords = structSize.dataWords + structSize.pointerCount;
201
+ const totalWords = elementWords * elementCount;
202
+ const listOffset = segment.allocate(totalWords);
203
+ const ptr = encodeListPointer(listOffset - ptrOffset - 1, elementSize, elementCount);
204
+ segment.setWord(ptrOffset, ptr);
205
+ return new ListBuilder(this.message, elementSize, elementCount, structSize, listOffset);
206
+ }
207
+ };
208
+
209
+ //#endregion
210
+ //#region src/core/list.ts
211
+ /**
212
+ * Cap'n Proto List 实现
213
+ * 纯 TypeScript
214
+ */
215
+ /**
216
+ * ListReader - 读取列表
217
+ */
218
+ var ListReader = class {
219
+ segment;
220
+ startOffset;
221
+ segmentIndex;
222
+ constructor(message, segmentIndex, elementSize, elementCount, structSize, wordOffset) {
223
+ this.message = message;
224
+ this.elementSize = elementSize;
225
+ this.elementCount = elementCount;
226
+ this.structSize = structSize;
227
+ this.segmentIndex = segmentIndex;
228
+ this.segment = message.getSegment(segmentIndex);
229
+ this.startOffset = wordOffset;
230
+ }
231
+ /**
232
+ * 列表长度
233
+ */
234
+ get length() {
235
+ return this.elementCount;
236
+ }
237
+ /**
238
+ * 获取元素(基础类型)
239
+ */
240
+ getPrimitive(index) {
241
+ if (index < 0 || index >= this.elementCount) throw new RangeError("Index out of bounds");
242
+ switch (this.elementSize) {
243
+ case ElementSize.BIT: {
244
+ const byteOffset = Math.floor(index / 8);
245
+ const bitInByte = index % 8;
246
+ return (this.segment.dataView.getUint8(this.startOffset * WORD_SIZE + byteOffset) & 1 << bitInByte) !== 0 ? 1 : 0;
247
+ }
248
+ case ElementSize.BYTE: return this.segment.dataView.getUint8(this.startOffset * WORD_SIZE + index);
249
+ case ElementSize.TWO_BYTES: return this.segment.dataView.getUint16(this.startOffset * WORD_SIZE + index * 2, true);
250
+ case ElementSize.FOUR_BYTES: return this.segment.dataView.getUint32(this.startOffset * WORD_SIZE + index * 4, true);
251
+ case ElementSize.EIGHT_BYTES: {
252
+ const offset = this.startOffset * WORD_SIZE + index * 8;
253
+ const low = BigInt(this.segment.dataView.getUint32(offset, true));
254
+ return BigInt(this.segment.dataView.getUint32(offset + 4, true)) << BigInt(32) | low;
255
+ }
256
+ default: throw new Error(`Unsupported element size: ${this.elementSize}`);
257
+ }
258
+ }
259
+ /**
260
+ * 获取结构元素
261
+ */
262
+ getStruct(index) {
263
+ if (!this.structSize) throw new Error("Not a struct list");
264
+ const { dataWords, pointerCount } = this.structSize;
265
+ const size = dataWords + pointerCount;
266
+ const offset = this.startOffset + index * size;
267
+ return new StructReader(this.message, this.segmentIndex, offset, dataWords, pointerCount);
268
+ }
269
+ /**
270
+ * 迭代器
271
+ */
272
+ *[Symbol.iterator]() {
273
+ for (let i = 0; i < this.elementCount; i++) yield this.getPrimitive(i);
274
+ }
275
+ };
276
+ /**
277
+ * ListBuilder - 构建列表
278
+ */
279
+ var ListBuilder = class {
280
+ segment;
281
+ startOffset;
282
+ constructor(message, elementSize, elementCount, structSize, wordOffset) {
283
+ this.message = message;
284
+ this.elementSize = elementSize;
285
+ this.elementCount = elementCount;
286
+ this.structSize = structSize;
287
+ this.segment = message.getSegment();
288
+ this.startOffset = wordOffset;
289
+ }
290
+ /**
291
+ * 列表长度
292
+ */
293
+ get length() {
294
+ return this.elementCount;
295
+ }
296
+ /**
297
+ * 设置基础类型元素
298
+ */
299
+ setPrimitive(index, value) {
300
+ if (index < 0 || index >= this.elementCount) throw new RangeError("Index out of bounds");
301
+ switch (this.elementSize) {
302
+ case ElementSize.BIT: {
303
+ const byteOffset = Math.floor(index / 8);
304
+ const bitInByte = index % 8;
305
+ const offset = this.startOffset * WORD_SIZE + byteOffset;
306
+ const current = this.segment.dataView.getUint8(offset);
307
+ const newValue = value ? current | 1 << bitInByte : current & ~(1 << bitInByte);
308
+ this.segment.dataView.setUint8(offset, newValue);
309
+ break;
310
+ }
311
+ case ElementSize.BYTE:
312
+ this.segment.dataView.setUint8(this.startOffset * WORD_SIZE + index, Number(value));
313
+ break;
314
+ case ElementSize.TWO_BYTES:
315
+ this.segment.dataView.setUint16(this.startOffset * WORD_SIZE + index * 2, Number(value), true);
316
+ break;
317
+ case ElementSize.FOUR_BYTES:
318
+ this.segment.dataView.setUint32(this.startOffset * WORD_SIZE + index * 4, Number(value), true);
319
+ break;
320
+ case ElementSize.EIGHT_BYTES: {
321
+ const offset = this.startOffset * WORD_SIZE + index * 8;
322
+ const bigValue = value;
323
+ this.segment.dataView.setUint32(offset, Number(bigValue & BigInt(4294967295)), true);
324
+ this.segment.dataView.setUint32(offset + 4, Number(bigValue >> BigInt(32)), true);
325
+ break;
326
+ }
327
+ default: throw new Error(`Unsupported element size: ${this.elementSize}`);
328
+ }
329
+ }
330
+ /**
331
+ * 获取结构元素(用于修改)
332
+ */
333
+ getStruct(index) {
334
+ if (!this.structSize) throw new Error("Not a struct list");
335
+ const { dataWords, pointerCount } = this.structSize;
336
+ const size = dataWords + pointerCount;
337
+ const offset = this.startOffset + index * size;
338
+ return new StructBuilder(this.message, 0, offset, dataWords, pointerCount);
339
+ }
340
+ };
341
+
342
+ //#endregion
343
+ //#region src/core/message-reader.ts
344
+ /**
345
+ * Cap'n Proto MessageReader
346
+ * 纯 TypeScript 实现
347
+ */
348
+ /** 默认安全选项 */
349
+ const DEFAULT_SECURITY_OPTIONS = {
350
+ maxSegments: 64,
351
+ maxTotalSize: 64 * 1024 * 1024,
352
+ strictMode: false
353
+ };
354
+ var MessageReader = class {
355
+ segments;
356
+ securityOptions;
357
+ constructor(buffer, securityOptions) {
358
+ this.securityOptions = {
359
+ ...DEFAULT_SECURITY_OPTIONS,
360
+ ...securityOptions
361
+ };
362
+ const uint8Array = buffer instanceof ArrayBuffer ? new Uint8Array(buffer) : buffer;
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)`);
365
+ if (uint8Array.byteLength < 8) return;
366
+ const view = new DataView(uint8Array.buffer, uint8Array.byteOffset, uint8Array.byteLength);
367
+ const firstWordLow = view.getUint32(0, true);
368
+ const firstWordHigh = view.getUint32(4, true);
369
+ const segmentCount = (firstWordLow & 4294967295) + 1;
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
+ }
375
+ let offset = 8;
376
+ const segmentSizes = [firstSegmentSize];
377
+ for (let i = 1; i < segmentCount; i++) {
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})`);
380
+ this.segments = [];
381
+ return;
382
+ }
383
+ segmentSizes.push(view.getUint32(offset, true));
384
+ offset += 4;
385
+ }
386
+ offset = offset + 7 & -8;
387
+ if (offset > uint8Array.byteLength) {
388
+ if (this.securityOptions.strictMode) throw new Error(`Insufficient data for segment table (offset: ${offset}, length: ${uint8Array.byteLength})`);
389
+ this.segments = [];
390
+ return;
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
+ }
400
+ this.segments = [];
401
+ for (const size of segmentSizes) {
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
+ }
406
+ const segmentBuffer = uint8Array.slice(offset, offset + size * WORD_SIZE);
407
+ this.segments.push(Segment.fromBuffer(segmentBuffer.buffer));
408
+ offset += size * WORD_SIZE;
409
+ }
410
+ }
411
+ /**
412
+ * 获取根结构
413
+ */
414
+ getRoot(_dataWords, _pointerCount) {
415
+ const segment = this.segments[0];
416
+ const ptr = decodePointer(segment.getWord(0));
417
+ if (ptr.tag === PointerTag.STRUCT) {
418
+ const structPtr = ptr;
419
+ const dataOffset = 1 + structPtr.offset;
420
+ return new StructReader(this, 0, dataOffset, structPtr.dataWords, structPtr.pointerCount);
421
+ }
422
+ if (ptr.tag === PointerTag.FAR) {
423
+ const farPtr = ptr;
424
+ const targetSegment = this.getSegment(farPtr.targetSegment);
425
+ if (!targetSegment) throw new Error(`Far pointer references non-existent segment ${farPtr.targetSegment}`);
426
+ if (farPtr.doubleFar) {
427
+ const landingPadPtr = decodePointer(targetSegment.getWord(farPtr.targetOffset));
428
+ if (landingPadPtr.tag !== PointerTag.FAR) throw new Error("Double-far landing pad is not a far pointer");
429
+ const innerFarPtr = landingPadPtr;
430
+ const finalSegment = this.getSegment(innerFarPtr.targetSegment);
431
+ if (!finalSegment) throw new Error(`Double-far references non-existent segment ${innerFarPtr.targetSegment}`);
432
+ const structPtr = decodePointer(finalSegment.getWord(innerFarPtr.targetOffset));
433
+ const dataOffset = innerFarPtr.targetOffset + 1 + structPtr.offset;
434
+ return new StructReader(this, innerFarPtr.targetSegment, dataOffset, structPtr.dataWords, structPtr.pointerCount);
435
+ }
436
+ const structPtr = decodePointer(targetSegment.getWord(farPtr.targetOffset));
437
+ const dataOffset = farPtr.targetOffset + 1 + structPtr.offset;
438
+ return new StructReader(this, farPtr.targetSegment, dataOffset, structPtr.dataWords, structPtr.pointerCount);
439
+ }
440
+ throw new Error(`Root pointer is not a struct or far pointer: ${ptr.tag}`);
441
+ }
442
+ /**
443
+ * 获取段
444
+ */
445
+ getSegment(index) {
446
+ return this.segments[index];
447
+ }
448
+ /**
449
+ * 解析指针,处理 far pointer 间接寻址
450
+ * 返回 { segmentIndex, wordOffset, pointer },其中 pointer 是实际的 struct/list 指针
451
+ */
452
+ resolvePointer(segmentIndex, wordOffset) {
453
+ const segment = this.getSegment(segmentIndex);
454
+ if (!segment) return null;
455
+ const ptrValue = segment.getWord(wordOffset);
456
+ if (ptrValue === 0n) return null;
457
+ const ptr = decodePointer(ptrValue);
458
+ if (ptr.tag === PointerTag.STRUCT || ptr.tag === PointerTag.LIST) return {
459
+ segmentIndex,
460
+ wordOffset: wordOffset + 1 + ptr.offset,
461
+ pointer: ptr
462
+ };
463
+ if (ptr.tag === PointerTag.FAR) {
464
+ const farPtr = ptr;
465
+ const targetSegment = this.getSegment(farPtr.targetSegment);
466
+ if (!targetSegment) return null;
467
+ if (farPtr.doubleFar) {
468
+ const landingPadPtr = decodePointer(targetSegment.getWord(farPtr.targetOffset));
469
+ if (landingPadPtr.tag !== PointerTag.FAR) return null;
470
+ const innerFarPtr = landingPadPtr;
471
+ const finalSegment = this.getSegment(innerFarPtr.targetSegment);
472
+ if (!finalSegment) return null;
473
+ const finalPtr = decodePointer(finalSegment.getWord(innerFarPtr.targetOffset));
474
+ if (finalPtr.tag !== PointerTag.STRUCT && finalPtr.tag !== PointerTag.LIST) return null;
475
+ const targetOffset = innerFarPtr.targetOffset + 1 + finalPtr.offset;
476
+ return {
477
+ segmentIndex: innerFarPtr.targetSegment,
478
+ wordOffset: targetOffset,
479
+ pointer: finalPtr
480
+ };
481
+ }
482
+ const landingPadPtr = decodePointer(targetSegment.getWord(farPtr.targetOffset));
483
+ if (landingPadPtr.tag !== PointerTag.STRUCT && landingPadPtr.tag !== PointerTag.LIST) return null;
484
+ const targetOffset = farPtr.targetOffset + 1 + landingPadPtr.offset;
485
+ return {
486
+ segmentIndex: farPtr.targetSegment,
487
+ wordOffset: targetOffset,
488
+ pointer: landingPadPtr
489
+ };
490
+ }
491
+ return null;
492
+ }
493
+ /**
494
+ * 段数量
495
+ */
496
+ get segmentCount() {
497
+ return this.segments.length;
498
+ }
499
+ /**
500
+ * 获取当前安全选项配置
501
+ */
502
+ getSecurityOptions() {
503
+ return { ...this.securityOptions };
504
+ }
505
+ };
506
+ /**
507
+ * 结构读取器
508
+ */
509
+ var StructReader = class StructReader {
510
+ constructor(message, segmentIndex, wordOffset, dataWords, pointerCount) {
511
+ this.message = message;
512
+ this.segmentIndex = segmentIndex;
513
+ this.wordOffset = wordOffset;
514
+ this.dataWords = dataWords;
515
+ this.pointerCount = pointerCount;
516
+ }
517
+ /**
518
+ * 获取 bool 字段
519
+ */
520
+ getBool(bitOffset) {
521
+ const byteOffset = Math.floor(bitOffset / 8);
522
+ const bitInByte = bitOffset % 8;
523
+ const segment = this.message.getSegment(this.segmentIndex);
524
+ const dataOffset = this.wordOffset * WORD_SIZE + byteOffset;
525
+ const dataSectionEnd = this.wordOffset * WORD_SIZE + this.dataWords * WORD_SIZE;
526
+ if (dataOffset < 0 || dataOffset >= dataSectionEnd) return false;
527
+ return (segment.dataView.getUint8(dataOffset) & 1 << bitInByte) !== 0;
528
+ }
529
+ /**
530
+ * 获取 int8 字段
531
+ */
532
+ getInt8(byteOffset) {
533
+ const segment = this.message.getSegment(this.segmentIndex);
534
+ const dataOffset = this.wordOffset * WORD_SIZE + byteOffset;
535
+ const dataSectionEnd = this.wordOffset * WORD_SIZE + this.dataWords * WORD_SIZE;
536
+ if (dataOffset < 0 || dataOffset >= dataSectionEnd) return 0;
537
+ return segment.dataView.getInt8(dataOffset);
538
+ }
539
+ /**
540
+ * 获取 int16 字段
541
+ */
542
+ getInt16(byteOffset) {
543
+ const segment = this.message.getSegment(this.segmentIndex);
544
+ const dataOffset = this.wordOffset * WORD_SIZE + byteOffset;
545
+ const dataSectionEnd = this.wordOffset * WORD_SIZE + this.dataWords * WORD_SIZE;
546
+ if (dataOffset < 0 || dataOffset + 2 > dataSectionEnd) return 0;
547
+ return segment.dataView.getInt16(dataOffset, true);
548
+ }
549
+ /**
550
+ * 获取 int32 字段
551
+ */
552
+ getInt32(byteOffset) {
553
+ const segment = this.message.getSegment(this.segmentIndex);
554
+ const dataOffset = this.wordOffset * WORD_SIZE + byteOffset;
555
+ const dataSectionEnd = this.wordOffset * WORD_SIZE + this.dataWords * WORD_SIZE;
556
+ if (dataOffset < 0 || dataOffset + 4 > dataSectionEnd) return 0;
557
+ return segment.dataView.getInt32(dataOffset, true);
558
+ }
559
+ /**
560
+ * 获取 int64 字段
561
+ */
562
+ getInt64(byteOffset) {
563
+ const segment = this.message.getSegment(this.segmentIndex);
564
+ const dataOffset = this.wordOffset * WORD_SIZE + byteOffset;
565
+ const dataSectionEnd = this.wordOffset * WORD_SIZE + this.dataWords * WORD_SIZE;
566
+ if (dataOffset < 0 || dataOffset + 8 > dataSectionEnd) return BigInt(0);
567
+ const low = BigInt(segment.dataView.getUint32(dataOffset, true));
568
+ return BigInt(segment.dataView.getInt32(dataOffset + 4, true)) << BigInt(32) | low;
569
+ }
570
+ /**
571
+ * 获取 uint8 字段
572
+ */
573
+ getUint8(byteOffset) {
574
+ const segment = this.message.getSegment(this.segmentIndex);
575
+ const dataOffset = this.wordOffset * WORD_SIZE + byteOffset;
576
+ const dataSectionEnd = this.wordOffset * WORD_SIZE + this.dataWords * WORD_SIZE;
577
+ if (dataOffset < 0 || dataOffset >= dataSectionEnd) return 0;
578
+ return segment.dataView.getUint8(dataOffset);
579
+ }
580
+ /**
581
+ * 获取 uint16 字段
582
+ */
583
+ getUint16(byteOffset) {
584
+ const segment = this.message.getSegment(this.segmentIndex);
585
+ const dataOffset = this.wordOffset * WORD_SIZE + byteOffset;
586
+ const dataSectionEnd = this.wordOffset * WORD_SIZE + this.dataWords * WORD_SIZE;
587
+ if (dataOffset < 0 || dataOffset + 2 > dataSectionEnd) return 0;
588
+ return segment.dataView.getUint16(dataOffset, true);
589
+ }
590
+ /**
591
+ * 获取 uint32 字段
592
+ */
593
+ getUint32(byteOffset) {
594
+ const segment = this.message.getSegment(this.segmentIndex);
595
+ const dataOffset = this.wordOffset * WORD_SIZE + byteOffset;
596
+ const dataSectionEnd = this.wordOffset * WORD_SIZE + this.dataWords * WORD_SIZE;
597
+ if (dataOffset < 0 || dataOffset + 4 > dataSectionEnd) return 0;
598
+ return segment.dataView.getUint32(dataOffset, true);
599
+ }
600
+ /**
601
+ * 获取 uint64 字段
602
+ */
603
+ getUint64(byteOffset) {
604
+ const segment = this.message.getSegment(this.segmentIndex);
605
+ const dataOffset = this.wordOffset * WORD_SIZE + byteOffset;
606
+ const dataSectionEnd = this.wordOffset * WORD_SIZE + this.dataWords * WORD_SIZE;
607
+ if (dataOffset < 0 || dataOffset + 8 > dataSectionEnd) return BigInt(0);
608
+ const low = BigInt(segment.dataView.getUint32(dataOffset, true));
609
+ return BigInt(segment.dataView.getUint32(dataOffset + 4, true)) << BigInt(32) | low;
610
+ }
611
+ /**
612
+ * 获取 float32 字段
613
+ */
614
+ getFloat32(byteOffset) {
615
+ const segment = this.message.getSegment(this.segmentIndex);
616
+ const dataOffset = this.wordOffset * WORD_SIZE + byteOffset;
617
+ const dataSectionEnd = this.wordOffset * WORD_SIZE + this.dataWords * WORD_SIZE;
618
+ if (dataOffset < 0 || dataOffset + 4 > dataSectionEnd) return 0;
619
+ return segment.dataView.getFloat32(dataOffset, true);
620
+ }
621
+ /**
622
+ * 获取 float64 字段
623
+ */
624
+ getFloat64(byteOffset) {
625
+ const segment = this.message.getSegment(this.segmentIndex);
626
+ const dataOffset = this.wordOffset * WORD_SIZE + byteOffset;
627
+ const dataSectionEnd = this.wordOffset * WORD_SIZE + this.dataWords * WORD_SIZE;
628
+ if (dataOffset < 0 || dataOffset + 8 > dataSectionEnd) return 0;
629
+ return segment.dataView.getFloat64(dataOffset, true);
630
+ }
631
+ /**
632
+ * 获取文本字段
633
+ */
634
+ getText(pointerIndex) {
635
+ const ptrOffset = this.wordOffset + this.dataWords + pointerIndex;
636
+ const resolved = this.message.resolvePointer(this.segmentIndex, ptrOffset);
637
+ if (!resolved) return "";
638
+ const { segmentIndex, wordOffset, pointer } = resolved;
639
+ if (pointer.tag !== PointerTag.LIST) return "";
640
+ const listPtr = pointer;
641
+ const segment = this.message.getSegment(segmentIndex);
642
+ const byteLength = listPtr.elementCount > 0 ? listPtr.elementCount - 1 : 0;
643
+ if (byteLength === 0) return "";
644
+ const bytes = new Uint8Array(segment.dataView.buffer, wordOffset * WORD_SIZE, byteLength);
645
+ return new TextDecoder().decode(bytes);
646
+ }
647
+ /**
648
+ * 获取数据字段
649
+ * Data is stored as List(UInt8) without NUL terminator
650
+ * @param pointerIndex - The index of the pointer in the pointer section
651
+ * @returns Uint8Array of the data content, or undefined if null pointer
652
+ */
653
+ getData(pointerIndex) {
654
+ const ptrOffset = this.wordOffset + this.dataWords + pointerIndex;
655
+ const resolved = this.message.resolvePointer(this.segmentIndex, ptrOffset);
656
+ if (!resolved) return void 0;
657
+ const { segmentIndex, wordOffset, pointer } = resolved;
658
+ if (pointer.tag !== PointerTag.LIST) return void 0;
659
+ const listPtr = pointer;
660
+ const segment = this.message.getSegment(segmentIndex);
661
+ const byteLength = listPtr.elementCount;
662
+ if (byteLength === 0) return new Uint8Array(0);
663
+ const bytes = new Uint8Array(segment.dataView.buffer, wordOffset * WORD_SIZE, byteLength);
664
+ return new Uint8Array(bytes);
665
+ }
666
+ /**
667
+ * 获取嵌套结构
668
+ */
669
+ getStruct(pointerIndex, _dataWords, _pointerCount) {
670
+ const ptrOffset = this.wordOffset + this.dataWords + pointerIndex;
671
+ const resolved = this.message.resolvePointer(this.segmentIndex, ptrOffset);
672
+ if (!resolved) return void 0;
673
+ const { segmentIndex, wordOffset, pointer } = resolved;
674
+ if (pointer.tag !== PointerTag.STRUCT) return void 0;
675
+ const structPtr = pointer;
676
+ return new StructReader(this.message, segmentIndex, wordOffset, structPtr.dataWords, structPtr.pointerCount);
677
+ }
678
+ /**
679
+ * 获取列表
680
+ */
681
+ getList(pointerIndex, _elementSize, structSize) {
682
+ const ptrOffset = this.wordOffset + this.dataWords + pointerIndex;
683
+ const resolved = this.message.resolvePointer(this.segmentIndex, ptrOffset);
684
+ if (!resolved) return void 0;
685
+ const { segmentIndex, wordOffset, pointer } = resolved;
686
+ if (pointer.tag !== PointerTag.LIST) return void 0;
687
+ const listPtr = pointer;
688
+ let targetOffset = wordOffset;
689
+ let elementCount = listPtr.elementCount;
690
+ let actualStructSize = structSize;
691
+ const segment = this.message.getSegment(segmentIndex);
692
+ if (listPtr.elementSize === ElementSize.COMPOSITE) {
693
+ if (targetOffset < 0 || targetOffset >= segment.wordCount) return;
694
+ try {
695
+ const tagWord = segment.getWord(targetOffset);
696
+ elementCount = Number(tagWord & BigInt(4294967295));
697
+ actualStructSize = {
698
+ dataWords: Number(tagWord >> BigInt(32) & BigInt(65535)),
699
+ pointerCount: Number(tagWord >> BigInt(48) & BigInt(65535))
700
+ };
701
+ targetOffset += 1;
702
+ } catch {
703
+ return;
704
+ }
705
+ }
706
+ return new ListReader(this.message, segmentIndex, listPtr.elementSize, elementCount, actualStructSize, targetOffset);
707
+ }
708
+ };
709
+
710
+ //#endregion
711
+ export { MessageBuilder as n, MessageReader as t };
712
+ //# sourceMappingURL=message-reader-_TCBf61G.js.map