@intactfile/engines 0.1.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 (113) hide show
  1. package/dist/archive/index.d.ts +5 -13
  2. package/dist/archive/index.d.ts.map +1 -1
  3. package/dist/archive/index.js +4 -1
  4. package/dist/archive/index.js.map +1 -1
  5. package/dist/audio/index.d.ts +11 -0
  6. package/dist/audio/index.d.ts.map +1 -0
  7. package/dist/audio/index.js +11 -0
  8. package/dist/audio/index.js.map +1 -0
  9. package/dist/audio/mp3.d.ts +22 -0
  10. package/dist/audio/mp3.d.ts.map +1 -0
  11. package/dist/audio/mp3.js +141 -0
  12. package/dist/audio/mp3.js.map +1 -0
  13. package/dist/audio/wav.d.ts +23 -0
  14. package/dist/audio/wav.d.ts.map +1 -0
  15. package/dist/audio/wav.js +86 -0
  16. package/dist/audio/wav.js.map +1 -0
  17. package/dist/bytes-util.d.ts +17 -0
  18. package/dist/bytes-util.d.ts.map +1 -0
  19. package/dist/bytes-util.js +46 -0
  20. package/dist/bytes-util.js.map +1 -0
  21. package/dist/detect/index.d.ts +1 -1
  22. package/dist/detect/index.d.ts.map +1 -1
  23. package/dist/detect/index.js +77 -0
  24. package/dist/detect/index.js.map +1 -1
  25. package/dist/heic/format.d.ts +87 -0
  26. package/dist/heic/format.d.ts.map +1 -0
  27. package/dist/heic/format.js +241 -0
  28. package/dist/heic/format.js.map +1 -0
  29. package/dist/index.d.ts +14 -1
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +14 -1
  32. package/dist/index.js.map +1 -1
  33. package/dist/jpeg/index.d.ts +2 -8
  34. package/dist/jpeg/index.d.ts.map +1 -1
  35. package/dist/jpeg/index.js +4 -1
  36. package/dist/jpeg/index.js.map +1 -1
  37. package/dist/license.d.ts +63 -0
  38. package/dist/license.d.ts.map +1 -0
  39. package/dist/license.js +167 -0
  40. package/dist/license.js.map +1 -0
  41. package/dist/office-legacy/diagnose.d.ts +24 -0
  42. package/dist/office-legacy/diagnose.d.ts.map +1 -0
  43. package/dist/office-legacy/diagnose.js +111 -0
  44. package/dist/office-legacy/diagnose.js.map +1 -0
  45. package/dist/office-legacy/format.d.ts +89 -0
  46. package/dist/office-legacy/format.d.ts.map +1 -0
  47. package/dist/office-legacy/format.js +281 -0
  48. package/dist/office-legacy/format.js.map +1 -0
  49. package/dist/office-legacy/index.d.ts +9 -0
  50. package/dist/office-legacy/index.d.ts.map +1 -0
  51. package/dist/office-legacy/index.js +18 -0
  52. package/dist/office-legacy/index.js.map +1 -0
  53. package/dist/office-legacy/rebuild.d.ts +8 -0
  54. package/dist/office-legacy/rebuild.d.ts.map +1 -0
  55. package/dist/office-legacy/rebuild.js +234 -0
  56. package/dist/office-legacy/rebuild.js.map +1 -0
  57. package/dist/office-legacy/repair.d.ts +40 -0
  58. package/dist/office-legacy/repair.d.ts.map +1 -0
  59. package/dist/office-legacy/repair.js +161 -0
  60. package/dist/office-legacy/repair.js.map +1 -0
  61. package/dist/pdf/index.d.ts +5 -6
  62. package/dist/pdf/index.d.ts.map +1 -1
  63. package/dist/pdf/index.js +4 -1
  64. package/dist/pdf/index.js.map +1 -1
  65. package/dist/png/index.d.ts +1 -7
  66. package/dist/png/index.d.ts.map +1 -1
  67. package/dist/png/index.js +3 -1
  68. package/dist/png/index.js.map +1 -1
  69. package/dist/psd/diagnose.d.ts +33 -0
  70. package/dist/psd/diagnose.d.ts.map +1 -0
  71. package/dist/psd/diagnose.js +176 -0
  72. package/dist/psd/diagnose.js.map +1 -0
  73. package/dist/psd/format.d.ts +106 -0
  74. package/dist/psd/format.d.ts.map +1 -0
  75. package/dist/psd/format.js +238 -0
  76. package/dist/psd/format.js.map +1 -0
  77. package/dist/psd/index.d.ts +8 -0
  78. package/dist/psd/index.d.ts.map +1 -0
  79. package/dist/psd/index.js +13 -0
  80. package/dist/psd/index.js.map +1 -0
  81. package/dist/psd/repair.d.ts +36 -0
  82. package/dist/psd/repair.d.ts.map +1 -0
  83. package/dist/psd/repair.js +451 -0
  84. package/dist/psd/repair.js.map +1 -0
  85. package/dist/raw/diagnose.d.ts +29 -0
  86. package/dist/raw/diagnose.d.ts.map +1 -0
  87. package/dist/raw/diagnose.js +95 -0
  88. package/dist/raw/diagnose.js.map +1 -0
  89. package/dist/raw/format.d.ts +47 -0
  90. package/dist/raw/format.d.ts.map +1 -0
  91. package/dist/raw/format.js +213 -0
  92. package/dist/raw/format.js.map +1 -0
  93. package/dist/raw/index.d.ts +7 -0
  94. package/dist/raw/index.d.ts.map +1 -0
  95. package/dist/raw/index.js +13 -0
  96. package/dist/raw/index.js.map +1 -0
  97. package/dist/raw/repair.d.ts +46 -0
  98. package/dist/raw/repair.d.ts.map +1 -0
  99. package/dist/raw/repair.js +94 -0
  100. package/dist/raw/repair.js.map +1 -0
  101. package/dist/sqlite/index.d.ts +8 -1
  102. package/dist/sqlite/index.d.ts.map +1 -1
  103. package/dist/sqlite/index.js +4 -1
  104. package/dist/sqlite/index.js.map +1 -1
  105. package/dist/video/avi.d.ts +23 -0
  106. package/dist/video/avi.d.ts.map +1 -0
  107. package/dist/video/avi.js +122 -0
  108. package/dist/video/avi.js.map +1 -0
  109. package/dist/video/index.d.ts +15 -2
  110. package/dist/video/index.d.ts.map +1 -1
  111. package/dist/video/index.js +10 -2
  112. package/dist/video/index.js.map +1 -1
  113. package/package.json +18 -2
