zstdify 1.0.1 → 1.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 (92) hide show
  1. package/README.md +27 -2
  2. package/dist/compress.d.ts +5 -0
  3. package/dist/compress.js +13 -1
  4. package/dist/compress.js.map +1 -1
  5. package/dist/dictionary/generateDictionary.d.ts +59 -0
  6. package/dist/dictionary/generateDictionary.js +187 -0
  7. package/dist/dictionary/generateDictionary.js.map +1 -0
  8. package/dist/encode/frameWriter.d.ts +1 -1
  9. package/dist/encode/frameWriter.js +26 -1
  10. package/dist/encode/frameWriter.js.map +1 -1
  11. package/dist/index.d.ts +1 -0
  12. package/dist/index.js +1 -0
  13. package/dist/index.js.map +1 -1
  14. package/package.json +1 -1
  15. package/dist/barrelExports.test.d.ts +0 -1
  16. package/dist/barrelExports.test.js +0 -25
  17. package/dist/barrelExports.test.js.map +0 -1
  18. package/dist/bitstream/bitReader.test.d.ts +0 -1
  19. package/dist/bitstream/bitReader.test.js +0 -47
  20. package/dist/bitstream/bitReader.test.js.map +0 -1
  21. package/dist/bitstream/bitReaderReverse.test.d.ts +0 -1
  22. package/dist/bitstream/bitReaderReverse.test.js +0 -49
  23. package/dist/bitstream/bitReaderReverse.test.js.map +0 -1
  24. package/dist/bitstream/littleEndian.test.d.ts +0 -1
  25. package/dist/bitstream/littleEndian.test.js +0 -21
  26. package/dist/bitstream/littleEndian.test.js.map +0 -1
  27. package/dist/bitstream/varint.test.d.ts +0 -1
  28. package/dist/bitstream/varint.test.js +0 -25
  29. package/dist/bitstream/varint.test.js.map +0 -1
  30. package/dist/compress.test.d.ts +0 -1
  31. package/dist/compress.test.js +0 -39
  32. package/dist/compress.test.js.map +0 -1
  33. package/dist/decode/block.test.d.ts +0 -1
  34. package/dist/decode/block.test.js +0 -26
  35. package/dist/decode/block.test.js.map +0 -1
  36. package/dist/decode/decompressFrame.test.d.ts +0 -1
  37. package/dist/decode/decompressFrame.test.js +0 -95
  38. package/dist/decode/decompressFrame.test.js.map +0 -1
  39. package/dist/decode/literals.corruption.test.d.ts +0 -1
  40. package/dist/decode/literals.corruption.test.js +0 -68
  41. package/dist/decode/literals.corruption.test.js.map +0 -1
  42. package/dist/decode/literals.test.d.ts +0 -1
  43. package/dist/decode/literals.test.js +0 -68
  44. package/dist/decode/literals.test.js.map +0 -1
  45. package/dist/decode/reconstruct.test.d.ts +0 -1
  46. package/dist/decode/reconstruct.test.js +0 -42
  47. package/dist/decode/reconstruct.test.js.map +0 -1
  48. package/dist/decode/sequences.corruption.test.d.ts +0 -1
  49. package/dist/decode/sequences.corruption.test.js +0 -32
  50. package/dist/decode/sequences.corruption.test.js.map +0 -1
  51. package/dist/decode/sequences.level1.test.d.ts +0 -1
  52. package/dist/decode/sequences.level1.test.js +0 -35
  53. package/dist/decode/sequences.level1.test.js.map +0 -1
  54. package/dist/decode/sequences.modes.test.d.ts +0 -1
  55. package/dist/decode/sequences.modes.test.js +0 -56
  56. package/dist/decode/sequences.modes.test.js.map +0 -1
  57. package/dist/dictionary/decoderDictionary.test.d.ts +0 -1
  58. package/dist/dictionary/decoderDictionary.test.js +0 -87
  59. package/dist/dictionary/decoderDictionary.test.js.map +0 -1
  60. package/dist/encode/blockWriter.test.d.ts +0 -1
  61. package/dist/encode/blockWriter.test.js +0 -31
  62. package/dist/encode/blockWriter.test.js.map +0 -1
  63. package/dist/encode/compressedBlock.test.d.ts +0 -1
  64. package/dist/encode/compressedBlock.test.js +0 -63
  65. package/dist/encode/compressedBlock.test.js.map +0 -1
  66. package/dist/encode/frameWriter.test.d.ts +0 -1
  67. package/dist/encode/frameWriter.test.js +0 -38
  68. package/dist/encode/frameWriter.test.js.map +0 -1
  69. package/dist/encode/greedySequences.test.d.ts +0 -1
  70. package/dist/encode/greedySequences.test.js +0 -33
  71. package/dist/encode/greedySequences.test.js.map +0 -1
  72. package/dist/entropy/fse.test.d.ts +0 -1
  73. package/dist/entropy/fse.test.js +0 -41
  74. package/dist/entropy/fse.test.js.map +0 -1
  75. package/dist/entropy/huffman.test.d.ts +0 -1
  76. package/dist/entropy/huffman.test.js +0 -22
  77. package/dist/entropy/huffman.test.js.map +0 -1
  78. package/dist/entropy/weights.test.d.ts +0 -1
  79. package/dist/entropy/weights.test.js +0 -38
  80. package/dist/entropy/weights.test.js.map +0 -1
  81. package/dist/errors.test.d.ts +0 -1
  82. package/dist/errors.test.js +0 -16
  83. package/dist/errors.test.js.map +0 -1
  84. package/dist/frame/checksum.test.d.ts +0 -1
  85. package/dist/frame/checksum.test.js +0 -28
  86. package/dist/frame/checksum.test.js.map +0 -1
  87. package/dist/frame/frameHeader.test.d.ts +0 -1
  88. package/dist/frame/frameHeader.test.js +0 -83
  89. package/dist/frame/frameHeader.test.js.map +0 -1
  90. package/dist/frame/skippable.test.d.ts +0 -1
  91. package/dist/frame/skippable.test.js +0 -35
  92. package/dist/frame/skippable.test.js.map +0 -1
