d2r-saver 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +126 -0
  3. package/data/data.json +1 -0
  4. package/data/strings.json +1 -0
  5. package/dist/core/binary-reader.d.ts +43 -0
  6. package/dist/core/binary-reader.d.ts.map +1 -0
  7. package/dist/core/binary-reader.js +130 -0
  8. package/dist/core/binary-reader.js.map +1 -0
  9. package/dist/core/binary-writer.d.ts +49 -0
  10. package/dist/core/binary-writer.d.ts.map +1 -0
  11. package/dist/core/binary-writer.js +156 -0
  12. package/dist/core/binary-writer.js.map +1 -0
  13. package/dist/core/checksum.d.ts +28 -0
  14. package/dist/core/checksum.d.ts.map +1 -0
  15. package/dist/core/checksum.js +62 -0
  16. package/dist/core/checksum.js.map +1 -0
  17. package/dist/core/huffman.d.ts +22 -0
  18. package/dist/core/huffman.d.ts.map +1 -0
  19. package/dist/core/huffman.js +66 -0
  20. package/dist/core/huffman.js.map +1 -0
  21. package/dist/core/index.d.ts +5 -0
  22. package/dist/core/index.d.ts.map +1 -0
  23. package/dist/core/index.js +5 -0
  24. package/dist/core/index.js.map +1 -0
  25. package/dist/formats/d2i-reader.d.ts +53 -0
  26. package/dist/formats/d2i-reader.d.ts.map +1 -0
  27. package/dist/formats/d2i-reader.js +208 -0
  28. package/dist/formats/d2i-reader.js.map +1 -0
  29. package/dist/formats/d2i-writer.d.ts +63 -0
  30. package/dist/formats/d2i-writer.d.ts.map +1 -0
  31. package/dist/formats/d2i-writer.js +229 -0
  32. package/dist/formats/d2i-writer.js.map +1 -0
  33. package/dist/formats/d2s-reader.d.ts +104 -0
  34. package/dist/formats/d2s-reader.d.ts.map +1 -0
  35. package/dist/formats/d2s-reader.js +257 -0
  36. package/dist/formats/d2s-reader.js.map +1 -0
  37. package/dist/formats/d2s-writer.d.ts +52 -0
  38. package/dist/formats/d2s-writer.d.ts.map +1 -0
  39. package/dist/formats/d2s-writer.js +407 -0
  40. package/dist/formats/d2s-writer.js.map +1 -0
  41. package/dist/formats/detect.d.ts +18 -0
  42. package/dist/formats/detect.d.ts.map +1 -0
  43. package/dist/formats/detect.js +40 -0
  44. package/dist/formats/detect.js.map +1 -0
  45. package/dist/formats/index.d.ts +8 -0
  46. package/dist/formats/index.d.ts.map +1 -0
  47. package/dist/formats/index.js +8 -0
  48. package/dist/formats/index.js.map +1 -0
  49. package/dist/formats/item-parser.d.ts +97 -0
  50. package/dist/formats/item-parser.d.ts.map +1 -0
  51. package/dist/formats/item-parser.js +627 -0
  52. package/dist/formats/item-parser.js.map +1 -0
  53. package/dist/formats/item-writer.d.ts +55 -0
  54. package/dist/formats/item-writer.d.ts.map +1 -0
  55. package/dist/formats/item-writer.js +514 -0
  56. package/dist/formats/item-writer.js.map +1 -0
  57. package/dist/game-data/game-data.d.ts +90 -0
  58. package/dist/game-data/game-data.d.ts.map +1 -0
  59. package/dist/game-data/game-data.js +355 -0
  60. package/dist/game-data/game-data.js.map +1 -0
  61. package/dist/game-data/index.d.ts +4 -0
  62. package/dist/game-data/index.d.ts.map +1 -0
  63. package/dist/game-data/index.js +3 -0
  64. package/dist/game-data/index.js.map +1 -0
  65. package/dist/game-data/loader.d.ts +23 -0
  66. package/dist/game-data/loader.d.ts.map +1 -0
  67. package/dist/game-data/loader.js +32 -0
  68. package/dist/game-data/loader.js.map +1 -0
  69. package/dist/game-data/types.d.ts +428 -0
  70. package/dist/game-data/types.d.ts.map +1 -0
  71. package/dist/game-data/types.js +10 -0
  72. package/dist/game-data/types.js.map +1 -0
  73. package/dist/index.d.ts +166 -0
  74. package/dist/index.d.ts.map +1 -0
  75. package/dist/index.js +197 -0
  76. package/dist/index.js.map +1 -0
  77. package/dist/inventory/dimensions.d.ts +42 -0
  78. package/dist/inventory/dimensions.d.ts.map +1 -0
  79. package/dist/inventory/dimensions.js +30 -0
  80. package/dist/inventory/dimensions.js.map +1 -0
  81. package/dist/inventory/grid.d.ts +53 -0
  82. package/dist/inventory/grid.d.ts.map +1 -0
  83. package/dist/inventory/grid.js +117 -0
  84. package/dist/inventory/grid.js.map +1 -0
  85. package/dist/inventory/index.d.ts +4 -0
  86. package/dist/inventory/index.d.ts.map +1 -0
  87. package/dist/inventory/index.js +4 -0
  88. package/dist/inventory/index.js.map +1 -0
  89. package/dist/inventory/placement.d.ts +68 -0
  90. package/dist/inventory/placement.d.ts.map +1 -0
  91. package/dist/inventory/placement.js +90 -0
  92. package/dist/inventory/placement.js.map +1 -0
  93. package/dist/items/index.d.ts +7 -0
  94. package/dist/items/index.d.ts.map +1 -0
  95. package/dist/items/index.js +7 -0
  96. package/dist/items/index.js.map +1 -0
  97. package/dist/items/item-dto.d.ts +47 -0
  98. package/dist/items/item-dto.d.ts.map +1 -0
  99. package/dist/items/item-dto.js +124 -0
  100. package/dist/items/item-dto.js.map +1 -0
  101. package/dist/items/item-icon.d.ts +27 -0
  102. package/dist/items/item-icon.d.ts.map +1 -0
  103. package/dist/items/item-icon.js +103 -0
  104. package/dist/items/item-icon.js.map +1 -0
  105. package/dist/items/item-serializer.d.ts +38 -0
  106. package/dist/items/item-serializer.d.ts.map +1 -0
  107. package/dist/items/item-serializer.js +92 -0
  108. package/dist/items/item-serializer.js.map +1 -0
  109. package/dist/items/item-stats-parser.d.ts +52 -0
  110. package/dist/items/item-stats-parser.d.ts.map +1 -0
  111. package/dist/items/item-stats-parser.js +671 -0
  112. package/dist/items/item-stats-parser.js.map +1 -0
  113. package/dist/items/item-types.d.ts +40 -0
  114. package/dist/items/item-types.d.ts.map +1 -0
  115. package/dist/items/item-types.js +198 -0
  116. package/dist/items/item-types.js.map +1 -0
  117. package/dist/items/item.d.ts +61 -0
  118. package/dist/items/item.d.ts.map +1 -0
  119. package/dist/items/item.js +335 -0
  120. package/dist/items/item.js.map +1 -0
  121. package/dist/operations/extract-item.d.ts +39 -0
  122. package/dist/operations/extract-item.d.ts.map +1 -0
  123. package/dist/operations/extract-item.js +204 -0
  124. package/dist/operations/extract-item.js.map +1 -0
  125. package/dist/operations/index.d.ts +4 -0
  126. package/dist/operations/index.d.ts.map +1 -0
  127. package/dist/operations/index.js +4 -0
  128. package/dist/operations/index.js.map +1 -0
  129. package/dist/operations/insert-item.d.ts +59 -0
  130. package/dist/operations/insert-item.d.ts.map +1 -0
  131. package/dist/operations/insert-item.js +210 -0
  132. package/dist/operations/insert-item.js.map +1 -0
  133. package/dist/operations/read-save.d.ts +25 -0
  134. package/dist/operations/read-save.d.ts.map +1 -0
  135. package/dist/operations/read-save.js +27 -0
  136. package/dist/operations/read-save.js.map +1 -0
  137. package/dist/types/constants.d.ts +76 -0
  138. package/dist/types/constants.d.ts.map +1 -0
  139. package/dist/types/constants.js +96 -0
  140. package/dist/types/constants.js.map +1 -0
  141. package/dist/types/errors.d.ts +47 -0
  142. package/dist/types/errors.d.ts.map +1 -0
  143. package/dist/types/errors.js +53 -0
  144. package/dist/types/errors.js.map +1 -0
  145. package/dist/types/index.d.ts +5 -0
  146. package/dist/types/index.d.ts.map +1 -0
  147. package/dist/types/index.js +3 -0
  148. package/dist/types/index.js.map +1 -0
  149. package/dist/types/item.d.ts +112 -0
  150. package/dist/types/item.d.ts.map +1 -0
  151. package/dist/types/item.js +6 -0
  152. package/dist/types/item.js.map +1 -0
  153. package/dist/types/save-file.d.ts +74 -0
  154. package/dist/types/save-file.d.ts.map +1 -0
  155. package/dist/types/save-file.js +5 -0
  156. package/dist/types/save-file.js.map +1 -0
  157. package/dist/types/trade-item.d.ts +37 -0
  158. package/dist/types/trade-item.d.ts.map +1 -0
  159. package/dist/types/trade-item.js +5 -0
  160. package/dist/types/trade-item.js.map +1 -0
  161. package/package.json +70 -0
