@intactfile/engines 0.2.0 → 0.3.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 (65) hide show
  1. package/dist/detect/index.d.ts +1 -1
  2. package/dist/detect/index.d.ts.map +1 -1
  3. package/dist/detect/index.js +77 -0
  4. package/dist/detect/index.js.map +1 -1
  5. package/dist/heic/format.d.ts +87 -0
  6. package/dist/heic/format.d.ts.map +1 -0
  7. package/dist/heic/format.js +241 -0
  8. package/dist/heic/format.js.map +1 -0
  9. package/dist/index.d.ts +8 -0
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +9 -0
  12. package/dist/index.js.map +1 -1
  13. package/dist/office-legacy/diagnose.d.ts +24 -0
  14. package/dist/office-legacy/diagnose.d.ts.map +1 -0
  15. package/dist/office-legacy/diagnose.js +111 -0
  16. package/dist/office-legacy/diagnose.js.map +1 -0
  17. package/dist/office-legacy/format.d.ts +89 -0
  18. package/dist/office-legacy/format.d.ts.map +1 -0
  19. package/dist/office-legacy/format.js +281 -0
  20. package/dist/office-legacy/format.js.map +1 -0
  21. package/dist/office-legacy/index.d.ts +9 -0
  22. package/dist/office-legacy/index.d.ts.map +1 -0
  23. package/dist/office-legacy/index.js +18 -0
  24. package/dist/office-legacy/index.js.map +1 -0
  25. package/dist/office-legacy/rebuild.d.ts +8 -0
  26. package/dist/office-legacy/rebuild.d.ts.map +1 -0
  27. package/dist/office-legacy/rebuild.js +234 -0
  28. package/dist/office-legacy/rebuild.js.map +1 -0
  29. package/dist/office-legacy/repair.d.ts +40 -0
  30. package/dist/office-legacy/repair.d.ts.map +1 -0
  31. package/dist/office-legacy/repair.js +161 -0
  32. package/dist/office-legacy/repair.js.map +1 -0
  33. package/dist/psd/diagnose.d.ts +33 -0
  34. package/dist/psd/diagnose.d.ts.map +1 -0
  35. package/dist/psd/diagnose.js +176 -0
  36. package/dist/psd/diagnose.js.map +1 -0
  37. package/dist/psd/format.d.ts +106 -0
  38. package/dist/psd/format.d.ts.map +1 -0
  39. package/dist/psd/format.js +238 -0
  40. package/dist/psd/format.js.map +1 -0
  41. package/dist/psd/index.d.ts +8 -0
  42. package/dist/psd/index.d.ts.map +1 -0
  43. package/dist/psd/index.js +13 -0
  44. package/dist/psd/index.js.map +1 -0
  45. package/dist/psd/repair.d.ts +36 -0
  46. package/dist/psd/repair.d.ts.map +1 -0
  47. package/dist/psd/repair.js +451 -0
  48. package/dist/psd/repair.js.map +1 -0
  49. package/dist/raw/diagnose.d.ts +29 -0
  50. package/dist/raw/diagnose.d.ts.map +1 -0
  51. package/dist/raw/diagnose.js +95 -0
  52. package/dist/raw/diagnose.js.map +1 -0
  53. package/dist/raw/format.d.ts +47 -0
  54. package/dist/raw/format.d.ts.map +1 -0
  55. package/dist/raw/format.js +213 -0
  56. package/dist/raw/format.js.map +1 -0
  57. package/dist/raw/index.d.ts +7 -0
  58. package/dist/raw/index.d.ts.map +1 -0
  59. package/dist/raw/index.js +13 -0
  60. package/dist/raw/index.js.map +1 -0
  61. package/dist/raw/repair.d.ts +46 -0
  62. package/dist/raw/repair.d.ts.map +1 -0
  63. package/dist/raw/repair.js +94 -0
  64. package/dist/raw/repair.js.map +1 -0
  65. package/package.json +14 -2
