lzma1 0.1.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/streams.js ADDED
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Read-only input buffer wrapping a Uint8Array.
3
+ */
4
+ export class InputBuffer {
5
+ buf;
6
+ pos = 0;
7
+ count;
8
+ constructor(data) {
9
+ this.buf = data;
10
+ this.count = data.length;
11
+ }
12
+ readByte() {
13
+ if (this.pos >= this.count)
14
+ return -1;
15
+ return this.buf[this.pos++] & 0xFF;
16
+ }
17
+ readBytes(dest, off, len) {
18
+ if (this.pos >= this.count)
19
+ return -1;
20
+ len = Math.min(len, this.count - this.pos);
21
+ dest.set(this.buf.subarray(this.pos, this.pos + len), off);
22
+ this.pos += len;
23
+ return len;
24
+ }
25
+ get remaining() {
26
+ return this.count - this.pos;
27
+ }
28
+ }
29
+ /**
30
+ * Growable output buffer backed by a Uint8Array.
31
+ */
32
+ export class OutputBuffer {
33
+ buf;
34
+ count = 0;
35
+ constructor(capacity = 32) {
36
+ this.buf = new Uint8Array(capacity);
37
+ }
38
+ grow(requiredSize) {
39
+ const newSize = Math.max(this.buf.length * 2, requiredSize);
40
+ const newBuf = new Uint8Array(newSize);
41
+ newBuf.set(this.buf.subarray(0, this.count));
42
+ this.buf = newBuf;
43
+ }
44
+ writeByte(b) {
45
+ if (this.count >= this.buf.length) {
46
+ this.grow(this.count + 1);
47
+ }
48
+ this.buf[this.count++] = b;
49
+ }
50
+ writeBytes(src, off, len) {
51
+ const requiredSize = this.count + len;
52
+ if (requiredSize > this.buf.length) {
53
+ this.grow(requiredSize);
54
+ }
55
+ this.buf.set(src.subarray(off, off + len), this.count);
56
+ this.count += len;
57
+ }
58
+ write(buf) {
59
+ this.writeBytes(buf, 0, buf.length);
60
+ }
61
+ toArray() {
62
+ return this.buf.slice(0, this.count);
63
+ }
64
+ }
package/lib/utils.js ADDED
@@ -0,0 +1,202 @@
1
+ // Additional LZMA constants
2
+ export const INFINITY_PRICE = 0xFFFFFFF;
3
+ export const _MAX_UINT32 = 0xFFFFFFFF;
4
+ export const DICTIONARY_SIZE_THRESHOLD = 0x3FFFFFFF;
5
+ // Range coder constants
6
+ export const kTopValue = 1 << 24;
7
+ export const kNumBitModelTotalBits = 11;
8
+ export const kBitModelTotal = 1 << kNumBitModelTotalBits;
9
+ export const kNumMoveBits = 5;
10
+ export const kNumMoveReducingBits = 2;
11
+ export const kNumBitPriceShiftBits = 6;
12
+ // Common array sizes used throughout LZMA implementation
13
+ export const MATCH_DECODERS_SIZE = 0xC0; // 192
14
+ export const REP_DECODERS_SIZE = 12;
15
+ export const POS_DECODERS_SIZE = 114;
16
+ export const LITERAL_DECODER_SIZE = 0x300; // 768
17
+ export const DEFAULT_WINDOW_SIZE = 0x1000; // 4096
18
+ export const CHOICE_ARRAY_SIZE = 2;
19
+ /**
20
+ * CRC32 lookup table for hash calculations
21
+ * dprint-ignore
22
+ */
23
+ export const CRC32_TABLE = [
24
+ 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F,
25
+ 0xE963A535, 0x9E6495A3, 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
26
+ 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, 0x1DB71064, 0x6AB020F2,
27
+ 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
28
+ 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9,
29
+ 0xFA0F3D63, 0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
30
+ 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, 0x35B5A8FA, 0x42B2986C,
31
+ 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
32
+ 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423,
33
+ 0xCFBA9599, 0xB8BDA50F, 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
34
+ 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, 0x76DC4190, 0x01DB7106,
35
+ 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
36
+ 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D,
37
+ 0x91646C97, 0xE6635C01, 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
38
+ 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, 0x65B0D9C6, 0x12B7E950,
39
+ 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
40
+ 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7,
41
+ 0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
42
+ 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, 0x5005713C, 0x270241AA,
43
+ 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
44
+ 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81,
45
+ 0xB7BD5C3B, 0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
46
+ 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, 0xE3630B12, 0x94643B84,
47
+ 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
48
+ 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB,
49
+ 0x196C3671, 0x6E6B06E7, 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
50
+ 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, 0xD6D6A3E8, 0xA1D1937E,
51
+ 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
52
+ 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55,
53
+ 0x316E8EEF, 0x4669BE79, 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
54
+ 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, 0xC5BA3BBE, 0xB2BD0B28,
55
+ 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
56
+ 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F,
57
+ 0x72076785, 0x05005713, 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,
58
+ 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, 0x86D3D2D4, 0xF1D4E242,
59
+ 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
60
+ 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69,
61
+ 0x616BFFD3, 0x166CCF45, 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
62
+ 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC,
63
+ 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
64
+ 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693,
65
+ 0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
66
+ 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
67
+ ];
68
+ /**
69
+ * Pre-computed static instances for common use
70
+ */
71
+ export const PROB_PRICES = createProbPrices();
72
+ export const G_FAST_POS = createFastPos();
73
+ /**
74
+ * Initialize array with specified length and default value
75
+ * This is MUCH faster than "new Array(len)" in newer versions of v8
76
+ * (starting with Node.js 0.11.15, which uses v8 3.28.73).
77
+ */
78
+ export function initArray(len, value = 0) {
79
+ const array = [];
80
+ // Pre-allocate array by setting the last index
81
+ array[len - 1] = undefined;
82
+ // Fill with specified value if needed
83
+ if (value !== 0) {
84
+ for (let i = 0; i < len; i++) {
85
+ array[i] = value;
86
+ }
87
+ }
88
+ return array;
89
+ }
90
+ /**
91
+ * Copy array data with bounds checking and overlap handling
92
+ */
93
+ export function arraycopy(src, srcOfs, dest, destOfs, len) {
94
+ // Bounds checking
95
+ if (srcOfs < 0
96
+ || destOfs < 0
97
+ || len < 0
98
+ || srcOfs + len > src.length
99
+ || destOfs + len > dest.length) {
100
+ return;
101
+ }
102
+ if (src === dest
103
+ && srcOfs < destOfs
104
+ && destOfs < srcOfs + len) {
105
+ // Overlapping regions - copy backwards
106
+ for (let i = len - 1; i >= 0; i--) {
107
+ dest[destOfs + i] = src[srcOfs + i];
108
+ }
109
+ }
110
+ else {
111
+ // Non-overlapping or safe regions - copy forward
112
+ for (let i = 0; i < len; i++) {
113
+ dest[destOfs + i] = src[srcOfs + i];
114
+ }
115
+ }
116
+ }
117
+ /**
118
+ * Get bit price using pre-computed probability prices
119
+ */
120
+ export function getBitPrice(probability, bit) {
121
+ return PROB_PRICES[((probability - bit ^ -bit) & 2047) >>> 2];
122
+ }
123
+ /**
124
+ * Bit model operations
125
+ */
126
+ /**
127
+ * Initialize bit models with default probability
128
+ */
129
+ export function initBitModels(probs) {
130
+ for (let i = probs.length - 1; i >= 0; --i) {
131
+ probs[i] = 1024;
132
+ }
133
+ }
134
+ /**
135
+ * Position and state operations
136
+ */
137
+ /**
138
+ * Get length to position state mapping
139
+ */
140
+ export function getLenToPosState(len) {
141
+ len -= 2;
142
+ if (len < 4) {
143
+ return len;
144
+ }
145
+ return 3;
146
+ }
147
+ /**
148
+ * Update state after character encoding/decoding
149
+ */
150
+ const STATE_UPDATE_CHAR_TABLE = [0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 4, 5];
151
+ export function stateUpdateChar(index) {
152
+ if (index >= 0 && index < STATE_UPDATE_CHAR_TABLE.length) {
153
+ return STATE_UPDATE_CHAR_TABLE[index];
154
+ }
155
+ if (index < 4) {
156
+ return 0;
157
+ }
158
+ if (index < 10) {
159
+ return index - 3;
160
+ }
161
+ return index - 6;
162
+ }
163
+ /**
164
+ * Bit tree operations
165
+ */
166
+ /**
167
+ * Create a bit tree with specified number of bit levels
168
+ */
169
+ export function createBitTree(numBitLevels) {
170
+ return {
171
+ numBitLevels: numBitLevels,
172
+ models: initArray(1 << numBitLevels),
173
+ };
174
+ }
175
+ /**
176
+ * Create probability prices lookup table
177
+ */
178
+ export function createProbPrices() {
179
+ const probPrices = [];
180
+ for (let i = 8; i >= 0; --i) {
181
+ let start = 1 << (9 - i - 1);
182
+ let end = 1 << (9 - i);
183
+ for (let j = start; j < end; ++j) {
184
+ probPrices[j] = (i << 6) + ((end - j) << 6 >>> (9 - i - 1));
185
+ }
186
+ }
187
+ return probPrices;
188
+ }
189
+ /**
190
+ * Create fast position lookup table
191
+ */
192
+ export function createFastPos() {
193
+ const gFastPos = [0, 1];
194
+ let c = 2;
195
+ for (let slotFast = 2; slotFast < 22; ++slotFast) {
196
+ let k = 1 << ((slotFast >> 1) - 1);
197
+ for (let j = 0; j < k; ++j, ++c) {
198
+ gFastPos[c] = slotFast;
199
+ }
200
+ }
201
+ return gFastPos;
202
+ }
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "lzma1",
3
3
  "type": "module",
