zstdify 1.0.1 → 1.0.2

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 (79) hide show
  1. package/package.json +1 -1
  2. package/dist/barrelExports.test.d.ts +0 -1
  3. package/dist/barrelExports.test.js +0 -25
  4. package/dist/barrelExports.test.js.map +0 -1
  5. package/dist/bitstream/bitReader.test.d.ts +0 -1
  6. package/dist/bitstream/bitReader.test.js +0 -47
  7. package/dist/bitstream/bitReader.test.js.map +0 -1
  8. package/dist/bitstream/bitReaderReverse.test.d.ts +0 -1
  9. package/dist/bitstream/bitReaderReverse.test.js +0 -49
  10. package/dist/bitstream/bitReaderReverse.test.js.map +0 -1
  11. package/dist/bitstream/littleEndian.test.d.ts +0 -1
  12. package/dist/bitstream/littleEndian.test.js +0 -21
  13. package/dist/bitstream/littleEndian.test.js.map +0 -1
  14. package/dist/bitstream/varint.test.d.ts +0 -1
  15. package/dist/bitstream/varint.test.js +0 -25
  16. package/dist/bitstream/varint.test.js.map +0 -1
  17. package/dist/compress.test.d.ts +0 -1
  18. package/dist/compress.test.js +0 -39
  19. package/dist/compress.test.js.map +0 -1
  20. package/dist/decode/block.test.d.ts +0 -1
  21. package/dist/decode/block.test.js +0 -26
  22. package/dist/decode/block.test.js.map +0 -1
  23. package/dist/decode/decompressFrame.test.d.ts +0 -1
  24. package/dist/decode/decompressFrame.test.js +0 -95
  25. package/dist/decode/decompressFrame.test.js.map +0 -1
  26. package/dist/decode/literals.corruption.test.d.ts +0 -1
  27. package/dist/decode/literals.corruption.test.js +0 -68
  28. package/dist/decode/literals.corruption.test.js.map +0 -1
  29. package/dist/decode/literals.test.d.ts +0 -1
  30. package/dist/decode/literals.test.js +0 -68
  31. package/dist/decode/literals.test.js.map +0 -1
  32. package/dist/decode/reconstruct.test.d.ts +0 -1
  33. package/dist/decode/reconstruct.test.js +0 -42
  34. package/dist/decode/reconstruct.test.js.map +0 -1
  35. package/dist/decode/sequences.corruption.test.d.ts +0 -1
  36. package/dist/decode/sequences.corruption.test.js +0 -32
  37. package/dist/decode/sequences.corruption.test.js.map +0 -1
  38. package/dist/decode/sequences.level1.test.d.ts +0 -1
  39. package/dist/decode/sequences.level1.test.js +0 -35
  40. package/dist/decode/sequences.level1.test.js.map +0 -1
  41. package/dist/decode/sequences.modes.test.d.ts +0 -1
  42. package/dist/decode/sequences.modes.test.js +0 -56
  43. package/dist/decode/sequences.modes.test.js.map +0 -1
  44. package/dist/dictionary/decoderDictionary.test.d.ts +0 -1
  45. package/dist/dictionary/decoderDictionary.test.js +0 -87
  46. package/dist/dictionary/decoderDictionary.test.js.map +0 -1
  47. package/dist/encode/blockWriter.test.d.ts +0 -1
  48. package/dist/encode/blockWriter.test.js +0 -31
  49. package/dist/encode/blockWriter.test.js.map +0 -1
  50. package/dist/encode/compressedBlock.test.d.ts +0 -1
  51. package/dist/encode/compressedBlock.test.js +0 -63
  52. package/dist/encode/compressedBlock.test.js.map +0 -1
  53. package/dist/encode/frameWriter.test.d.ts +0 -1
  54. package/dist/encode/frameWriter.test.js +0 -38
  55. package/dist/encode/frameWriter.test.js.map +0 -1
  56. package/dist/encode/greedySequences.test.d.ts +0 -1
  57. package/dist/encode/greedySequences.test.js +0 -33
  58. package/dist/encode/greedySequences.test.js.map +0 -1
  59. package/dist/entropy/fse.test.d.ts +0 -1
  60. package/dist/entropy/fse.test.js +0 -41
  61. package/dist/entropy/fse.test.js.map +0 -1
  62. package/dist/entropy/huffman.test.d.ts +0 -1
  63. package/dist/entropy/huffman.test.js +0 -22
  64. package/dist/entropy/huffman.test.js.map +0 -1
  65. package/dist/entropy/weights.test.d.ts +0 -1
  66. package/dist/entropy/weights.test.js +0 -38
  67. package/dist/entropy/weights.test.js.map +0 -1
  68. package/dist/errors.test.d.ts +0 -1
  69. package/dist/errors.test.js +0 -16
  70. package/dist/errors.test.js.map +0 -1
  71. package/dist/frame/checksum.test.d.ts +0 -1
  72. package/dist/frame/checksum.test.js +0 -28
  73. package/dist/frame/checksum.test.js.map +0 -1
  74. package/dist/frame/frameHeader.test.d.ts +0 -1
  75. package/dist/frame/frameHeader.test.js +0 -83
  76. package/dist/frame/frameHeader.test.js.map +0 -1
  77. package/dist/frame/skippable.test.d.ts +0 -1
  78. package/dist/frame/skippable.test.js +0 -35
  79. package/dist/frame/skippable.test.js.map +0 -1
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "zstdify",
3
3
  "description": "Pure TypeScript zstd compression library",