@@ -0,0 +1,43 @@
1
+ /**
2
+ * BinaryReader — bit-level reader for D2R save files (Blizzless v105).
3
+ *
4
+ * Ported from d2planner/src/logic/binary/reader.js.
5
+ * Supports byte-aligned reads, arbitrary-width bit reads,
6
+ * and Huffman-decoded character reads for item codes.
7
+ */
8
+ export declare class BinaryReader {
9
+ /** Current position in bits */
10
+ bitpos: number;
11
+ /** Underlying raw buffer */
12
+ readonly buffer: Uint8Array;
13
+ constructor(buffer: Uint8Array);
14
+ /** Read unsigned 8-bit integer (byte-aligned). */
15
+ read8(): number;
16
+ /** Read unsigned 16-bit integer, little-endian (byte-aligned). */
17
+ read16(): number;
18
+ /** Read unsigned 32-bit integer, little-endian (byte-aligned). */
19
+ read32(): number;
20
+ /** Peek at a byte at relative offset from current byte position (does NOT advance). */
21
+ byte(offset: number): number;
22
+ /** Read a fixed-length ASCII string, stopping at the first NUL. */
23
+ string(length: number): string;
24
+ /** Read a fixed-length UTF-8 string, stopping at the first NUL. */
25
+ utf8(length: number): string;
26
+ /** Seek to an absolute byte position. */
27
+ seek(pos: number): void;
28
+ /** Skip forward by `bytes` bytes. */
29
+ skip(bytes: number): void;
30
+ /** Align to the next byte boundary. */
31
+ align(): void;
32
+ /** Read `count` bits as little-endian unsigned integer. */
33
+ bits(count: number): number;
34
+ /** Read a single bit (0 or 1). */
35
+ bit(): number;
36
+ /** Skip forward by `count` bits. */
37
+ skipbits(count: number): void;
38
+ /** Read one Huffman-encoded character (for item type codes). */
39
+ char(): string;
40
+ /** Returns true when the reader has consumed the entire buffer. */
41
+ eof(): boolean;
42
+ }
43
+ //# sourceMappingURL=binary-reader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binary-reader.d.ts","sourceRoot":"","sources":["../../src/core/binary-reader.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,qBAAa,YAAY;IACvB,+BAA+B;IAC/B,MAAM,SAAK;IAEX,4BAA4B;IAC5B,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;gBAEhB,MAAM,EAAE,UAAU;IAM9B,kDAAkD;IAClD,KAAK,IAAI,MAAM;IAMf,kEAAkE;IAClE,MAAM,IAAI,MAAM;IAQhB,kEAAkE;IAClE,MAAM,IAAI,MAAM;IAUhB,uFAAuF;IACvF,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAM5B,mEAAmE;IACnE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAW9B,mEAAmE;IACnE,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAa5B,yCAAyC;IACzC,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIvB,qCAAqC;IACrC,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIzB,uCAAuC;IACvC,KAAK,IAAI,IAAI;IAMb,2DAA2D;IAC3D,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAiB3B,kCAAkC;IAClC,GAAG,IAAI,MAAM;IAMb,oCAAoC;IACpC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAM7B,gEAAgE;IAChE,IAAI,IAAI,MAAM;IAUd,mEAAmE;IACnE,GAAG,IAAI,OAAO;CAGf"}
@@ -0,0 +1,130 @@
1
+ /**
2
+ * BinaryReader — bit-level reader for D2R save files (Blizzless v105).
3
+ *
4
+ * Ported from d2planner/src/logic/binary/reader.js.
5
+ * Supports byte-aligned reads, arbitrary-width bit reads,
6
+ * and Huffman-decoded character reads for item codes.
7
+ */
8
+ import { HUFFMAN_TREE } from './huffman.js';
9
+ const utf8Decoder = new TextDecoder('utf-8');
10
+ export class BinaryReader {
11
+ /** Current position in bits */
12
+ bitpos = 0;
13
+ /** Underlying raw buffer */
14
+ buffer;
15
+ constructor(buffer) {
16
+ this.buffer = buffer;
17
+ }
18
+ // ─── Byte-aligned reads (little-endian) ───────────────────────
19
+ /** Read unsigned 8-bit integer (byte-aligned). */
20
+ read8() {
21
+ const value = this.buffer[this.bitpos >> 3];
22
+ this.bitpos += 8;
23
+ return value;
24
+ }
25
+ /** Read unsigned 16-bit integer, little-endian (byte-aligned). */
26
+ read16() {
27
+ const idx = this.bitpos >> 3;
28
+ const value1 = this.buffer[idx];
29
+ const value2 = this.buffer[idx + 1];
30
+ this.bitpos += 16;
31
+ return value1 | (value2 << 8);
32
+ }
33
+ /** Read unsigned 32-bit integer, little-endian (byte-aligned). */
34
+ read32() {
35
+ const idx = this.bitpos >> 3;
36
+ const value1 = this.buffer[idx];
37
+ const value2 = this.buffer[idx + 1];
38
+ const value3 = this.buffer[idx + 2];
39
+ const value4 = this.buffer[idx + 3];
40
+ this.bitpos += 32;
41
+ return (value1 | (value2 << 8) | (value3 << 16) | (value4 << 24)) >>> 0;
42
+ }
43
+ /** Peek at a byte at relative offset from current byte position (does NOT advance). */
44
+ byte(offset) {
45
+ return this.buffer[(this.bitpos >> 3) + offset];
46
+ }
47
+ // ─── String reads (byte-aligned) ──────────────────────────────
48
+ /** Read a fixed-length ASCII string, stopping at the first NUL. */
49
+ string(length) {
50
+ const start = this.bitpos >> 3;
51
+ const end = start + length;
52
+ let index = this.buffer.indexOf(0, start);
53
+ if (index < 0)
54
+ index = end;
55
+ else
56
+ index = Math.min(index, end);
57
+ const result = String.fromCharCode(...this.buffer.subarray(start, index));
58
+ this.bitpos = end << 3;
59
+ return result;
60
+ }
61
+ /** Read a fixed-length UTF-8 string, stopping at the first NUL. */
62
+ utf8(length) {
63
+ const start = this.bitpos >> 3;
64
+ const end = start + length;
65
+ let index = this.buffer.indexOf(0, start);
66
+ if (index < 0)
67
+ index = end;
68
+ else
69
+ index = Math.min(index, end);
70
+ const result = utf8Decoder.decode(this.buffer.subarray(start, index));
71
+ this.bitpos = end << 3;
72
+ return result;
73
+ }
74
+ // ─── Positioning ──────────────────────────────────────────────
75
+ /** Seek to an absolute byte position. */
76
+ seek(pos) {
77
+ this.bitpos = pos << 3;
78
+ }
79
+ /** Skip forward by `bytes` bytes. */
80
+ skip(bytes) {
81
+ this.bitpos += bytes << 3;
82
+ }
83
+ /** Align to the next byte boundary. */
84
+ align() {
85
+ this.bitpos = (this.bitpos + 7) & ~7;
86
+ }
87
+ // ─── Bit-level reads ─────────────────────────────────────────
88
+ /** Read `count` bits as little-endian unsigned integer. */
89
+ bits(count) {
90
+ let result = 0;
91
+ let shift = 0;
92
+ let remaining = count;
93
+ while (remaining) {
94
+ const byteIdx = this.bitpos >> 3;
95
+ const bit = this.bitpos & 7;
96
+ const read = Math.min(remaining, 8 - bit);
97
+ const value = (this.buffer[byteIdx] >> bit) & ((1 << read) - 1);
98
+ result |= value << shift;
99
+ shift += read;
100
+ remaining -= read;
101
+ this.bitpos += read;
102
+ }
103
+ return result;
104
+ }
105
+ /** Read a single bit (0 or 1). */
106
+ bit() {
107
+ const result = (this.buffer[this.bitpos >> 3] >> (this.bitpos & 7)) & 1;
108
+ this.bitpos += 1;
109
+ return result;
110
+ }
111
+ /** Skip forward by `count` bits. */
112
+ skipbits(count) {
113
+ this.bitpos += count;
114
+ }
115
+ // ─── Huffman ──────────────────────────────────────────────────
116
+ /** Read one Huffman-encoded character (for item type codes). */
117
+ char() {
118
+ let node = HUFFMAN_TREE;
119
+ while (Array.isArray(node)) {
120
+ node = node[this.bit()];
121
+ }
122
+ return node;
123
+ }
124
+ // ─── Utility ──────────────────────────────────────────────────
125
+ /** Returns true when the reader has consumed the entire buffer. */
126
+ eof() {
127
+ return this.bitpos >= this.buffer.byteLength * 8;
128
+ }
129
+ }
130
+ //# sourceMappingURL=binary-reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binary-reader.js","sourceRoot":"","sources":["../../src/core/binary-reader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * BitWriter — bit-level writer for D2R save files (Blizzless v105).
3
+ *
4
+ * Ported from d2planner/src/logic/binary/writer.js.
5
+ * Stores individual bits in an expanded Uint8Array (1 bit per byte),
6
+ * then packs them on `toArray()`.
7
+ *
8
+ * Also provides Huffman character writing via `writeChar()`.
9
+ */
10
+ export declare class BitWriter {
11
+ /** Expanded bit storage: each byte holds 0 or 1. */
12
+ private bits;
13
+ /** Current write/seek offset in bits. */
14
+ offset: number;
15
+ /** High-water mark — total bit length. */
16
+ length: number;
17
+ constructor(capacity?: number);
18
+ /** Write a single bit (0 or 1). */
19
+ writeBit(value: number | boolean): this;
20
+ /** Write an array of bits (expanded form: each element is 0 or 1). */
21
+ writeBits(bitsArray: ArrayLike<number>, numberOfBits: number): this;
22
+ /** Write raw bytes, optionally limiting to `numberOfBits` bits. */
23
+ writeBytes(bytes: ArrayLike<number>, numberOfBits?: number): this;
24
+ /** Alias for `writeBytes`. */
25
+ writeArray(bytes: ArrayLike<number>, numberOfBits: number): this;
26
+ /** Write an unsigned 8-bit value. */
27
+ writeUInt8(value: number, numberOfBits?: number): this;
28
+ /** Write an unsigned 16-bit value (little-endian). */
29
+ writeUInt16(value: number, numberOfBits?: number): this;
30
+ /** Write an unsigned 32-bit value (little-endian). */
31
+ writeUInt32(value: number, numberOfBits?: number): this;
32
+ /** Write a UTF-8 string, padded/truncated to `numberOfBytes` bytes. */
33
+ writeString(value: string, numberOfBytes: number): this;
34
+ /** Write `bits` bits of `value` in MSB-first order. */
35
+ writeBitsNumber(value: number, bits: number): this;
36
+ /** Write one Huffman-encoded character (for item type codes). */
37
+ writeChar(ch: string): this;
38
+ /** Seek to an absolute bit offset. */
39
+ seekBit(offset: number): this;
40
+ /** Seek to an absolute byte offset. */
41
+ seekByte(offset: number): this;
42
+ /** Peek at `count` packed bytes starting from current offset (does NOT advance). */
43
+ peekBytes(count: number): Uint8Array;
44
+ /** Align offset to next byte boundary (skip forward). */
45
+ align(): this;
46
+ /** Pack expanded bit storage into a compact Uint8Array. */
47
+ toArray(): Uint8Array;
48
+ }
49
+ //# sourceMappingURL=binary-writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binary-writer.d.ts","sourceRoot":"","sources":["../../src/core/binary-writer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,qBAAa,SAAS;IACpB,oDAAoD;IACpD,OAAO,CAAC,IAAI,CAAa;IACzB,yCAAyC;IACzC,MAAM,SAAK;IACX,0CAA0C;IAC1C,MAAM,SAAK;gBAEC,QAAQ,SAAmB;IAMvC,mCAAmC;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;IAWvC,sEAAsE;IACtE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAOnE,mEAAmE;IACnE,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,YAAY,GAAE,MAAyC,GAAG,IAAI;IAWnG,8BAA8B;IAC9B,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAMhE,qCAAqC;IACrC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,SAAI,GAAG,IAAI;IAMjD,sDAAsD;IACtD,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,SAAK,GAAG,IAAI;IAMnD,sDAAsD;IACtD,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,SAAK,GAAG,IAAI;IAMnD,uEAAuE;IACvE,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI;IASvD,uDAAuD;IACvD,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IASlD,iEAAiE;IACjE,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAQ3B,sCAAsC;IACtC,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAM7B,uCAAuC;IACvC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI9B,oFAAoF;IACpF,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU;IAmBpC,yDAAyD;IACzD,KAAK,IAAI,IAAI;IAQb,2DAA2D;IAC3D,OAAO,IAAI,UAAU;CAiBtB"}
@@ -0,0 +1,156 @@
1
+ /**
2
+ * BitWriter — bit-level writer for D2R save files (Blizzless v105).
3
+ *
4
+ * Ported from d2planner/src/logic/binary/writer.js.
5
+ * Stores individual bits in an expanded Uint8Array (1 bit per byte),
6
+ * then packs them on `toArray()`.
7
+ *
8
+ * Also provides Huffman character writing via `writeChar()`.
9
+ */
10
+ import { HUFFMAN_LOOKUP } from './huffman.js';
11
+ const DEFAULT_CAPACITY = 8192;
12
+ export class BitWriter {
13
+ /** Expanded bit storage: each byte holds 0 or 1. */
14
+ bits;
15
+ /** Current write/seek offset in bits. */
16
+ offset = 0;
17
+ /** High-water mark — total bit length. */
18
+ length = 0;
19
+ constructor(capacity = DEFAULT_CAPACITY) {
20
+ this.bits = new Uint8Array(capacity);
21
+ }
22
+ // ─── Primitive bit writes ─────────────────────────────────────
23
+ /** Write a single bit (0 or 1). */
24
+ writeBit(value) {
25
+ if (this.offset >= this.bits.length) {
26
+ const resized = new Uint8Array(this.bits.length + 8192);
27
+ resized.set(this.bits, 0);
28
+ this.bits = resized;
29
+ }
30
+ this.bits[this.offset++] = value ? 1 : 0;
31
+ if (this.offset > this.length)
32
+ this.length = this.offset;
33
+ return this;
34
+ }
35
+ /** Write an array of bits (expanded form: each element is 0 or 1). */
36
+ writeBits(bitsArray, numberOfBits) {
37
+ for (let i = 0; i < numberOfBits; i++) {
38
+ this.writeBit(bitsArray[i]);
39
+ }
40
+ return this;
41
+ }
42
+ /** Write raw bytes, optionally limiting to `numberOfBits` bits. */
43
+ writeBytes(bytes, numberOfBits = bytes.length * 8) {
44
+ const toWrite = new Uint8Array(numberOfBits);
45
+ let acc = 0;
46
+ for (let j = 0; j < bytes.length && acc < numberOfBits; j++) {
47
+ for (let k = 0; k < 8 && acc < numberOfBits; k++) {
48
+ toWrite[acc++] = (bytes[j] >> k) & 1;
49
+ }
50
+ }
51
+ return this.writeBits(toWrite, numberOfBits);
52
+ }
53
+ /** Alias for `writeBytes`. */
54
+ writeArray(bytes, numberOfBits) {
55
+ return this.writeBytes(bytes, numberOfBits);
56
+ }
57
+ // ─── Typed writes (little-endian) ─────────────────────────────
58
+ /** Write an unsigned 8-bit value. */
59
+ writeUInt8(value, numberOfBits = 8) {
60
+ const buffer = new Uint8Array(1);
61
+ new DataView(buffer.buffer).setUint8(0, value);
62
+ return this.writeBytes(buffer, numberOfBits);
63
+ }
64
+ /** Write an unsigned 16-bit value (little-endian). */
65
+ writeUInt16(value, numberOfBits = 16) {
66
+ const buffer = new Uint8Array(2);
67
+ new DataView(buffer.buffer).setUint16(0, value, true);
68
+ return this.writeBytes(buffer, numberOfBits);
69
+ }
70
+ /** Write an unsigned 32-bit value (little-endian). */
71
+ writeUInt32(value, numberOfBits = 32) {
72
+ const buffer = new Uint8Array(4);
73
+ new DataView(buffer.buffer).setUint32(0, value, true);
74
+ return this.writeBytes(buffer, numberOfBits);
75
+ }
76
+ /** Write a UTF-8 string, padded/truncated to `numberOfBytes` bytes. */
77
+ writeString(value, numberOfBytes) {
78
+ const encoded = new TextEncoder().encode(value);
79
+ const padded = new Uint8Array(numberOfBytes);
80
+ padded.set(encoded.subarray(0, numberOfBytes));
81
+ return this.writeBytes(padded, numberOfBytes * 8);
82
+ }
83
+ // ─── MSB bit write (used for specific flag fields) ────────────
84
+ /** Write `bits` bits of `value` in MSB-first order. */
85
+ writeBitsNumber(value, bits) {
86
+ for (let i = bits - 1; i >= 0; i--) {
87
+ this.writeBit((value >> i) & 1);
88
+ }
89
+ return this;
90
+ }
91
+ // ─── Huffman writes ───────────────────────────────────────────
92
+ /** Write one Huffman-encoded character (for item type codes). */
93
+ writeChar(ch) {
94
+ const entry = HUFFMAN_LOOKUP[ch];
95
+ if (!entry)
96
+ throw new Error(`writeChar: unsupported character '${ch}'`);
97
+ return this.writeUInt16(entry.v, entry.l);
98
+ }
99
+ // ─── Positioning / Peek ───────────────────────────────────────
100
+ /** Seek to an absolute bit offset. */
101
+ seekBit(offset) {
102
+ this.offset = offset;
103
+ if (this.offset > this.length)
104
+ this.length = this.offset;
105
+ return this;
106
+ }
107
+ /** Seek to an absolute byte offset. */
108
+ seekByte(offset) {
109
+ return this.seekBit(offset * 8);
110
+ }
111
+ /** Peek at `count` packed bytes starting from current offset (does NOT advance). */
112
+ peekBytes(count) {
113
+ const buffer = new Uint8Array(count);
114
+ let byteIndex = 0;
115
+ let bitIndex = 0;
116
+ for (let i = 0; i < count * 8; ++i) {
117
+ if (this.bits[this.offset + i]) {
118
+ buffer[byteIndex] |= (1 << bitIndex) & 0xff;
119
+ }
120
+ bitIndex++;
121
+ if (bitIndex >= 8) {
122
+ byteIndex++;
123
+ bitIndex = 0;
124
+ }
125
+ }
126
+ return buffer;
127
+ }
128
+ // ─── Alignment ────────────────────────────────────────────────
129
+ /** Align offset to next byte boundary (skip forward). */
130
+ align() {
131
+ this.offset = (this.offset + 7) & ~7;
132
+ if (this.offset > this.length)
133
+ this.length = this.offset;
134
+ return this;
135
+ }
136
+ // ─── Output ───────────────────────────────────────────────────
137
+ /** Pack expanded bit storage into a compact Uint8Array. */
138
+ toArray() {
139
+ const byteLen = this.length > 0 ? Math.ceil(this.length / 8) : 0;
140
+ const buffer = new Uint8Array(byteLen);
141
+ let byteIndex = 0;
142
+ let bitIndex = 0;
143
+ for (let i = 0; i < this.length; ++i) {
144
+ if (this.bits[i]) {
145
+ buffer[byteIndex] |= (1 << bitIndex) & 0xff;
146
+ }
147
+ ++bitIndex;
148
+ if (bitIndex >= 8) {
149
+ ++byteIndex;
150
+ bitIndex = 0;
151
+ }
152
+ }
153
+ return buffer;
154
+ }
155
+ }
156
+ //# sourceMappingURL=binary-writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binary-writer.js","sourceRoot":"","sources":["../../src/core/binary-writer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * D2S checksum — compute and patch the rolling checksum used by D2R save files.
3
+ *
4
+ * Ported from d2planner `fixHeader()` in writed2s.js.
5
+ *
6
+ * Format layout (byte offsets):
7
+ * 0x00 magic (4 bytes, "aa 55 aa 55")
8
+ * 0x04 version (4 bytes)
9
+ * 0x08 filesize (4 bytes) ← written by fixHeader
10
+ * 0x0C checksum (4 bytes) ← written by fixHeader
11
+ */
12
+ import { BitWriter } from './binary-writer.js';
13
+ /**
14
+ * Write the file size at offset 0x08 and compute + write the rolling checksum
15
+ * at offset 0x0C. Must be called **after** all other data has been written.
16
+ *
17
+ * @param writer The `BitWriter` that contains the fully-written save data.
18
+ */
19
+ export declare function fixHeader(writer: BitWriter): void;
20
+ /**
21
+ * Compute the checksum for a packed byte array (e.g. from `writer.toArray()`).
22
+ * The checksum field at 0x0C is treated as zero during computation.
23
+ *
24
+ * @param data Complete file bytes.
25
+ * @returns The 32-bit rolling checksum.
26
+ */
27
+ export declare function computeChecksum(data: Uint8Array): number;
28
+ //# sourceMappingURL=checksum.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checksum.d.ts","sourceRoot":"","sources":["../../src/core/checksum.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAO/C;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAqBjD;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAcxD"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * D2S checksum — compute and patch the rolling checksum used by D2R save files.
3
+ *
4
+ * Ported from d2planner `fixHeader()` in writed2s.js.
5
+ *
6
+ * Format layout (byte offsets):
7
+ * 0x00 magic (4 bytes, "aa 55 aa 55")
8
+ * 0x04 version (4 bytes)
9
+ * 0x08 filesize (4 bytes) ← written by fixHeader
10
+ * 0x0C checksum (4 bytes) ← written by fixHeader
11
+ */
12
+ /** Byte offset of the file-size field. */
13
+ const OFFSET_FILESIZE = 0x08;
14
+ /** Byte offset of the checksum field. */
15
+ const OFFSET_CHECKSUM = 0x0c;
16
+ /**
17
+ * Write the file size at offset 0x08 and compute + write the rolling checksum
18
+ * at offset 0x0C. Must be called **after** all other data has been written.
19
+ *
20
+ * @param writer The `BitWriter` that contains the fully-written save data.
21
+ */
22
+ export function fixHeader(writer) {
23
+ const eof = Math.ceil(writer.offset / 8);
24
+ // Write file size at 0x08
25
+ writer.seekByte(OFFSET_FILESIZE).writeUInt32(eof);
26
+ // Zero out the checksum field before computing
27
+ writer.seekByte(OFFSET_CHECKSUM).writeUInt32(0);
28
+ // Compute rolling checksum over the entire file
29
+ let checksum = 0;
30
+ for (let i = 0; i < eof; i++) {
31
+ let byte = writer.seekByte(i).peekBytes(1)[0];
32
+ if (checksum & 0x80000000) {
33
+ byte += 1;
34
+ }
35
+ checksum = (byte + checksum * 2) >>> 0;
36
+ }
37
+ // Write checksum at 0x0C
38
+ writer.seekByte(OFFSET_CHECKSUM).writeUInt32(checksum);
39
+ }
40
+ /**
41
+ * Compute the checksum for a packed byte array (e.g. from `writer.toArray()`).
42
+ * The checksum field at 0x0C is treated as zero during computation.
43
+ *
44
+ * @param data Complete file bytes.
45
+ * @returns The 32-bit rolling checksum.
46
+ */
47
+ export function computeChecksum(data) {
48
+ let checksum = 0;
49
+ for (let i = 0; i < data.length; i++) {
50
+ let byte = data[i];
51
+ // Skip the checksum field (4 bytes at 0x0C)
52
+ if (i >= OFFSET_CHECKSUM && i < OFFSET_CHECKSUM + 4) {
53
+ byte = 0;
54
+ }
55
+ if (checksum & 0x80000000) {
56
+ byte += 1;
57
+ }
58
+ checksum = (byte + checksum * 2) >>> 0;
59
+ }
60
+ return checksum;
61
+ }
62
+ //# sourceMappingURL=checksum.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checksum.js","sourceRoot":"","sources":["../../src/core/checksum.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,0CAA0C;AAC1C,MAAM,eAAe,GAAG,IAAI,CAAC;AAC7B,yCAAyC;AACzC,MAAM,eAAe,GAAG,IAAI,CAAC;AAE7B;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,MAAiB;IACzC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAEzC,0BAA0B;IAC1B,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAElD,+CAA+C;IAC/C,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAEhD,gDAAgD;IAChD,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,IAAI,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,IAAI,QAAQ,GAAG,UAAU,EAAE,CAAC;YAC1B,IAAI,IAAI,CAAC,CAAC;QACZ,CAAC;QACD,QAAQ,GAAG,CAAC,IAAI,GAAG,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;IAED,yBAAyB;IACzB,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;AACzD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,IAAgB;IAC9C,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,IAAI,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACnB,4CAA4C;QAC5C,IAAI,CAAC,IAAI,eAAe,IAAI,CAAC,GAAG,eAAe,GAAG,CAAC,EAAE,CAAC;YACpD,IAAI,GAAG,CAAC,CAAC;QACX,CAAC;QACD,IAAI,QAAQ,GAAG,UAAU,EAAE,CAAC;YAC1B,IAAI,IAAI,CAAC,CAAC;QACZ,CAAC;QACD,QAAQ,GAAG,CAAC,IAAI,GAAG,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Huffman tree and lookup table for D2R item code encoding/decoding.
3
+ *
4
+ * Used in v105 (Blizzless) for 3-character item codes.
5
+ * Alphabet: [a-z0-9 ] — 37 symbols.
6
+ * Space (' ') is the most frequent (2 bits), 'j' is the rarest (9 bits).
7
+ */
8
+ /**
9
+ * Huffman decoding tree. Navigate by bit value (0=left, 1=right) until a string leaf is reached.
10
+ * Note: some nodes have only one child (e.g. `["j"]`) — only bit 0 is valid there.
11
+ */
12
+ export type HuffmanNode = [HuffmanNode, HuffmanNode] | [HuffmanNode] | string;
13
+ export declare const HUFFMAN_TREE: HuffmanNode;
14
+ /** Huffman encoding lookup: char → { v: bit pattern, l: bit length } */
15
+ export interface HuffmanEntry {
16
+ /** Bit pattern value (little-endian) */
17
+ readonly v: number;
18
+ /** Number of bits */
19
+ readonly l: number;
20
+ }
21
+ export declare const HUFFMAN_LOOKUP: Readonly<Record<string, HuffmanEntry>>;
22
+ //# sourceMappingURL=huffman.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"huffman.d.ts","sourceRoot":"","sources":["../../src/core/huffman.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,WAAW,EAAE,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC;AAE9E,eAAO,MAAM,YAAY,EAAE,WAkB1B,CAAC;AAEF,wEAAwE;AACxE,MAAM,WAAW,YAAY;IAC3B,wCAAwC;IACxC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,qBAAqB;IACrB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAsCjE,CAAC"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Huffman tree and lookup table for D2R item code encoding/decoding.
3
+ *
4
+ * Used in v105 (Blizzless) for 3-character item codes.
5
+ * Alphabet: [a-z0-9 ] — 37 symbols.
6
+ * Space (' ') is the most frequent (2 bits), 'j' is the rarest (9 bits).
7
+ */
8
+ export const HUFFMAN_TREE = [
9
+ [
10
+ [
11
+ [['w', 'u'], [['8', ['y', ['5', ['j']]]], 'h']],
12
+ ['s', [['2', 'n'], 'x']],
13
+ ],
14
+ [
15
+ [['c', ['k', 'f']], 'b'],
16
+ [['t', 'm'], ['9', '7']],
17
+ ],
18
+ ],
19
+ [
20
+ ' ',
21
+ [
22
+ [[['e', 'd'], 'p'], ['g', [[['z', 'q'], '3'], ['v', '6']]]],
23
+ [['r', 'l'], ['a', [['1', ['4', '0']], ['i', 'o']]]],
24
+ ],
25
+ ],
26
+ ];
27
+ export const HUFFMAN_LOOKUP = {
28
+ '0': { v: 223, l: 8 },
29
+ '1': { v: 31, l: 7 },
30
+ '2': { v: 12, l: 6 },
31
+ '3': { v: 91, l: 7 },
32
+ '4': { v: 95, l: 8 },
33
+ '5': { v: 104, l: 8 },
34
+ '6': { v: 123, l: 7 },
35
+ '7': { v: 30, l: 5 },
36
+ '8': { v: 8, l: 6 },
37
+ '9': { v: 14, l: 5 },
38
+ ' ': { v: 1, l: 2 },
39
+ a: { v: 15, l: 5 },
40
+ b: { v: 10, l: 4 },
41
+ c: { v: 2, l: 5 },
42
+ d: { v: 35, l: 6 },
43
+ e: { v: 3, l: 6 },
44
+ f: { v: 50, l: 6 },
45
+ g: { v: 11, l: 5 },
46
+ h: { v: 24, l: 5 },
47
+ i: { v: 63, l: 7 },
48
+ j: { v: 232, l: 9 },
49
+ k: { v: 18, l: 6 },
50
+ l: { v: 23, l: 5 },
51
+ m: { v: 22, l: 5 },
52
+ n: { v: 44, l: 6 },
53
+ o: { v: 127, l: 7 },
54
+ p: { v: 19, l: 5 },
55
+ q: { v: 155, l: 8 },
56
+ r: { v: 7, l: 5 },
57
+ s: { v: 4, l: 4 },
58
+ t: { v: 6, l: 5 },
59
+ u: { v: 16, l: 5 },
60
+ v: { v: 59, l: 7 },
61
+ w: { v: 0, l: 5 },
62
+ x: { v: 28, l: 5 },
63
+ y: { v: 40, l: 7 },
64
+ z: { v: 27, l: 8 },
65
+ };
66
+ //# sourceMappingURL=huffman.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"huffman.js","sourceRoot":"","sources":["../../src/core/huffman.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH,MAAM,CAAC,MAAM,YAAY,GAAgB;IACvC;QACE;YACE,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YAC/C,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;SACzB;QACD;YACE,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC;YACxB,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;SACzB;KACF;IACD;QACE,GAAG;QACH;YACE,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;YAC3D,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;SACrD;KACF;CACF,CAAC;AAUF,MAAM,CAAC,MAAM,cAAc,GAA2C;IACpE,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE;IACrB,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE;IACpB,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE;IACpB,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE;IACpB,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE;IACpB,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE;IACrB,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE;IACrB,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE;IACpB,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;IACnB,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE;IACpB,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;IACnB,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE;IAClB,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE;IAClB,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;IACjB,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE;IAClB,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;IACjB,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE;IAClB,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE;IAClB,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE;IAClB,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE;IAClB,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE;IACnB,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE;IAClB,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE;IAClB,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE;IAClB,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE;IAClB,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE;IACnB,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE;IAClB,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE;IACnB,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;IACjB,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;IACjB,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;IACjB,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE;IAClB,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE;IAClB,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;IACjB,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE;IAClB,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE;IAClB,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE;CACnB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { BinaryReader } from './binary-reader.js';
2
+ export { BitWriter } from './binary-writer.js';
3
+ export { fixHeader, computeChecksum } from './checksum.js';
4
+ export { HUFFMAN_TREE, HUFFMAN_LOOKUP, type HuffmanNode, type HuffmanEntry, } from './huffman.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EACL,YAAY,EACZ,cAAc,EACd,KAAK,WAAW,EAChB,KAAK,YAAY,GAClB,MAAM,cAAc,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { BinaryReader } from './binary-reader.js';
2
+ export { BitWriter } from './binary-writer.js';
3
+ export { fixHeader, computeChecksum } from './checksum.js';
4
+ export { HUFFMAN_TREE, HUFFMAN_LOOKUP, } from './huffman.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EACL,YAAY,EACZ,cAAc,GAGf,MAAM,cAAc,CAAC"}