@@ -0,0 +1,281 @@
1
+ /**
2
+ * Pure CFBF / OLE2 (Compound File Binary Format) primitives: header parse,
3
+ * FAT/DIFAT/MiniFAT walk, 128-byte directory entries, sector→offset math, and
4
+ * a pointer-free linear directory scan for salvage. No wasm, no compression —
5
+ * CFBF stores stream bytes raw, so this is all integer/offset arithmetic.
6
+ *
7
+ * Backs legacy binary Office: .doc/.xls/.ppt (97–2003), plus .msg/.msi. Repair
8
+ * scope is the CONTAINER + stream salvage — never the document content inside a
9
+ * stream. Reference: [MS-CFB]. All fields little-endian.
10
+ */
11
+ export const CFBF_MAGIC = Uint8Array.of(0xd0, 0xcf, 0x11, 0xe0, 0xa1, 0xb1, 0x1a, 0xe1);
12
+ export const MAXREGSECT = 0xfffffffa;
13
+ export const DIFSECT = 0xfffffffc;
14
+ export const FATSECT = 0xfffffffd;
15
+ export const ENDOFCHAIN = 0xfffffffe;
16
+ export const FREESECT = 0xffffffff;
17
+ export const NOSTREAM = 0xffffffff;
18
+ export const MINI_CUTOFF = 4096;
19
+ export const MINI_SECTOR = 64;
20
+ export const DIR_ENTRY = 128;
21
+ export const u16 = (b, o) => (b[o] | (b[o + 1] << 8)) >>> 0;
22
+ export const u32 = (b, o) => ((b[o] | (b[o + 1] << 8) | (b[o + 2] << 16) | (b[o + 3] << 24)) >>> 0);
23
+ /** 64-bit little-endian as a JS number (v3 uses only the low 32 bits). */
24
+ export const u64 = (b, o) => u32(b, o) + u32(b, o + 4) * 0x1_0000_0000;
25
+ export function hasMagicAt(b, off) {
26
+ for (let i = 0; i < 8; i++)
27
+ if (b[off + i] !== CFBF_MAGIC[i])
28
+ return false;
29
+ return true;
30
+ }
31
+ /** How many of the 8 magic bytes match at `off` (partial-magic heuristic). */
32
+ export function magicScore(b, off) {
33
+ let n = 0;
34
+ for (let i = 0; i < 8; i++)
35
+ if (b[off + i] === CFBF_MAGIC[i])
36
+ n++;
37
+ return n;
38
+ }
39
+ /** First offset of an exact CFBF magic within `window`, or -1. */
40
+ export function findMagic(b, window) {
41
+ const limit = Math.min(b.length - 8, window);
42
+ for (let i = 0; i <= limit; i++)
43
+ if (b[i] === 0xd0 && hasMagicAt(b, i))
44
+ return i;
45
+ return -1;
46
+ }
47
+ /** Parse the 512-byte header. Returns null if the sector shift is implausible. */
48
+ export function parseHeader(b) {
49
+ if (b.length < 512)
50
+ return null;
51
+ const major = u16(b, 26);
52
+ const sectorShift = u16(b, 30);
53
+ // Normalize: sector shift is derivable from the major version if garbled.
54
+ const shift = sectorShift === 9 || sectorShift === 12 ? sectorShift : major === 4 ? 12 : 9;
55
+ const sectorSize = 1 << shift;
56
+ return {
57
+ major: major === 3 || major === 4 ? major : sectorSize === 4096 ? 4 : 3,
58
+ sectorSize,
59
+ miniCutoff: u32(b, 56) || MINI_CUTOFF,
60
+ numFatSectors: u32(b, 44),
61
+ firstDirSector: u32(b, 48),
62
+ firstMiniFatSector: u32(b, 60),
63
+ numMiniFatSectors: u32(b, 64),
64
+ firstDifatSector: u32(b, 68),
65
+ numDifatSectors: u32(b, 72),
66
+ };
67
+ }
68
+ /** SECT number → absolute file offset. Sector 0 begins one sector past the header. */
69
+ export const sectOffset = (sect, sectorSize) => (sect + 1) * sectorSize;
70
+ /** Collect the FAT-sector numbers from the header DIFAT + any chained DIFAT sectors. */
71
+ export function readDifat(b, header) {
72
+ const { sectorSize } = header;
73
+ const fatSectors = [];
74
+ for (let i = 0; i < 109; i++) {
75
+ const s = u32(b, 76 + i * 4);
76
+ if (s <= MAXREGSECT)
77
+ fatSectors.push(s);
78
+ }
79
+ // chained DIFAT sectors: 127 FAT-sector numbers + a "next DIFAT" link each
80
+ let difat = header.firstDifatSector;
81
+ const seen = new Set();
82
+ const perSector = sectorSize / 4;
83
+ while (difat <= MAXREGSECT && !seen.has(difat)) {
84
+ seen.add(difat);
85
+ const base = sectOffset(difat, sectorSize);
86
+ if (base + sectorSize > b.length)
87
+ break;
88
+ for (let i = 0; i < perSector - 1; i++) {
89
+ const s = u32(b, base + i * 4);
90
+ if (s <= MAXREGSECT)
91
+ fatSectors.push(s);
92
+ }
93
+ difat = u32(b, base + (perSector - 1) * 4);
94
+ }
95
+ return fatSectors;
96
+ }
97
+ /** Build the FAT array from its sectors. Out-of-range sectors read as FREESECT. */
98
+ export function buildFat(b, header, fatSectors) {
99
+ const { sectorSize } = header;
100
+ const perSector = sectorSize / 4;
101
+ const fat = new Uint32Array(fatSectors.length * perSector).fill(FREESECT);
102
+ let w = 0;
103
+ for (const s of fatSectors) {
104
+ const base = sectOffset(s, sectorSize);
105
+ for (let i = 0; i < perSector; i++) {
106
+ fat[w++] = base + i * 4 + 4 <= b.length ? u32(b, base + i * 4) : FREESECT;
107
+ }
108
+ }
109
+ return fat;
110
+ }
111
+ /** Follow a FAT/MiniFAT chain from `start`, with cycle + bound guards. */
112
+ export function readChain(fat, start, maxLen) {
113
+ const out = [];
114
+ const seen = new Set();
115
+ let s = start;
116
+ while (s <= MAXREGSECT && s < fat.length && !seen.has(s) && out.length <= maxLen) {
117
+ out.push(s);
118
+ seen.add(s);
119
+ s = fat[s];
120
+ }
121
+ return out;
122
+ }
123
+ /** Read a normal (FAT-chained) stream of `size` bytes from `start`. */
124
+ export function readBigStream(b, header, fat, start, size) {
125
+ const { sectorSize } = header;
126
+ const need = Math.ceil(size / sectorSize);
127
+ const chain = readChain(fat, start, need + 4);
128
+ const out = new Uint8Array(size);
129
+ let written = 0;
130
+ let brokenChain = chain.length < need;
131
+ for (const s of chain) {
132
+ if (written >= size)
133
+ break;
134
+ const base = sectOffset(s, sectorSize);
135
+ const take = Math.min(sectorSize, size - written);
136
+ if (base + take > b.length) {
137
+ brokenChain = true;
138
+ break;
139
+ }
140
+ out.set(b.subarray(base, base + take), written);
141
+ written += take;
142
+ }
143
+ return { bytes: out.subarray(0, written), complete: written >= size, brokenChain };
144
+ }
145
+ /** Build the MiniFAT array by reading its sector chain from the FAT. */
146
+ export function buildMiniFat(b, header, fat) {
147
+ const chain = readChain(fat, header.firstMiniFatSector, 1 << 20);
148
+ const perSector = header.sectorSize / 4;
149
+ const mf = new Uint32Array(chain.length * perSector).fill(FREESECT);
150
+ let w = 0;
151
+ for (const s of chain) {
152
+ const base = sectOffset(s, header.sectorSize);
153
+ for (let i = 0; i < perSector; i++) {
154
+ mf[w++] = base + i * 4 + 4 <= b.length ? u32(b, base + i * 4) : FREESECT;
155
+ }
156
+ }
157
+ return mf;
158
+ }
159
+ /** Read a small (MiniFAT-chained) stream from the mini stream. */
160
+ export function readMiniStream(miniStream, miniFat, start, size) {
161
+ const need = Math.ceil(size / MINI_SECTOR);
162
+ const chain = readChain(miniFat, start, need + 4);
163
+ const out = new Uint8Array(size);
164
+ let written = 0;
165
+ let brokenChain = chain.length < need;
166
+ for (const s of chain) {
167
+ if (written >= size)
168
+ break;
169
+ const base = s * MINI_SECTOR;
170
+ const take = Math.min(MINI_SECTOR, size - written);
171
+ if (base + take > miniStream.length) {
172
+ brokenChain = true;
173
+ break;
174
+ }
175
+ out.set(miniStream.subarray(base, base + take), written);
176
+ written += take;
177
+ }
178
+ return { bytes: out.subarray(0, written), complete: written >= size, brokenChain };
179
+ }
180
+ function decodeName(b, off, nameLenBytes) {
181
+ if (nameLenBytes < 2 || nameLenBytes > 64)
182
+ return "";
183
+ let s = "";
184
+ for (let i = 0; i + 2 <= nameLenBytes; i += 2) {
185
+ const c = u16(b, off + i);
186
+ if (c === 0)
187
+ break;
188
+ s += String.fromCharCode(c);
189
+ }
190
+ return s;
191
+ }
192
+ /** Parse one 128-byte directory entry at absolute offset `off`. */
193
+ export function parseDirEntry(b, off, id) {
194
+ if (off + DIR_ENTRY > b.length)
195
+ return null;
196
+ const type = b[off + 66];
197
+ const nameLen = u16(b, off + 64);
198
+ return {
199
+ id,
200
+ name: decodeName(b, off, nameLen),
201
+ type,
202
+ color: b[off + 67],
203
+ left: u32(b, off + 68),
204
+ right: u32(b, off + 72),
205
+ child: u32(b, off + 76),
206
+ startSector: u32(b, off + 116),
207
+ size: u64(b, off + 120),
208
+ recordOffset: off,
209
+ };
210
+ }
211
+ /** Read the directory entries by following the directory-sector chain. */
212
+ export function readDirectory(b, header, fat) {
213
+ const { sectorSize } = header;
214
+ const perSector = sectorSize / DIR_ENTRY;
215
+ const chain = readChain(fat, header.firstDirSector, 1 << 20);
216
+ const entries = [];
217
+ let id = 0;
218
+ for (const s of chain) {
219
+ const base = sectOffset(s, sectorSize);
220
+ for (let i = 0; i < perSector; i++) {
221
+ const e = parseDirEntry(b, base + i * DIR_ENTRY, id++);
222
+ if (e)
223
+ entries.push(e);
224
+ }
225
+ }
226
+ return entries;
227
+ }
228
+ /** True when a 128-byte record looks like a real directory entry. */
229
+ export function looksLikeEntry(b, off) {
230
+ const type = b[off + 66];
231
+ if (type !== 1 && type !== 2 && type !== 5)
232
+ return false;
233
+ const nameLen = u16(b, off + 64);
234
+ if (nameLen < 2 || nameLen > 64 || nameLen % 2 !== 0)
235
+ return false;
236
+ // name must be NUL-terminated UTF-16 within nameLen and start with a printable-ish unit
237
+ const first = u16(b, off);
238
+ if (first === 0 || first > 0xffff)
239
+ return false;
240
+ if (u16(b, off + nameLen - 2) !== 0)
241
+ return false;
242
+ return true;
243
+ }
244
+ /**
245
+ * Pointer-free salvage: scan the whole file at 128-byte alignment for records
246
+ * that look like directory entries. Recovers streams when the tree/chain is
247
+ * destroyed (the CFBF analog of the ZIP local-header scan).
248
+ */
249
+ export function linearScanEntries(b, header) {
250
+ const out = [];
251
+ const start = header.sectorSize; // skip the header sector
252
+ let id = 0;
253
+ const seen = new Set();
254
+ for (let off = start; off + DIR_ENTRY <= b.length; off += DIR_ENTRY) {
255
+ if (!looksLikeEntry(b, off))
256
+ continue;
257
+ const e = parseDirEntry(b, off, id);
258
+ if (!e || !e.name)
259
+ continue;
260
+ const key = `${e.name}:${e.startSector}:${e.size}`;
261
+ if (seen.has(key))
262
+ continue;
263
+ seen.add(key);
264
+ e.id = id++;
265
+ out.push(e);
266
+ }
267
+ return out;
268
+ }
269
+ /** Detect the Office document type from the recovered stream names. */
270
+ export function classifyContainer(names) {
271
+ if (names.includes("WordDocument"))
272
+ return "doc";
273
+ if (names.includes("Workbook") || names.includes("Book"))
274
+ return "xls";
275
+ if (names.includes("PowerPoint Document"))
276
+ return "ppt";
277
+ if (names.some((n) => n === "__properties_version1.0" || /__recip_version/.test(n) || n === "__nameid_version1.0"))
278
+ return "msg";
279
+ return "ole";
280
+ }
281
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/office-legacy/format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export declare const repairOffice: (src: import("../byte-source.js").ByteSource) => Promise<import("./repair.js").OfficeRepairResult>;
2
+ export { repairOfficeBytes } from "./repair.js";
3
+ export type { OfficeRepairOutcome, OfficeRepairStrategy, OfficeRepairReport, OfficeRepairResult, RecoveredStream, } from "./repair.js";
4
+ export { diagnoseOffice, diagnoseOfficeBytes } from "./diagnose.js";
5
+ export type { OfficeDiagnosis, OfficeDamageClass } from "./diagnose.js";
6
+ export { writeCfbf } from "./rebuild.js";
7
+ export { CFBF_MAGIC, parseHeader, readDifat, buildFat, readDirectory, linearScanEntries, classifyContainer, } from "./format.js";
8
+ export type { CfbfHeader, DirEntry } from "./format.js";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/office-legacy/index.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,YAAY,oGAAsB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,YAAY,EACV,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,GAChB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpE,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EACL,UAAU,EACV,WAAW,EACX,SAAS,EACT,QAAQ,EACR,aAAa,EACb,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Legacy Office (CFBF / OLE2) engine subpath export
3
+ * (`@intactfile/engines/office-legacy`). Pure TypeScript, no wasm — CFBF stores
4
+ * streams raw, so parsing and the canonical rebuild are plain byte arithmetic.
5
+ *
6
+ * Scope: container + stream salvage for .doc/.xls/.ppt (97–2003) and .msg. It
7
+ * recovers the streams and rebuilds a valid compound file; it does NOT repair
8
+ * the document content (BIFF/FIB) inside a stream. diagnoseOffice is pure and
9
+ * promoted to the root barrel; repairOffice stays here and is gated.
10
+ */
11
+ import { gate } from "../license.js";
12
+ import { repairOffice as _repairOffice } from "./repair.js";
13
+ export const repairOffice = gate(_repairOffice);
14
+ export { repairOfficeBytes } from "./repair.js";
15
+ export { diagnoseOffice, diagnoseOfficeBytes } from "./diagnose.js";
16
+ export { writeCfbf } from "./rebuild.js";
17
+ export { CFBF_MAGIC, parseHeader, readDifat, buildFat, readDirectory, linearScanEntries, classifyContainer, } from "./format.js";
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/office-legacy/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,YAAY,IAAI,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5D,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAShD,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEpE,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EACL,UAAU,EACV,WAAW,EACX,SAAS,EACT,QAAQ,EACR,aAAa,EACb,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,aAAa,CAAC"}
@@ -0,0 +1,8 @@
1
+ export interface OutStream {
2
+ name: string;
3
+ bytes: Uint8Array;
4
+ }
5
+ /** True if a rebuild would need more than the 109 inline DIFAT slots. */
6
+ export declare function rebuildExceedsLimit(streams: OutStream[]): boolean;
7
+ export declare function writeCfbf(streams: OutStream[]): Uint8Array;
8
+ //# sourceMappingURL=rebuild.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rebuild.d.ts","sourceRoot":"","sources":["../../src/office-legacy/rebuild.ts"],"names":[],"mappings":"AAwBA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,UAAU,CAAC;CACnB;AAeD,yEAAyE;AACzE,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,OAAO,CAejE;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,UAAU,CAmK1D"}
@@ -0,0 +1,234 @@
1
+ /**
2
+ * Pure-TS canonical CFBF (v3, 512-byte sectors) writer. Given a flat set of
3
+ * recovered streams it emits a fresh, structurally-valid compound file:
4
+ * header + FAT + DIFAT(inline) + directory + MiniFAT + mini stream + big
5
+ * streams. Deterministic output. No wasm.
6
+ *
7
+ * v1 limit: ≤ 109 FAT sectors (~7 MB of addressable sectors), which covers
8
+ * legacy Office files comfortably; larger inputs are reported without a rebuild.
9
+ */
10
+ import { CFBF_MAGIC, DIR_ENTRY, ENDOFCHAIN, FATSECT, FREESECT, MINI_CUTOFF, MINI_SECTOR, NOSTREAM, } from "./format.js";
11
+ const SS = 512; // sector size (v3)
12
+ const PER_FAT = SS / 4; // 128 entries per FAT sector
13
+ const PER_DIR = SS / DIR_ENTRY; // 4 entries per directory sector
14
+ const wU16 = (b, o, v) => { b[o] = v & 0xff; b[o + 1] = (v >>> 8) & 0xff; };
15
+ const wU32 = (b, o, v) => {
16
+ b[o] = v & 0xff;
17
+ b[o + 1] = (v >>> 8) & 0xff;
18
+ b[o + 2] = (v >>> 16) & 0xff;
19
+ b[o + 3] = (v >>> 24) & 0xff;
20
+ };
21
+ /** CFBF sibling collation: shorter names first, then by uppercased UTF-16. */
22
+ function compareNames(a, b) {
23
+ if (a.length !== b.length)
24
+ return a.length - b.length;
25
+ const ua = a.toUpperCase();
26
+ const ub = b.toUpperCase();
27
+ return ua < ub ? -1 : ua > ub ? 1 : 0;
28
+ }
29
+ /** True if a rebuild would need more than the 109 inline DIFAT slots. */
30
+ export function rebuildExceedsLimit(streams) {
31
+ let dataSectors = 0;
32
+ let miniBytes = 0;
33
+ for (const s of streams) {
34
+ if (s.bytes.length === 0)
35
+ continue;
36
+ if (s.bytes.length < MINI_CUTOFF)
37
+ miniBytes += Math.ceil(s.bytes.length / MINI_SECTOR) * MINI_SECTOR;
38
+ else
39
+ dataSectors += Math.ceil(s.bytes.length / SS);
40
+ }
41
+ const S = Math.ceil(miniBytes / SS);
42
+ const M = Math.ceil(Math.ceil(miniBytes / MINI_SECTOR) * 4 / SS);
43
+ const D = Math.ceil((1 + streams.length) * DIR_ENTRY / SS);
44
+ const base = D + M + S + dataSectors;
45
+ let F = 1;
46
+ for (let i = 0; i < 8; i++) {
47
+ const n = base + F;
48
+ const f2 = Math.max(1, Math.ceil(n / PER_FAT));
49
+ if (f2 === F)
50
+ break;
51
+ F = f2;
52
+ }
53
+ return F > 109;
54
+ }
55
+ export function writeCfbf(streams) {
56
+ // 1. Mini stream: pack small streams (< 4096 B), each padded to 64 B.
57
+ const small = streams.filter((s) => s.bytes.length > 0 && s.bytes.length < MINI_CUTOFF);
58
+ const big = streams.filter((s) => s.bytes.length >= MINI_CUTOFF);
59
+ const empty = streams.filter((s) => s.bytes.length === 0);
60
+ const miniStartOf = new Map();
61
+ let miniSectors = 0;
62
+ for (const s of small) {
63
+ miniStartOf.set(s, miniSectors);
64
+ miniSectors += Math.ceil(s.bytes.length / MINI_SECTOR);
65
+ }
66
+ const miniStreamLen = miniSectors * MINI_SECTOR;
67
+ const miniStream = new Uint8Array(miniStreamLen);
68
+ for (const s of small) {
69
+ miniStream.set(s.bytes, miniStartOf.get(s) * MINI_SECTOR);
70
+ }
71
+ // 2. Sector counts.
72
+ const D = Math.max(1, Math.ceil((1 + streams.length) * DIR_ENTRY / SS));
73
+ const miniFatEntries = miniSectors;
74
+ const M = Math.ceil((miniFatEntries * 4) / SS);
75
+ const S = Math.ceil(miniStreamLen / SS);
76
+ const bigRun = new Map();
77
+ let bigTotal = 0;
78
+ for (const s of big)
79
+ bigTotal += Math.ceil(s.bytes.length / SS);
80
+ const dataSectors = D + M + S + bigTotal;
81
+ let F = 1;
82
+ for (let i = 0; i < 16; i++) {
83
+ const n = dataSectors + F;
84
+ const f2 = Math.max(1, Math.ceil(n / PER_FAT));
85
+ if (f2 === F)
86
+ break;
87
+ F = f2;
88
+ }
89
+ const total = dataSectors + F;
90
+ // 3. Sector index assignment.
91
+ const dirStart = 0;
92
+ const miniFatStart = D;
93
+ const miniStreamStart = D + M;
94
+ let cursor = D + M + S;
95
+ for (const s of big) {
96
+ const sectors = Math.ceil(s.bytes.length / SS);
97
+ bigRun.set(s, { start: cursor, sectors });
98
+ cursor += sectors;
99
+ }
100
+ const fatStart = dataSectors;
101
+ // 4. FAT.
102
+ const fat = new Uint32Array(total).fill(FREESECT);
103
+ const chainRange = (a, count) => {
104
+ for (let i = 0; i < count; i++)
105
+ fat[a + i] = i === count - 1 ? ENDOFCHAIN : a + i + 1;
106
+ };
107
+ if (D > 0)
108
+ chainRange(dirStart, D);
109
+ if (M > 0)
110
+ chainRange(miniFatStart, M);
111
+ if (S > 0)
112
+ chainRange(miniStreamStart, S);
113
+ for (const s of big) {
114
+ const r = bigRun.get(s);
115
+ chainRange(r.start, r.sectors);
116
+ }
117
+ for (let i = fatStart; i < total; i++)
118
+ fat[i] = FATSECT;
119
+ // 5. MiniFAT (chain each small stream's mini-sectors).
120
+ const miniFat = new Uint32Array(M * PER_FAT).fill(FREESECT);
121
+ for (const s of small) {
122
+ const start = miniStartOf.get(s);
123
+ const n = Math.ceil(s.bytes.length / MINI_SECTOR);
124
+ for (let i = 0; i < n; i++)
125
+ miniFat[start + i] = i === n - 1 ? ENDOFCHAIN : start + i + 1;
126
+ }
127
+ // 6. Directory entries (Root + one per stream, siblings in a balanced BST).
128
+ const sorted = [...streams].sort((a, z) => compareNames(a.name, z.name));
129
+ const idOf = new Map();
130
+ sorted.forEach((s, i) => idOf.set(s, i + 1)); // 0 = Root
131
+ const left = new Array(streams.length + 1).fill(NOSTREAM);
132
+ const right = new Array(streams.length + 1).fill(NOSTREAM);
133
+ const buildTree = (lo, hi) => {
134
+ if (lo > hi)
135
+ return NOSTREAM;
136
+ const mid = (lo + hi) >> 1;
137
+ const id = mid + 1;
138
+ left[id] = buildTree(lo, mid - 1);
139
+ right[id] = buildTree(mid + 1, hi);
140
+ return id;
141
+ };
142
+ const rootChild = buildTree(0, sorted.length - 1);
143
+ const dir = new Uint8Array(D * SS);
144
+ // fill unused slots as free entries
145
+ for (let i = 0; i < D * PER_DIR; i++) {
146
+ const o = i * DIR_ENTRY;
147
+ wU32(dir, o + 68, NOSTREAM);
148
+ wU32(dir, o + 72, NOSTREAM);
149
+ wU32(dir, o + 76, NOSTREAM);
150
+ }
151
+ const writeEntry = (id, name, type, startSector, size, child) => {
152
+ const o = id * DIR_ENTRY;
153
+ const nm = name.length > 31 ? name.slice(0, 31) : name;
154
+ for (let i = 0; i < nm.length; i++)
155
+ wU16(dir, o + i * 2, nm.charCodeAt(i));
156
+ const nameLen = (nm.length + 1) * 2; // incl. NUL terminator
157
+ wU16(dir, o + 64, nameLen);
158
+ dir[o + 66] = type;
159
+ dir[o + 67] = 1; // black
160
+ wU32(dir, o + 68, left[id] ?? NOSTREAM);
161
+ wU32(dir, o + 72, right[id] ?? NOSTREAM);
162
+ wU32(dir, o + 76, child);
163
+ wU32(dir, o + 116, startSector);
164
+ wU32(dir, o + 120, size >>> 0);
165
+ wU32(dir, o + 124, Math.floor(size / 0x1_0000_0000));
166
+ };
167
+ // Root Entry
168
+ writeEntry(0, "Root Entry", 5, S > 0 ? miniStreamStart : ENDOFCHAIN, miniStreamLen, rootChild);
169
+ left[0] = NOSTREAM;
170
+ right[0] = NOSTREAM;
171
+ wU32(dir, 68, NOSTREAM);
172
+ wU32(dir, 72, NOSTREAM);
173
+ wU32(dir, 76, rootChild);
174
+ for (const s of streams) {
175
+ const id = idOf.get(s);
176
+ let start;
177
+ if (s.bytes.length === 0)
178
+ start = ENDOFCHAIN;
179
+ else if (s.bytes.length < MINI_CUTOFF)
180
+ start = miniStartOf.get(s);
181
+ else
182
+ start = bigRun.get(s).start;
183
+ writeEntry(id, s.name, 2, start, s.bytes.length, NOSTREAM);
184
+ }
185
+ void empty;
186
+ // 7. Assemble the file.
187
+ const file = new Uint8Array(SS + total * SS);
188
+ // header
189
+ file.set(CFBF_MAGIC, 0);
190
+ wU16(file, 24, 0x3e); // minor version
191
+ wU16(file, 26, 3); // major version (v3)
192
+ wU16(file, 28, 0xfffe); // byte order
193
+ wU16(file, 30, 9); // sector shift
194
+ wU16(file, 32, 6); // mini sector shift
195
+ wU32(file, 40, 0); // # dir sectors (0 for v3)
196
+ wU32(file, 44, F); // # FAT sectors
197
+ wU32(file, 48, dirStart); // first dir sector
198
+ wU32(file, 56, MINI_CUTOFF); // mini stream cutoff
199
+ wU32(file, 60, M > 0 ? miniFatStart : ENDOFCHAIN); // first MiniFAT sector
200
+ wU32(file, 64, M); // # MiniFAT sectors
201
+ wU32(file, 68, ENDOFCHAIN); // first DIFAT sector (≤109 FAT sectors → none)
202
+ wU32(file, 72, 0); // # DIFAT sectors
203
+ for (let i = 0; i < 109; i++)
204
+ wU32(file, 76 + i * 4, i < F ? fatStart + i : FREESECT);
205
+ const put = (sect, bytes) => { file.set(bytes, (sect + 1) * SS); };
206
+ put(dirStart, dir);
207
+ // MiniFAT
208
+ if (M > 0) {
209
+ const mf = new Uint8Array(M * SS);
210
+ for (let i = 0; i < miniFat.length; i++)
211
+ wU32(mf, i * 4, miniFat[i]);
212
+ put(miniFatStart, mf);
213
+ }
214
+ // mini stream
215
+ if (S > 0) {
216
+ const ms = new Uint8Array(S * SS);
217
+ ms.set(miniStream, 0);
218
+ put(miniStreamStart, ms);
219
+ }
220
+ // big streams
221
+ for (const s of big) {
222
+ const r = bigRun.get(s);
223
+ const buf = new Uint8Array(r.sectors * SS);
224
+ buf.set(s.bytes, 0);
225
+ put(r.start, buf);
226
+ }
227
+ // FAT sectors
228
+ const fatBuf = new Uint8Array(F * SS).fill(0xff); // FREESECT padding
229
+ for (let i = 0; i < fat.length; i++)
230
+ wU32(fatBuf, i * 4, fat[i]);
231
+ put(fatStart, fatBuf);
232
+ return file;
233
+ }
234
+ //# sourceMappingURL=rebuild.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rebuild.js","sourceRoot":"","sources":["../../src/office-legacy/rebuild.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Legacy Office (CFBF/OLE2) repair: header normalization → FAT/DIFAT build →
3
+ * directory walk (with a pointer-free linear-scan fallback) → stream extraction
4
+ * (FAT + MiniFAT chains, with a contiguity fallback) → pure-TS rebuild of a
5
+ * canonical v3 compound file. No wasm.
6
+ *
7
+ * Honesty rule (docs/03): we rebuild the CONTAINER and recover its streams. If
8
+ * the damage is inside a stream's document content (BIFF/FIB), the file may
9
+ * still not fully open — the caveats say so. `outcome` is never "success" when a
10
+ * stream came back partial.
11
+ */
12
+ import type { ByteSource } from "../byte-source.js";
13
+ import { type OfficeDamageClass } from "./diagnose.js";
14
+ export type OfficeRepairOutcome = "success" | "partial" | "failed";
15
+ export type OfficeRepairStrategy = "tree-walk" | "linear-scan" | "contiguity-fallback" | null;
16
+ export interface RecoveredStream {
17
+ name: string;
18
+ size: number;
19
+ bytesRecovered: number;
20
+ complete: boolean;
21
+ viaLinearScan: boolean;
22
+ }
23
+ export interface OfficeRepairReport {
24
+ outcome: OfficeRepairOutcome;
25
+ damageClass: OfficeDamageClass;
26
+ container: "doc" | "xls" | "ppt" | "msg" | "ole" | null;
27
+ strategy: OfficeRepairStrategy;
28
+ streams: RecoveredStream[];
29
+ caveats: string[];
30
+ notes: string[];
31
+ bytesIn: number;
32
+ bytesOut: number;
33
+ }
34
+ export interface OfficeRepairResult {
35
+ file?: Uint8Array;
36
+ report: OfficeRepairReport;
37
+ }
38
+ export declare function repairOfficeBytes(input: Uint8Array): OfficeRepairResult;
39
+ export declare function repairOffice(src: ByteSource): Promise<OfficeRepairResult>;
40
+ //# sourceMappingURL=repair.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repair.d.ts","sourceRoot":"","sources":["../../src/office-legacy/repair.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,EAAuB,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAoB5E,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;AACnE,MAAM,MAAM,oBAAoB,GAAG,WAAW,GAAG,aAAa,GAAG,qBAAqB,GAAG,IAAI,CAAC;AAE9F,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,OAAO,CAAC;IAClB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,mBAAmB,CAAC;IAC7B,WAAW,EAAE,iBAAiB,CAAC;IAC/B,SAAS,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC;IACxD,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,MAAM,EAAE,kBAAkB,CAAC;CAC5B;AAYD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,GAAG,kBAAkB,CAqJvE;AAED,wBAAsB,YAAY,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAE/E"}