4
- "version": "0.1.2",
4
+ "version": "0.3.0",
5
5
  "license": "MIT",
6
6
  "author": "Filip Seman <filip.seman@pm.me>",
7
7
  "description": "A JavaScript implementation of the Lempel-Ziv-Markov (LZMA) chain compression algorithm",
8
8
  "funding": "https://github.com/sponsors/xseman",
9
- "homepage": "https://github.com/xseman/lzma1#readme",
9
+ "homepage": "https://github.com/xseman/lzma1",
10
10
  "keywords": [
11
11
  "lzma",
12
12
  "lzma1",
@@ -14,32 +14,43 @@
14
14
  ],
15
15
  "repository": {
16
16
  "type": "git",
17
- "url": "git+https://github.com/xseman/lzma1.git"
17
+ "url": "https://github.com/xseman/lzma1"
18
18
  },
19
19
  "scripts": {
20
20
  "prebuild": "tsc --build --clean",
21
- "build": "tsc",
21
+ "build": "tsc --build",
22
22
  "fmt": "dprint fmt",
23
23
  "fmt:check": "dprint check",
24
24
  "typecheck": "tsc --noEmit",
25
- "test": "bun test --coverage lzma.test.ts",
26
- "test:watch": "bun test --watch lzma.test.ts"
25
+ "bench": "bun test src/bench_test.ts --no-coverage --timeout 300000",
26
+ "test": "bun test src/ --coverage --coverage-reporter=text --coverage-reporter=lcov --concurrent --path-ignore-patterns=src/bench_test.ts",
27
+ "test:watch": "bun test src/ --watch --coverage --concurrent --path-ignore-patterns=src/bench_test.ts"
27
28
  },
28
29
  "devDependencies": {
29
- "@types/bun": "^1.2.18",
30
- "@types/node": "^24.0.14",
31
- "dprint": "~0.50.0",
32
- "typescript": "^5.8.0"
30
+ "@types/bun": "^1.3.11",
31
+ "@types/node": "^25.5.2",
32
+ "dprint": "~0.54.0",
33
+ "typescript": "^6.0.2"
33
34
  },
35
+ "engines": {
36
+ "bun": ">=1.0.0",
37
+ "node": ">=18.0.0"
38
+ },
39
+ "sideEffects": false,
40
+ "types": "./src/index.ts",
34
41
  "exports": {
35
42
  "./package.json": "./package.json",
36
43
  ".": {
44
+ "types": "./src/index.ts",
45
+ "bun": "./src/index.ts",
37
46
  "import": "./lib/index.js",
38
- "types": "./lib/index.d.ts"
47
+ "require": "./lib/index.js"
39
48
  }
40
49
  },
41
50
  "files": [
42
- "lib",
43
- "!lib/*test*"
51
+ "lib/**/*.js",
52
+ "!lib/**/*_test*",
53
+ "src/**/*.ts",
54
+ "!src/**/*_test.ts"
44
55
  ]
45
56
  }