@intactfile/engines 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 (207) hide show
  1. package/README.md +68 -0
  2. package/dist/archive/diagnose.d.ts +37 -0
  3. package/dist/archive/diagnose.d.ts.map +1 -0
  4. package/dist/archive/diagnose.js +165 -0
  5. package/dist/archive/diagnose.js.map +1 -0
  6. package/dist/archive/format.d.ts +52 -0
  7. package/dist/archive/format.d.ts.map +1 -0
  8. package/dist/archive/format.js +87 -0
  9. package/dist/archive/format.js.map +1 -0
  10. package/dist/archive/host.d.ts +83 -0
  11. package/dist/archive/host.d.ts.map +1 -0
  12. package/dist/archive/host.js +92 -0
  13. package/dist/archive/host.js.map +1 -0
  14. package/dist/archive/index.d.ts +22 -0
  15. package/dist/archive/index.d.ts.map +1 -0
  16. package/dist/archive/index.js +19 -0
  17. package/dist/archive/index.js.map +1 -0
  18. package/dist/archive/salvage.d.ts +73 -0
  19. package/dist/archive/salvage.d.ts.map +1 -0
  20. package/dist/archive/salvage.js +210 -0
  21. package/dist/archive/salvage.js.map +1 -0
  22. package/dist/byte-source.d.ts +19 -0
  23. package/dist/byte-source.d.ts.map +1 -0
  24. package/dist/byte-source.js +16 -0
  25. package/dist/byte-source.js.map +1 -0
  26. package/dist/bytesource/blob.d.ts +14 -0
  27. package/dist/bytesource/blob.d.ts.map +1 -0
  28. package/dist/bytesource/blob.js +23 -0
  29. package/dist/bytesource/blob.js.map +1 -0
  30. package/dist/crc32.d.ts +2 -0
  31. package/dist/crc32.d.ts.map +1 -0
  32. package/dist/crc32.js +18 -0
  33. package/dist/crc32.js.map +1 -0
  34. package/dist/detect/index.d.ts +16 -0
  35. package/dist/detect/index.d.ts.map +1 -0
  36. package/dist/detect/index.js +159 -0
  37. package/dist/detect/index.js.map +1 -0
  38. package/dist/index.d.ts +24 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +17 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/jpeg/browser-loader.d.ts +21 -0
  43. package/dist/jpeg/browser-loader.d.ts.map +1 -0
  44. package/dist/jpeg/browser-loader.js +28 -0
  45. package/dist/jpeg/browser-loader.js.map +1 -0
  46. package/dist/jpeg/diagnose.d.ts +50 -0
  47. package/dist/jpeg/diagnose.d.ts.map +1 -0
  48. package/dist/jpeg/diagnose.js +124 -0
  49. package/dist/jpeg/diagnose.js.map +1 -0
  50. package/dist/jpeg/exif.d.ts +11 -0
  51. package/dist/jpeg/exif.d.ts.map +1 -0
  52. package/dist/jpeg/exif.js +50 -0
  53. package/dist/jpeg/exif.js.map +1 -0
  54. package/dist/jpeg/format.d.ts +106 -0
  55. package/dist/jpeg/format.d.ts.map +1 -0
  56. package/dist/jpeg/format.js +248 -0
  57. package/dist/jpeg/format.js.map +1 -0
  58. package/dist/jpeg/index.d.ts +18 -0
  59. package/dist/jpeg/index.d.ts.map +1 -0
  60. package/dist/jpeg/index.js +14 -0
  61. package/dist/jpeg/index.js.map +1 -0
  62. package/dist/jpeg/mozjpeg-host.d.ts +60 -0
  63. package/dist/jpeg/mozjpeg-host.d.ts.map +1 -0
  64. package/dist/jpeg/mozjpeg-host.js +138 -0
  65. package/dist/jpeg/mozjpeg-host.js.map +1 -0
  66. package/dist/jpeg/repair.d.ts +89 -0
  67. package/dist/jpeg/repair.d.ts.map +1 -0
  68. package/dist/jpeg/repair.js +216 -0
  69. package/dist/jpeg/repair.js.map +1 -0
  70. package/dist/node.d.ts +11 -0
  71. package/dist/node.d.ts.map +1 -0
  72. package/dist/node.js +29 -0
  73. package/dist/node.js.map +1 -0
  74. package/dist/pdf/browser-loader.d.ts +30 -0
  75. package/dist/pdf/browser-loader.d.ts.map +1 -0
  76. package/dist/pdf/browser-loader.js +21 -0
  77. package/dist/pdf/browser-loader.js.map +1 -0
  78. package/dist/pdf/diagnose.d.ts +23 -0
  79. package/dist/pdf/diagnose.d.ts.map +1 -0
  80. package/dist/pdf/diagnose.js +113 -0
  81. package/dist/pdf/diagnose.js.map +1 -0
  82. package/dist/pdf/format.d.ts +61 -0
  83. package/dist/pdf/format.d.ts.map +1 -0
  84. package/dist/pdf/format.js +150 -0
  85. package/dist/pdf/format.js.map +1 -0
  86. package/dist/pdf/index.d.ts +17 -0
  87. package/dist/pdf/index.d.ts.map +1 -0
  88. package/dist/pdf/index.js +12 -0
  89. package/dist/pdf/index.js.map +1 -0
  90. package/dist/pdf/qpdf-host.d.ts +66 -0
  91. package/dist/pdf/qpdf-host.d.ts.map +1 -0
  92. package/dist/pdf/qpdf-host.js +149 -0
  93. package/dist/pdf/qpdf-host.js.map +1 -0
  94. package/dist/pdf/rebuild.d.ts +32 -0
  95. package/dist/pdf/rebuild.d.ts.map +1 -0
  96. package/dist/pdf/rebuild.js +90 -0
  97. package/dist/pdf/rebuild.js.map +1 -0
  98. package/dist/pdf/repair.d.ts +61 -0
  99. package/dist/pdf/repair.d.ts.map +1 -0
  100. package/dist/pdf/repair.js +167 -0
  101. package/dist/pdf/repair.js.map +1 -0
  102. package/dist/png/diagnose.d.ts +50 -0
  103. package/dist/png/diagnose.d.ts.map +1 -0
  104. package/dist/png/diagnose.js +261 -0
  105. package/dist/png/diagnose.js.map +1 -0
  106. package/dist/png/format.d.ts +133 -0
  107. package/dist/png/format.d.ts.map +1 -0
  108. package/dist/png/format.js +350 -0
  109. package/dist/png/format.js.map +1 -0
  110. package/dist/png/index.d.ts +13 -0
  111. package/dist/png/index.d.ts.map +1 -0
  112. package/dist/png/index.js +10 -0
  113. package/dist/png/index.js.map +1 -0
  114. package/dist/png/repair.d.ts +31 -0
  115. package/dist/png/repair.d.ts.map +1 -0
  116. package/dist/png/repair.js +335 -0
  117. package/dist/png/repair.js.map +1 -0
  118. package/dist/sqlite/diagnose.d.ts +31 -0
  119. package/dist/sqlite/diagnose.d.ts.map +1 -0
  120. package/dist/sqlite/diagnose.js +169 -0
  121. package/dist/sqlite/diagnose.js.map +1 -0
  122. package/dist/sqlite/format.d.ts +103 -0
  123. package/dist/sqlite/format.d.ts.map +1 -0
  124. package/dist/sqlite/format.js +237 -0
  125. package/dist/sqlite/format.js.map +1 -0
  126. package/dist/sqlite/index.d.ts +24 -0
  127. package/dist/sqlite/index.d.ts.map +1 -0
  128. package/dist/sqlite/index.js +19 -0
  129. package/dist/sqlite/index.js.map +1 -0
  130. package/dist/sqlite/recover.d.ts +66 -0
  131. package/dist/sqlite/recover.d.ts.map +1 -0
  132. package/dist/sqlite/recover.js +305 -0
  133. package/dist/sqlite/recover.js.map +1 -0
  134. package/dist/sqlite/scan.d.ts +94 -0
  135. package/dist/sqlite/scan.d.ts.map +1 -0
  136. package/dist/sqlite/scan.js +356 -0
  137. package/dist/sqlite/scan.js.map +1 -0
  138. package/dist/sqlite/sqlite-host.d.ts +37 -0
  139. package/dist/sqlite/sqlite-host.d.ts.map +1 -0
  140. package/dist/sqlite/sqlite-host.js +80 -0
  141. package/dist/sqlite/sqlite-host.js.map +1 -0
  142. package/dist/sqlite/wal.d.ts +14 -0
  143. package/dist/sqlite/wal.d.ts.map +1 -0
  144. package/dist/sqlite/wal.js +79 -0
  145. package/dist/sqlite/wal.js.map +1 -0
  146. package/dist/types.d.ts +2 -0
  147. package/dist/types.d.ts.map +1 -0
  148. package/dist/types.js +2 -0
  149. package/dist/types.js.map +1 -0
  150. package/dist/video/diagnose.d.ts +41 -0
  151. package/dist/video/diagnose.d.ts.map +1 -0
  152. package/dist/video/diagnose.js +188 -0
  153. package/dist/video/diagnose.js.map +1 -0
  154. package/dist/video/format.d.ts +87 -0
  155. package/dist/video/format.d.ts.map +1 -0
  156. package/dist/video/format.js +273 -0
  157. package/dist/video/format.js.map +1 -0
  158. package/dist/video/index.d.ts +21 -0
  159. package/dist/video/index.d.ts.map +1 -0
  160. package/dist/video/index.js +17 -0
  161. package/dist/video/index.js.map +1 -0
  162. package/dist/video/libav-host.d.ts +88 -0
  163. package/dist/video/libav-host.d.ts.map +1 -0
  164. package/dist/video/libav-host.js +66 -0
  165. package/dist/video/libav-host.js.map +1 -0
  166. package/dist/video/mp4-rebuild.d.ts +167 -0
  167. package/dist/video/mp4-rebuild.d.ts.map +1 -0
  168. package/dist/video/mp4-rebuild.js +270 -0
  169. package/dist/video/mp4-rebuild.js.map +1 -0
  170. package/dist/video/mp4box-host.d.ts +62 -0
  171. package/dist/video/mp4box-host.d.ts.map +1 -0
  172. package/dist/video/mp4box-host.js +209 -0
  173. package/dist/video/mp4box-host.js.map +1 -0
  174. package/dist/video/reconstruct.d.ts +97 -0
  175. package/dist/video/reconstruct.d.ts.map +1 -0
  176. package/dist/video/reconstruct.js +271 -0
  177. package/dist/video/reconstruct.js.map +1 -0
  178. package/dist/video/remux.d.ts +85 -0
  179. package/dist/video/remux.d.ts.map +1 -0
  180. package/dist/video/remux.js +350 -0
  181. package/dist/video/remux.js.map +1 -0
  182. package/dist/zip/diagnose.d.ts +22 -0
  183. package/dist/zip/diagnose.d.ts.map +1 -0
  184. package/dist/zip/diagnose.js +126 -0
  185. package/dist/zip/diagnose.js.map +1 -0
  186. package/dist/zip/format.d.ts +79 -0
  187. package/dist/zip/format.d.ts.map +1 -0
  188. package/dist/zip/format.js +129 -0
  189. package/dist/zip/format.js.map +1 -0
  190. package/dist/zip/repair.d.ts +32 -0
  191. package/dist/zip/repair.d.ts.map +1 -0
  192. package/dist/zip/repair.js +82 -0
  193. package/dist/zip/repair.js.map +1 -0
  194. package/dist/zip/salvage.d.ts +23 -0
  195. package/dist/zip/salvage.d.ts.map +1 -0
  196. package/dist/zip/salvage.js +140 -0
  197. package/dist/zip/salvage.js.map +1 -0
  198. package/dist/zip/scan.d.ts +64 -0
  199. package/dist/zip/scan.d.ts.map +1 -0
  200. package/dist/zip/scan.js +386 -0
  201. package/dist/zip/scan.js.map +1 -0
  202. package/dist/zip/writer.d.ts +14 -0
  203. package/dist/zip/writer.d.ts.map +1 -0
  204. package/dist/zip/writer.js +131 -0
  205. package/dist/zip/writer.js.map +1 -0
  206. package/package.json +71 -0
  207. package/src/archive/LICENSE-unrar.txt +53 -0
