7z-iterator 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/LICENSE +42 -0
  2. package/README.md +142 -0
  3. package/dist/cjs/FileEntry.d.cts +12 -0
  4. package/dist/cjs/FileEntry.d.ts +12 -0
  5. package/dist/cjs/FileEntry.js +147 -0
  6. package/dist/cjs/FileEntry.js.map +1 -0
  7. package/dist/cjs/SevenZipIterator.d.cts +8 -0
  8. package/dist/cjs/SevenZipIterator.d.ts +8 -0
  9. package/dist/cjs/SevenZipIterator.js +204 -0
  10. package/dist/cjs/SevenZipIterator.js.map +1 -0
  11. package/dist/cjs/index.d.cts +4 -0
  12. package/dist/cjs/index.d.ts +4 -0
  13. package/dist/cjs/index.js +40 -0
  14. package/dist/cjs/index.js.map +1 -0
  15. package/dist/cjs/lib/Lock.d.cts +11 -0
  16. package/dist/cjs/lib/Lock.d.ts +11 -0
  17. package/dist/cjs/lib/Lock.js +65 -0
  18. package/dist/cjs/lib/Lock.js.map +1 -0
  19. package/dist/cjs/lib/streamToSource.d.cts +20 -0
  20. package/dist/cjs/lib/streamToSource.d.ts +20 -0
  21. package/dist/cjs/lib/streamToSource.js +116 -0
  22. package/dist/cjs/lib/streamToSource.js.map +1 -0
  23. package/dist/cjs/nextEntry.d.cts +4 -0
  24. package/dist/cjs/nextEntry.d.ts +4 -0
  25. package/dist/cjs/nextEntry.js +102 -0
  26. package/dist/cjs/nextEntry.js.map +1 -0
  27. package/dist/cjs/package.json +1 -0
  28. package/dist/cjs/sevenz/NumberCodec.d.cts +58 -0
  29. package/dist/cjs/sevenz/NumberCodec.d.ts +58 -0
  30. package/dist/cjs/sevenz/NumberCodec.js +133 -0
  31. package/dist/cjs/sevenz/NumberCodec.js.map +1 -0
  32. package/dist/cjs/sevenz/SevenZipParser.d.cts +96 -0
  33. package/dist/cjs/sevenz/SevenZipParser.d.ts +96 -0
  34. package/dist/cjs/sevenz/SevenZipParser.js +457 -0
  35. package/dist/cjs/sevenz/SevenZipParser.js.map +1 -0
  36. package/dist/cjs/sevenz/codecs/Aes.d.cts +22 -0
  37. package/dist/cjs/sevenz/codecs/Aes.d.ts +22 -0
  38. package/dist/cjs/sevenz/codecs/Aes.js +179 -0
  39. package/dist/cjs/sevenz/codecs/Aes.js.map +1 -0
  40. package/dist/cjs/sevenz/codecs/BZip2.d.cts +14 -0
  41. package/dist/cjs/sevenz/codecs/BZip2.d.ts +14 -0
  42. package/dist/cjs/sevenz/codecs/BZip2.js +37 -0
  43. package/dist/cjs/sevenz/codecs/BZip2.js.map +1 -0
  44. package/dist/cjs/sevenz/codecs/Bcj.d.cts +15 -0
  45. package/dist/cjs/sevenz/codecs/Bcj.d.ts +15 -0
  46. package/dist/cjs/sevenz/codecs/Bcj.js +89 -0
  47. package/dist/cjs/sevenz/codecs/Bcj.js.map +1 -0
  48. package/dist/cjs/sevenz/codecs/Copy.d.cts +14 -0
  49. package/dist/cjs/sevenz/codecs/Copy.d.ts +14 -0
  50. package/dist/cjs/sevenz/codecs/Copy.js +28 -0
  51. package/dist/cjs/sevenz/codecs/Copy.js.map +1 -0
  52. package/dist/cjs/sevenz/codecs/Deflate.d.cts +14 -0
  53. package/dist/cjs/sevenz/codecs/Deflate.d.ts +14 -0
  54. package/dist/cjs/sevenz/codecs/Deflate.js +39 -0
  55. package/dist/cjs/sevenz/codecs/Deflate.js.map +1 -0
  56. package/dist/cjs/sevenz/codecs/Delta.d.cts +15 -0
  57. package/dist/cjs/sevenz/codecs/Delta.d.ts +15 -0
  58. package/dist/cjs/sevenz/codecs/Delta.js +55 -0
  59. package/dist/cjs/sevenz/codecs/Delta.js.map +1 -0
  60. package/dist/cjs/sevenz/codecs/Lzma.d.cts +14 -0
  61. package/dist/cjs/sevenz/codecs/Lzma.d.ts +14 -0
  62. package/dist/cjs/sevenz/codecs/Lzma.js +53 -0
  63. package/dist/cjs/sevenz/codecs/Lzma.js.map +1 -0
  64. package/dist/cjs/sevenz/codecs/Lzma2.d.cts +14 -0
  65. package/dist/cjs/sevenz/codecs/Lzma2.d.ts +14 -0
  66. package/dist/cjs/sevenz/codecs/Lzma2.js +160 -0
  67. package/dist/cjs/sevenz/codecs/Lzma2.js.map +1 -0
  68. package/dist/cjs/sevenz/codecs/createBufferingDecoder.d.cts +7 -0
  69. package/dist/cjs/sevenz/codecs/createBufferingDecoder.d.ts +7 -0
  70. package/dist/cjs/sevenz/codecs/createBufferingDecoder.js +36 -0
  71. package/dist/cjs/sevenz/codecs/createBufferingDecoder.js.map +1 -0
  72. package/dist/cjs/sevenz/codecs/index.d.cts +24 -0
  73. package/dist/cjs/sevenz/codecs/index.d.ts +24 -0
  74. package/dist/cjs/sevenz/codecs/index.js +128 -0
  75. package/dist/cjs/sevenz/codecs/index.js.map +1 -0
  76. package/dist/cjs/sevenz/codecs/streams.d.cts +18 -0
  77. package/dist/cjs/sevenz/codecs/streams.d.ts +18 -0
  78. package/dist/cjs/sevenz/codecs/streams.js +79 -0
  79. package/dist/cjs/sevenz/codecs/streams.js.map +1 -0
  80. package/dist/cjs/sevenz/constants.d.cts +86 -0
  81. package/dist/cjs/sevenz/constants.d.ts +86 -0
  82. package/dist/cjs/sevenz/constants.js +162 -0
  83. package/dist/cjs/sevenz/constants.js.map +1 -0
  84. package/dist/cjs/sevenz/headers.d.cts +70 -0
  85. package/dist/cjs/sevenz/headers.d.ts +70 -0
  86. package/dist/cjs/sevenz/headers.js +661 -0
  87. package/dist/cjs/sevenz/headers.js.map +1 -0
  88. package/dist/cjs/sevenz/index.d.cts +4 -0
  89. package/dist/cjs/sevenz/index.d.ts +4 -0
  90. package/dist/cjs/sevenz/index.js +33 -0
  91. package/dist/cjs/sevenz/index.js.map +1 -0
  92. package/dist/cjs/types.d.cts +37 -0
  93. package/dist/cjs/types.d.ts +37 -0
  94. package/dist/cjs/types.js +32 -0
  95. package/dist/cjs/types.js.map +1 -0
  96. package/dist/esm/FileEntry.d.ts +12 -0
  97. package/dist/esm/FileEntry.js +63 -0
  98. package/dist/esm/FileEntry.js.map +1 -0
  99. package/dist/esm/SevenZipIterator.d.ts +8 -0
  100. package/dist/esm/SevenZipIterator.js +116 -0
  101. package/dist/esm/SevenZipIterator.js.map +1 -0
  102. package/dist/esm/index.d.ts +4 -0
  103. package/dist/esm/index.js +3 -0
  104. package/dist/esm/index.js.map +1 -0
  105. package/dist/esm/lib/Lock.d.ts +11 -0
  106. package/dist/esm/lib/Lock.js +41 -0
  107. package/dist/esm/lib/Lock.js.map +1 -0
  108. package/dist/esm/lib/streamToSource.d.ts +20 -0
  109. package/dist/esm/lib/streamToSource.js +100 -0
  110. package/dist/esm/lib/streamToSource.js.map +1 -0
  111. package/dist/esm/nextEntry.d.ts +4 -0
  112. package/dist/esm/nextEntry.js +86 -0
  113. package/dist/esm/nextEntry.js.map +1 -0
  114. package/dist/esm/package.json +1 -0
  115. package/dist/esm/sevenz/NumberCodec.d.ts +58 -0
  116. package/dist/esm/sevenz/NumberCodec.js +138 -0
  117. package/dist/esm/sevenz/NumberCodec.js.map +1 -0
  118. package/dist/esm/sevenz/SevenZipParser.d.ts +96 -0
  119. package/dist/esm/sevenz/SevenZipParser.js +419 -0
  120. package/dist/esm/sevenz/SevenZipParser.js.map +1 -0
  121. package/dist/esm/sevenz/codecs/Aes.d.ts +22 -0
  122. package/dist/esm/sevenz/codecs/Aes.js +162 -0
  123. package/dist/esm/sevenz/codecs/Aes.js.map +1 -0
  124. package/dist/esm/sevenz/codecs/BZip2.d.ts +14 -0
  125. package/dist/esm/sevenz/codecs/BZip2.js +22 -0
  126. package/dist/esm/sevenz/codecs/BZip2.js.map +1 -0
  127. package/dist/esm/sevenz/codecs/Bcj.d.ts +15 -0
  128. package/dist/esm/sevenz/codecs/Bcj.js +75 -0
  129. package/dist/esm/sevenz/codecs/Bcj.js.map +1 -0
  130. package/dist/esm/sevenz/codecs/Copy.d.ts +14 -0
  131. package/dist/esm/sevenz/codecs/Copy.js +18 -0
  132. package/dist/esm/sevenz/codecs/Copy.js.map +1 -0
  133. package/dist/esm/sevenz/codecs/Deflate.d.ts +14 -0
  134. package/dist/esm/sevenz/codecs/Deflate.js +24 -0
  135. package/dist/esm/sevenz/codecs/Deflate.js.map +1 -0
  136. package/dist/esm/sevenz/codecs/Delta.d.ts +15 -0
  137. package/dist/esm/sevenz/codecs/Delta.js +41 -0
  138. package/dist/esm/sevenz/codecs/Delta.js.map +1 -0
  139. package/dist/esm/sevenz/codecs/Lzma.d.ts +14 -0
  140. package/dist/esm/sevenz/codecs/Lzma.js +38 -0
  141. package/dist/esm/sevenz/codecs/Lzma.js.map +1 -0
  142. package/dist/esm/sevenz/codecs/Lzma2.d.ts +14 -0
  143. package/dist/esm/sevenz/codecs/Lzma2.js +145 -0
  144. package/dist/esm/sevenz/codecs/Lzma2.js.map +1 -0
  145. package/dist/esm/sevenz/codecs/createBufferingDecoder.d.ts +7 -0
  146. package/dist/esm/sevenz/codecs/createBufferingDecoder.js +25 -0
  147. package/dist/esm/sevenz/codecs/createBufferingDecoder.js.map +1 -0
  148. package/dist/esm/sevenz/codecs/index.d.ts +24 -0
  149. package/dist/esm/sevenz/codecs/index.js +108 -0
  150. package/dist/esm/sevenz/codecs/index.js.map +1 -0
  151. package/dist/esm/sevenz/codecs/streams.d.ts +18 -0
  152. package/dist/esm/sevenz/codecs/streams.js +66 -0
  153. package/dist/esm/sevenz/codecs/streams.js.map +1 -0
  154. package/dist/esm/sevenz/constants.d.ts +86 -0
  155. package/dist/esm/sevenz/constants.js +131 -0
  156. package/dist/esm/sevenz/constants.js.map +1 -0
  157. package/dist/esm/sevenz/headers.d.ts +70 -0
  158. package/dist/esm/sevenz/headers.js +646 -0
  159. package/dist/esm/sevenz/headers.js.map +1 -0
  160. package/dist/esm/sevenz/index.d.ts +4 -0
  161. package/dist/esm/sevenz/index.js +5 -0
  162. package/dist/esm/sevenz/index.js.map +1 -0
  163. package/dist/esm/types.d.ts +37 -0
  164. package/dist/esm/types.js +2 -0
  165. package/dist/esm/types.js.map +1 -0
  166. package/package.json +77 -0