@@ -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 {};
@@ -1,42 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { executeSequences } from './reconstruct.js';
3
- describe('executeSequences', () => {
4
- it('does not over-allocate output when sequences consume literals', () => {
5
- const literals = new TextEncoder().encode('abcd');
6
- const sequences = [
7
- {
8
- literalsLength: 4, // "abcd"
9
- offset: 7, // offsetValue 7 => actual offset 4
10
- matchLength: 2,
11
- },
12
- ];
13
- const output = executeSequences(literals, sequences, 128 * 1024);
14
- expect(new TextDecoder().decode(output)).toBe('abcdab');
15
- expect(output.length).toBe(6);
16
- });
17
- it('supports match copies from previous block history', () => {
18
- const history = new TextEncoder().encode('wxyz');
19
- const literals = new Uint8Array(0);
20
- const sequences = [
21
- {
22
- literalsLength: 0,
23
- offset: 7, // Offset_Value 7 => actual offset 4
24
- matchLength: 4,
25
- },
26
- ];
27
- const output = executeSequences(literals, sequences, 128 * 1024, [1, 4, 8], history);
28
- expect(new TextDecoder().decode(output)).toBe('wxyz');
29
- });
30
- it('rejects rep1-1 when it becomes zero', () => {
31
- const literals = new Uint8Array(0);
32
- const sequences = [
33
- {
34
- literalsLength: 0,
35
- offset: 3,
36
- matchLength: 1,
37
- },
38
- ];
39
- expect(() => executeSequences(literals, sequences, 128 * 1024, [1, 4, 8])).toThrowError(/repeat1-1/i);
40
- });
41
- });
42
- //# sourceMappingURL=reconstruct.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"reconstruct.test.js","sourceRoot":"","sources":["../../src/decode/reconstruct.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAiB,MAAM,kBAAkB,CAAC;AAEnE,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC;IACjC,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE,CAAC;QACxE,MAAM,QAAQ,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAClD,MAAM,SAAS,GAAe;YAC5B;gBACE,cAAc,EAAE,CAAC,EAAE,SAAS;gBAC5B,MAAM,EAAE,CAAC,EAAE,mCAAmC;gBAC9C,WAAW,EAAE,CAAC;aACf;SACF,CAAC;QAEF,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,GAAG,IAAI,CAAC,CAAC;QACjE,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAAA,CAC/B,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE,CAAC;QAC5D,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,SAAS,GAAe;YAC5B;gBACE,cAAc,EAAE,CAAC;gBACjB,MAAM,EAAE,CAAC,EAAE,oCAAoC;gBAC/C,WAAW,EAAE,CAAC;aACf;SACF,CAAC;QAEF,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,GAAG,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACrF,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAAA,CACvD,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE,CAAC;QAC9C,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,SAAS,GAAe;YAC5B;gBACE,cAAc,EAAE,CAAC;gBACjB,MAAM,EAAE,CAAC;gBACT,WAAW,EAAE,CAAC;aACf;SACF,CAAC;QAEF,MAAM,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,GAAG,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;IAAA,CACvG,CAAC,CAAC;AAAA,CACJ,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,32 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { decodeSequences } from './sequences.js';
3
- describe('decodeSequences corruption handling', () => {
4
- it('rejects truncated sequences section header', () => {
5
- const data = new Uint8Array([0x01]);
6
- expect(() => decodeSequences(data, 0, data.length, null)).toThrowError(/too short|truncated/i);
7
- });
8
- it('rejects reserved bits set in modes byte', () => {
9
- const data = new Uint8Array([
10
- 0x01, // numSequences
11
- 0x01, // reserved low 2 bits set
12
- ]);
13
- expect(() => decodeSequences(data, 0, data.length, null)).toThrowError(/reserved bits/i);
14
- });
15
- it('rejects repeat mode without previous tables', () => {
16
- const data = new Uint8Array([
17
- 0x01, // numSequences
18
- 0xc0, // llMode=3 (repeat), of/ml default
19
- 0xff, // bitstream marker byte
20
- ]);
21
- expect(() => decodeSequences(data, 0, data.length, null)).toThrowError(/Repeat_Mode/i);
22
- });
23
- it('rejects bitstream too short for initial states', () => {
24
- const data = new Uint8Array([
25
- 0x01, // numSequences
26
- 0x00, // predefined tables for LL/OF/ML
27
- 0x80, // valid reverse end marker but only 1 byte of bitstream
28
- ]);
29
- expect(() => decodeSequences(data, 0, data.length, null)).toThrowError(/too short for initial states/i);
30
- });
31
- });
32
- //# sourceMappingURL=sequences.corruption.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sequences.corruption.test.js","sourceRoot":"","sources":["../../src/decode/sequences.corruption.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,QAAQ,CAAC,qCAAqC,EAAE,GAAG,EAAE,CAAC;IACpD,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE,CAAC;QACrD,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,sBAAsB,CAAC,CAAC;IAAA,CAChG,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE,CAAC;QAClD,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC;YAC1B,IAAI,EAAE,eAAe;YACrB,IAAI,EAAE,0BAA0B;SACjC,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC;IAAA,CAC1F,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE,CAAC;QACtD,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC;YAC1B,IAAI,EAAE,eAAe;YACrB,IAAI,EAAE,mCAAmC;YACzC,IAAI,EAAE,wBAAwB;SAC/B,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;IAAA,CACxF,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE,CAAC;QACzD,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC;YAC1B,IAAI,EAAE,eAAe;YACrB,IAAI,EAAE,iCAAiC;YACvC,IAAI,EAAE,wDAAwD;SAC/D,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,+BAA+B,CAAC,CAAC;IAAA,CACzG,CAAC,CAAC;AAAA,CACJ,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,35 +0,0 @@
1
- import * as fs from 'node:fs';
2
- import * as path from 'node:path';
3
- import { fileURLToPath } from 'node:url';
4
- import { describe, expect, it } from 'vitest';
5
- import { parseFrameHeader } from '../frame/frameHeader.js';
6
- import { parseBlockHeader } from './block.js';
7
- import { decodeRawLiterals, parseLiteralsSectionHeader } from './literals.js';
8
- import { executeSequences } from './reconstruct.js';
9
- import { decodeSequences } from './sequences.js';
10
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
11
- const fixturePath = path.join(__dirname, '../../../zstdify-tests/fixtures/level1.zst');
12
- describe('sequence internals (level1 fixture)', () => {
13
- it('decodes exact sequence tuple and reconstructs output length', () => {
14
- if (!fs.existsSync(fixturePath)) {
15
- console.warn('Skipping: run "echo -n "hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world " | zstd -c --no-check -1 > packages/zstdify-tests/fixtures/level1.zst"');
16
- return;
17
- }
18
- const data = new Uint8Array(fs.readFileSync(fixturePath));
19
- const header = parseFrameHeader(data, 4);
20
- let pos = 4 + header.headerSize;
21
- const block = parseBlockHeader(data, pos);
22
- pos += 3;
23
- const blockContent = data.subarray(pos, pos + block.blockSize);
24
- const { header: litHeader, dataOffset } = parseLiteralsSectionHeader(blockContent, 0);
25
- expect(litHeader.blockType).toBe(0); // Raw literals for this fixture.
26
- const literals = decodeRawLiterals(blockContent, dataOffset, litHeader.regeneratedSize);
27
- const litBytesConsumed = litHeader.headerSize + litHeader.regeneratedSize;
28
- const seq = decodeSequences(blockContent, litBytesConsumed, block.blockSize - litBytesConsumed, null);
29
- expect(seq.sequences).toEqual([{ literalsLength: 12, offset: 15, matchLength: 108 }]);
30
- const output = executeSequences(literals, seq.sequences, header.windowSize, [1, 4, 8]);
31
- expect(output.length).toBe(120);
32
- expect(new TextDecoder().decode(output)).toBe('hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world ');
33
- });
34
- });
35
- //# sourceMappingURL=sequences.level1.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sequences.level1.test.js","sourceRoot":"","sources":["../../src/decode/sequences.level1.test.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,4CAA4C,CAAC,CAAC;AAEvF,QAAQ,CAAC,qCAAqC,EAAE,GAAG,EAAE,CAAC;IACpD,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE,CAAC;QACtE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAChC,OAAO,CAAC,IAAI,CACV,yNAAyN,CAC1N,CAAC;YACF,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC;QAC1D,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACzC,IAAI,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC;QAChC,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC1C,GAAG,IAAI,CAAC,CAAC;QACT,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;QAE/D,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,0BAA0B,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;QACtF,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,iCAAiC;QACtE,MAAM,QAAQ,GAAG,iBAAiB,CAAC,YAAY,EAAE,UAAU,EAAE,SAAS,CAAC,eAAe,CAAC,CAAC;QACxF,MAAM,gBAAgB,GAAG,SAAS,CAAC,UAAU,GAAG,SAAS,CAAC,eAAe,CAAC;QAE1E,MAAM,GAAG,GAAG,eAAe,CAAC,YAAY,EAAE,gBAAgB,EAAE,KAAK,CAAC,SAAS,GAAG,gBAAgB,EAAE,IAAI,CAAC,CAAC;QACtG,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAEtF,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,EAAE,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACvF,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChC,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAC3C,0HAA0H,CAC3H,CAAC;IAAA,CACH,CAAC,CAAC;AAAA,CACJ,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- export {};