4
- "version": "1.0.1",
4
+ "version": "1.0.2",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
@@ -1 +0,0 @@
1
- export {};
@@ -1,25 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import * as bitstream from './bitstream/index.js';
3
- import * as entropy from './entropy/index.js';
4
- import * as frame from './frame/index.js';
5
- import * as root from './index.js';
6
- describe('public barrel exports smoke', () => {
7
- it('exposes root API functions', () => {
8
- expect(typeof root.compress).toBe('function');
9
- expect(typeof root.decompress).toBe('function');
10
- });
11
- it('exposes bitstream helpers', () => {
12
- expect(typeof bitstream.BitReader).toBe('function');
13
- expect(typeof bitstream.BitWriter).toBe('function');
14
- expect(typeof bitstream.readU32LE).toBe('function');
15
- expect(typeof bitstream.encodeVarint).toBe('function');
16
- });
17
- it('exposes entropy and frame helpers', () => {
18
- expect(typeof entropy.buildFSEDecodeTable).toBe('function');
19
- expect(typeof entropy.buildHuffmanDecodeTable).toBe('function');
20
- expect(typeof frame.parseZstdFrame).toBe('function');
21
- expect(typeof frame.validateContentChecksum).toBe('function');
22
- expect(typeof frame.isSkippableFrame).toBe('function');
23
- });
24
- });
25
- //# sourceMappingURL=barrelExports.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"barrelExports.test.js","sourceRoot":"","sources":["../src/barrelExports.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAC1C,OAAO,KAAK,IAAI,MAAM,YAAY,CAAC;AAEnC,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE,CAAC;IAC5C,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE,CAAC;QACrC,MAAM,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC9C,MAAM,CAAC,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAAA,CACjD,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE,CAAC;QACpC,MAAM,CAAC,OAAO,SAAS,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACpD,MAAM,CAAC,OAAO,SAAS,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACpD,MAAM,CAAC,OAAO,SAAS,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACpD,MAAM,CAAC,OAAO,SAAS,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAAA,CACxD,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE,CAAC;QAC5C,MAAM,CAAC,OAAO,OAAO,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC5D,MAAM,CAAC,OAAO,OAAO,CAAC,uBAAuB,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAChE,MAAM,CAAC,OAAO,KAAK,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACrD,MAAM,CAAC,OAAO,KAAK,CAAC,uBAAuB,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC9D,MAAM,CAAC,OAAO,KAAK,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAAA,CACxD,CAAC,CAAC;AAAA,CACJ,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,47 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { BitReader } from './bitReader.js';
3
- describe('BitReader', () => {
4
- it('reads single bits', () => {
5
- // 0b10110100 = 0xB4
6
- const data = new Uint8Array([0xb4]);
7
- const r = new BitReader(data);
8
- expect(r.readBits(1)).toBe(0);
9
- expect(r.readBits(1)).toBe(0);
10
- expect(r.readBits(1)).toBe(1);
11
- expect(r.readBits(1)).toBe(0);
12
- expect(r.readBits(1)).toBe(1);
13
- expect(r.readBits(1)).toBe(1);
14
- expect(r.readBits(1)).toBe(0);
15
- expect(r.readBits(1)).toBe(1);
16
- expect(r.atEnd).toBe(true);
17
- });
18
- it('reads multi-bit values', () => {
19
- const data = new Uint8Array([0xff, 0x00]); // 11111111 00000000
20
- const r = new BitReader(data);
21
- expect(r.readBits(8)).toBe(0xff);
22
- expect(r.readBits(8)).toBe(0x00);
23
- });
24
- it('reads across byte boundaries', () => {
25
- // byte0: 1111 (low) 0000 (high), byte1: 1111 (low) 0000 (high)
26
- const data = new Uint8Array([0b00001111, 0b00001111]);
27
- const r = new BitReader(data);
28
- expect(r.readBits(4)).toBe(0b1111); // low 4 of byte0
29
- expect(r.readBits(8)).toBe(0b11110000); // high 4 of byte0 + low 4 of byte1
30
- expect(r.readBits(4)).toBe(0); // high 4 of byte1
31
- });
32
- it('align works', () => {
33
- const data = new Uint8Array([0xff, 0xab, 0xcd]);
34
- const r = new BitReader(data);
35
- r.readBits(3);
36
- r.align();
37
- expect(r.position).toBe(1);
38
- expect(r.readByte()).toBe(0xab);
39
- });
40
- it('throws on out of bounds', () => {
41
- const data = new Uint8Array([0xff]);
42
- const r = new BitReader(data);
43
- r.readBits(8);
44
- expect(() => r.readBits(1)).toThrow();
45
- });
46
- });
47
- //# sourceMappingURL=bitReader.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bitReader.test.js","sourceRoot":"","sources":["../../src/bitstream/bitReader.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,49 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { BitReaderReverse } from './bitReaderReverse.js';
3
- describe('BitReaderReverse', () => {
4
- it('supports unreadBits to rollback over-read', () => {
5
- const reader = new BitReaderReverse(new Uint8Array([0xa0, 0x01]), 0, 2);
6
- reader.skipPadding();
7
- const first = reader.readBits(2);
8
- expect(first).toBe(2);
9
- reader.unreadBits(1);
10
- expect(reader.readBits(1)).toBe(0);
11
- });
12
- it('zero-fills when reading past stream start', () => {
13
- const reader = new BitReaderReverse(new Uint8Array([0x80]), 0, 1);
14
- reader.skipPadding();
15
- // No payload bits remain after padding; reading still succeeds with zeros.
16
- expect(reader.readBits(4)).toBe(0);
17
- });
18
- it('position returns start byte when bitOffset <= startBit', () => {
19
- const reader = new BitReaderReverse(new Uint8Array([0x80]), 0, 1);
20
- reader.skipPadding();
21
- reader.readBits(4); // consume remaining (zeros)
22
- expect(reader.position).toBe(0);
23
- });
24
- it('position returns correct byte after reading bits', () => {
25
- const reader = new BitReaderReverse(new Uint8Array([0xa0, 0x01]), 0, 2);
26
- reader.skipPadding();
27
- reader.readBits(2);
28
- expect(reader.position).toBeGreaterThanOrEqual(0);
29
- expect(reader.position).toBeLessThanOrEqual(2);
30
- });
31
- it('skipBitsAtEnd advances logical position', () => {
32
- const reader = new BitReaderReverse(new Uint8Array([0x80]), 0, 1);
33
- reader.skipPadding();
34
- reader.skipBitsAtEnd(1);
35
- expect(reader.readBits(1)).toBe(0);
36
- });
37
- it('skipBitsAtEnd throws on buffer underflow', () => {
38
- const reader = new BitReaderReverse(new Uint8Array([0x80]), 0, 1);
39
- reader.skipPadding();
40
- expect(() => reader.skipBitsAtEnd(100)).toThrow(/underflow|RangeError/i);
41
- });
42
- it('unreadBits throws on overflow', () => {
43
- const reader = new BitReaderReverse(new Uint8Array([0xa0, 0x01]), 0, 2);
44
- reader.skipPadding();
45
- reader.readBits(2);
46
- expect(() => reader.unreadBits(20)).toThrow(/overflow|RangeError/i);
47
- });
48
- });
49
- //# sourceMappingURL=bitReaderReverse.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bitReaderReverse.test.js","sourceRoot":"","sources":["../../src/bitstream/bitReaderReverse.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,21 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { readU16LE, readU32LE, readU64LE } from './littleEndian.js';
3
- describe('littleEndian', () => {
4
- it('readU16LE', () => {
5
- const data = new Uint8Array([0x34, 0x12]); // 0x1234
6
- expect(readU16LE(data, 0)).toBe(0x1234);
7
- });
8
- it('readU32LE', () => {
9
- const data = new Uint8Array([0x78, 0x56, 0x34, 0x12]);
10
- expect(readU32LE(data, 0)).toBe(0x12345678);
11
- });
12
- it('readU64LE', () => {
13
- const data = new Uint8Array([0xef, 0xcd, 0xab, 0x89, 0x67, 0x45, 0x23, 0x01]);
14
- expect(readU64LE(data, 0)).toBe(0x0123456789abcdefn);
15
- });
16
- it('throws on out of bounds', () => {
17
- const data = new Uint8Array([1, 2, 3]);
18
- expect(() => readU32LE(data, 0)).toThrow();
19
- });
20
- });
21
- //# sourceMappingURL=littleEndian.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"littleEndian.test.js","sourceRoot":"","sources":["../../src/bitstream/littleEndian.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEpE,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC;IAC7B,EAAE,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC;QACpB,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;QACpD,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAAA,CACzC,CAAC,CAAC;IAEH,EAAE,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC;QACpB,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QACtD,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAAA,CAC7C,CAAC,CAAC;IAEH,EAAE,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC;QACpB,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAC9E,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAAA,CACtD,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IAAA,CAC5C,CAAC,CAAC;AAAA,CACJ,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,25 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { decodeVarint, encodeVarint } from './varint.js';
3
- describe('varint', () => {
4
- it('encodes and decodes small values', () => {
5
- for (const v of [0, 1, 127, 128, 255, 256, 16383]) {
6
- const encoded = encodeVarint(v);
7
- const { value, bytesRead } = decodeVarint(encoded, 0);
8
- expect(value).toBe(v);
9
- expect(bytesRead).toBe(encoded.length);
10
- }
11
- });
12
- it('decodes single-byte varint', () => {
13
- const data = new Uint8Array([0x7f]); // 127, no continuation
14
- const { value, bytesRead } = decodeVarint(data, 0);
15
- expect(value).toBe(127);
16
- expect(bytesRead).toBe(1);
17
- });
18
- it('decodes two-byte varint', () => {
19
- const data = new Uint8Array([0x80, 0x01]); // 128 = 0x80 | 0x01<<7
20
- const { value, bytesRead } = decodeVarint(data, 0);
21
- expect(value).toBe(128);
22
- expect(bytesRead).toBe(2);
23
- });
24
- });
25
- //# sourceMappingURL=varint.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"varint.test.js","sourceRoot":"","sources":["../../src/bitstream/varint.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEzD,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC;IACvB,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE,CAAC;QAC3C,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC;YAClD,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;YAChC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACtD,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACtB,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACzC,CAAC;IAAA,CACF,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,uBAAuB;QAC5D,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACnD,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxB,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAAA,CAC3B,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,uBAAuB;QAClE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACnD,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxB,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAAA,CAC3B,CAAC,CAAC;AAAA,CACJ,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,39 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { compress } from './compress.js';
3
- import { parseBlockHeader } from './decode/block.js';
4
- import { parseZstdFrame } from './frame/frameHeader.js';
5
- function firstBlockType(frame) {
6
- const { header } = parseZstdFrame(frame, 0);
7
- const blockOffset = 4 + header.headerSize;
8
- return parseBlockHeader(frame, blockOffset).blockType;
9
- }
10
- describe('compress branch behavior', () => {
11
- it('uses raw block path at level=0', () => {
12
- const input = new Uint8Array(4096);
13
- input.fill(0x61);
14
- const encoded = compress(input, { level: 0 });
15
- expect(firstBlockType(encoded)).toBe(0);
16
- });
17
- it('uses RLE for repeated bytes and raw for non-repeated bytes at level=1', () => {
18
- const repeated = new Uint8Array(2048);
19
- repeated.fill(0x7a);
20
- const repeatedEncoded = compress(repeated, { level: 1 });
21
- expect(firstBlockType(repeatedEncoded)).toBe(1);
22
- const mixed = new Uint8Array(2048);
23
- for (let i = 0; i < mixed.length; i++)
24
- mixed[i] = i & 0xff;
25
- const mixedEncoded = compress(mixed, { level: 1 });
26
- expect(firstBlockType(mixedEncoded)).toBe(0);
27
- });
28
- it('at level>1 chooses compressed block when smaller and falls back when not smaller', () => {
29
- const repeatedPattern = new TextEncoder().encode('abcabcabcabcabcabcabcabcabcabc'.repeat(256));
30
- const compressedChoice = compress(repeatedPattern, { level: 3 });
31
- expect(firstBlockType(compressedChoice)).toBe(2);
32
- const noMatches = new Uint8Array(64);
33
- for (let i = 0; i < noMatches.length; i++)
34
- noMatches[i] = i;
35
- const fallbackChoice = compress(noMatches, { level: 3 });
36
- expect(firstBlockType(fallbackChoice)).toBe(0);
37
- });
38
- });
39
- //# sourceMappingURL=compress.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"compress.test.js","sourceRoot":"","sources":["../src/compress.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,26 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { parseBlockHeader } from './block.js';
3
- describe('block', () => {
4
- it('parses raw block header (last=1, type=0, size=5)', () => {
5
- // last=1, type=0, size=5 -> (5<<3)|0<<1|1 = 41
6
- const data = new Uint8Array([0x29, 0x00, 0x00]);
7
- const block = parseBlockHeader(data, 0);
8
- expect(block.lastBlock).toBe(true);
9
- expect(block.blockType).toBe(0);
10
- expect(block.blockSize).toBe(5);
11
- });
12
- it('throws on reserved block type 3', () => {
13
- // last=0, type=3, size=0
14
- const data = new Uint8Array([0x06, 0x00, 0x00]);
15
- expect(() => parseBlockHeader(data, 0)).toThrow(/Reserved block type|corruption/i);
16
- });
17
- it('throws when block header is truncated', () => {
18
- const data = new Uint8Array([0x28, 0xb5]);
19
- expect(() => parseBlockHeader(data, 0)).toThrow(/Block header truncated|corruption/i);
20
- });
21
- it('throws when offset + 3 exceeds data length', () => {
22
- const data = new Uint8Array([0x29, 0x00]);
23
- expect(() => parseBlockHeader(data, 0)).toThrow(/truncated|corruption/i);
24
- });
25
- });
26
- //# sourceMappingURL=block.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"block.test.js","sourceRoot":"","sources":["../../src/decode/block.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9C,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC;IACtB,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE,CAAC;QAC3D,+CAA+C;QAC/C,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAAA,CACjC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE,CAAC;QAC1C,yBAAyB;QACzB,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC;IAAA,CACpF,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE,CAAC;QAChD,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC;IAAA,CACvF,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE,CAAC;QACrD,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAAA,CAC1E,CAAC,CAAC;AAAA,CACJ,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,95 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { BitWriter } from '../bitstream/bitWriter.js';
3
- import { readU32LE } from '../bitstream/littleEndian.js';
4
- import { writeRawBlock, writeRLEBlock } from '../encode/blockWriter.js';
5
- import { writeFrameHeader } from '../encode/frameWriter.js';
6
- import { computeContentChecksum32 } from '../frame/checksum.js';
7
- import { parseZstdFrame } from '../frame/frameHeader.js';
8
- import { decompressFrame } from './decompressFrame.js';
9
- function concatBytes(...chunks) {
10
- const total = chunks.reduce((sum, chunk) => sum + chunk.length, 0);
11
- const out = new Uint8Array(total);
12
- let pos = 0;
13
- for (const chunk of chunks) {
14
- out.set(chunk, pos);
15
- pos += chunk.length;
16
- }
17
- return out;
18
- }
19
- function checksumBytes(data) {
20
- const checksum = computeContentChecksum32(data);
21
- return new Uint8Array([checksum & 0xff, (checksum >>> 8) & 0xff, (checksum >>> 16) & 0xff, (checksum >>> 24) & 0xff]);
22
- }
23
- describe('decompressFrame', () => {
24
- it('decodes an RLE block path', () => {
25
- const expected = new Uint8Array(5);
26
- expected.fill(0x61);
27
- const frame = concatBytes(writeFrameHeader(expected.length, false), writeRLEBlock(0x61, expected.length, true));
28
- const { header } = parseZstdFrame(frame, 0);
29
- const result = decompressFrame(frame, 0, header);
30
- expect(result.output).toEqual(expected);
31
- });
32
- it('decodes compressed block with empty sequence section', () => {
33
- const literals = new TextEncoder().encode('abc');
34
- const literalsSection = concatBytes(new Uint8Array([(literals.length << 3) | 0]), literals);
35
- const compressedBlockHeader = new Uint8Array([0x25, 0x00, 0x00]); // last=1, type=2, size=4
36
- const frame = concatBytes(writeFrameHeader(literals.length, false), compressedBlockHeader, literalsSection);
37
- const { header } = parseZstdFrame(frame, 0);
38
- const result = decompressFrame(frame, 0, header);
39
- expect(result.output).toEqual(literals);
40
- });
41
- it('rejects truncated checksum and checksum mismatch', () => {
42
- const payload = new TextEncoder().encode('hello');
43
- const header = writeFrameHeader(payload.length, true);
44
- const rawBlock = writeRawBlock(payload, 0, payload.length, true);
45
- const truncated = concatBytes(header, rawBlock);
46
- const parsedTruncated = parseZstdFrame(truncated, 0).header;
47
- expect(() => decompressFrame(truncated, 0, parsedTruncated)).toThrowError(/checksum truncated/i);
48
- const validChecksum = checksumBytes(payload);
49
- const mismatch = concatBytes(header, rawBlock, validChecksum);
50
- const last = mismatch.length - 1;
51
- mismatch[last] = (mismatch[last] ?? 0) ^ 0xff;
52
- const parsedMismatch = parseZstdFrame(mismatch, 0).header;
53
- expect(() => decompressFrame(mismatch, 0, parsedMismatch)).toThrowError(/checksum mismatch/i);
54
- });
55
- it('rejects frame content-size mismatch', () => {
56
- const payload = new TextEncoder().encode('hello');
57
- const frame = concatBytes(writeFrameHeader(payload.length, false), writeRawBlock(payload, 0, payload.length - 1, true));
58
- const { header } = parseZstdFrame(frame, 0);
59
- expect(() => decompressFrame(frame, 0, header)).toThrowError(/content size mismatch/i);
60
- });
61
- it('rejects when in-frame decompressed output exceeds maxSize', () => {
62
- const payload = new TextEncoder().encode('hello');
63
- const frame = concatBytes(writeFrameHeader(payload.length, false), writeRawBlock(payload, 0, payload.length, true));
64
- const { header } = parseZstdFrame(frame, 0);
65
- expect(() => decompressFrame(frame, 0, header, null, 4)).toThrowError(/maxSize/i);
66
- });
67
- it('rejects treeless literals when no previous Huffman table exists', () => {
68
- const writer = new BitWriter();
69
- writer.writeBits(2, 3); // blockType = treeless
70
- writer.writeBits(2, 0); // sizeFormat = 0 (10-bit fields)
71
- writer.writeBits(10, 1); // regeneratedSize
72
- writer.writeBits(10, 1); // compressedSize
73
- const literalsHeader = writer.flush();
74
- const blockContent = concatBytes(literalsHeader, new Uint8Array([0x00]));
75
- const blockHeaderWord = (blockContent.length << 3) | (2 << 1) | 1; // compressed block
76
- const blockHeader = new Uint8Array([
77
- blockHeaderWord & 0xff,
78
- (blockHeaderWord >>> 8) & 0xff,
79
- (blockHeaderWord >>> 16) & 0xff,
80
- ]);
81
- const frame = concatBytes(writeFrameHeader(1, false), blockHeader, blockContent);
82
- const { header } = parseZstdFrame(frame, 0);
83
- expect(() => decompressFrame(frame, 0, header)).toThrowError(/Treeless literals without previous Huffman table/i);
84
- });
85
- it('reports consumed bytes including checksum bytes', () => {
86
- const payload = new TextEncoder().encode('world');
87
- const frame = concatBytes(writeFrameHeader(payload.length, true), writeRawBlock(payload, 0, payload.length, true), checksumBytes(payload));
88
- const { header } = parseZstdFrame(frame, 0);
89
- const result = decompressFrame(frame, 0, header);
90
- const stored = readU32LE(frame, frame.length - 4);
91
- expect(stored).toBe(computeContentChecksum32(payload));
92
- expect(result.bytesConsumed).toBe(frame.length);
93
- });
94
- });
95
- //# sourceMappingURL=decompressFrame.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"decompressFrame.test.js","sourceRoot":"","sources":["../../src/decode/decompressFrame.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,68 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { decodeCompressedLiterals, decodeRawLiterals, decodeRLELiterals, decodeTreelessLiterals, parseLiteralsSectionHeader, } from './literals.js';
3
- describe('literals corruption handling', () => {
4
- it('rejects truncated literals section header', () => {
5
- const data = new Uint8Array([0x24]); // compressed literals sizeFormat=1 requires 3-byte header
6
- expect(() => parseLiteralsSectionHeader(data, 0)).toThrowError(/header truncated/i);
7
- });
8
- it('rejects raw literals overrun', () => {
9
- const data = new Uint8Array([0x61, 0x62]);
10
- expect(() => decodeRawLiterals(data, 0, 3)).toThrowError(/Raw literals truncated/i);
11
- });
12
- it('rejects rle literals when source byte is missing', () => {
13
- const data = new Uint8Array([]);
14
- expect(() => decodeRLELiterals(data, 0, 10)).toThrowError(/RLE literals truncated/i);
15
- });
16
- it('rejects invalid compressed literals size', () => {
17
- const data = new Uint8Array([0x80]); // direct weights header with 1 weight; no stream payload
18
- expect(() => decodeCompressedLiterals(data, 0, 1, 16, 1)).toThrowError(/truncated|Invalid literals compressed size/i);
19
- });
20
- it('rejects treeless 4-stream with compressedSize < 10', () => {
21
- const table = decodeCompressedLiterals(new Uint8Array([129, 0x10, 0x02]), 0, 3, 1, 1).huffmanTable;
22
- const data = new Uint8Array(9);
23
- expect(() => decodeTreelessLiterals(data, 0, 9, 100, 4, table)).toThrowError(/4-stream mode requires at least 10 bytes/i);
24
- });
25
- it('rejects compressed literals 4-stream jump table with negative stream4', () => {
26
- const data = new Uint8Array([
27
- 129,
28
- 0x10, // tree
29
- 0x0a,
30
- 0x00, // s1 = 10
31
- 0x0a,
32
- 0x00, // s2 = 10
33
- 0x0a,
34
- 0x00, // s3 = 10
35
- 0x01,
36
- 0x01,
37
- 0x01,
38
- 0x01,
39
- 0x01,
40
- 0x01,
41
- 0x01,
42
- 0x01,
43
- 0x01,
44
- 0x01,
45
- ]);
46
- expect(() => decodeCompressedLiterals(data, 0, 12, 4, 4)).toThrowError(/Invalid jump table/i);
47
- });
48
- it('rejects treeless literals 4-stream jump table with negative stream4', () => {
49
- const table = decodeCompressedLiterals(new Uint8Array([129, 0x10, 0x02]), 0, 3, 1, 1).huffmanTable;
50
- const data = new Uint8Array([0x0a, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x01, 0x01, 0x01, 0x01]);
51
- expect(() => decodeTreelessLiterals(data, 0, 10, 4, 4, table)).toThrowError(/Invalid jump table/i);
52
- });
53
- it('rejects Huffman stream with invalid end marker in 4-stream treeless mode', () => {
54
- const table = decodeCompressedLiterals(new Uint8Array([129, 0x10, 0x02]), 0, 3, 1, 1).huffmanTable;
55
- // Jump table: 1,1,1 and stream4=1. First stream byte is 0x00 => invalid end marker.
56
- const data = new Uint8Array([0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01]);
57
- expect(() => decodeTreelessLiterals(data, 0, 10, 4, 4, table)).toThrowError(/invalid end marker/i);
58
- });
59
- it('rejects malformed Huffman stream termination in 4-stream treeless mode', () => {
60
- const malformedTable = {
61
- table: [{ symbol: 0, numBits: 2 }],
62
- maxNumBits: 2,
63
- };
64
- const data = new Uint8Array([0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x01, 0x01, 0x01]);
65
- expect(() => decodeTreelessLiterals(data, 0, 10, 4, 4, malformedTable)).toThrowError(/did not end cleanly/i);
66
- });
67
- });
68
- //# sourceMappingURL=literals.corruption.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"literals.corruption.test.js","sourceRoot":"","sources":["../../src/decode/literals.corruption.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,68 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { BitWriter } from '../bitstream/bitWriter.js';
3
- import { decodeCompressedLiterals, decodeTreelessLiterals, parseLiteralsSectionHeader } from './literals.js';
4
- describe('literals header parsing', () => {
5
- it('parses compressed literals header with bit-accurate layout', () => {
6
- const writer = new BitWriter();
7
- writer.writeBits(2, 2); // blockType=Compressed
8
- writer.writeBits(2, 1); // sizeFormat=1 => 4 streams, 10-bit sizes
9
- writer.writeBits(10, 513); // regeneratedSize
10
- writer.writeBits(10, 700); // compressedSize
11
- const headerBytes = writer.flush();
12
- const { header, dataOffset } = parseLiteralsSectionHeader(headerBytes, 0);
13
- expect(header.blockType).toBe(2);
14
- expect(header.numStreams).toBe(4);
15
- expect(header.regeneratedSize).toBe(513);
16
- expect(header.compressedSize).toBe(700);
17
- expect(header.headerSize).toBe(3);
18
- expect(dataOffset).toBe(3);
19
- });
20
- it('parses raw literals header with sizeFormat=3', () => {
21
- const data = new Uint8Array([0x5c, 0x32, 0x00]); // blockType=0, sizeFormat=3, regeneratedSize=0x325
22
- const { header, dataOffset } = parseLiteralsSectionHeader(data, 0);
23
- expect(header.blockType).toBe(0);
24
- expect(header.regeneratedSize).toBe(0x325);
25
- expect(header.headerSize).toBe(3);
26
- expect(dataOffset).toBe(3);
27
- });
28
- it('parses RLE literals header with sizeFormat=3', () => {
29
- const data = new Uint8Array([0xad, 0x01, 0x00]); // blockType=1, sizeFormat=3, regeneratedSize=0x1a
30
- const { header, dataOffset } = parseLiteralsSectionHeader(data, 0);
31
- expect(header.blockType).toBe(1);
32
- expect(header.regeneratedSize).toBe(0x1a);
33
- expect(header.headerSize).toBe(3);
34
- expect(dataOffset).toBe(3);
35
- });
36
- });
37
- describe('decodeCompressedLiterals', () => {
38
- it('decodes minimal single-symbol Huffman (direct weights, 1 stream)', () => {
39
- // headerByte=129 => numWeights=2, then 1 byte with nibbles [1,0] => symbol 0 has weight 1 (1 bit)
40
- // stream: 1 byte; last byte must be non-zero (end marker). Bit 0 = data (0), bit 1 = end => 0x02
41
- const data = new Uint8Array([129, 0x10, 0x02]);
42
- const result = decodeCompressedLiterals(data, 0, 3, 1, 1);
43
- expect(result.literals).toEqual(new Uint8Array([0]));
44
- expect(result.bytesRead).toBe(3);
45
- expect(result.huffmanTable.table).toBeDefined();
46
- expect(result.huffmanTable.maxNumBits).toBe(1);
47
- });
48
- it('decodes multiple symbols with single-symbol tree', () => {
49
- // Same tree (symbol 0, 1 bit). Stream: 3 data bits (0,0,0) + end at bit 3 => 0x08
50
- const data = new Uint8Array([129, 0x10, 0x08]);
51
- const result = decodeCompressedLiterals(data, 0, 3, 3, 1);
52
- expect(result.literals).toEqual(new Uint8Array([0, 0, 0]));
53
- expect(result.bytesRead).toBe(3);
54
- });
55
- });
56
- describe('decodeTreelessLiterals', () => {
57
- it('decodes treeless literals reusing previous Huffman table (1 stream)', () => {
58
- // First get a table from compressed literals
59
- const compressed = new Uint8Array([129, 0x10, 0x02]);
60
- const { huffmanTable } = decodeCompressedLiterals(compressed, 0, 3, 1, 1);
61
- // Treeless: no tree, just stream. Same 1-symbol stream: 1 byte with end marker 0x02
62
- const treelessData = new Uint8Array([0x02]);
63
- const result = decodeTreelessLiterals(treelessData, 0, 1, 1, 1, huffmanTable);
64
- expect(result.literals).toEqual(new Uint8Array([0]));
65
- expect(result.bytesRead).toBe(1);
66
- });
67
- });
68
- //# sourceMappingURL=literals.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"literals.test.js","sourceRoot":"","sources":["../../src/decode/literals.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};