@@ -0,0 +1,386 @@
1
+ import { CDH_FIXED_SIZE, EOCD_FIXED_SIZE, FLAG_DATA_DESCRIPTOR, FLAG_UTF8, LFH_FIXED_SIZE, MAX_COMMENT, SIG_CDH, SIG_DD, SIG_EOCD, SIG_EOCD64, SIG_EOCD64_LOC, SIG_LFH, U32_MAX, localHeaderLooksSane, parseEocd, parseLocalHeader, parseZip64Extra, readU16, readU32, readU64, reconcileDeclaredSize, } from './format.js';
2
+ const CHUNK = 1 << 20;
3
+ function concat(a, b) {
4
+ const out = new Uint8Array(a.length + b.length);
5
+ out.set(a, 0);
6
+ out.set(b, a.length);
7
+ return out;
8
+ }
9
+ async function* iterateSignatures(src, from, sigs) {
10
+ let base = from;
11
+ let carry = new Uint8Array(0);
12
+ while (base < src.size) {
13
+ const chunk = await src.read(base, CHUNK);
14
+ if (chunk.length === 0)
15
+ break;
16
+ const buf = carry.length ? concat(carry, chunk) : chunk;
17
+ const bufBase = base - carry.length;
18
+ for (let i = 0; i + 4 <= buf.length; i++) {
19
+ if (buf[i] === 0x50 && buf[i + 1] === 0x4b) {
20
+ const sig = readU32(buf, i);
21
+ if (sigs.has(sig))
22
+ yield { offset: bufBase + i, sig };
23
+ }
24
+ }
25
+ carry = buf.subarray(Math.max(0, buf.length - 3));
26
+ base += chunk.length;
27
+ }
28
+ }
29
+ const STRUCT_SIGS = new Set([SIG_LFH, SIG_CDH, SIG_EOCD]);
30
+ /** Find the next plausible structural record (validated LFH, CDH, or EOCD) at or after `from`. */
31
+ export async function nextStructuralBoundary(src, from) {
32
+ for await (const m of iterateSignatures(src, from, STRUCT_SIGS)) {
33
+ if (m.sig === SIG_LFH) {
34
+ const h = parseLocalHeader(await src.read(m.offset, LFH_FIXED_SIZE));
35
+ if (h && localHeaderLooksSane(h))
36
+ return m;
37
+ }
38
+ else if (m.sig === SIG_CDH) {
39
+ const b = await src.read(m.offset, CDH_FIXED_SIZE);
40
+ if (b.length === CDH_FIXED_SIZE && readU16(b, 28) <= 4096)
41
+ return m;
42
+ }
43
+ else {
44
+ return m;
45
+ }
46
+ }
47
+ return null;
48
+ }
49
+ /**
50
+ * Locate the data descriptor for an entry starting at `dataStart`. A PK\x07\x08
51
+ * candidate only counts when its compressed-size field equals the distance from
52
+ * dataStart (filters signatures occurring inside compressed data). Falls back
53
+ * to signature-less descriptors validated against the next structural record.
54
+ */
55
+ async function resolveDescriptor(src, dataStart) {
56
+ for await (const m of iterateSignatures(src, dataStart, new Set([SIG_DD]))) {
57
+ const b = await src.read(m.offset + 4, 20);
58
+ const dist = m.offset - dataStart;
59
+ if (b.length >= 12 && readU32(b, 4) === dist) {
60
+ return {
61
+ crc32: readU32(b, 0),
62
+ compressedSize: dist,
63
+ uncompressedSize: readU32(b, 8),
64
+ descriptorLength: 16,
65
+ };
66
+ }
67
+ if (b.length >= 20 && readU64(b, 4) === dist) {
68
+ return {
69
+ crc32: readU32(b, 0),
70
+ compressedSize: dist,
71
+ uncompressedSize: readU64(b, 12),
72
+ descriptorLength: 24,
73
+ };
74
+ }
75
+ }
76
+ const next = await nextStructuralBoundary(src, dataStart + 1);
77
+ if (next) {
78
+ for (const [len, wide] of [
79
+ [12, false],
80
+ [20, true],
81
+ ]) {
82
+ const end = next.offset - len;
83
+ if (end < dataStart)
84
+ continue;
85
+ const b = await src.read(end, len);
86
+ if (b.length !== len)
87
+ continue;
88
+ const csize = wide ? readU64(b, 4) : readU32(b, 4);
89
+ if (csize === end - dataStart) {
90
+ return {
91
+ crc32: readU32(b, 0),
92
+ compressedSize: csize,
93
+ uncompressedSize: wide ? readU64(b, 12) : readU32(b, 8),
94
+ descriptorLength: len,
95
+ };
96
+ }
97
+ }
98
+ }
99
+ return null;
100
+ }
101
+ function decodeName(bytes, flags) {
102
+ if (flags & FLAG_UTF8)
103
+ return new TextDecoder('utf-8').decode(bytes);
104
+ try {
105
+ return new TextDecoder('utf-8', { fatal: true }).decode(bytes);
106
+ }
107
+ catch {
108
+ // CP437 in the wild; latin1 is a lossy but stable stand-in.
109
+ return new TextDecoder('latin1').decode(bytes);
110
+ }
111
+ }
112
+ /** Forward streaming scan for local file entries; tolerates garbage prefixes, lying headers, and truncation. */
113
+ export async function scanLocalEntries(src) {
114
+ const result = {
115
+ entries: [],
116
+ prefixOffset: 0,
117
+ firstCdhOffset: undefined,
118
+ truncatedTail: false,
119
+ gaps: 0,
120
+ notes: [],
121
+ };
122
+ const first = await nextStructuralBoundary(src, 0);
123
+ if (!first) {
124
+ result.notes.push('no zip structures found');
125
+ return result;
126
+ }
127
+ if (first.sig !== SIG_LFH) {
128
+ // Central directory or EOCD with no local entries (e.g. empty zip).
129
+ if (first.sig === SIG_CDH)
130
+ result.firstCdhOffset = first.offset;
131
+ if (first.offset > 0)
132
+ result.prefixOffset = first.offset;
133
+ return result;
134
+ }
135
+ result.prefixOffset = first.offset;
136
+ if (first.offset > 0)
137
+ result.notes.push(`first local header at offset ${first.offset} (garbage prefix)`);
138
+ let pos = first.offset;
139
+ while (pos < src.size) {
140
+ const sigBytes = await src.read(pos, 4);
141
+ if (sigBytes.length < 4) {
142
+ if (sigBytes.length > 0)
143
+ result.truncatedTail = true;
144
+ break;
145
+ }
146
+ const sig = readU32(sigBytes, 0);
147
+ if (sig === SIG_CDH) {
148
+ result.firstCdhOffset = pos;
149
+ break;
150
+ }
151
+ if (sig === SIG_EOCD || sig === SIG_EOCD64 || sig === SIG_EOCD64_LOC)
152
+ break;
153
+ if (sig !== SIG_LFH) {
154
+ const next = await nextStructuralBoundary(src, pos + 1);
155
+ if (!next) {
156
+ result.notes.push(`unparseable trailing region at offset ${pos}`);
157
+ break;
158
+ }
159
+ result.gaps++;
160
+ if (next.sig !== SIG_LFH) {
161
+ if (next.sig === SIG_CDH)
162
+ result.firstCdhOffset = next.offset;
163
+ break;
164
+ }
165
+ pos = next.offset;
166
+ continue;
167
+ }
168
+ const fixed = await src.read(pos, LFH_FIXED_SIZE);
169
+ const h = parseLocalHeader(fixed);
170
+ if (!h) {
171
+ result.truncatedTail = true;
172
+ result.notes.push(`local header at ${pos} cut off by EOF`);
173
+ break;
174
+ }
175
+ if (!localHeaderLooksSane(h)) {
176
+ const next = await nextStructuralBoundary(src, pos + 1);
177
+ if (!next)
178
+ break;
179
+ result.gaps++;
180
+ if (next.sig !== SIG_LFH) {
181
+ if (next.sig === SIG_CDH)
182
+ result.firstCdhOffset = next.offset;
183
+ break;
184
+ }
185
+ pos = next.offset;
186
+ continue;
187
+ }
188
+ const notes = [];
189
+ const nameBytes = await src.read(pos + LFH_FIXED_SIZE, h.nameLength);
190
+ const extraBytes = await src.read(pos + LFH_FIXED_SIZE + h.nameLength, h.extraLength);
191
+ const dataStart = pos + LFH_FIXED_SIZE + h.nameLength + h.extraLength;
192
+ const entry = {
193
+ headerOffset: pos,
194
+ dataStart,
195
+ method: h.method,
196
+ flags: h.flags,
197
+ nameBytes,
198
+ name: decodeName(nameBytes, h.flags),
199
+ dosTime: h.dosTime,
200
+ dosDate: h.dosDate,
201
+ // With bit 3 the LFH CRC is customarily 0; a real 0 CRC (empty file) is fine to trust.
202
+ crc32: h.flags & FLAG_DATA_DESCRIPTOR ? undefined : h.crc32,
203
+ compressedSize: 0,
204
+ uncompressedSize: undefined,
205
+ hasDescriptor: (h.flags & FLAG_DATA_DESCRIPTOR) !== 0,
206
+ descriptorLength: 0,
207
+ usedZip64: false,
208
+ complete: false,
209
+ sizeFromScan: false,
210
+ dataEndUncertain: false,
211
+ endValidated: false,
212
+ wrapAroundFixed: false,
213
+ notes,
214
+ };
215
+ if (nameBytes.length < h.nameLength || extraBytes.length < h.extraLength) {
216
+ notes.push('header truncated by EOF');
217
+ result.truncatedTail = true;
218
+ result.entries.push(entry);
219
+ break;
220
+ }
221
+ let declaredCsize = h.compressedSize;
222
+ let declaredUsize = h.uncompressedSize;
223
+ if (h.compressedSize === U32_MAX || h.uncompressedSize === U32_MAX) {
224
+ const z64 = parseZip64Extra(extraBytes, {
225
+ uncompressedSize: h.uncompressedSize === U32_MAX,
226
+ compressedSize: h.compressedSize === U32_MAX,
227
+ });
228
+ if (z64 && !z64.malformed) {
229
+ entry.usedZip64 = true;
230
+ if (h.compressedSize === U32_MAX)
231
+ declaredCsize = z64.compressedSize;
232
+ if (h.uncompressedSize === U32_MAX)
233
+ declaredUsize = z64.uncompressedSize;
234
+ }
235
+ else {
236
+ notes.push(z64 ? 'malformed zip64 extra field' : 'zip64 sizes without zip64 extra field');
237
+ declaredCsize = undefined;
238
+ declaredUsize = undefined;
239
+ entry.sizeFromScan = true;
240
+ }
241
+ }
242
+ if (entry.hasDescriptor) {
243
+ const desc = await resolveDescriptor(src, dataStart);
244
+ if (desc) {
245
+ entry.compressedSize = desc.compressedSize;
246
+ entry.uncompressedSize = desc.uncompressedSize;
247
+ entry.crc32 = desc.crc32;
248
+ entry.descriptorLength = desc.descriptorLength;
249
+ entry.complete = dataStart + desc.compressedSize <= src.size;
250
+ entry.endValidated = true;
251
+ }
252
+ else {
253
+ entry.compressedSize = Math.max(0, src.size - dataStart);
254
+ entry.uncompressedSize = undefined;
255
+ entry.crc32 = h.crc32 || undefined;
256
+ entry.sizeFromScan = true;
257
+ entry.dataEndUncertain = true;
258
+ notes.push('data descriptor not found; data runs to EOF');
259
+ result.truncatedTail = true;
260
+ }
261
+ }
262
+ else if (declaredCsize === undefined) {
263
+ // zip64 fields unusable: recover the size from the next structural record.
264
+ const next = await nextStructuralBoundary(src, dataStart + 1);
265
+ const end = next ? next.offset : src.size;
266
+ entry.compressedSize = Math.max(0, end - dataStart);
267
+ entry.complete = next !== null || src.size > dataStart;
268
+ entry.uncompressedSize = declaredUsize;
269
+ entry.dataEndUncertain = true;
270
+ notes.push('compressed size recovered by structure scan');
271
+ }
272
+ else {
273
+ const declaredEnd = dataStart + declaredCsize;
274
+ if (declaredEnd > src.size) {
275
+ entry.compressedSize = Math.max(0, src.size - dataStart);
276
+ entry.uncompressedSize = declaredUsize;
277
+ entry.complete = false;
278
+ notes.push('entry data truncated by EOF');
279
+ result.truncatedTail = true;
280
+ result.entries.push(entry);
281
+ break;
282
+ }
283
+ const after = await src.read(declaredEnd, 4);
284
+ const afterSig = after.length === 4 ? readU32(after, 0) : undefined;
285
+ const boundaryOk = declaredEnd === src.size ||
286
+ afterSig === SIG_LFH ||
287
+ afterSig === SIG_CDH ||
288
+ afterSig === SIG_EOCD ||
289
+ afterSig === SIG_EOCD64;
290
+ if (boundaryOk) {
291
+ entry.compressedSize = declaredCsize;
292
+ entry.uncompressedSize = declaredUsize;
293
+ entry.complete = true;
294
+ entry.endValidated = true;
295
+ }
296
+ else {
297
+ const next = await nextStructuralBoundary(src, dataStart + 1);
298
+ const actual = (next ? next.offset : src.size) - dataStart;
299
+ const reconciled = actual > 0 ? reconcileDeclaredSize(declaredCsize, actual) : null;
300
+ if (reconciled && reconciled.wrapAroundFixed) {
301
+ entry.compressedSize = reconciled.size;
302
+ entry.wrapAroundFixed = true;
303
+ entry.uncompressedSize = undefined;
304
+ entry.complete = true;
305
+ entry.sizeFromScan = true;
306
+ entry.endValidated = true;
307
+ notes.push('32-bit size wraparound fixed (OneDrive-style bad zip64)');
308
+ }
309
+ else {
310
+ // Header may lie (or junk may follow a truthful size): keep both
311
+ // candidates and let data validation pick the right one.
312
+ entry.compressedSize = Math.max(0, actual);
313
+ entry.altCompressedSize = declaredCsize;
314
+ entry.uncompressedSize = undefined;
315
+ entry.complete = true;
316
+ entry.sizeFromScan = true;
317
+ entry.dataEndUncertain = true;
318
+ notes.push(`declared compressed size ${declaredCsize} inconsistent with structure at +${actual}; kept as fallback candidate`);
319
+ }
320
+ }
321
+ }
322
+ result.entries.push(entry);
323
+ const nextPos = dataStart + entry.compressedSize + entry.descriptorLength;
324
+ if (nextPos <= pos)
325
+ break;
326
+ pos = nextPos;
327
+ }
328
+ return result;
329
+ }
330
+ /** Locate the EOCD record by scanning the file tail; resolves zip64 overrides when present. */
331
+ export async function findEocd(src) {
332
+ const tailLen = Math.min(src.size, EOCD_FIXED_SIZE + MAX_COMMENT + 64);
333
+ if (tailLen < EOCD_FIXED_SIZE)
334
+ return null;
335
+ const tailStart = src.size - tailLen;
336
+ const tail = await src.read(tailStart, tailLen);
337
+ let found = null;
338
+ const notes = [];
339
+ for (let i = tail.length - EOCD_FIXED_SIZE; i >= 0; i--) {
340
+ if (readU32(tail, i) !== SIG_EOCD)
341
+ continue;
342
+ const eocd = parseEocd(tail, i, tailStart + i);
343
+ if (!eocd)
344
+ continue;
345
+ const end = tailStart + i + EOCD_FIXED_SIZE + eocd.commentLength;
346
+ if (end === src.size) {
347
+ found = eocd;
348
+ break;
349
+ }
350
+ if (!found && end < src.size) {
351
+ found = eocd;
352
+ notes.push('EOCD followed by trailing junk');
353
+ // keep scanning for an exact match closer to nothing? exact match wins via break above
354
+ }
355
+ }
356
+ if (!found)
357
+ return null;
358
+ const result = { eocd: found, notes };
359
+ if (found.totalEntries === 0xffff ||
360
+ found.cdOffset === U32_MAX ||
361
+ found.cdSize === U32_MAX) {
362
+ const locOff = found.offset - 20;
363
+ if (locOff >= 0) {
364
+ const loc = await src.read(locOff, 20);
365
+ if (loc.length === 20 && readU32(loc, 0) === SIG_EOCD64_LOC) {
366
+ const eocd64Off = readU64(loc, 8);
367
+ const rec = await src.read(eocd64Off, 56);
368
+ if (rec.length === 56 && readU32(rec, 0) === SIG_EOCD64) {
369
+ result.zip64 = {
370
+ totalEntries: readU64(rec, 32),
371
+ cdSize: readU64(rec, 40),
372
+ cdOffset: readU64(rec, 48),
373
+ };
374
+ }
375
+ else {
376
+ notes.push('zip64 EOCD locator points to invalid record');
377
+ }
378
+ }
379
+ else {
380
+ notes.push('zip64 markers in EOCD but no zip64 locator found');
381
+ }
382
+ }
383
+ }
384
+ return result;
385
+ }
386
+ //# sourceMappingURL=scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/zip/scan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export interface OutEntry {
2
+ nameBytes: Uint8Array;
3
+ flags: number;
4
+ method: number;
5
+ dosTime: number;
6
+ dosDate: number;
7
+ crc32: number;
8
+ uncompressedSize: number;
9
+ /** Bytes stored in the entry data area (already compressed per `method`). */
10
+ data: Uint8Array;
11
+ }
12
+ /** Serialize entries into a fresh, spec-valid ZIP (local headers + central directory + EOCD, zip64 when required). */
13
+ export declare function buildZip(entries: OutEntry[]): Uint8Array;
14
+ //# sourceMappingURL=writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../../src/zip/writer.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,UAAU,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,MAAM,CAAC;IACzB,6EAA6E;IAC7E,IAAI,EAAE,UAAU,CAAC;CAClB;AA6BD,sHAAsH;AACtH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,UAAU,CAyGxD"}
@@ -0,0 +1,131 @@
1
+ import { CDH_FIXED_SIZE, EOCD_FIXED_SIZE, LFH_FIXED_SIZE, SIG_CDH, SIG_EOCD, SIG_EOCD64, SIG_EOCD64_LOC, SIG_LFH, U16_MAX, U32_MAX, } from './format.js';
2
+ class Cursor {
3
+ buf;
4
+ pos = 0;
5
+ constructor(buf) {
6
+ this.buf = buf;
7
+ }
8
+ u16(v) {
9
+ this.buf[this.pos++] = v & 0xff;
10
+ this.buf[this.pos++] = (v >>> 8) & 0xff;
11
+ }
12
+ u32(v) {
13
+ this.buf[this.pos++] = v & 0xff;
14
+ this.buf[this.pos++] = (v >>> 8) & 0xff;
15
+ this.buf[this.pos++] = (v >>> 16) & 0xff;
16
+ this.buf[this.pos++] = (v >>> 24) & 0xff;
17
+ }
18
+ u64(v) {
19
+ this.u32(v % 0x1_0000_0000);
20
+ this.u32(Math.floor(v / 0x1_0000_0000));
21
+ }
22
+ bytes(b) {
23
+ this.buf.set(b, this.pos);
24
+ this.pos += b.length;
25
+ }
26
+ }
27
+ function needsZip64(e, offset) {
28
+ return e.data.length >= U32_MAX || e.uncompressedSize >= U32_MAX || offset >= U32_MAX;
29
+ }
30
+ /** Serialize entries into a fresh, spec-valid ZIP (local headers + central directory + EOCD, zip64 when required). */
31
+ export function buildZip(entries) {
32
+ const offsets = [];
33
+ let size = 0;
34
+ for (const e of entries) {
35
+ offsets.push(size);
36
+ const z64 = needsZip64(e, size);
37
+ size += LFH_FIXED_SIZE + e.nameBytes.length + (z64 ? 20 : 0) + e.data.length;
38
+ }
39
+ const cdStart = size;
40
+ for (let i = 0; i < entries.length; i++) {
41
+ const e = entries[i];
42
+ const z64 = needsZip64(e, offsets[i]);
43
+ size += CDH_FIXED_SIZE + e.nameBytes.length + (z64 ? 32 : 0);
44
+ }
45
+ const cdSize = size - cdStart;
46
+ const anyZip64 = entries.some((e, i) => needsZip64(e, offsets[i])) || entries.length > U16_MAX || cdStart >= U32_MAX;
47
+ if (anyZip64)
48
+ size += 56 + 20;
49
+ size += EOCD_FIXED_SIZE;
50
+ const c = new Cursor(new Uint8Array(size));
51
+ for (let i = 0; i < entries.length; i++) {
52
+ const e = entries[i];
53
+ const z64 = needsZip64(e, offsets[i]);
54
+ c.u32(SIG_LFH);
55
+ c.u16(z64 ? 45 : 20);
56
+ c.u16(e.flags);
57
+ c.u16(e.method);
58
+ c.u16(e.dosTime);
59
+ c.u16(e.dosDate);
60
+ c.u32(e.crc32);
61
+ c.u32(z64 ? U32_MAX : e.data.length);
62
+ c.u32(z64 ? U32_MAX : e.uncompressedSize);
63
+ c.u16(e.nameBytes.length);
64
+ c.u16(z64 ? 20 : 0);
65
+ c.bytes(e.nameBytes);
66
+ if (z64) {
67
+ c.u16(0x0001);
68
+ c.u16(16);
69
+ c.u64(e.uncompressedSize);
70
+ c.u64(e.data.length);
71
+ }
72
+ c.bytes(e.data);
73
+ }
74
+ for (let i = 0; i < entries.length; i++) {
75
+ const e = entries[i];
76
+ const z64 = needsZip64(e, offsets[i]);
77
+ c.u32(SIG_CDH);
78
+ c.u16(z64 ? 45 : 20);
79
+ c.u16(z64 ? 45 : 20);
80
+ c.u16(e.flags);
81
+ c.u16(e.method);
82
+ c.u16(e.dosTime);
83
+ c.u16(e.dosDate);
84
+ c.u32(e.crc32);
85
+ c.u32(z64 ? U32_MAX : e.data.length);
86
+ c.u32(z64 ? U32_MAX : e.uncompressedSize);
87
+ c.u16(e.nameBytes.length);
88
+ c.u16(z64 ? 32 : 0);
89
+ c.u16(0); // comment length
90
+ c.u16(0); // disk number start
91
+ c.u16(0); // internal attrs
92
+ c.u32(0); // external attrs
93
+ c.u32(z64 ? U32_MAX : offsets[i]);
94
+ c.bytes(e.nameBytes);
95
+ if (z64) {
96
+ c.u16(0x0001);
97
+ c.u16(28);
98
+ c.u64(e.uncompressedSize);
99
+ c.u64(e.data.length);
100
+ c.u64(offsets[i]);
101
+ c.u32(0);
102
+ }
103
+ }
104
+ if (anyZip64) {
105
+ const eocd64Offset = c.pos;
106
+ c.u32(SIG_EOCD64);
107
+ c.u64(44); // size of remaining record
108
+ c.u16(45);
109
+ c.u16(45);
110
+ c.u32(0);
111
+ c.u32(0);
112
+ c.u64(entries.length);
113
+ c.u64(entries.length);
114
+ c.u64(cdSize);
115
+ c.u64(cdStart);
116
+ c.u32(SIG_EOCD64_LOC);
117
+ c.u32(0);
118
+ c.u64(eocd64Offset);
119
+ c.u32(1);
120
+ }
121
+ c.u32(SIG_EOCD);
122
+ c.u16(0);
123
+ c.u16(0);
124
+ c.u16(Math.min(entries.length, U16_MAX));
125
+ c.u16(Math.min(entries.length, U16_MAX));
126
+ c.u32(Math.min(cdSize, U32_MAX));
127
+ c.u32(anyZip64 ? U32_MAX : cdStart);
128
+ c.u16(0);
129
+ return c.buf;
130
+ }
131
+ //# sourceMappingURL=writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer.js","sourceRoot":"","sources":["../../src/zip/writer.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,71 @@
1
+ {
2
+ "name": "@intactfile/engines",
3
+ "version": "0.1.0",
4
+ "description": "IntactFile repair engines (SDK): repair corrupted video, ZIP/Office, PDF, JPEG, PNG, SQLite and RAR/7z entirely in-process. Runs in the browser and in Node — files never leave the machine.",
5
+ "private": false,
6
+ "type": "module",
7
+ "license": "UNLICENSED",
8
+ "sideEffects": false,
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "default": "./dist/index.js"
13
+ },
14
+ "./node": {
15
+ "types": "./dist/node.d.ts",
16
+ "default": "./dist/node.js"
17
+ },
18
+ "./pdf": {
19
+ "types": "./dist/pdf/index.d.ts",
20
+ "default": "./dist/pdf/index.js"
21
+ },
22
+ "./video": {
23
+ "types": "./dist/video/index.d.ts",
24
+ "default": "./dist/video/index.js"
25
+ },
26
+ "./jpeg": {
27
+ "types": "./dist/jpeg/index.d.ts",
28
+ "default": "./dist/jpeg/index.js"
29
+ },
30
+ "./sqlite": {
31
+ "types": "./dist/sqlite/index.d.ts",
32
+ "default": "./dist/sqlite/index.js"
33
+ },
34
+ "./archive": {
35
+ "types": "./dist/archive/index.d.ts",
36
+ "default": "./dist/archive/index.js"
37
+ },
38
+ "./png": {
39
+ "types": "./dist/png/index.d.ts",
40
+ "default": "./dist/png/index.js"
41
+ }
42
+ },
43
+ "files": [
44
+ "dist",
45
+ "src/archive/LICENSE-unrar.txt"
46
+ ],
47
+ "dependencies": {
48
+ "7z-wasm": "1.2.0",
49
+ "@jsquash/jpeg": "1.6.0",
50
+ "@libav.js/variant-webcodecs": "6.9.8",
51
+ "@neslinesli93/qpdf-wasm": "0.3.0",
52
+ "exifr": "7.1.3",
53
+ "fast-png": "^8.0.0",
54
+ "fflate": "^0.8.3",
55
+ "mp4box": "2.4.1",
56
+ "pako": "^3.0.1"
57
+ },
58
+ "devDependencies": {
59
+ "@types/node": "^22.15.0",
60
+ "@zip.js/zip.js": "^2.8.31",
61
+ "tsx": "^4.23.1",
62
+ "typescript": "^5.9.3",
63
+ "vitest": "^4.1.10"
64
+ },
65
+ "scripts": {
66
+ "build": "tsc -p tsconfig.json",
67
+ "test": "vitest run",
68
+ "generate-corpus": "tsx scripts/generate-corpus.ts",
69
+ "generate-jpeg-corpus": "tsx scripts/jpeg-corpus.ts"
70
+ }
71
+ }