@@ -0,0 +1,451 @@
1
+ /**
2
+ * PSD/PSB repair by deterministic byte surgery + composite salvage.
3
+ *
4
+ * Pure TypeScript: pako (MIT) inflates ZIP composites, fast-png (MIT) emits a
5
+ * viewable preview. No wasm. What it does:
6
+ * - garbage-prefix / signature-damage → strip / rewrite the 8BPS magic; if the
7
+ * rest is intact, hand the file back UNTOUCHED (layers preserved);
8
+ * - corrupt section length → re-derive boundaries by content (color-mode length
9
+ * forced by mode, image resources re-walked via 8BIM, composite relocated by
10
+ * an exact-fit scan) rather than trusting the length field;
11
+ * - layer section damaged → DROP it (flatten) — layers are never reconstructed;
12
+ * - truncated / composite-corruption → decode the scanlines that survive (RLE
13
+ * resyncs per row) and re-emit a valid, shorter composite;
14
+ * - nothing decodable but a 1036/1033 thumbnail survives → return that JPEG.
15
+ *
16
+ * A repaired PSD is the FLATTENED image. `layersRecovered` is false whenever the
17
+ * input carried layers that were dropped. `verified` means only that our own
18
+ * re-parse + composite re-decode round-trips — never "opens in Photoshop".
19
+ */
20
+ import { Inflate, Z_SYNC_FLUSH } from "pako";
21
+ import { encode as encodePng } from "fast-png";
22
+ import { readAll } from "../bytes-util.js";
23
+ import { diagnosePsdBytes } from "./diagnose.js";
24
+ import { DEFAULT_PSD_CAPS, findJpeg, hasSignatureAt, packBitsRow, parseHeader, rowBytes, serializeHeader, u16be, u32be, u64be, unpackBitsRow, walkImageResources, writeU16be, writeU32be, } from "./format.js";
25
+ const INFLATE_INPUT_SLICE = 4096;
26
+ function safeInflate(data, cap) {
27
+ const inflator = new Inflate();
28
+ const chunks = [];
29
+ let total = 0;
30
+ inflator.onData = (chunk) => {
31
+ if (total >= cap)
32
+ return;
33
+ const take = Math.min(chunk.length, cap - total);
34
+ chunks.push(take === chunk.length ? chunk : chunk.subarray(0, take));
35
+ total += take;
36
+ };
37
+ for (let off = 0; off < data.length; off += INFLATE_INPUT_SLICE) {
38
+ const slice = data.subarray(off, Math.min(off + INFLATE_INPUT_SLICE, data.length));
39
+ const last = off + INFLATE_INPUT_SLICE >= data.length;
40
+ try {
41
+ inflator.push(slice, last ? true : Z_SYNC_FLUSH);
42
+ }
43
+ catch {
44
+ break;
45
+ }
46
+ if (inflator.err)
47
+ break;
48
+ }
49
+ const out = new Uint8Array(total);
50
+ let o = 0;
51
+ for (const c of chunks) {
52
+ out.set(c, o);
53
+ o += c.length;
54
+ }
55
+ return out;
56
+ }
57
+ function unpredict(plane, width, height, depth) {
58
+ const rb = rowBytes(width, depth);
59
+ if (depth === 8) {
60
+ for (let r = 0; r < height; r++) {
61
+ const base = r * rb;
62
+ for (let x = 1; x < rb; x++)
63
+ plane[base + x] = (plane[base + x] + plane[base + x - 1]) & 0xff;
64
+ }
65
+ }
66
+ else if (depth === 16) {
67
+ for (let r = 0; r < height; r++) {
68
+ const base = r * rb;
69
+ for (let x = 1; x < width; x++) {
70
+ const o = base + x * 2;
71
+ const prev = (plane[o - 2] << 8) | plane[o - 1];
72
+ const cur = ((plane[o] << 8) | plane[o + 1]) + prev;
73
+ plane[o] = (cur >>> 8) & 0xff;
74
+ plane[o + 1] = cur & 0xff;
75
+ }
76
+ }
77
+ }
78
+ }
79
+ function decodeComposite(b, header, idOff, caps) {
80
+ const { width, height, channels, depth } = header;
81
+ const rb = rowBytes(width, depth);
82
+ const planeSize = rb * height;
83
+ if (planeSize * channels > caps.maxCompositeBytes)
84
+ return null;
85
+ if (idOff + 2 > b.length)
86
+ return null;
87
+ const compression = u16be(b, idOff);
88
+ const planes = Array.from({ length: channels }, () => new Uint8Array(planeSize));
89
+ const decodedRows = new Array(channels).fill(0);
90
+ if (compression === 0) {
91
+ let src = idOff + 2;
92
+ for (let c = 0; c < channels; c++) {
93
+ for (let r = 0; r < height; r++) {
94
+ if (src + rb > b.length)
95
+ break;
96
+ planes[c].set(b.subarray(src, src + rb), r * rb);
97
+ src += rb;
98
+ decodedRows[c]++;
99
+ }
100
+ }
101
+ }
102
+ else if (compression === 1) {
103
+ const entryW = header.version === 2 ? 4 : 2;
104
+ const entries = height * channels;
105
+ let tp = idOff + 2;
106
+ if (tp + entries * entryW > b.length)
107
+ return null;
108
+ const counts = new Array(entries);
109
+ for (let i = 0; i < entries; i++) {
110
+ counts[i] = entryW === 4 ? u32be(b, tp) : u16be(b, tp);
111
+ tp += entryW;
112
+ }
113
+ let dp = idOff + 2 + entries * entryW;
114
+ outer: for (let c = 0; c < channels; c++) {
115
+ for (let r = 0; r < height; r++) {
116
+ const clen = counts[c * height + r];
117
+ if (dp + clen > b.length)
118
+ break outer;
119
+ const { row, produced } = unpackBitsRow(b, dp, dp + clen, rb);
120
+ planes[c].set(row, r * rb);
121
+ dp += clen;
122
+ if (produced === rb)
123
+ decodedRows[c]++;
124
+ }
125
+ }
126
+ }
127
+ else if (compression === 2 || compression === 3) {
128
+ const inflated = safeInflate(b.subarray(idOff + 2), caps.maxCompositeBytes);
129
+ let src = 0;
130
+ for (let c = 0; c < channels; c++) {
131
+ for (let r = 0; r < height; r++) {
132
+ if (src + rb > inflated.length)
133
+ break;
134
+ planes[c].set(inflated.subarray(src, src + rb), r * rb);
135
+ src += rb;
136
+ decodedRows[c]++;
137
+ }
138
+ }
139
+ if (compression === 3)
140
+ for (const p of planes)
141
+ unpredict(p, width, height, depth);
142
+ }
143
+ else {
144
+ return null;
145
+ }
146
+ return { planes, rowsRecovered: Math.min(...decodedRows) };
147
+ }
148
+ function encodeCompositeRle(planes, header) {
149
+ const { width, height, depth, version } = header;
150
+ const rb = rowBytes(width, depth);
151
+ const entryW = version === 2 ? 4 : 2;
152
+ const entries = height * planes.length;
153
+ const rows = [];
154
+ const counts = new Array(entries);
155
+ let idx = 0;
156
+ for (const plane of planes) {
157
+ for (let r = 0; r < height; r++) {
158
+ const enc = packBitsRow(plane.subarray(r * rb, r * rb + rb));
159
+ counts[idx++] = enc.length;
160
+ rows.push(enc);
161
+ }
162
+ }
163
+ const tableSize = entries * entryW;
164
+ let dataSize = 0;
165
+ for (const row of rows)
166
+ dataSize += row.length;
167
+ const out = new Uint8Array(2 + tableSize + dataSize);
168
+ writeU16be(out, 0, 1);
169
+ let p = 2;
170
+ for (let i = 0; i < entries; i++) {
171
+ if (entryW === 4)
172
+ writeU32be(out, p, counts[i]);
173
+ else
174
+ writeU16be(out, p, counts[i]);
175
+ p += entryW;
176
+ }
177
+ for (const row of rows) {
178
+ out.set(row, p);
179
+ p += row.length;
180
+ }
181
+ return out;
182
+ }
183
+ function concat(parts) {
184
+ let n = 0;
185
+ for (const p of parts)
186
+ n += p.length;
187
+ const out = new Uint8Array(n);
188
+ let o = 0;
189
+ for (const p of parts) {
190
+ out.set(p, o);
191
+ o += p.length;
192
+ }
193
+ return out;
194
+ }
195
+ /** Does a valid image-data (composite) section sit at `off`, consuming to EOF? */
196
+ function imageDataFit(b, header, off) {
197
+ if (off + 2 > b.length)
198
+ return null;
199
+ const comp = u16be(b, off);
200
+ if (comp > 3)
201
+ return null;
202
+ const rb = rowBytes(header.width, header.depth);
203
+ if (comp === 0) {
204
+ return off + 2 + rb * header.height * header.channels === b.length ? "exact" : null;
205
+ }
206
+ if (comp === 1) {
207
+ const entryW = header.version === 2 ? 4 : 2;
208
+ const entries = header.height * header.channels;
209
+ const tableSize = entries * entryW;
210
+ if (off + 2 + tableSize > b.length)
211
+ return null;
212
+ let sum = 0;
213
+ let p = off + 2;
214
+ for (let i = 0; i < entries; i++) {
215
+ sum += entryW === 4 ? u32be(b, p) : u16be(b, p);
216
+ p += entryW;
217
+ }
218
+ return off + 2 + tableSize + sum === b.length ? "exact" : null;
219
+ }
220
+ return off + 2 < b.length ? "zip" : null; // ZIP size can't be pinned without inflate
221
+ }
222
+ const IMAGE_DATA_SCAN_CAP = 64 * 1024 * 1024;
223
+ /** Scan for a raw/RLE composite that exactly fits to EOF (a corrupt layer length made it unlocatable). */
224
+ function locateImageData(b, header, start) {
225
+ const end = Math.min(b.length - 2, start + IMAGE_DATA_SCAN_CAP);
226
+ for (let off = start; off <= end; off++) {
227
+ const c = b[off];
228
+ if (c > 0 || b[off + 1] > 3)
229
+ continue; // cheap gate: compression flag high byte 0, low 0..3
230
+ if (imageDataFit(b, header, off) === "exact")
231
+ return off;
232
+ }
233
+ return -1;
234
+ }
235
+ /** Re-derive section boundaries by content, not by the (possibly corrupt) length fields. */
236
+ function deriveLayout(work, header) {
237
+ // Color-mode data: length is forced by the color mode (0 unless Indexed/Duotone).
238
+ const declaredCm = u32be(work, 26);
239
+ const expectedCm = header.colorMode === 2 ? 768 : header.colorMode === 8 ? declaredCm : 0;
240
+ const cmLen = declaredCm === expectedCm && 30 + declaredCm <= work.length ? declaredCm : expectedCm;
241
+ if (30 + cmLen > work.length)
242
+ return null;
243
+ const colorModeBlock = new Uint8Array(4 + cmLen);
244
+ writeU32be(colorModeBlock, 0, cmLen);
245
+ colorModeBlock.set(work.subarray(30, 30 + cmLen), 4);
246
+ const resStart = 30 + cmLen;
247
+ if (resStart + 4 > work.length)
248
+ return null;
249
+ // Re-walk 8BIM blocks (ignore the declared length, which may be corrupt).
250
+ const resWalk = walkImageResources(work, resStart + 4, work.length - (resStart + 4));
251
+ const resourcesEnd = resStart + 4 + resWalk.trueLength;
252
+ const lenW = header.version === 2 ? 8 : 4;
253
+ const layerStart = resourcesEnd;
254
+ const layerLen = layerStart + lenW <= work.length
255
+ ? (lenW === 8 ? u64be(work, layerStart) : u32be(work, layerStart))
256
+ : -1;
257
+ const cand = layerLen >= 0 ? layerStart + lenW + layerLen : -1;
258
+ let imageDataOffset = -1;
259
+ let hadLayers = false;
260
+ // 1. Trust the layer length when it lands on a composite that fits exactly.
261
+ if (cand >= 0 && imageDataFit(work, header, cand)) {
262
+ imageDataOffset = cand;
263
+ hadLayers = layerLen > 0;
264
+ }
265
+ // 2. Corrupt layer length → scan for an exact-fit composite.
266
+ if (imageDataOffset < 0) {
267
+ const found = locateImageData(work, header, layerStart + lenW);
268
+ if (found >= 0) {
269
+ imageDataOffset = found;
270
+ hadLayers = found > layerStart + lenW;
271
+ }
272
+ }
273
+ // 3. Truncated tail → the layer length is intact but the composite is cut;
274
+ // trust the offset if the compression flag is valid and salvage rows.
275
+ if (imageDataOffset < 0 && cand >= 0 && cand + 2 <= work.length && u16be(work, cand) <= 3) {
276
+ imageDataOffset = cand;
277
+ hadLayers = layerLen > 0;
278
+ }
279
+ if (imageDataOffset < 0)
280
+ return null;
281
+ return { colorModeBlock, resourceBlocks: resWalk.blocks, imageDataOffset, hadLayers };
282
+ }
283
+ function assemblePsd(work, header, layout, imageData) {
284
+ const resBody = concat(layout.resourceBlocks.map((blk) => work.subarray(blk.offset, blk.offset + blk.totalLength)));
285
+ const resHeader = new Uint8Array(4);
286
+ writeU32be(resHeader, 0, resBody.length);
287
+ const layerHeader = new Uint8Array(header.version === 2 ? 8 : 4); // dropped → length 0
288
+ return concat([serializeHeader(header), layout.colorModeBlock, resHeader, resBody, layerHeader, imageData]);
289
+ }
290
+ function compositeToPng(planes, header) {
291
+ const { width, height, depth, colorMode, channels } = header;
292
+ if (depth !== 8)
293
+ return null;
294
+ if (colorMode === 1 && channels >= 1) {
295
+ return encodePng({ width, height, data: planes[0].subarray(0, width * height), channels: 1, depth: 8 });
296
+ }
297
+ if (colorMode === 3 && channels >= 3) {
298
+ const n = width * height;
299
+ const data = new Uint8Array(n * 3);
300
+ const [r, g, bl] = planes;
301
+ for (let i = 0; i < n; i++) {
302
+ data[i * 3] = r[i];
303
+ data[i * 3 + 1] = g[i];
304
+ data[i * 3 + 2] = bl[i];
305
+ }
306
+ return encodePng({ width, height, data, channels: 3, depth: 8 });
307
+ }
308
+ return null;
309
+ }
310
+ function verify(out, caps) {
311
+ const h = parseHeader(out, 0);
312
+ if (!h)
313
+ return false;
314
+ const layout = deriveLayout(out, h);
315
+ if (!layout)
316
+ return false;
317
+ const comp = decodeComposite(out, h, layout.imageDataOffset, caps);
318
+ return !!comp && comp.rowsRecovered === h.height;
319
+ }
320
+ export function repairPsdBytes(input, opts = {}) {
321
+ const caps = opts.caps ?? DEFAULT_PSD_CAPS;
322
+ const bytesIn = input.length;
323
+ const actions = [];
324
+ const notes = [];
325
+ const diag = diagnosePsdBytes(input, caps);
326
+ notes.push(...diag.notes);
327
+ const build = (outcome, out) => {
328
+ const h = out.header ?? null;
329
+ return {
330
+ psd: out.psd,
331
+ preview: out.preview,
332
+ report: {
333
+ outcome,
334
+ damageClass: diag.damageClass,
335
+ actions,
336
+ notes,
337
+ bytesIn,
338
+ bytesOut: out.psd?.length ?? out.preview?.length ?? 0,
339
+ width: h?.width ?? diag.width,
340
+ height: h?.height ?? diag.height,
341
+ channels: h?.channels ?? diag.channels,
342
+ depth: h?.depth ?? diag.depth,
343
+ colorMode: h?.colorMode ?? diag.colorMode,
344
+ layersRecovered: out.layersRecovered ?? false,
345
+ rowsRecovered: out.rowsRecovered ?? null,
346
+ rowsExpected: out.rowsExpected ?? null,
347
+ previewSource: out.previewSource ?? null,
348
+ output: out.output ??
349
+ (out.psd ? "psd" : out.preview ? (out.previewSource === "thumbnail-jpeg" ? "jpeg" : "png") : null),
350
+ verified: out.verified ?? false,
351
+ },
352
+ };
353
+ };
354
+ if (diag.damageClass === "not-psd") {
355
+ notes.push("input is not recognizable as a PSD/PSB; nothing to repair");
356
+ return build("failed", {});
357
+ }
358
+ // Clean file: nothing to repair — hand it back untouched (layers preserved).
359
+ if (diag.damageClass === "none") {
360
+ notes.push("container is structurally valid; nothing to repair");
361
+ const h = parseHeader(input, 0);
362
+ return build("success", {
363
+ psd: input, output: "psd", layersRecovered: true,
364
+ rowsRecovered: h?.height ?? null, rowsExpected: h?.height ?? null, verified: true, header: h,
365
+ });
366
+ }
367
+ // 1. strip a garbage prefix; 2. rewrite a damaged signature.
368
+ let work = input;
369
+ if (diag.prefixBytes > 0) {
370
+ work = input.slice(diag.prefixBytes);
371
+ actions.push(`stripped ${diag.prefixBytes} garbage byte(s) before the 8BPS signature`);
372
+ }
373
+ if (!hasSignatureAt(work, 0) && work[0] === 0x38 && work[1] === 0x42) {
374
+ work = work === input ? input.slice() : work;
375
+ work[0] = 0x38;
376
+ work[1] = 0x42;
377
+ work[2] = 0x50;
378
+ work[3] = 0x53;
379
+ actions.push("rewrote the 8BPS signature");
380
+ }
381
+ // If stripping/rewriting made the whole container valid, keep it as-is (layers preserved).
382
+ if (work !== input) {
383
+ const post = diagnosePsdBytes(work, caps);
384
+ if (post.damageClass === "none") {
385
+ const h = parseHeader(work, 0);
386
+ notes.push("after removing the prefix/signature damage the container is valid; layers preserved");
387
+ return build("success", {
388
+ psd: work, output: "psd", layersRecovered: true,
389
+ rowsRecovered: h?.height ?? null, rowsExpected: h?.height ?? null, verified: verify(work, caps), header: h,
390
+ });
391
+ }
392
+ }
393
+ const header = parseHeader(work, 0);
394
+ const thumbFallback = () => {
395
+ const t = findJpeg(work, 0, work.length);
396
+ if (t) {
397
+ const preview = work.slice(t.offset, t.offset + t.length);
398
+ actions.push(`recovered the embedded ${preview.length}-byte thumbnail JPEG`);
399
+ notes.push("the composite could not be decoded; the embedded thumbnail is the honest recovery");
400
+ return build("partial", { preview, previewSource: "thumbnail-jpeg", output: "jpeg", header });
401
+ }
402
+ notes.push("no decodable composite and no embedded thumbnail: nothing to recover");
403
+ return build("failed", { header });
404
+ };
405
+ if (!header) {
406
+ notes.push("the 26-byte header is not repairable (geometry/depth/mode invalid)");
407
+ return thumbFallback();
408
+ }
409
+ const layout = deriveLayout(work, header);
410
+ if (!layout)
411
+ return thumbFallback();
412
+ const comp = decodeComposite(work, header, layout.imageDataOffset, caps);
413
+ if (!comp || comp.rowsRecovered === 0)
414
+ return thumbFallback();
415
+ const rowsExpected = header.height;
416
+ const rowsRecovered = comp.rowsRecovered;
417
+ const imageData = encodeCompositeRle(comp.planes, header);
418
+ const psd = assemblePsd(work, header, layout, imageData);
419
+ if (layout.hadLayers) {
420
+ actions.push("dropped the damaged layer section and rebuilt a flattened composite");
421
+ notes.push("layers could not be recovered — this is the flattened image");
422
+ }
423
+ else {
424
+ actions.push("re-derived section boundaries and rebuilt a valid flattened composite");
425
+ }
426
+ const verified = verify(psd, caps);
427
+ const preview = compositeToPng(comp.planes, header) ?? undefined;
428
+ let outcome;
429
+ if (rowsRecovered < rowsExpected) {
430
+ outcome = "partial";
431
+ notes.push(`recovered ${rowsRecovered}/${rowsExpected} scanlines; rows after the damage are physically gone`);
432
+ }
433
+ else {
434
+ outcome = layout.hadLayers ? "partial" : "success";
435
+ }
436
+ return build(outcome, {
437
+ psd,
438
+ preview,
439
+ previewSource: preview ? "composite-png" : null,
440
+ output: "psd",
441
+ layersRecovered: !layout.hadLayers,
442
+ rowsRecovered,
443
+ rowsExpected,
444
+ verified,
445
+ header,
446
+ });
447
+ }
448
+ export async function repairPsd(src, opts = {}) {
449
+ return repairPsdBytes(await readAll(src), opts);
450
+ }
451
+ //# sourceMappingURL=repair.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repair.js","sourceRoot":"","sources":["../../src/psd/repair.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Read-only RAW diagnosis: classify container damage without loading a codec.
3
+ * Mirrors diagnoseJpeg — a pure byte scan that grades what is deterministically
4
+ * repairable (prefix/header/index) vs lost (truncated/overwritten payload).
5
+ */
6
+ import type { ByteSource } from "../byte-source.js";
7
+ import type { Confidence } from "../types.js";
8
+ import { type ByteOrder, type RawContainer } from "./format.js";
9
+ export type RawDamageClass = "none" | "garbage-prefix" | "header-damage" | "bad-ifd-offset" | "truncated" | "preview-only" | "payload-overwritten" | "not-raw" | "unknown";
10
+ export interface RawPreview {
11
+ offset: number;
12
+ length: number;
13
+ source: "tiff-tag" | "scan";
14
+ }
15
+ export interface RawDiagnosis {
16
+ container: RawContainer | "unknown";
17
+ order?: ByteOrder;
18
+ damageClass: RawDamageClass;
19
+ confidence: Confidence;
20
+ notes: string[];
21
+ /** bytes of junk before the true container start. */
22
+ prefixBytes: number;
23
+ preview?: RawPreview;
24
+ ifdCount?: number;
25
+ danglingOffsets?: number;
26
+ }
27
+ export declare function diagnoseRawBytes(b: Uint8Array): RawDiagnosis;
28
+ export declare function diagnoseRaw(src: ByteSource): Promise<RawDiagnosis>;
29
+ //# sourceMappingURL=diagnose.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnose.d.ts","sourceRoot":"","sources":["../../src/raw/diagnose.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,EAML,KAAK,SAAS,EACd,KAAK,YAAY,EAClB,MAAM,aAAa,CAAC;AAErB,MAAM,MAAM,cAAc,GACtB,MAAM,GACN,gBAAgB,GAChB,eAAe,GACf,gBAAgB,GAChB,WAAW,GACX,cAAc,GACd,qBAAqB,GACrB,SAAS,GACT,SAAS,CAAC;AAEd,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,UAAU,GAAG,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,YAAY,GAAG,SAAS,CAAC;IACpC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,WAAW,EAAE,cAAc,CAAC;IAC5B,UAAU,EAAE,UAAU,CAAC;IACvB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,qDAAqD;IACrD,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAYD,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,UAAU,GAAG,YAAY,CAiF5D;AAED,wBAAsB,WAAW,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,CAExE"}
@@ -0,0 +1,95 @@
1
+ import { readAll } from "../bytes-util.js";
2
+ import { findLargestJpeg, findRawStart, rawIdAt, readers, walkTiff, } from "./format.js";
3
+ const isTiff = (c) => c !== "cr3" && c !== "raf";
4
+ /** True if bytes look like a TIFF header whose byte-order mark is intact but the
5
+ * 42 magic is corrupt — a deterministically repairable header. */
6
+ function tiffMagicDamaged(b) {
7
+ if (b[0] === 0x49 && b[1] === 0x49 && !(b[2] === 0x2a && b[3] === 0x00))
8
+ return "le";
9
+ if (b[0] === 0x4d && b[1] === 0x4d && !(b[2] === 0x00 && b[3] === 0x2a))
10
+ return "be";
11
+ return null;
12
+ }
13
+ export function diagnoseRawBytes(b) {
14
+ const notes = [];
15
+ const at0 = rawIdAt(b, 0);
16
+ if (!at0) {
17
+ // header magic corrupt but II/MM present?
18
+ const dmg = tiffMagicDamaged(b);
19
+ if (dmg) {
20
+ return {
21
+ container: "tiff",
22
+ order: dmg,
23
+ damageClass: "header-damage",
24
+ confidence: "medium",
25
+ notes: ["TIFF byte-order mark present but the 42 magic is corrupt"],
26
+ prefixBytes: 0,
27
+ };
28
+ }
29
+ const found = findRawStart(b);
30
+ if (found) {
31
+ notes.push(`RAW magic found at offset ${found.offset} (garbage prefix)`);
32
+ return {
33
+ container: found.container,
34
+ order: found.order,
35
+ damageClass: "garbage-prefix",
36
+ confidence: "high",
37
+ notes,
38
+ prefixBytes: found.offset,
39
+ };
40
+ }
41
+ return { container: "unknown", damageClass: "not-raw", confidence: "low", notes: ["no RAW magic found"], prefixBytes: 0 };
42
+ }
43
+ const { container, order } = at0;
44
+ const preview = (() => {
45
+ if (isTiff(container) && order) {
46
+ const { u32 } = readers(order);
47
+ const ifd0 = u32(b, 4);
48
+ const scan = walkTiff(b, order, ifd0);
49
+ if (scan.jpeg)
50
+ return { ...scan.jpeg, source: "tiff-tag" };
51
+ }
52
+ const j = findLargestJpeg(b);
53
+ return j ? { ...j, source: "scan" } : undefined;
54
+ })();
55
+ if (isTiff(container) && order) {
56
+ const { u32 } = readers(order);
57
+ const ifd0 = u32(b, 4);
58
+ if (ifd0 <= 0 || ifd0 + 2 > b.length) {
59
+ return {
60
+ container, order, damageClass: "bad-ifd-offset", confidence: "high",
61
+ notes: [`IFD0 offset ${ifd0} points past EOF (${b.length})`], prefixBytes: 0, preview,
62
+ };
63
+ }
64
+ const scan = walkTiff(b, order, ifd0);
65
+ notes.push(...scan.notes);
66
+ const dangling = scan.dangling.length;
67
+ if (dangling > 0) {
68
+ // strip/preview data past EOF ⇒ truncated; IFD/next/sub offset past EOF ⇒ bad index
69
+ const dc = preview ? "truncated" : "bad-ifd-offset";
70
+ return {
71
+ container, order, damageClass: preview ? (scan.jpeg ? "truncated" : "preview-only") : dc,
72
+ confidence: "medium",
73
+ notes: [...notes, `${dangling} offset(s) point past EOF`],
74
+ prefixBytes: 0, preview, ifdCount: scan.ifdCount, danglingOffsets: dangling,
75
+ };
76
+ }
77
+ return {
78
+ container, order, damageClass: "none", confidence: "high",
79
+ notes: [...notes, `TIFF OK: ${scan.ifdCount} IFD(s), ${scan.entryTotal} entries`],
80
+ prefixBytes: 0, preview, ifdCount: scan.ifdCount, danglingOffsets: 0,
81
+ };
82
+ }
83
+ // CR3 / RAF: v1 validates magic + preview presence + gross truncation only.
84
+ return {
85
+ container, order,
86
+ damageClass: preview ? "none" : "unknown",
87
+ confidence: preview ? "high" : "medium",
88
+ notes: [...notes, container === "cr3" ? "CR3 (ISO-BMFF) container" : "RAF container"],
89
+ prefixBytes: 0, preview,
90
+ };
91
+ }
92
+ export async function diagnoseRaw(src) {
93
+ return diagnoseRawBytes(await readAll(src));
94
+ }
95
+ //# sourceMappingURL=diagnose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnose.js","sourceRoot":"","sources":["../../src/raw/diagnose.ts"],"names":[],"mappings":"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"}