@@ -0,0 +1,661 @@
1
+ // 7z header parsing
2
+ // Reference: https://py7zr.readthedocs.io/en/latest/archive_format.html
3
+ "use strict";
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ function _export(target, all) {
8
+ for(var name in all)Object.defineProperty(target, name, {
9
+ enumerable: true,
10
+ get: Object.getOwnPropertyDescriptor(all, name).get
11
+ });
12
+ }
13
+ _export(exports, {
14
+ get parseEncodedHeader () {
15
+ return parseEncodedHeader;
16
+ },
17
+ get parseHeaderContent () {
18
+ return parseHeaderContent;
19
+ },
20
+ get parseSignatureHeader () {
21
+ return parseSignatureHeader;
22
+ }
23
+ });
24
+ var _extractbaseiterator = require("extract-base-iterator");
25
+ var _constantsts = require("./constants.js");
26
+ var _NumberCodects = require("./NumberCodec.js");
27
+ function parseSignatureHeader(buf) {
28
+ // Verify magic bytes
29
+ if (!(0, _extractbaseiterator.bufferEquals)(buf, 0, _constantsts.SEVENZ_MAGIC)) {
30
+ throw (0, _constantsts.createCodedError)('Not a valid 7z archive', _constantsts.ErrorCode.INVALID_SIGNATURE);
31
+ }
32
+ // Read version
33
+ var majorVersion = buf[6];
34
+ var minorVersion = buf[7];
35
+ // Version check - we support 0.x (current is 0.4)
36
+ if (majorVersion > 0) {
37
+ throw (0, _constantsts.createCodedError)("Unsupported 7z version: ".concat(majorVersion, ".").concat(minorVersion), _constantsts.ErrorCode.UNSUPPORTED_VERSION);
38
+ }
39
+ // Read start header CRC (CRC of the next 20 bytes)
40
+ var startHeaderCRC = buf.readUInt32LE(8);
41
+ // Verify start header CRC
42
+ if (!(0, _extractbaseiterator.verifyCrc32Region)(buf, 12, 20, startHeaderCRC)) {
43
+ throw (0, _constantsts.createCodedError)('Start header CRC mismatch', _constantsts.ErrorCode.CRC_MISMATCH);
44
+ }
45
+ // Read next header location
46
+ var nextHeaderOffset = (0, _extractbaseiterator.readUInt64LE)(buf, 12);
47
+ var nextHeaderSize = (0, _extractbaseiterator.readUInt64LE)(buf, 20);
48
+ var nextHeaderCRC = buf.readUInt32LE(28);
49
+ return {
50
+ majorVersion: majorVersion,
51
+ minorVersion: minorVersion,
52
+ startHeaderCRC: startHeaderCRC,
53
+ nextHeaderOffset: nextHeaderOffset,
54
+ nextHeaderSize: nextHeaderSize,
55
+ nextHeaderCRC: nextHeaderCRC
56
+ };
57
+ }
58
+ function parseEncodedHeader(buf, expectedCRC) {
59
+ // Verify CRC
60
+ if (!(0, _extractbaseiterator.verifyCrc32Region)(buf, 0, buf.length, expectedCRC)) {
61
+ throw (0, _constantsts.createCodedError)('Encoded header CRC mismatch', _constantsts.ErrorCode.CRC_MISMATCH);
62
+ }
63
+ var offset = 0;
64
+ // Read property ID
65
+ var propertyId = buf[offset++];
66
+ // Handle kEncodedHeader - means the header itself is compressed
67
+ if (propertyId === _constantsts.PropertyId.kEncodedHeader) {
68
+ // Return indicator that we need to decompress
69
+ throw (0, _constantsts.createCodedError)('Compressed header - needs decompression first', _constantsts.ErrorCode.COMPRESSED_HEADER);
70
+ }
71
+ // Should be kHeader
72
+ if (propertyId !== _constantsts.PropertyId.kHeader) {
73
+ throw (0, _constantsts.createCodedError)("Expected kHeader, got ".concat(propertyId), _constantsts.ErrorCode.CORRUPT_HEADER);
74
+ }
75
+ // Parse header contents (after kHeader byte)
76
+ return parseHeaderContent(buf, offset);
77
+ }
78
+ function parseHeaderContent(buf, offset) {
79
+ var result = {
80
+ filesInfo: []
81
+ };
82
+ // Parse header contents
83
+ while(offset < buf.length){
84
+ var propertyId = buf[offset++];
85
+ if (propertyId === _constantsts.PropertyId.kEnd) {
86
+ break;
87
+ }
88
+ switch(propertyId){
89
+ case _constantsts.PropertyId.kArchiveProperties:
90
+ offset = skipArchiveProperties(buf, offset);
91
+ break;
92
+ case _constantsts.PropertyId.kAdditionalStreamsInfo:
93
+ // Additional streams - skip for now
94
+ offset = skipStreamsInfo(buf, offset);
95
+ break;
96
+ case _constantsts.PropertyId.kMainStreamsInfo:
97
+ {
98
+ var streamsResult = parseStreamsInfo(buf, offset);
99
+ result.streamsInfo = streamsResult.info;
100
+ offset = streamsResult.offset;
101
+ break;
102
+ }
103
+ case _constantsts.PropertyId.kFilesInfo:
104
+ {
105
+ var filesResult = parseFilesInfo(buf, offset);
106
+ result.filesInfo = filesResult.files;
107
+ offset = filesResult.offset;
108
+ break;
109
+ }
110
+ default:
111
+ throw (0, _constantsts.createCodedError)("Unknown property ID in header: ".concat(propertyId), _constantsts.ErrorCode.CORRUPT_HEADER);
112
+ }
113
+ }
114
+ return result;
115
+ }
116
+ /**
117
+ * Parse StreamsInfo block
118
+ */ function parseStreamsInfo(buf, offset) {
119
+ var info = {
120
+ packPos: 0,
121
+ packSizes: [],
122
+ folders: [],
123
+ numUnpackStreamsPerFolder: [],
124
+ unpackSizes: []
125
+ };
126
+ while(offset < buf.length){
127
+ var propertyId = buf[offset++];
128
+ if (propertyId === _constantsts.PropertyId.kEnd) {
129
+ break;
130
+ }
131
+ switch(propertyId){
132
+ case _constantsts.PropertyId.kPackInfo:
133
+ {
134
+ var packResult = parsePackInfo(buf, offset);
135
+ info.packPos = packResult.packPos;
136
+ info.packSizes = packResult.packSizes;
137
+ info.packCRCs = packResult.packCRCs;
138
+ offset = packResult.offset;
139
+ break;
140
+ }
141
+ case _constantsts.PropertyId.kUnpackInfo:
142
+ {
143
+ var unpackResult = parseUnpackInfo(buf, offset);
144
+ info.folders = unpackResult.folders;
145
+ offset = unpackResult.offset;
146
+ break;
147
+ }
148
+ case _constantsts.PropertyId.kSubStreamsInfo:
149
+ {
150
+ var subResult = parseSubStreamsInfo(buf, offset, info.folders);
151
+ info.numUnpackStreamsPerFolder = subResult.numUnpackStreamsPerFolder;
152
+ info.unpackSizes = subResult.unpackSizes;
153
+ info.unpackCRCs = subResult.unpackCRCs;
154
+ offset = subResult.offset;
155
+ break;
156
+ }
157
+ default:
158
+ throw (0, _constantsts.createCodedError)("Unknown property ID in StreamsInfo: ".concat(propertyId), _constantsts.ErrorCode.CORRUPT_HEADER);
159
+ }
160
+ }
161
+ // If no SubStreamsInfo, each folder produces one file
162
+ if (info.unpackSizes.length === 0 && info.folders.length > 0) {
163
+ for(var i = 0; i < info.folders.length; i++){
164
+ var folder = info.folders[i];
165
+ // Get the final unpack size (last coder's output)
166
+ var finalSize = folder.unpackSizes[folder.unpackSizes.length - 1];
167
+ info.unpackSizes.push(finalSize);
168
+ info.numUnpackStreamsPerFolder.push(1);
169
+ }
170
+ }
171
+ return {
172
+ info: info,
173
+ offset: offset
174
+ };
175
+ }
176
+ /**
177
+ * Parse PackInfo block
178
+ */ function parsePackInfo(buf, offset) {
179
+ // Pack position
180
+ var packPosResult = (0, _NumberCodects.readNumber)(buf, offset);
181
+ var packPos = packPosResult.value;
182
+ offset += packPosResult.bytesRead;
183
+ // Number of pack streams
184
+ var numPackResult = (0, _NumberCodects.readNumber)(buf, offset);
185
+ var numPackStreams = numPackResult.value;
186
+ offset += numPackResult.bytesRead;
187
+ var packSizes = [];
188
+ var packCRCs;
189
+ while(offset < buf.length){
190
+ var propertyId = buf[offset++];
191
+ if (propertyId === _constantsts.PropertyId.kEnd) {
192
+ break;
193
+ }
194
+ if (propertyId === _constantsts.PropertyId.kSize) {
195
+ for(var i = 0; i < numPackStreams; i++){
196
+ var sizeResult = (0, _NumberCodects.readNumber)(buf, offset);
197
+ packSizes.push(sizeResult.value);
198
+ offset += sizeResult.bytesRead;
199
+ }
200
+ } else if (propertyId === _constantsts.PropertyId.kCRC) {
201
+ packCRCs = [];
202
+ var definedResult = (0, _NumberCodects.readDefinedVector)(buf, offset, numPackStreams);
203
+ offset += definedResult.bytesRead;
204
+ for(var j = 0; j < numPackStreams; j++){
205
+ if (definedResult.defined[j]) {
206
+ packCRCs.push(buf.readUInt32LE(offset));
207
+ offset += 4;
208
+ } else {
209
+ packCRCs.push(0);
210
+ }
211
+ }
212
+ }
213
+ }
214
+ return {
215
+ packPos: packPos,
216
+ packSizes: packSizes,
217
+ packCRCs: packCRCs,
218
+ offset: offset
219
+ };
220
+ }
221
+ /**
222
+ * Parse UnpackInfo block
223
+ */ function parseUnpackInfo(buf, offset) {
224
+ var folders = [];
225
+ while(offset < buf.length){
226
+ var propertyId = buf[offset++];
227
+ if (propertyId === _constantsts.PropertyId.kEnd) {
228
+ break;
229
+ }
230
+ if (propertyId === _constantsts.PropertyId.kFolder) {
231
+ // Number of folders
232
+ var numFoldersResult = (0, _NumberCodects.readNumber)(buf, offset);
233
+ var numFolders = numFoldersResult.value;
234
+ offset += numFoldersResult.bytesRead;
235
+ // External flag
236
+ var external = buf[offset++];
237
+ if (external !== 0) {
238
+ throw (0, _constantsts.createCodedError)('External folders not supported', _constantsts.ErrorCode.CORRUPT_HEADER);
239
+ }
240
+ // Parse each folder
241
+ for(var i = 0; i < numFolders; i++){
242
+ var folderResult = parseFolder(buf, offset);
243
+ folders.push(folderResult.folder);
244
+ offset = folderResult.offset;
245
+ }
246
+ } else if (propertyId === _constantsts.PropertyId.kCodersUnpackSize) {
247
+ // Unpack sizes for each coder output
248
+ for(var j = 0; j < folders.length; j++){
249
+ var folder = folders[j];
250
+ folder.unpackSizes = [];
251
+ // One unpack size per coder output stream
252
+ var numOutputs = 0;
253
+ for(var k = 0; k < folder.coders.length; k++){
254
+ numOutputs += folder.coders[k].numOutStreams;
255
+ }
256
+ for(var l = 0; l < numOutputs; l++){
257
+ var sizeResult = (0, _NumberCodects.readNumber)(buf, offset);
258
+ folder.unpackSizes.push(sizeResult.value);
259
+ offset += sizeResult.bytesRead;
260
+ }
261
+ }
262
+ } else if (propertyId === _constantsts.PropertyId.kCRC) {
263
+ // CRCs for folders
264
+ var definedResult = (0, _NumberCodects.readDefinedVector)(buf, offset, folders.length);
265
+ offset += definedResult.bytesRead;
266
+ for(var m = 0; m < folders.length; m++){
267
+ folders[m].hasCRC = definedResult.defined[m];
268
+ if (definedResult.defined[m]) {
269
+ folders[m].unpackCRC = buf.readUInt32LE(offset);
270
+ offset += 4;
271
+ }
272
+ }
273
+ }
274
+ }
275
+ return {
276
+ folders: folders,
277
+ offset: offset
278
+ };
279
+ }
280
+ /**
281
+ * Parse a single Folder structure
282
+ */ function parseFolder(buf, offset) {
283
+ // Number of coders
284
+ var numCodersResult = (0, _NumberCodects.readNumber)(buf, offset);
285
+ var numCoders = numCodersResult.value;
286
+ offset += numCodersResult.bytesRead;
287
+ var coders = [];
288
+ var numInStreamsTotal = 0;
289
+ var numOutStreamsTotal = 0;
290
+ for(var i = 0; i < numCoders; i++){
291
+ var flags = buf[offset++];
292
+ var idSize = flags & 0x0f;
293
+ var isComplex = (flags & 0x10) !== 0;
294
+ var hasAttributes = (flags & 0x20) !== 0;
295
+ // Read codec ID
296
+ var id = [];
297
+ for(var j = 0; j < idSize; j++){
298
+ id.push(buf[offset++]);
299
+ }
300
+ var numInStreams = 1;
301
+ var numOutStreams = 1;
302
+ if (isComplex) {
303
+ var inResult = (0, _NumberCodects.readNumber)(buf, offset);
304
+ numInStreams = inResult.value;
305
+ offset += inResult.bytesRead;
306
+ var outResult = (0, _NumberCodects.readNumber)(buf, offset);
307
+ numOutStreams = outResult.value;
308
+ offset += outResult.bytesRead;
309
+ }
310
+ var properties;
311
+ if (hasAttributes) {
312
+ var propsLenResult = (0, _NumberCodects.readNumber)(buf, offset);
313
+ offset += propsLenResult.bytesRead;
314
+ properties = buf.slice(offset, offset + propsLenResult.value);
315
+ offset += propsLenResult.value;
316
+ }
317
+ coders.push({
318
+ id: id,
319
+ numInStreams: numInStreams,
320
+ numOutStreams: numOutStreams,
321
+ properties: properties
322
+ });
323
+ numInStreamsTotal += numInStreams;
324
+ numOutStreamsTotal += numOutStreams;
325
+ }
326
+ // Bind pairs
327
+ var numBindPairs = numOutStreamsTotal - 1;
328
+ var bindPairs = [];
329
+ for(var k = 0; k < numBindPairs; k++){
330
+ var inIndexResult = (0, _NumberCodects.readNumber)(buf, offset);
331
+ offset += inIndexResult.bytesRead;
332
+ var outIndexResult = (0, _NumberCodects.readNumber)(buf, offset);
333
+ offset += outIndexResult.bytesRead;
334
+ bindPairs.push({
335
+ inIndex: inIndexResult.value,
336
+ outIndex: outIndexResult.value
337
+ });
338
+ }
339
+ // Packed stream indices
340
+ var numPackedStreams = numInStreamsTotal - numBindPairs;
341
+ var packedStreams = [];
342
+ if (numPackedStreams === 1) {
343
+ // Find the unbound input stream
344
+ for(var m = 0; m < numInStreamsTotal; m++){
345
+ var isBound = false;
346
+ for(var n = 0; n < bindPairs.length; n++){
347
+ if (bindPairs[n].inIndex === m) {
348
+ isBound = true;
349
+ break;
350
+ }
351
+ }
352
+ if (!isBound) {
353
+ packedStreams.push(m);
354
+ break;
355
+ }
356
+ }
357
+ } else {
358
+ for(var p = 0; p < numPackedStreams; p++){
359
+ var indexResult = (0, _NumberCodects.readNumber)(buf, offset);
360
+ packedStreams.push(indexResult.value);
361
+ offset += indexResult.bytesRead;
362
+ }
363
+ }
364
+ return {
365
+ folder: {
366
+ coders: coders,
367
+ bindPairs: bindPairs,
368
+ packedStreams: packedStreams,
369
+ unpackSizes: [],
370
+ hasCRC: false
371
+ },
372
+ offset: offset
373
+ };
374
+ }
375
+ /**
376
+ * Parse SubStreamsInfo block
377
+ */ function parseSubStreamsInfo(buf, offset, folders) {
378
+ var numUnpackStreamsPerFolder = [];
379
+ var unpackSizes = [];
380
+ var unpackCRCs;
381
+ // Default: 1 file per folder
382
+ for(var i = 0; i < folders.length; i++){
383
+ numUnpackStreamsPerFolder.push(1);
384
+ }
385
+ while(offset < buf.length){
386
+ var propertyId = buf[offset++];
387
+ if (propertyId === _constantsts.PropertyId.kEnd) {
388
+ break;
389
+ }
390
+ if (propertyId === _constantsts.PropertyId.kNumUnpackStream) {
391
+ for(var j = 0; j < folders.length; j++){
392
+ var numResult = (0, _NumberCodects.readNumber)(buf, offset);
393
+ numUnpackStreamsPerFolder[j] = numResult.value;
394
+ offset += numResult.bytesRead;
395
+ }
396
+ } else if (propertyId === _constantsts.PropertyId.kSize) {
397
+ for(var k = 0; k < folders.length; k++){
398
+ var numStreams = numUnpackStreamsPerFolder[k];
399
+ if (numStreams === 0) continue;
400
+ // Read sizes for all but last stream in folder (last is calculated)
401
+ var remaining = folders[k].unpackSizes[folders[k].unpackSizes.length - 1];
402
+ for(var l = 0; l < numStreams - 1; l++){
403
+ var sizeResult = (0, _NumberCodects.readNumber)(buf, offset);
404
+ unpackSizes.push(sizeResult.value);
405
+ remaining -= sizeResult.value;
406
+ offset += sizeResult.bytesRead;
407
+ }
408
+ // Last stream size is remainder
409
+ unpackSizes.push(remaining);
410
+ }
411
+ } else if (propertyId === _constantsts.PropertyId.kCRC) {
412
+ // Count files that need CRC
413
+ var numFiles = 0;
414
+ for(var m = 0; m < folders.length; m++){
415
+ var numStreamsInFolder = numUnpackStreamsPerFolder[m];
416
+ // Only count if folder doesn't have CRC or has multiple streams
417
+ if (!folders[m].hasCRC || numStreamsInFolder > 1) {
418
+ numFiles += numStreamsInFolder;
419
+ }
420
+ }
421
+ unpackCRCs = [];
422
+ var definedResult = (0, _NumberCodects.readDefinedVector)(buf, offset, numFiles);
423
+ offset += definedResult.bytesRead;
424
+ for(var n = 0; n < numFiles; n++){
425
+ if (definedResult.defined[n]) {
426
+ unpackCRCs.push(buf.readUInt32LE(offset));
427
+ offset += 4;
428
+ } else {
429
+ unpackCRCs.push(0);
430
+ }
431
+ }
432
+ }
433
+ }
434
+ // If no sizes specified, use folder unpack sizes
435
+ if (unpackSizes.length === 0) {
436
+ for(var p = 0; p < folders.length; p++){
437
+ var folder = folders[p];
438
+ unpackSizes.push(folder.unpackSizes[folder.unpackSizes.length - 1]);
439
+ }
440
+ }
441
+ return {
442
+ numUnpackStreamsPerFolder: numUnpackStreamsPerFolder,
443
+ unpackSizes: unpackSizes,
444
+ unpackCRCs: unpackCRCs,
445
+ offset: offset
446
+ };
447
+ }
448
+ /**
449
+ * Parse FilesInfo block
450
+ */ function parseFilesInfo(buf, offset) {
451
+ // Number of files
452
+ var numFilesResult = (0, _NumberCodects.readNumber)(buf, offset);
453
+ var numFiles = numFilesResult.value;
454
+ offset += numFilesResult.bytesRead;
455
+ // Initialize files array
456
+ var files = [];
457
+ for(var i = 0; i < numFiles; i++){
458
+ files.push({
459
+ name: '',
460
+ size: 0,
461
+ isDirectory: false,
462
+ isAntiFile: false,
463
+ hasStream: true
464
+ });
465
+ }
466
+ var emptyStreamFlags = [];
467
+ var emptyFileFlags = [];
468
+ while(offset < buf.length){
469
+ var propertyId = buf[offset++];
470
+ if (propertyId === _constantsts.PropertyId.kEnd) {
471
+ break;
472
+ }
473
+ // Read property size
474
+ var propSizeResult = (0, _NumberCodects.readNumber)(buf, offset);
475
+ var propSize = propSizeResult.value;
476
+ offset += propSizeResult.bytesRead;
477
+ var propEnd = offset + propSize;
478
+ switch(propertyId){
479
+ case _constantsts.PropertyId.kEmptyStream:
480
+ emptyStreamFlags = readBoolVector(buf, offset, numFiles);
481
+ // Mark files that don't have streams
482
+ for(var j = 0; j < numFiles; j++){
483
+ files[j].hasStream = !emptyStreamFlags[j];
484
+ }
485
+ break;
486
+ case _constantsts.PropertyId.kEmptyFile:
487
+ {
488
+ var numEmptyStreams = 0;
489
+ for(var k = 0; k < emptyStreamFlags.length; k++){
490
+ if (emptyStreamFlags[k]) numEmptyStreams++;
491
+ }
492
+ emptyFileFlags = readBoolVector(buf, offset, numEmptyStreams);
493
+ break;
494
+ }
495
+ case _constantsts.PropertyId.kAnti:
496
+ {
497
+ var numAnti = 0;
498
+ for(var l = 0; l < emptyStreamFlags.length; l++){
499
+ if (emptyStreamFlags[l]) numAnti++;
500
+ }
501
+ var antiFlags = readBoolVector(buf, offset, numAnti);
502
+ var antiIdx = 0;
503
+ for(var m = 0; m < numFiles; m++){
504
+ if (emptyStreamFlags[m]) {
505
+ files[m].isAntiFile = antiFlags[antiIdx++];
506
+ }
507
+ }
508
+ break;
509
+ }
510
+ case _constantsts.PropertyId.kName:
511
+ offset = parseFileNames(buf, offset, files);
512
+ break;
513
+ case _constantsts.PropertyId.kCTime:
514
+ offset = parseFileTimes(buf, offset, files, 'ctime');
515
+ break;
516
+ case _constantsts.PropertyId.kATime:
517
+ offset = parseFileTimes(buf, offset, files, 'atime');
518
+ break;
519
+ case _constantsts.PropertyId.kMTime:
520
+ offset = parseFileTimes(buf, offset, files, 'mtime');
521
+ break;
522
+ case _constantsts.PropertyId.kWinAttributes:
523
+ offset = parseAttributes(buf, offset, files);
524
+ break;
525
+ case _constantsts.PropertyId.kDummy:
526
+ break;
527
+ default:
528
+ break;
529
+ }
530
+ offset = propEnd;
531
+ }
532
+ // Determine directories from empty stream + not empty file
533
+ var emptyIdx = 0;
534
+ for(var n = 0; n < numFiles; n++){
535
+ if (emptyStreamFlags[n]) {
536
+ // Empty stream - could be directory or empty file
537
+ if (emptyIdx < emptyFileFlags.length && emptyFileFlags[emptyIdx]) {
538
+ files[n].isDirectory = false; // Empty file
539
+ } else {
540
+ files[n].isDirectory = true; // Directory
541
+ }
542
+ emptyIdx++;
543
+ }
544
+ }
545
+ return {
546
+ files: files,
547
+ offset: offset
548
+ };
549
+ }
550
+ /**
551
+ * Read a boolean vector (bit-packed)
552
+ */ function readBoolVector(buf, offset, count) {
553
+ var result = [];
554
+ var byteIdx = 0;
555
+ var bitMask = 0x80;
556
+ for(var i = 0; i < count; i++){
557
+ result.push((buf[offset + byteIdx] & bitMask) !== 0);
558
+ bitMask = bitMask >>> 1;
559
+ if (bitMask === 0) {
560
+ bitMask = 0x80;
561
+ byteIdx++;
562
+ }
563
+ }
564
+ return result;
565
+ }
566
+ /**
567
+ * Parse file names (UTF-16LE encoded)
568
+ */ function parseFileNames(buf, offset, files) {
569
+ // External flag
570
+ var external = buf[offset++];
571
+ if (external !== 0) {
572
+ throw (0, _constantsts.createCodedError)('External file names not supported', _constantsts.ErrorCode.CORRUPT_HEADER);
573
+ }
574
+ // Names are UTF-16LE, null-terminated
575
+ for(var i = 0; i < files.length; i++){
576
+ var nameChars = [];
577
+ while(offset < buf.length){
578
+ var charCode = buf.readUInt16LE(offset);
579
+ offset += 2;
580
+ if (charCode === 0) break;
581
+ nameChars.push(charCode);
582
+ }
583
+ files[i].name = String.fromCharCode.apply(null, nameChars);
584
+ }
585
+ return offset;
586
+ }
587
+ /**
588
+ * Parse file times (Windows FILETIME format)
589
+ */ function parseFileTimes(buf, offset, files, timeType) {
590
+ // Read defined vector (allDefined byte + optional bitmask)
591
+ var definedResult = (0, _NumberCodects.readDefinedVector)(buf, offset, files.length);
592
+ offset += definedResult.bytesRead;
593
+ // External flag - 0x00 means data follows inline, non-zero means external stream
594
+ var external = buf[offset++];
595
+ if (external !== 0) {
596
+ throw (0, _constantsts.createCodedError)('External file times not supported', _constantsts.ErrorCode.UNSUPPORTED_FEATURE);
597
+ }
598
+ // Read times
599
+ for(var i = 0; i < files.length; i++){
600
+ if (definedResult.defined[i]) {
601
+ var filetime = (0, _extractbaseiterator.readUInt64LE)(buf, offset);
602
+ offset += 8;
603
+ // Convert FILETIME (100ns since 1601) to JavaScript Date
604
+ // FILETIME epoch: 1601-01-01
605
+ // JS Date epoch: 1970-01-01
606
+ // Difference: 11644473600 seconds
607
+ var ms = filetime / 10000 - 11644473600000;
608
+ files[i][timeType] = new Date(ms);
609
+ }
610
+ }
611
+ return offset;
612
+ }
613
+ /**
614
+ * Parse Windows file attributes
615
+ */ function parseAttributes(buf, offset, files) {
616
+ // Read defined vector (allDefined byte + optional bitmask)
617
+ var definedResult = (0, _NumberCodects.readDefinedVector)(buf, offset, files.length);
618
+ offset += definedResult.bytesRead;
619
+ // External flag - 0x00 means data follows inline, non-zero means external stream
620
+ var external = buf[offset++];
621
+ if (external !== 0) {
622
+ throw (0, _constantsts.createCodedError)('External file attributes not supported', _constantsts.ErrorCode.UNSUPPORTED_FEATURE);
623
+ }
624
+ // Read attributes
625
+ for(var i = 0; i < files.length; i++){
626
+ if (definedResult.defined[i]) {
627
+ files[i].attributes = buf.readUInt32LE(offset);
628
+ offset += 4;
629
+ }
630
+ }
631
+ return offset;
632
+ }
633
+ /**
634
+ * Skip archive properties block
635
+ */ function skipArchiveProperties(buf, offset) {
636
+ while(offset < buf.length){
637
+ var propertyId = buf[offset++];
638
+ if (propertyId === _constantsts.PropertyId.kEnd) {
639
+ break;
640
+ }
641
+ var sizeResult = (0, _NumberCodects.readNumber)(buf, offset);
642
+ offset += sizeResult.bytesRead + sizeResult.value;
643
+ }
644
+ return offset;
645
+ }
646
+ /**
647
+ * Skip streams info block (for additional streams)
648
+ */ function skipStreamsInfo(buf, offset) {
649
+ while(offset < buf.length){
650
+ var propertyId = buf[offset++];
651
+ if (propertyId === _constantsts.PropertyId.kEnd) {
652
+ break;
653
+ }
654
+ // For nested structures, recurse
655
+ if (propertyId === _constantsts.PropertyId.kPackInfo || propertyId === _constantsts.PropertyId.kUnpackInfo || propertyId === _constantsts.PropertyId.kSubStreamsInfo) {
656
+ offset = skipStreamsInfo(buf, offset);
657
+ }
658
+ }
659
+ return offset;
660
+ }
661
+ /* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }