7z-iterator 0.1.5 → 0.1.6

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 (38) hide show
  1. package/dist/cjs/sevenz/SevenZipParser.d.cts +4 -1
  2. package/dist/cjs/sevenz/SevenZipParser.d.ts +4 -1
  3. package/dist/cjs/sevenz/SevenZipParser.js +45 -7
  4. package/dist/cjs/sevenz/SevenZipParser.js.map +1 -1
  5. package/dist/cjs/sevenz/codecs/Bcj2.js +17 -4
  6. package/dist/cjs/sevenz/codecs/Bcj2.js.map +1 -1
  7. package/dist/cjs/sevenz/codecs/Lzma.js +2 -1
  8. package/dist/cjs/sevenz/codecs/Lzma.js.map +1 -1
  9. package/dist/cjs/sevenz/codecs/Lzma2.d.cts +2 -2
  10. package/dist/cjs/sevenz/codecs/Lzma2.d.ts +2 -2
  11. package/dist/cjs/sevenz/codecs/Lzma2.js +30 -6
  12. package/dist/cjs/sevenz/codecs/Lzma2.js.map +1 -1
  13. package/dist/cjs/sevenz/codecs/streams.d.cts +7 -1
  14. package/dist/cjs/sevenz/codecs/streams.d.ts +7 -1
  15. package/dist/cjs/sevenz/codecs/streams.js +47 -17
  16. package/dist/cjs/sevenz/codecs/streams.js.map +1 -1
  17. package/dist/cjs/sevenz/constants.d.cts +1 -0
  18. package/dist/cjs/sevenz/constants.d.ts +1 -0
  19. package/dist/cjs/sevenz/constants.js +2 -1
  20. package/dist/cjs/sevenz/constants.js.map +1 -1
  21. package/dist/esm/sevenz/SevenZipParser.d.ts +4 -1
  22. package/dist/esm/sevenz/SevenZipParser.js +45 -7
  23. package/dist/esm/sevenz/SevenZipParser.js.map +1 -1
  24. package/dist/esm/sevenz/codecs/Bcj2.js +17 -4
  25. package/dist/esm/sevenz/codecs/Bcj2.js.map +1 -1
  26. package/dist/esm/sevenz/codecs/Lzma.js +2 -1
  27. package/dist/esm/sevenz/codecs/Lzma.js.map +1 -1
  28. package/dist/esm/sevenz/codecs/Lzma2.d.ts +2 -2
  29. package/dist/esm/sevenz/codecs/Lzma2.js +31 -7
  30. package/dist/esm/sevenz/codecs/Lzma2.js.map +1 -1
  31. package/dist/esm/sevenz/codecs/streams.d.ts +7 -1
  32. package/dist/esm/sevenz/codecs/streams.js +53 -17
  33. package/dist/esm/sevenz/codecs/streams.js.map +1 -1
  34. package/dist/esm/sevenz/constants.d.ts +1 -0
  35. package/dist/esm/sevenz/constants.js +2 -1
  36. package/dist/esm/sevenz/constants.js.map +1 -1
  37. package/package.json +4 -2
  38. package/patches/lzma-purejs+0.9.3.patch +196 -0
@@ -27,19 +27,53 @@ import { allocBufferUnsafe } from 'extract-base-iterator';
27
27
  /**
28
28
  * Output stream wrapper for lzma-purejs
29
29
  * Collects output bytes into Buffer chunks
30
- */ export function createOutputStream() {
30
+ * Uses typed arrays for memory efficiency (1 byte per element instead of 8)
31
+ *
32
+ * Memory optimization: If expectedSize is provided, pre-allocates a single buffer
33
+ * to avoid double-memory during Buffer.concat.
34
+ *
35
+ * @param expectedSize - Optional expected output size for pre-allocation
36
+ */ export function createOutputStream(expectedSize) {
37
+ // Pre-allocation mode: single buffer, no concat needed
38
+ // Includes bounds checking for safety on older Node.js versions
39
+ if (expectedSize && expectedSize > 0) {
40
+ var buffer = allocBufferUnsafe(expectedSize);
41
+ var bufPos = 0;
42
+ var bufLen = buffer.length;
43
+ return {
44
+ writeByte: (b)=>{
45
+ if (bufPos < bufLen) {
46
+ buffer[bufPos++] = b;
47
+ }
48
+ // Silently ignore overflow (should not happen with correct size)
49
+ },
50
+ write: (buf, bufOffset, len)=>{
51
+ for(var i = 0; i < len && bufPos < bufLen; i++){
52
+ buffer[bufPos++] = buf[bufOffset + i];
53
+ }
54
+ return len;
55
+ },
56
+ flush: ()=>{
57
+ // No-op for pre-allocated buffer
58
+ },
59
+ toBuffer: ()=>{
60
+ // Return only the used portion
61
+ return bufPos < buffer.length ? buffer.slice(0, bufPos) : buffer;
62
+ }
63
+ };
64
+ }
65
+ // Chunked mode: accumulate in 64KB chunks (fallback for unknown size)
31
66
  var chunks = [];
32
- var currentChunk = [];
33
- var CHUNK_SIZE = 16384;
67
+ var CHUNK_SIZE = 65536; // 64KB chunks for better memory efficiency
68
+ var currentChunk = allocBufferUnsafe(CHUNK_SIZE);
69
+ var pos = 0;
34
70
  return {
35
71
  writeByte: (b)=>{
36
- currentChunk.push(b);
37
- if (currentChunk.length >= CHUNK_SIZE) {
38
- chunks.push(allocBufferUnsafe(currentChunk.length));
39
- for(var i = 0; i < currentChunk.length; i++){
40
- chunks[chunks.length - 1][i] = currentChunk[i];
41
- }
42
- currentChunk = [];
72
+ currentChunk[pos++] = b;
73
+ if (pos >= CHUNK_SIZE) {
74
+ chunks.push(currentChunk);
75
+ currentChunk = allocBufferUnsafe(CHUNK_SIZE);
76
+ pos = 0;
43
77
  }
44
78
  },
45
79
  write: function(buf, bufOffset, len) {
@@ -49,17 +83,19 @@ import { allocBufferUnsafe } from 'extract-base-iterator';
49
83
  return len;
50
84
  },
51
85
  flush: ()=>{
52
- if (currentChunk.length > 0) {
53
- var finalChunk = allocBufferUnsafe(currentChunk.length);
54
- for(var i = 0; i < currentChunk.length; i++){
55
- finalChunk[i] = currentChunk[i];
56
- }
57
- chunks.push(finalChunk);
58
- currentChunk = [];
86
+ if (pos > 0) {
87
+ // Only keep the used portion of the current chunk
88
+ chunks.push(currentChunk.slice(0, pos));
89
+ currentChunk = allocBufferUnsafe(CHUNK_SIZE);
90
+ pos = 0;
59
91
  }
60
92
  },
61
93
  toBuffer: function() {
62
94
  this.flush();
95
+ // Optimization: if single chunk, return it directly
96
+ if (chunks.length === 1) {
97
+ return chunks[0];
98
+ }
63
99
  return Buffer.concat(chunks);
64
100
  }
65
101
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/codecs/streams.ts"],"sourcesContent":["// Shared stream wrappers for lzma-purejs codec interface\n// These adapters convert between Buffer/lzma-purejs stream interfaces\n\nimport { allocBufferUnsafe } from 'extract-base-iterator';\n\n/**\n * Input stream wrapper for lzma-purejs\n * Wraps a Buffer region as a readable stream interface\n */\nexport function createInputStream(buffer: Buffer, offset: number, length: number) {\n var pos = 0;\n var end = Math.min(offset + length, buffer.length);\n var start = offset;\n\n return {\n readByte: (): number => {\n if (start + pos >= end) return -1;\n return buffer[start + pos++];\n },\n read: (buf: number[], bufOffset: number, len: number): number => {\n var bytesRead = 0;\n while (bytesRead < len && start + pos < end) {\n buf[bufOffset + bytesRead] = buffer[start + pos];\n pos++;\n bytesRead++;\n }\n return bytesRead === 0 ? -1 : bytesRead;\n },\n };\n}\n\n/**\n * Output stream wrapper for lzma-purejs\n * Collects output bytes into Buffer chunks\n */\nexport function createOutputStream() {\n var chunks: Buffer[] = [];\n var currentChunk: number[] = [];\n var CHUNK_SIZE = 16384;\n\n return {\n writeByte: (b: number): void => {\n currentChunk.push(b);\n if (currentChunk.length >= CHUNK_SIZE) {\n chunks.push(allocBufferUnsafe(currentChunk.length));\n for (var i = 0; i < currentChunk.length; i++) {\n chunks[chunks.length - 1][i] = currentChunk[i];\n }\n currentChunk = [];\n }\n },\n write: function (buf: number[], bufOffset: number, len: number): number {\n for (var i = 0; i < len; i++) {\n this.writeByte(buf[bufOffset + i]);\n }\n return len;\n },\n flush: (): void => {\n if (currentChunk.length > 0) {\n var finalChunk = allocBufferUnsafe(currentChunk.length);\n for (var i = 0; i < currentChunk.length; i++) {\n finalChunk[i] = currentChunk[i];\n }\n chunks.push(finalChunk);\n currentChunk = [];\n }\n },\n toBuffer: function (): Buffer {\n this.flush();\n return Buffer.concat(chunks);\n },\n };\n}\n"],"names":["allocBufferUnsafe","createInputStream","buffer","offset","length","pos","end","Math","min","start","readByte","read","buf","bufOffset","len","bytesRead","createOutputStream","chunks","currentChunk","CHUNK_SIZE","writeByte","b","push","i","write","flush","finalChunk","toBuffer","Buffer","concat"],"mappings":"AAAA,yDAAyD;AACzD,sEAAsE;AAEtE,SAASA,iBAAiB,QAAQ,wBAAwB;AAE1D;;;CAGC,GACD,OAAO,SAASC,kBAAkBC,MAAc,EAAEC,MAAc,EAAEC,MAAc;IAC9E,IAAIC,MAAM;IACV,IAAIC,MAAMC,KAAKC,GAAG,CAACL,SAASC,QAAQF,OAAOE,MAAM;IACjD,IAAIK,QAAQN;IAEZ,OAAO;QACLO,UAAU;YACR,IAAID,QAAQJ,OAAOC,KAAK,OAAO,CAAC;YAChC,OAAOJ,MAAM,CAACO,QAAQJ,MAAM;QAC9B;QACAM,MAAM,CAACC,KAAeC,WAAmBC;YACvC,IAAIC,YAAY;YAChB,MAAOA,YAAYD,OAAOL,QAAQJ,MAAMC,IAAK;gBAC3CM,GAAG,CAACC,YAAYE,UAAU,GAAGb,MAAM,CAACO,QAAQJ,IAAI;gBAChDA;gBACAU;YACF;YACA,OAAOA,cAAc,IAAI,CAAC,IAAIA;QAChC;IACF;AACF;AAEA;;;CAGC,GACD,OAAO,SAASC;IACd,IAAIC,SAAmB,EAAE;IACzB,IAAIC,eAAyB,EAAE;IAC/B,IAAIC,aAAa;IAEjB,OAAO;QACLC,WAAW,CAACC;YACVH,aAAaI,IAAI,CAACD;YAClB,IAAIH,aAAad,MAAM,IAAIe,YAAY;gBACrCF,OAAOK,IAAI,CAACtB,kBAAkBkB,aAAad,MAAM;gBACjD,IAAK,IAAImB,IAAI,GAAGA,IAAIL,aAAad,MAAM,EAAEmB,IAAK;oBAC5CN,MAAM,CAACA,OAAOb,MAAM,GAAG,EAAE,CAACmB,EAAE,GAAGL,YAAY,CAACK,EAAE;gBAChD;gBACAL,eAAe,EAAE;YACnB;QACF;QACAM,OAAO,SAAUZ,GAAa,EAAEC,SAAiB,EAAEC,GAAW;YAC5D,IAAK,IAAIS,IAAI,GAAGA,IAAIT,KAAKS,IAAK;gBAC5B,IAAI,CAACH,SAAS,CAACR,GAAG,CAACC,YAAYU,EAAE;YACnC;YACA,OAAOT;QACT;QACAW,OAAO;YACL,IAAIP,aAAad,MAAM,GAAG,GAAG;gBAC3B,IAAIsB,aAAa1B,kBAAkBkB,aAAad,MAAM;gBACtD,IAAK,IAAImB,IAAI,GAAGA,IAAIL,aAAad,MAAM,EAAEmB,IAAK;oBAC5CG,UAAU,CAACH,EAAE,GAAGL,YAAY,CAACK,EAAE;gBACjC;gBACAN,OAAOK,IAAI,CAACI;gBACZR,eAAe,EAAE;YACnB;QACF;QACAS,UAAU;YACR,IAAI,CAACF,KAAK;YACV,OAAOG,OAAOC,MAAM,CAACZ;QACvB;IACF;AACF"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/codecs/streams.ts"],"sourcesContent":["// Shared stream wrappers for lzma-purejs codec interface\n// These adapters convert between Buffer/lzma-purejs stream interfaces\n\nimport { allocBufferUnsafe } from 'extract-base-iterator';\n\n/**\n * Input stream wrapper for lzma-purejs\n * Wraps a Buffer region as a readable stream interface\n */\nexport function createInputStream(buffer: Buffer, offset: number, length: number) {\n var pos = 0;\n var end = Math.min(offset + length, buffer.length);\n var start = offset;\n\n return {\n readByte: (): number => {\n if (start + pos >= end) return -1;\n return buffer[start + pos++];\n },\n read: (buf: number[], bufOffset: number, len: number): number => {\n var bytesRead = 0;\n while (bytesRead < len && start + pos < end) {\n buf[bufOffset + bytesRead] = buffer[start + pos];\n pos++;\n bytesRead++;\n }\n return bytesRead === 0 ? -1 : bytesRead;\n },\n };\n}\n\n/**\n * Output stream wrapper for lzma-purejs\n * Collects output bytes into Buffer chunks\n * Uses typed arrays for memory efficiency (1 byte per element instead of 8)\n *\n * Memory optimization: If expectedSize is provided, pre-allocates a single buffer\n * to avoid double-memory during Buffer.concat.\n *\n * @param expectedSize - Optional expected output size for pre-allocation\n */\nexport function createOutputStream(expectedSize?: number) {\n // Pre-allocation mode: single buffer, no concat needed\n // Includes bounds checking for safety on older Node.js versions\n if (expectedSize && expectedSize > 0) {\n var buffer = allocBufferUnsafe(expectedSize);\n var bufPos = 0;\n var bufLen = buffer.length;\n\n return {\n writeByte: (b: number): void => {\n if (bufPos < bufLen) {\n buffer[bufPos++] = b;\n }\n // Silently ignore overflow (should not happen with correct size)\n },\n write: (buf: number[], bufOffset: number, len: number): number => {\n for (var i = 0; i < len && bufPos < bufLen; i++) {\n buffer[bufPos++] = buf[bufOffset + i];\n }\n return len;\n },\n flush: (): void => {\n // No-op for pre-allocated buffer\n },\n toBuffer: (): Buffer => {\n // Return only the used portion\n return bufPos < buffer.length ? buffer.slice(0, bufPos) : buffer;\n },\n };\n }\n\n // Chunked mode: accumulate in 64KB chunks (fallback for unknown size)\n var chunks: Buffer[] = [];\n var CHUNK_SIZE = 65536; // 64KB chunks for better memory efficiency\n var currentChunk: Buffer = allocBufferUnsafe(CHUNK_SIZE);\n var pos = 0;\n\n return {\n writeByte: (b: number): void => {\n currentChunk[pos++] = b;\n if (pos >= CHUNK_SIZE) {\n chunks.push(currentChunk);\n currentChunk = allocBufferUnsafe(CHUNK_SIZE);\n pos = 0;\n }\n },\n write: function (buf: number[], bufOffset: number, len: number): number {\n for (var i = 0; i < len; i++) {\n this.writeByte(buf[bufOffset + i]);\n }\n return len;\n },\n flush: (): void => {\n if (pos > 0) {\n // Only keep the used portion of the current chunk\n chunks.push(currentChunk.slice(0, pos));\n currentChunk = allocBufferUnsafe(CHUNK_SIZE);\n pos = 0;\n }\n },\n toBuffer: function (): Buffer {\n this.flush();\n // Optimization: if single chunk, return it directly\n if (chunks.length === 1) {\n return chunks[0];\n }\n return Buffer.concat(chunks);\n },\n };\n}\n"],"names":["allocBufferUnsafe","createInputStream","buffer","offset","length","pos","end","Math","min","start","readByte","read","buf","bufOffset","len","bytesRead","createOutputStream","expectedSize","bufPos","bufLen","writeByte","b","write","i","flush","toBuffer","slice","chunks","CHUNK_SIZE","currentChunk","push","Buffer","concat"],"mappings":"AAAA,yDAAyD;AACzD,sEAAsE;AAEtE,SAASA,iBAAiB,QAAQ,wBAAwB;AAE1D;;;CAGC,GACD,OAAO,SAASC,kBAAkBC,MAAc,EAAEC,MAAc,EAAEC,MAAc;IAC9E,IAAIC,MAAM;IACV,IAAIC,MAAMC,KAAKC,GAAG,CAACL,SAASC,QAAQF,OAAOE,MAAM;IACjD,IAAIK,QAAQN;IAEZ,OAAO;QACLO,UAAU;YACR,IAAID,QAAQJ,OAAOC,KAAK,OAAO,CAAC;YAChC,OAAOJ,MAAM,CAACO,QAAQJ,MAAM;QAC9B;QACAM,MAAM,CAACC,KAAeC,WAAmBC;YACvC,IAAIC,YAAY;YAChB,MAAOA,YAAYD,OAAOL,QAAQJ,MAAMC,IAAK;gBAC3CM,GAAG,CAACC,YAAYE,UAAU,GAAGb,MAAM,CAACO,QAAQJ,IAAI;gBAChDA;gBACAU;YACF;YACA,OAAOA,cAAc,IAAI,CAAC,IAAIA;QAChC;IACF;AACF;AAEA;;;;;;;;;CASC,GACD,OAAO,SAASC,mBAAmBC,YAAqB;IACtD,uDAAuD;IACvD,gEAAgE;IAChE,IAAIA,gBAAgBA,eAAe,GAAG;QACpC,IAAIf,SAASF,kBAAkBiB;QAC/B,IAAIC,SAAS;QACb,IAAIC,SAASjB,OAAOE,MAAM;QAE1B,OAAO;YACLgB,WAAW,CAACC;gBACV,IAAIH,SAASC,QAAQ;oBACnBjB,MAAM,CAACgB,SAAS,GAAGG;gBACrB;YACA,iEAAiE;YACnE;YACAC,OAAO,CAACV,KAAeC,WAAmBC;gBACxC,IAAK,IAAIS,IAAI,GAAGA,IAAIT,OAAOI,SAASC,QAAQI,IAAK;oBAC/CrB,MAAM,CAACgB,SAAS,GAAGN,GAAG,CAACC,YAAYU,EAAE;gBACvC;gBACA,OAAOT;YACT;YACAU,OAAO;YACL,iCAAiC;YACnC;YACAC,UAAU;gBACR,+BAA+B;gBAC/B,OAAOP,SAAShB,OAAOE,MAAM,GAAGF,OAAOwB,KAAK,CAAC,GAAGR,UAAUhB;YAC5D;QACF;IACF;IAEA,sEAAsE;IACtE,IAAIyB,SAAmB,EAAE;IACzB,IAAIC,aAAa,OAAO,2CAA2C;IACnE,IAAIC,eAAuB7B,kBAAkB4B;IAC7C,IAAIvB,MAAM;IAEV,OAAO;QACLe,WAAW,CAACC;YACVQ,YAAY,CAACxB,MAAM,GAAGgB;YACtB,IAAIhB,OAAOuB,YAAY;gBACrBD,OAAOG,IAAI,CAACD;gBACZA,eAAe7B,kBAAkB4B;gBACjCvB,MAAM;YACR;QACF;QACAiB,OAAO,SAAUV,GAAa,EAAEC,SAAiB,EAAEC,GAAW;YAC5D,IAAK,IAAIS,IAAI,GAAGA,IAAIT,KAAKS,IAAK;gBAC5B,IAAI,CAACH,SAAS,CAACR,GAAG,CAACC,YAAYU,EAAE;YACnC;YACA,OAAOT;QACT;QACAU,OAAO;YACL,IAAInB,MAAM,GAAG;gBACX,kDAAkD;gBAClDsB,OAAOG,IAAI,CAACD,aAAaH,KAAK,CAAC,GAAGrB;gBAClCwB,eAAe7B,kBAAkB4B;gBACjCvB,MAAM;YACR;QACF;QACAoB,UAAU;YACR,IAAI,CAACD,KAAK;YACV,oDAAoD;YACpD,IAAIG,OAAOvB,MAAM,KAAK,GAAG;gBACvB,OAAOuB,MAAM,CAAC,EAAE;YAClB;YACA,OAAOI,OAAOC,MAAM,CAACL;QACvB;IACF;AACF"}
@@ -77,6 +77,7 @@ export declare var ErrorCode: {
77
77
  CORRUPT_HEADER: string;
78
78
  ENCRYPTED_ARCHIVE: string;
79
79
  COMPRESSED_HEADER: string;
80
+ DECOMPRESSION_FAILED: string;
80
81
  };
81
82
  export interface CodedError extends Error {
82
83
  code: string;
@@ -126,7 +126,8 @@ export var ErrorCode = {
126
126
  TRUNCATED_ARCHIVE: 'TRUNCATED_ARCHIVE',
127
127
  CORRUPT_HEADER: 'CORRUPT_HEADER',
128
128
  ENCRYPTED_ARCHIVE: 'ENCRYPTED_ARCHIVE',
129
- COMPRESSED_HEADER: 'COMPRESSED_HEADER'
129
+ COMPRESSED_HEADER: 'COMPRESSED_HEADER',
130
+ DECOMPRESSION_FAILED: 'DECOMPRESSION_FAILED'
130
131
  };
131
132
  /**
132
133
  * Create an error with a code property
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/constants.ts"],"sourcesContent":["// 7z format constants\n// Reference: https://py7zr.readthedocs.io/en/latest/archive_format.html\n\n// 7z signature: '7z' + magic bytes\nexport var SEVENZ_MAGIC = [0x37, 0x7a, 0xbc, 0xaf, 0x27, 0x1c];\n\n// Header sizes\nexport var SIGNATURE_HEADER_SIZE = 32;\nexport var START_HEADER_SIZE = 20; // Part of signature header after magic + version\n\n// Property IDs for encoded header\nexport var PropertyId = {\n kEnd: 0x00,\n kHeader: 0x01,\n kArchiveProperties: 0x02,\n kAdditionalStreamsInfo: 0x03,\n kMainStreamsInfo: 0x04,\n kFilesInfo: 0x05,\n kPackInfo: 0x06,\n kUnpackInfo: 0x07,\n kSubStreamsInfo: 0x08,\n kSize: 0x09,\n kCRC: 0x0a,\n kFolder: 0x0b,\n kCodersUnpackSize: 0x0c,\n kNumUnpackStream: 0x0d,\n kEmptyStream: 0x0e,\n kEmptyFile: 0x0f,\n kAnti: 0x10,\n kName: 0x11,\n kCTime: 0x12,\n kATime: 0x13,\n kMTime: 0x14,\n kWinAttributes: 0x15,\n kComment: 0x16,\n kEncodedHeader: 0x17,\n kStartPos: 0x18,\n kDummy: 0x19,\n};\n\n// Codec IDs\n// 7z uses variable-length codec IDs\nexport var CodecId = {\n COPY: [0x00],\n DELTA: [0x03],\n LZMA: [0x03, 0x01, 0x01],\n LZMA2: [0x21],\n BCJ_X86: [0x03, 0x03, 0x01, 0x03],\n BCJ2: [0x03, 0x03, 0x01, 0x1b],\n DEFLATE: [0x04, 0x01, 0x08],\n BZIP2: [0x04, 0x02, 0x02],\n AES: [0x06, 0xf1, 0x07, 0x01],\n};\n\n// File attribute flags (Windows style, stored in FilesInfo)\nexport var FileAttribute = {\n READONLY: 0x01,\n HIDDEN: 0x02,\n SYSTEM: 0x04,\n DIRECTORY: 0x10,\n ARCHIVE: 0x20,\n DEVICE: 0x40,\n NORMAL: 0x80,\n TEMPORARY: 0x100,\n SPARSE_FILE: 0x200,\n REPARSE_POINT: 0x400,\n COMPRESSED: 0x800,\n OFFLINE: 0x1000,\n NOT_CONTENT_INDEXED: 0x2000,\n ENCRYPTED: 0x4000,\n UNIX_EXTENSION: 0x8000,\n};\n\n// Unix permission modes (decimal values for Node 0.8 compatibility)\nexport var UnixMode = {\n DIR: 16384, // 0o40000 - directory\n FILE: 32768, // 0o100000 - regular file\n SYMLINK: 40960, // 0o120000 - symbolic link\n RWXRWXRWX: 511, // 0o777\n RWXRXRX: 493, // 0o755\n RWRR: 420, // 0o644\n DEFAULT_DIR: 493, // 0o755 - rwxr-xr-x\n DEFAULT_FILE: 420, // 0o644 - rw-r--r--\n};\n\n// Error codes\nexport var ErrorCode = {\n INVALID_SIGNATURE: 'INVALID_SIGNATURE',\n CRC_MISMATCH: 'CRC_MISMATCH',\n UNSUPPORTED_CODEC: 'UNSUPPORTED_CODEC',\n UNSUPPORTED_VERSION: 'UNSUPPORTED_VERSION',\n UNSUPPORTED_FEATURE: 'UNSUPPORTED_FEATURE',\n TRUNCATED_ARCHIVE: 'TRUNCATED_ARCHIVE',\n CORRUPT_HEADER: 'CORRUPT_HEADER',\n ENCRYPTED_ARCHIVE: 'ENCRYPTED_ARCHIVE',\n COMPRESSED_HEADER: 'COMPRESSED_HEADER',\n};\n\n// Error with code property\nexport interface CodedError extends Error {\n code: string;\n}\n\n/**\n * Create an error with a code property\n */\nexport function createCodedError(message: string, code: string): CodedError {\n var err = new Error(message) as CodedError;\n err.code = code;\n return err;\n}\n"],"names":["SEVENZ_MAGIC","SIGNATURE_HEADER_SIZE","START_HEADER_SIZE","PropertyId","kEnd","kHeader","kArchiveProperties","kAdditionalStreamsInfo","kMainStreamsInfo","kFilesInfo","kPackInfo","kUnpackInfo","kSubStreamsInfo","kSize","kCRC","kFolder","kCodersUnpackSize","kNumUnpackStream","kEmptyStream","kEmptyFile","kAnti","kName","kCTime","kATime","kMTime","kWinAttributes","kComment","kEncodedHeader","kStartPos","kDummy","CodecId","COPY","DELTA","LZMA","LZMA2","BCJ_X86","BCJ2","DEFLATE","BZIP2","AES","FileAttribute","READONLY","HIDDEN","SYSTEM","DIRECTORY","ARCHIVE","DEVICE","NORMAL","TEMPORARY","SPARSE_FILE","REPARSE_POINT","COMPRESSED","OFFLINE","NOT_CONTENT_INDEXED","ENCRYPTED","UNIX_EXTENSION","UnixMode","DIR","FILE","SYMLINK","RWXRWXRWX","RWXRXRX","RWRR","DEFAULT_DIR","DEFAULT_FILE","ErrorCode","INVALID_SIGNATURE","CRC_MISMATCH","UNSUPPORTED_CODEC","UNSUPPORTED_VERSION","UNSUPPORTED_FEATURE","TRUNCATED_ARCHIVE","CORRUPT_HEADER","ENCRYPTED_ARCHIVE","COMPRESSED_HEADER","createCodedError","message","code","err","Error"],"mappings":"AAAA,sBAAsB;AACtB,wEAAwE;AAExE,mCAAmC;AACnC,OAAO,IAAIA,eAAe;IAAC;IAAM;IAAM;IAAM;IAAM;IAAM;CAAK,CAAC;AAE/D,eAAe;AACf,OAAO,IAAIC,wBAAwB,GAAG;AACtC,OAAO,IAAIC,oBAAoB,GAAG,CAAC,iDAAiD;AAEpF,kCAAkC;AAClC,OAAO,IAAIC,aAAa;IACtBC,MAAM;IACNC,SAAS;IACTC,oBAAoB;IACpBC,wBAAwB;IACxBC,kBAAkB;IAClBC,YAAY;IACZC,WAAW;IACXC,aAAa;IACbC,iBAAiB;IACjBC,OAAO;IACPC,MAAM;IACNC,SAAS;IACTC,mBAAmB;IACnBC,kBAAkB;IAClBC,cAAc;IACdC,YAAY;IACZC,OAAO;IACPC,OAAO;IACPC,QAAQ;IACRC,QAAQ;IACRC,QAAQ;IACRC,gBAAgB;IAChBC,UAAU;IACVC,gBAAgB;IAChBC,WAAW;IACXC,QAAQ;AACV,EAAE;AAEF,YAAY;AACZ,oCAAoC;AACpC,OAAO,IAAIC,UAAU;IACnBC,MAAM;QAAC;KAAK;IACZC,OAAO;QAAC;KAAK;IACbC,MAAM;QAAC;QAAM;QAAM;KAAK;IACxBC,OAAO;QAAC;KAAK;IACbC,SAAS;QAAC;QAAM;QAAM;QAAM;KAAK;IACjCC,MAAM;QAAC;QAAM;QAAM;QAAM;KAAK;IAC9BC,SAAS;QAAC;QAAM;QAAM;KAAK;IAC3BC,OAAO;QAAC;QAAM;QAAM;KAAK;IACzBC,KAAK;QAAC;QAAM;QAAM;QAAM;KAAK;AAC/B,EAAE;AAEF,4DAA4D;AAC5D,OAAO,IAAIC,gBAAgB;IACzBC,UAAU;IACVC,QAAQ;IACRC,QAAQ;IACRC,WAAW;IACXC,SAAS;IACTC,QAAQ;IACRC,QAAQ;IACRC,WAAW;IACXC,aAAa;IACbC,eAAe;IACfC,YAAY;IACZC,SAAS;IACTC,qBAAqB;IACrBC,WAAW;IACXC,gBAAgB;AAClB,EAAE;AAEF,oEAAoE;AACpE,OAAO,IAAIC,WAAW;IACpBC,KAAK;IACLC,MAAM;IACNC,SAAS;IACTC,WAAW;IACXC,SAAS;IACTC,MAAM;IACNC,aAAa;IACbC,cAAc;AAChB,EAAE;AAEF,cAAc;AACd,OAAO,IAAIC,YAAY;IACrBC,mBAAmB;IACnBC,cAAc;IACdC,mBAAmB;IACnBC,qBAAqB;IACrBC,qBAAqB;IACrBC,mBAAmB;IACnBC,gBAAgB;IAChBC,mBAAmB;IACnBC,mBAAmB;AACrB,EAAE;AAOF;;CAEC,GACD,OAAO,SAASC,iBAAiBC,OAAe,EAAEC,IAAY;IAC5D,IAAIC,MAAM,IAAIC,MAAMH;IACpBE,IAAID,IAAI,GAAGA;IACX,OAAOC;AACT"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/iterators/7z-iterator/src/sevenz/constants.ts"],"sourcesContent":["// 7z format constants\n// Reference: https://py7zr.readthedocs.io/en/latest/archive_format.html\n\n// 7z signature: '7z' + magic bytes\nexport var SEVENZ_MAGIC = [0x37, 0x7a, 0xbc, 0xaf, 0x27, 0x1c];\n\n// Header sizes\nexport var SIGNATURE_HEADER_SIZE = 32;\nexport var START_HEADER_SIZE = 20; // Part of signature header after magic + version\n\n// Property IDs for encoded header\nexport var PropertyId = {\n kEnd: 0x00,\n kHeader: 0x01,\n kArchiveProperties: 0x02,\n kAdditionalStreamsInfo: 0x03,\n kMainStreamsInfo: 0x04,\n kFilesInfo: 0x05,\n kPackInfo: 0x06,\n kUnpackInfo: 0x07,\n kSubStreamsInfo: 0x08,\n kSize: 0x09,\n kCRC: 0x0a,\n kFolder: 0x0b,\n kCodersUnpackSize: 0x0c,\n kNumUnpackStream: 0x0d,\n kEmptyStream: 0x0e,\n kEmptyFile: 0x0f,\n kAnti: 0x10,\n kName: 0x11,\n kCTime: 0x12,\n kATime: 0x13,\n kMTime: 0x14,\n kWinAttributes: 0x15,\n kComment: 0x16,\n kEncodedHeader: 0x17,\n kStartPos: 0x18,\n kDummy: 0x19,\n};\n\n// Codec IDs\n// 7z uses variable-length codec IDs\nexport var CodecId = {\n COPY: [0x00],\n DELTA: [0x03],\n LZMA: [0x03, 0x01, 0x01],\n LZMA2: [0x21],\n BCJ_X86: [0x03, 0x03, 0x01, 0x03],\n BCJ2: [0x03, 0x03, 0x01, 0x1b],\n DEFLATE: [0x04, 0x01, 0x08],\n BZIP2: [0x04, 0x02, 0x02],\n AES: [0x06, 0xf1, 0x07, 0x01],\n};\n\n// File attribute flags (Windows style, stored in FilesInfo)\nexport var FileAttribute = {\n READONLY: 0x01,\n HIDDEN: 0x02,\n SYSTEM: 0x04,\n DIRECTORY: 0x10,\n ARCHIVE: 0x20,\n DEVICE: 0x40,\n NORMAL: 0x80,\n TEMPORARY: 0x100,\n SPARSE_FILE: 0x200,\n REPARSE_POINT: 0x400,\n COMPRESSED: 0x800,\n OFFLINE: 0x1000,\n NOT_CONTENT_INDEXED: 0x2000,\n ENCRYPTED: 0x4000,\n UNIX_EXTENSION: 0x8000,\n};\n\n// Unix permission modes (decimal values for Node 0.8 compatibility)\nexport var UnixMode = {\n DIR: 16384, // 0o40000 - directory\n FILE: 32768, // 0o100000 - regular file\n SYMLINK: 40960, // 0o120000 - symbolic link\n RWXRWXRWX: 511, // 0o777\n RWXRXRX: 493, // 0o755\n RWRR: 420, // 0o644\n DEFAULT_DIR: 493, // 0o755 - rwxr-xr-x\n DEFAULT_FILE: 420, // 0o644 - rw-r--r--\n};\n\n// Error codes\nexport var ErrorCode = {\n INVALID_SIGNATURE: 'INVALID_SIGNATURE',\n CRC_MISMATCH: 'CRC_MISMATCH',\n UNSUPPORTED_CODEC: 'UNSUPPORTED_CODEC',\n UNSUPPORTED_VERSION: 'UNSUPPORTED_VERSION',\n UNSUPPORTED_FEATURE: 'UNSUPPORTED_FEATURE',\n TRUNCATED_ARCHIVE: 'TRUNCATED_ARCHIVE',\n CORRUPT_HEADER: 'CORRUPT_HEADER',\n ENCRYPTED_ARCHIVE: 'ENCRYPTED_ARCHIVE',\n COMPRESSED_HEADER: 'COMPRESSED_HEADER',\n DECOMPRESSION_FAILED: 'DECOMPRESSION_FAILED',\n};\n\n// Error with code property\nexport interface CodedError extends Error {\n code: string;\n}\n\n/**\n * Create an error with a code property\n */\nexport function createCodedError(message: string, code: string): CodedError {\n var err = new Error(message) as CodedError;\n err.code = code;\n return err;\n}\n"],"names":["SEVENZ_MAGIC","SIGNATURE_HEADER_SIZE","START_HEADER_SIZE","PropertyId","kEnd","kHeader","kArchiveProperties","kAdditionalStreamsInfo","kMainStreamsInfo","kFilesInfo","kPackInfo","kUnpackInfo","kSubStreamsInfo","kSize","kCRC","kFolder","kCodersUnpackSize","kNumUnpackStream","kEmptyStream","kEmptyFile","kAnti","kName","kCTime","kATime","kMTime","kWinAttributes","kComment","kEncodedHeader","kStartPos","kDummy","CodecId","COPY","DELTA","LZMA","LZMA2","BCJ_X86","BCJ2","DEFLATE","BZIP2","AES","FileAttribute","READONLY","HIDDEN","SYSTEM","DIRECTORY","ARCHIVE","DEVICE","NORMAL","TEMPORARY","SPARSE_FILE","REPARSE_POINT","COMPRESSED","OFFLINE","NOT_CONTENT_INDEXED","ENCRYPTED","UNIX_EXTENSION","UnixMode","DIR","FILE","SYMLINK","RWXRWXRWX","RWXRXRX","RWRR","DEFAULT_DIR","DEFAULT_FILE","ErrorCode","INVALID_SIGNATURE","CRC_MISMATCH","UNSUPPORTED_CODEC","UNSUPPORTED_VERSION","UNSUPPORTED_FEATURE","TRUNCATED_ARCHIVE","CORRUPT_HEADER","ENCRYPTED_ARCHIVE","COMPRESSED_HEADER","DECOMPRESSION_FAILED","createCodedError","message","code","err","Error"],"mappings":"AAAA,sBAAsB;AACtB,wEAAwE;AAExE,mCAAmC;AACnC,OAAO,IAAIA,eAAe;IAAC;IAAM;IAAM;IAAM;IAAM;IAAM;CAAK,CAAC;AAE/D,eAAe;AACf,OAAO,IAAIC,wBAAwB,GAAG;AACtC,OAAO,IAAIC,oBAAoB,GAAG,CAAC,iDAAiD;AAEpF,kCAAkC;AAClC,OAAO,IAAIC,aAAa;IACtBC,MAAM;IACNC,SAAS;IACTC,oBAAoB;IACpBC,wBAAwB;IACxBC,kBAAkB;IAClBC,YAAY;IACZC,WAAW;IACXC,aAAa;IACbC,iBAAiB;IACjBC,OAAO;IACPC,MAAM;IACNC,SAAS;IACTC,mBAAmB;IACnBC,kBAAkB;IAClBC,cAAc;IACdC,YAAY;IACZC,OAAO;IACPC,OAAO;IACPC,QAAQ;IACRC,QAAQ;IACRC,QAAQ;IACRC,gBAAgB;IAChBC,UAAU;IACVC,gBAAgB;IAChBC,WAAW;IACXC,QAAQ;AACV,EAAE;AAEF,YAAY;AACZ,oCAAoC;AACpC,OAAO,IAAIC,UAAU;IACnBC,MAAM;QAAC;KAAK;IACZC,OAAO;QAAC;KAAK;IACbC,MAAM;QAAC;QAAM;QAAM;KAAK;IACxBC,OAAO;QAAC;KAAK;IACbC,SAAS;QAAC;QAAM;QAAM;QAAM;KAAK;IACjCC,MAAM;QAAC;QAAM;QAAM;QAAM;KAAK;IAC9BC,SAAS;QAAC;QAAM;QAAM;KAAK;IAC3BC,OAAO;QAAC;QAAM;QAAM;KAAK;IACzBC,KAAK;QAAC;QAAM;QAAM;QAAM;KAAK;AAC/B,EAAE;AAEF,4DAA4D;AAC5D,OAAO,IAAIC,gBAAgB;IACzBC,UAAU;IACVC,QAAQ;IACRC,QAAQ;IACRC,WAAW;IACXC,SAAS;IACTC,QAAQ;IACRC,QAAQ;IACRC,WAAW;IACXC,aAAa;IACbC,eAAe;IACfC,YAAY;IACZC,SAAS;IACTC,qBAAqB;IACrBC,WAAW;IACXC,gBAAgB;AAClB,EAAE;AAEF,oEAAoE;AACpE,OAAO,IAAIC,WAAW;IACpBC,KAAK;IACLC,MAAM;IACNC,SAAS;IACTC,WAAW;IACXC,SAAS;IACTC,MAAM;IACNC,aAAa;IACbC,cAAc;AAChB,EAAE;AAEF,cAAc;AACd,OAAO,IAAIC,YAAY;IACrBC,mBAAmB;IACnBC,cAAc;IACdC,mBAAmB;IACnBC,qBAAqB;IACrBC,qBAAqB;IACrBC,mBAAmB;IACnBC,gBAAgB;IAChBC,mBAAmB;IACnBC,mBAAmB;IACnBC,sBAAsB;AACxB,EAAE;AAOF;;CAEC,GACD,OAAO,SAASC,iBAAiBC,OAAe,EAAEC,IAAY;IAC5D,IAAIC,MAAM,IAAIC,MAAMH;IACpBE,IAAID,IAAI,GAAGA;IACX,OAAOC;AACT"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "7z-iterator",
3
- "version": "0.1.5",
3
+ "version": "0.1.6",
4
4
  "description": "Extract contents from 7z archives using an iterator API. Pure JavaScript, works on Node.js 0.8+",
5
5
  "keywords": [
6
6
  "extract",
@@ -34,7 +34,8 @@
34
34
  "main": "dist/cjs/index.js",
35
35
  "types": "dist/cjs/index.d.ts",
36
36
  "files": [
37
- "dist"
37
+ "dist",
38
+ "patches"
38
39
  ],
39
40
  "scripts": {
40
41
  "build": "tsds build",
@@ -67,6 +68,7 @@
67
68
  "@types/mocha": "*",
68
69
  "@types/node": "*",
69
70
  "array-find": "^1.0.0",
71
+ "end-with": "^1.0.2",
70
72
  "fs-iterator": "*",
71
73
  "fs-stats-spys": "*",
72
74
  "get-remote": "^2.2.1",
@@ -0,0 +1,196 @@
1
+ diff --git a/node_modules/lzma-purejs/lib/LZMA/Decoder.js b/node_modules/lzma-purejs/lib/LZMA/Decoder.js
2
+ index b82db68..3a124a1 100644
3
+ --- a/node_modules/lzma-purejs/lib/LZMA/Decoder.js
4
+ +++ b/node_modules/lzma-purejs/lib/LZMA/Decoder.js
5
+ @@ -163,11 +163,26 @@ var Decoder = function(){
6
+ this._dictionarySizeCheck = -1;
7
+ this._posStateMask = 0;
8
+
9
+ + // LZMA2 state preservation: these were local vars in code(), now instance props
10
+ + this._state = 0;
11
+ + this._rep0 = 0;
12
+ + this._rep1 = 0;
13
+ + this._rep2 = 0;
14
+ + this._rep3 = 0;
15
+ + this._prevByte = 0;
16
+ + this._nowPos64 = 0; // Cumulative position for solid mode
17
+ + this._solid = false; // When true, don't reset state in code()
18
+ +
19
+ for (i=0; i<Base.kNumLenToPosStates; i++) {
20
+ this._posSlotDecoder[i] = new RangeCoder.BitTreeDecoder(Base.kNumPosSlotBits);
21
+ }
22
+ };
23
+
24
+ +// LZMA2 support: Set solid mode to preserve state across chunks
25
+ +Decoder.prototype.setSolid = function(solid) {
26
+ + this._solid = solid;
27
+ +};
28
+ +
29
+ Decoder.prototype.setDictionarySize = function(dictionarySize){
30
+ if (dictionarySize < 0){
31
+ return false;
32
+ @@ -224,100 +239,120 @@ Decoder.prototype.init = function(){
33
+ Decoder.prototype.code = function(inStream, outStream, outSize){
34
+ // note that nowPos64 is actually only 53 bits long; that sets a limit
35
+ // on the amount of data we can decode
36
+ - var state, rep0 = 0, rep1 = 0, rep2 = 0, rep3 = 0, nowPos64 = 0, prevByte = 0,
37
+ - posState, decoder2, len, distance, posSlot, numDirectBits;
38
+ + // LZMA2 patch: use instance properties for state vars instead of locals
39
+ + // chunkPos tracks bytes in current chunk (for loop termination)
40
+ + // cumPos tracks cumulative bytes across chunks (for posState, literal context, rep0 validation)
41
+ + var chunkPos = 0, posState, decoder2, len, distance, posSlot, numDirectBits;
42
+ + var cumPos;
43
+
44
+ this._rangeDecoder.setStream(inStream);
45
+ this._outWindow.setStream(outStream);
46
+
47
+ - this.init();
48
+ + // LZMA2 patch: only init when not in solid mode (state preservation)
49
+ + if (!this._solid) {
50
+ + this.init();
51
+ + this._state = Base.stateInit();
52
+ + this._rep0 = 0;
53
+ + this._rep1 = 0;
54
+ + this._rep2 = 0;
55
+ + this._rep3 = 0;
56
+ + this._prevByte = 0;
57
+ + this._nowPos64 = 0;
58
+ + } else {
59
+ + // In solid mode, preserve dictionary (pass true), just init the range decoder
60
+ + this._outWindow.init(true);
61
+ + this._rangeDecoder.init();
62
+ + }
63
+ + cumPos = this._nowPos64;
64
+
65
+ - state = Base.stateInit();
66
+ - while(outSize < 0 || nowPos64 < outSize){
67
+ - posState = nowPos64 & this._posStateMask;
68
+ + while(outSize < 0 || chunkPos < outSize){
69
+ + posState = cumPos & this._posStateMask;
70
+
71
+ - if (this._rangeDecoder.decodeBit(this._isMatchDecoders, (state << Base.kNumPosStatesBitsMax) + posState) === 0){
72
+ - decoder2 = this._literalDecoder.getDecoder(nowPos64, prevByte);
73
+ + if (this._rangeDecoder.decodeBit(this._isMatchDecoders, (this._state << Base.kNumPosStatesBitsMax) + posState) === 0){
74
+ + decoder2 = this._literalDecoder.getDecoder(cumPos, this._prevByte);
75
+
76
+ - if (!Base.stateIsCharState(state)){
77
+ - prevByte = decoder2.decodeWithMatchByte(this._rangeDecoder, this._outWindow.getByte(rep0) );
78
+ + if (!Base.stateIsCharState(this._state)){
79
+ + this._prevByte = decoder2.decodeWithMatchByte(this._rangeDecoder, this._outWindow.getByte(this._rep0) );
80
+ }else{
81
+ - prevByte = decoder2.decodeNormal(this._rangeDecoder);
82
+ + this._prevByte = decoder2.decodeNormal(this._rangeDecoder);
83
+ }
84
+ - this._outWindow.putByte(prevByte);
85
+ - state = Base.stateUpdateChar(state);
86
+ - nowPos64++;
87
+ + this._outWindow.putByte(this._prevByte);
88
+ + this._state = Base.stateUpdateChar(this._state);
89
+ + chunkPos++; cumPos++;
90
+
91
+ }else{
92
+
93
+ - if (this._rangeDecoder.decodeBit(this._isRepDecoders, state) === 1){
94
+ + if (this._rangeDecoder.decodeBit(this._isRepDecoders, this._state) === 1){
95
+ len = 0;
96
+ - if (this._rangeDecoder.decodeBit(this._isRepG0Decoders, state) === 0){
97
+ - if (this._rangeDecoder.decodeBit(this._isRep0LongDecoders, (state << Base.kNumPosStatesBitsMax) + posState) === 0){
98
+ - state = Base.stateUpdateShortRep(state);
99
+ + if (this._rangeDecoder.decodeBit(this._isRepG0Decoders, this._state) === 0){
100
+ + if (this._rangeDecoder.decodeBit(this._isRep0LongDecoders, (this._state << Base.kNumPosStatesBitsMax) + posState) === 0){
101
+ + this._state = Base.stateUpdateShortRep(this._state);
102
+ len = 1;
103
+ }
104
+ }else{
105
+ - if (this._rangeDecoder.decodeBit(this._isRepG1Decoders, state) === 0){
106
+ - distance = rep1;
107
+ + if (this._rangeDecoder.decodeBit(this._isRepG1Decoders, this._state) === 0){
108
+ + distance = this._rep1;
109
+ }else{
110
+ - if (this._rangeDecoder.decodeBit(this._isRepG2Decoders, state) === 0){
111
+ - distance = rep2;
112
+ + if (this._rangeDecoder.decodeBit(this._isRepG2Decoders, this._state) === 0){
113
+ + distance = this._rep2;
114
+ }else{
115
+ - distance = rep3;
116
+ - rep3 = rep2;
117
+ + distance = this._rep3;
118
+ + this._rep3 = this._rep2;
119
+ }
120
+ - rep2 = rep1;
121
+ + this._rep2 = this._rep1;
122
+ }
123
+ - rep1 = rep0;
124
+ - rep0 = distance;
125
+ + this._rep1 = this._rep0;
126
+ + this._rep0 = distance;
127
+ }
128
+ if (len === 0){
129
+ len = Base.kMatchMinLen + this._repLenDecoder.decode(this._rangeDecoder, posState);
130
+ - state = Base.stateUpdateRep(state);
131
+ + this._state = Base.stateUpdateRep(this._state);
132
+ }
133
+ }else{
134
+ - rep3 = rep2;
135
+ - rep2 = rep1;
136
+ - rep1 = rep0;
137
+ + this._rep3 = this._rep2;
138
+ + this._rep2 = this._rep1;
139
+ + this._rep1 = this._rep0;
140
+
141
+ len = Base.kMatchMinLen + this._lenDecoder.decode(this._rangeDecoder, posState);
142
+ - state = Base.stateUpdateMatch(state);
143
+ + this._state = Base.stateUpdateMatch(this._state);
144
+
145
+ posSlot = this._posSlotDecoder[Base.getLenToPosState(len)].decode(this._rangeDecoder);
146
+ if (posSlot >= Base.kStartPosModelIndex){
147
+
148
+ numDirectBits = (posSlot >> 1) - 1;
149
+ - rep0 = (2 | (posSlot & 1) ) << numDirectBits;
150
+ + this._rep0 = (2 | (posSlot & 1) ) << numDirectBits;
151
+
152
+ if (posSlot < Base.kEndPosModelIndex){
153
+ - rep0 += RangeCoder.BitTreeDecoder.reverseDecode(this._posDecoders,
154
+ - rep0 - posSlot - 1, this._rangeDecoder, numDirectBits);
155
+ + this._rep0 += RangeCoder.BitTreeDecoder.reverseDecode(this._posDecoders,
156
+ + this._rep0 - posSlot - 1, this._rangeDecoder, numDirectBits);
157
+ }else{
158
+ - rep0 += this._rangeDecoder.decodeDirectBits(numDirectBits - Base.kNumAlignBits) << Base.kNumAlignBits;
159
+ - rep0 += this._posAlignDecoder.reverseDecode(this._rangeDecoder);
160
+ - if (rep0 < 0){
161
+ - if (rep0 === -1){
162
+ + this._rep0 += this._rangeDecoder.decodeDirectBits(numDirectBits - Base.kNumAlignBits) << Base.kNumAlignBits;
163
+ + this._rep0 += this._posAlignDecoder.reverseDecode(this._rangeDecoder);
164
+ + if (this._rep0 < 0){
165
+ + if (this._rep0 === -1){
166
+ break;
167
+ }
168
+ return false;
169
+ }
170
+ }
171
+ }else{
172
+ - rep0 = posSlot;
173
+ + this._rep0 = posSlot;
174
+ }
175
+ }
176
+
177
+ - if (rep0 >= nowPos64 || rep0 >= this._dictionarySizeCheck){
178
+ + if (this._rep0 >= cumPos || this._rep0 >= this._dictionarySizeCheck){
179
+ return false;
180
+ }
181
+
182
+ - this._outWindow.copyBlock(rep0, len);
183
+ - nowPos64 += len;
184
+ - prevByte = this._outWindow.getByte(0);
185
+ + this._outWindow.copyBlock(this._rep0, len);
186
+ + chunkPos += len; cumPos += len;
187
+ + this._prevByte = this._outWindow.getByte(0);
188
+ }
189
+ }
190
+
191
+ + // LZMA2: save cumulative position for next solid chunk
192
+ + this._nowPos64 = cumPos;
193
+ +
194
+ this._outWindow.flush();
195
+ this._outWindow.releaseStream();
196
+ this._rangeDecoder.releaseStream();