@usejunior/docx-core 0.22.0 → 0.23.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 (56) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/integration/generation-probes.d.ts.map +1 -1
  3. package/dist/integration/generation-probes.js +26 -21
  4. package/dist/integration/generation-probes.js.map +1 -1
  5. package/dist/integration/libreoffice-oracle.d.ts +6 -1
  6. package/dist/integration/libreoffice-oracle.d.ts.map +1 -1
  7. package/dist/integration/libreoffice-oracle.js +113 -44
  8. package/dist/integration/libreoffice-oracle.js.map +1 -1
  9. package/dist/integration/soffice-lock.d.ts +30 -0
  10. package/dist/integration/soffice-lock.d.ts.map +1 -0
  11. package/dist/integration/soffice-lock.js +308 -0
  12. package/dist/integration/soffice-lock.js.map +1 -0
  13. package/dist/primitives/accept_ai_edits.d.ts +8 -0
  14. package/dist/primitives/accept_ai_edits.d.ts.map +1 -1
  15. package/dist/primitives/accept_ai_edits.js +24 -4
  16. package/dist/primitives/accept_ai_edits.js.map +1 -1
  17. package/dist/primitives/accept_changes.d.ts +27 -1
  18. package/dist/primitives/accept_changes.d.ts.map +1 -1
  19. package/dist/primitives/accept_changes.js +57 -2
  20. package/dist/primitives/accept_changes.js.map +1 -1
  21. package/dist/primitives/comments.d.ts.map +1 -1
  22. package/dist/primitives/comments.js +2 -2
  23. package/dist/primitives/comments.js.map +1 -1
  24. package/dist/primitives/document.d.ts +1 -0
  25. package/dist/primitives/document.d.ts.map +1 -1
  26. package/dist/primitives/document.js +27 -14
  27. package/dist/primitives/document.js.map +1 -1
  28. package/dist/primitives/document_view-headings.d.ts.map +1 -1
  29. package/dist/primitives/document_view-headings.js +16 -6
  30. package/dist/primitives/document_view-headings.js.map +1 -1
  31. package/dist/primitives/footnotes.js +2 -2
  32. package/dist/primitives/footnotes.js.map +1 -1
  33. package/dist/primitives/formatting_tags.d.ts +6 -3
  34. package/dist/primitives/formatting_tags.d.ts.map +1 -1
  35. package/dist/primitives/formatting_tags.js +50 -44
  36. package/dist/primitives/formatting_tags.js.map +1 -1
  37. package/dist/primitives/paragraph-index.d.ts +28 -2
  38. package/dist/primitives/paragraph-index.d.ts.map +1 -1
  39. package/dist/primitives/paragraph-index.js +25 -6
  40. package/dist/primitives/paragraph-index.js.map +1 -1
  41. package/dist/primitives/styles.d.ts +88 -20
  42. package/dist/primitives/styles.d.ts.map +1 -1
  43. package/dist/primitives/styles.js +207 -40
  44. package/dist/primitives/styles.js.map +1 -1
  45. package/dist/primitives/xml.d.ts +43 -1
  46. package/dist/primitives/xml.d.ts.map +1 -1
  47. package/dist/primitives/xml.js +100 -10
  48. package/dist/primitives/xml.js.map +1 -1
  49. package/dist/primitives/zip.d.ts +6 -0
  50. package/dist/primitives/zip.d.ts.map +1 -1
  51. package/dist/primitives/zip.js +19 -4
  52. package/dist/primitives/zip.js.map +1 -1
  53. package/dist/shared/docx/DocxArchive.d.ts.map +1 -1
  54. package/dist/shared/docx/DocxArchive.js +6 -2
  55. package/dist/shared/docx/DocxArchive.js.map +1 -1
  56. package/package.json +3 -3
@@ -18,15 +18,21 @@
18
18
  *
19
19
  * This module is gated by callers: when `resolveSoffice()` returns null the oracle is skipped.
20
20
  * CI does not install LibreOffice, so the oracle voter is a local developer check.
21
+ *
22
+ * Every soffice launch here runs under the cross-process lock in `soffice-lock.ts`, so parallel
23
+ * Vitest workers and sibling processes never start concurrent headless LibreOffice instances of
24
+ * the same binary (issue #1037).
21
25
  */
22
26
  import { execFile } from 'node:child_process';
23
- import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
27
+ import { createHash } from 'node:crypto';
28
+ import { existsSync, mkdirSync, mkdtempSync, readdirSync, readFileSync, rmSync, statSync, writeFileSync } from 'node:fs';
24
29
  import os from 'node:os';
25
30
  import path from 'node:path';
26
31
  import { pathToFileURL } from 'node:url';
27
32
  import { promisify } from 'node:util';
28
33
  import { createZipBuffer, readZipText } from '../primitives/zip.js';
29
34
  import { parseXml } from '../primitives/xml.js';
35
+ import { withSofficeLock } from './soffice-lock.js';
30
36
  const execFileAsync = promisify(execFile);
31
37
  const W_NS = 'http://schemas.openxmlformats.org/wordprocessingml/2006/main';
32
38
  const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
@@ -75,6 +81,74 @@ export function resolveSoffice() {
75
81
  return candidates.find((c) => existsSync(c)) ?? null;
76
82
  }
77
83
  const probeResults = new Map();
84
+ /**
85
+ * Run-scoped probe sharing. A test runner sets `SAFE_DOCX_SOFFICE_RUN_ID` once per invocation
86
+ * (the Vitest configs of the packages that drive the oracle do), and every worker inherits it.
87
+ * The first worker to take the lock probes and records the verdict; the rest reuse it, so one
88
+ * run performs at most one launchability probe per binary — in particular at most one FAILED
89
+ * launch, instead of one SIGABRT crash report per worker. Outside a tagged run the verdict is
90
+ * memoized per process only, so a stale verdict can never leak into a later run.
91
+ */
92
+ const PROBE_RUN_ENV = 'SAFE_DOCX_SOFFICE_RUN_ID';
93
+ const PROBE_RECORD_MAX_AGE_MS = 24 * 60 * 60_000;
94
+ /** One verdict file per (run, binary) in a dedicated temp subdirectory (cheap to sweep even when
95
+ * the OS temp dir is huge), so concurrent runs never evict each other's verdicts. */
96
+ export function sofficeProbeRecordDir() {
97
+ return path.join(os.tmpdir(), 'safe-docx-soffice-probes');
98
+ }
99
+ function probeRecordPath(soffice, runId) {
100
+ const key = createHash('sha256').update(`${runId}\0${soffice}`).digest('hex').slice(0, 16);
101
+ return path.join(sofficeProbeRecordDir(), `probe-${key}.json`);
102
+ }
103
+ function readSharedProbe(soffice, runId) {
104
+ try {
105
+ const rec = JSON.parse(readFileSync(probeRecordPath(soffice, runId), 'utf8'));
106
+ return rec.runId === runId && rec.soffice === soffice && typeof rec.usable === 'boolean' ? rec.usable : null;
107
+ }
108
+ catch {
109
+ return null;
110
+ }
111
+ }
112
+ function writeSharedProbe(soffice, runId, usable) {
113
+ const dir = sofficeProbeRecordDir();
114
+ try {
115
+ mkdirSync(dir, { recursive: true });
116
+ writeFileSync(probeRecordPath(soffice, runId), JSON.stringify({ runId, soffice, usable, at: new Date().toISOString() }));
117
+ }
118
+ catch { /* best effort — workers fall back to probing themselves */ }
119
+ // Bounded cleanup: drop verdicts from runs older than a day.
120
+ try {
121
+ for (const name of readdirSync(dir)) {
122
+ const full = path.join(dir, name);
123
+ if (Date.now() - statSync(full).mtimeMs > PROBE_RECORD_MAX_AGE_MS)
124
+ rmSync(full, { force: true });
125
+ }
126
+ }
127
+ catch { /* best effort */ }
128
+ }
129
+ async function launchProbe(soffice) {
130
+ const work = mkdtempSync(path.join(os.tmpdir(), 'lo-probe-'));
131
+ try {
132
+ const inPath = path.join(work, 'probe-input.txt');
133
+ const outDir = path.join(work, 'out');
134
+ writeFileSync(inPath, 'probe');
135
+ await runSoffice(soffice, [
136
+ '--headless',
137
+ '--norestore',
138
+ '--nologo',
139
+ `-env:UserInstallation=${pathToFileURL(path.join(work, 'profile')).href}`,
140
+ '--convert-to',
141
+ 'txt',
142
+ '--outdir',
143
+ outDir,
144
+ inPath,
145
+ ], 30_000);
146
+ return existsSync(path.join(outDir, 'probe-input.txt'));
147
+ }
148
+ finally {
149
+ rmSync(work, { recursive: true, force: true });
150
+ }
151
+ }
78
152
  /**
79
153
  * Preflight launchability probe. `resolveSoffice()` proves the binary EXISTS, not that it can
80
154
  * launch: under a restricted shell (observed: macOS Seatbelt, e.g. `codex exec --sandbox
@@ -85,34 +159,23 @@ const probeResults = new Map();
85
159
  *
86
160
  * The probe is the same throwaway headless `--convert-to txt` the oracle uses to initialize its
87
161
  * profile — the cheapest operation known to discriminate "can launch" from "aborts on init".
88
- * Memoized per binary path so a multi-test file pays for one launch.
162
+ * Memoized per binary path so a multi-test file pays for one launch, shared across the workers
163
+ * of one tagged test run (see `SAFE_DOCX_SOFFICE_RUN_ID` above), and serialized with every other
164
+ * soffice launch by the cross-process lock.
89
165
  */
90
166
  export function probeSofficeUsable(soffice) {
91
167
  let result = probeResults.get(soffice);
92
168
  if (!result) {
93
- result = (async () => {
94
- const work = mkdtempSync(path.join(os.tmpdir(), 'lo-probe-'));
95
- try {
96
- const inPath = path.join(work, 'probe-input.txt');
97
- const outDir = path.join(work, 'out');
98
- writeFileSync(inPath, 'probe');
99
- await runSoffice(soffice, [
100
- '--headless',
101
- '--norestore',
102
- '--nologo',
103
- `-env:UserInstallation=${pathToFileURL(path.join(work, 'profile')).href}`,
104
- '--convert-to',
105
- 'txt',
106
- '--outdir',
107
- outDir,
108
- inPath,
109
- ], 30_000);
110
- return existsSync(path.join(outDir, 'probe-input.txt'));
111
- }
112
- finally {
113
- rmSync(work, { recursive: true, force: true });
114
- }
115
- })();
169
+ result = withSofficeLock(soffice, async () => {
170
+ const runId = process.env[PROBE_RUN_ENV];
171
+ const shared = runId ? readSharedProbe(soffice, runId) : null;
172
+ if (shared !== null)
173
+ return shared;
174
+ const usable = await launchProbe(soffice);
175
+ if (runId)
176
+ writeSharedProbe(soffice, runId, usable);
177
+ return usable;
178
+ });
116
179
  probeResults.set(soffice, result);
117
180
  }
118
181
  return result;
@@ -258,25 +321,31 @@ export async function runLibreOfficeOracle(jobs, soffice = resolveSoffice(), cap
258
321
  writeFileSync(path.join(userDir, 'registrymodifications.xcu'), REGMOD);
259
322
  const baseArgs = ['--headless', '--norestore', '--nologo', `-env:UserInstallation=${profileUrl}`];
260
323
  const diag = [];
261
- // (1) INIT the profile: a throwaway convert makes soffice populate user/basic/Standard
262
- // (which would otherwise clobber a pre-placed Module1.xba on first real launch).
263
- const init = await runSoffice(soffice, [...baseArgs, '--convert-to', 'txt', '--outdir', path.join(work, 'init'), path.join(inDir, 'job0.docx')], 20_000);
264
- diag.push(`[init] ${(init.stderr || init.stdout || '(no output)').trim()}`);
265
- // (2) Overwrite the Basic library with our macro.
266
- mkdirSync(basicDir, { recursive: true });
267
- writeFileSync(path.join(userDir, 'basic', 'script.xlc'), SCRIPT_XLC);
268
- writeFileSync(path.join(basicDir, 'script.xlb'), SCRIPT_XLB);
269
- writeFileSync(path.join(basicDir, 'Module1.xba'), module1Xba(jobsPath, marker));
270
- // (3) Run the macro via a bare macro:/// URL — but only once the init instance has fully
271
- // released the profile, so LibreOffice's single-instance model can't forward our macro command
272
- // to the dying init process. Retry once: the first macro launch can still race a slow init exit.
273
- for (let attempt = 1; attempt <= 2 && !existsSync(marker); attempt++) {
274
- await settleProfile(profile);
275
- const run = await runSoffice(soffice, [...baseArgs, 'macro:///Standard.Module1.RunOracle'], 45_000);
276
- diag.push(`[macro attempt ${attempt}] ${(run.stderr || run.stdout || '(no output)').trim()}`);
277
- if (!existsSync(marker))
278
- await sleep(400);
279
- }
324
+ // Hold the cross-process lock only around the launches themselves. Reading the outputs and
325
+ // running `captureOutput` happen after release, so a callback that starts its own LibreOffice
326
+ // work does not hold up other workers (and could not deadlock even if it ran inside: the lock
327
+ // is re-entrant within an async context).
328
+ await withSofficeLock(soffice, async () => {
329
+ // (1) INIT the profile: a throwaway convert makes soffice populate user/basic/Standard
330
+ // (which would otherwise clobber a pre-placed Module1.xba on first real launch).
331
+ const init = await runSoffice(soffice, [...baseArgs, '--convert-to', 'txt', '--outdir', path.join(work, 'init'), path.join(inDir, 'job0.docx')], 20_000);
332
+ diag.push(`[init] ${(init.stderr || init.stdout || '(no output)').trim()}`);
333
+ // (2) Overwrite the Basic library with our macro.
334
+ mkdirSync(basicDir, { recursive: true });
335
+ writeFileSync(path.join(userDir, 'basic', 'script.xlc'), SCRIPT_XLC);
336
+ writeFileSync(path.join(basicDir, 'script.xlb'), SCRIPT_XLB);
337
+ writeFileSync(path.join(basicDir, 'Module1.xba'), module1Xba(jobsPath, marker));
338
+ // (3) Run the macro via a bare macro:/// URL — but only once the init instance has fully
339
+ // released the profile, so LibreOffice's single-instance model can't forward our macro command
340
+ // to the dying init process. Retry once: the first macro launch can still race a slow init exit.
341
+ for (let attempt = 1; attempt <= 2 && !existsSync(marker); attempt++) {
342
+ await settleProfile(profile);
343
+ const run = await runSoffice(soffice, [...baseArgs, 'macro:///Standard.Module1.RunOracle'], 45_000);
344
+ diag.push(`[macro attempt ${attempt}] ${(run.stderr || run.stdout || '(no output)').trim()}`);
345
+ if (!existsSync(marker))
346
+ await sleep(400);
347
+ }
348
+ });
280
349
  if (!existsSync(marker)) {
281
350
  keepWork = Boolean(process.env.SAFE_DOCX_ORACLE_DEBUG);
282
351
  throw new Error('LibreOffice oracle macro did not run (no marker file) after 2 attempts.\nsoffice output:\n' +
@@ -1 +1 @@
1
- {"version":3,"file":"libreoffice-oracle.js","sourceRoot":"","sources":["../../src/integration/libreoffice-oracle.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"libreoffice-oracle.js","sourceRoot":"","sources":["../../src/integration/libreoffice-oracle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /** A holder older than this is presumed dead even if its PID looks alive (PID reuse). Oracle
2
+ * launches are bounded far below this: the probe times out at 30s, an oracle batch at
3
+ * 20s + 2 × 45s, a generation probe at 45s. */
4
+ export declare const DEFAULT_STALE_LOCK_MS: number;
5
+ /** Default wait for a contended lock before giving up with a diagnostic. */
6
+ export declare const DEFAULT_LOCK_TIMEOUT_MS: number;
7
+ export type SofficeLockOptions = {
8
+ /** Lockfile path; defaults to {@link sofficeLockPath}. */
9
+ lockPath?: string;
10
+ timeoutMs?: number;
11
+ pollMs?: number;
12
+ staleMs?: number;
13
+ };
14
+ /** An idempotent release; resolves once the lockfile is removed (or confirmed not ours). */
15
+ export type SofficeLockRelease = () => Promise<void>;
16
+ /** Lockfile path for a binary: one machine-wide (per OS user temp dir) lock for every real
17
+ * LibreOffice entry point, a per-path lock for anything else. */
18
+ export declare function sofficeLockPath(soffice: string): string;
19
+ /**
20
+ * Acquire the lockfile, returning an idempotent async release. Exported for unit tests and the
21
+ * multi-process contention test; production code uses {@link withSofficeLock}.
22
+ */
23
+ export declare function acquireSofficeLock(lockPath: string, { timeoutMs, pollMs, staleMs, }?: Omit<SofficeLockOptions, 'lockPath'>): Promise<SofficeLockRelease>;
24
+ /**
25
+ * Run `fn` while holding the cross-process lock for `soffice`. The lock is released on every
26
+ * exit path, including a throw or timeout inside `fn`. See the module comment for re-entrancy
27
+ * and the unwritable-temp-dir fallback.
28
+ */
29
+ export declare function withSofficeLock<T>(soffice: string, fn: () => Promise<T>, options?: SofficeLockOptions): Promise<T>;
30
+ //# sourceMappingURL=soffice-lock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"soffice-lock.d.ts","sourceRoot":"","sources":["../../src/integration/soffice-lock.ts"],"names":[],"mappings":"AAkEA;;gDAEgD;AAChD,eAAO,MAAM,qBAAqB,QAAc,CAAC;AACjD,4EAA4E;AAC5E,eAAO,MAAM,uBAAuB,QAAa,CAAC;AAUlD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,4FAA4F;AAC5F,MAAM,MAAM,kBAAkB,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;AAarD;kEACkE;AAClE,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMvD;AA4GD;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,EACE,SAAmC,EACnC,MAAY,EACZ,OAA+B,GAChC,GAAE,IAAI,CAAC,kBAAkB,EAAE,UAAU,CAAM,GAC3C,OAAO,CAAC,kBAAkB,CAAC,CAmD7B;AASD;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,CAAC,EACrC,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,CAAC,CAAC,CAwBZ"}
@@ -0,0 +1,308 @@
1
+ /**
2
+ * Cross-process LibreOffice launch lock.
3
+ *
4
+ * Every helper in this package that launches `soffice` (the accept/reject oracle, its
5
+ * launchability probe, and the generation probes) memoizes or batches within ONE process, but
6
+ * nothing coordinated ACROSS processes: parallel Vitest workers, sibling sessions, and a human
7
+ * running the oracle at the same time each spawned their own headless LibreOffice. On macOS
8
+ * concurrent headless launches are the amplification vector behind issue #627 (one environment
9
+ * incompatibility became several simultaneous SIGABRT crash reports), so LibreOffice launches
10
+ * serialize on a lockfile in the OS temp dir (issue #1037).
11
+ *
12
+ * Protocol:
13
+ * - Acquire = exclusive-create (`wx`) a JSON lockfile recording PID, host, and a random token.
14
+ * Creation can only succeed while no lockfile exists, so it never displaces a holder.
15
+ * - Every REMOVAL of the lockfile — a holder's release or a waiter's stale steal — happens under
16
+ * a short-lived guard file (also `wx`), and only after re-reading the lockfile under that guard
17
+ * and confirming it is still the exact record (by token) the remover is entitled to delete.
18
+ * Because removers are serialized and a present lockfile cannot be replaced by a create, the
19
+ * record cannot change between that re-read and the `rm`. So a release never deletes a
20
+ * successor's lock, and two waiters racing to steal the same stale lock cannot delete a fresh
21
+ * lock a third process created.
22
+ * - A waiter steals only when the recorded holder is provably gone (same host and
23
+ * `process.kill(pid, 0)` reports ESRCH), or the file is older than `staleMs` (a SIGKILLed holder
24
+ * cannot clean up; a recycled PID cannot pin the lock forever). A lockfile that cannot be parsed
25
+ * (a creator between `open` and `write`) is stolen only after a grace period.
26
+ * - The guard is held for a few synchronous filesystem calls and records its holder like the
27
+ * lock does. A guard is cleared only when its holder is provably dead (a process killed inside
28
+ * that window), or when it is still unparseable after `GUARD_STALE_MS` (its creator died between
29
+ * `open` and `write`). A guard whose holder is alive is never cleared, however old: a holder
30
+ * stopped mid-section (SIGSTOP, a debugger) keeps it, and waiters time out with a diagnostic
31
+ * naming the guard file rather than overlap. Clearing renames the guard aside and puts it back
32
+ * if it turns out not to be the one judged stale.
33
+ * Residual risk: two waiters clearing the SAME dead guard while a third creates a new one can
34
+ * still overlap. That needs a process to die inside a microsecond critical section and three
35
+ * more to race within microseconds of it; the worst outcome is two concurrent soffice launches,
36
+ * the behaviour before this lock existed.
37
+ * - If the guard cannot be taken, a release leaves its lockfile in place rather than removing it
38
+ * unguarded; waiters reclaim it once the holder exits (ESRCH) or after `staleMs`.
39
+ *
40
+ * Re-entrancy: a call nested inside a holder's async context (for the same lockfile) runs under
41
+ * the holder's lease instead of waiting on itself. The lease is invalidated before release, so
42
+ * work that outlives the holder (a detached promise) must acquire the lock again. Nested calls
43
+ * share the holder's lease and are not serialized among themselves; the package's launchers
44
+ * never nest.
45
+ *
46
+ * Scope: every real LibreOffice binary (anything whose path or resolved real path contains
47
+ * "libreoffice", e.g. the Homebrew wrapper and the app-bundle binary it execs) shares ONE
48
+ * machine-wide lock. Any other executable — the stub converters used by unit tests — is locked by
49
+ * its own real path, so stubs never queue behind a real oracle run in another worker.
50
+ *
51
+ * If the temp dir cannot be written (a restricted sandbox), launches proceed unlocked with a
52
+ * one-time warning rather than turning a skip-on-unusable-soffice into a hard failure.
53
+ *
54
+ * Deliberately NOT part of the package's public API: it is internal coordination for this
55
+ * package's soffice launchers, which callers reach through `runLibreOfficeOracle` /
56
+ * `probeSofficeUsable` and get the lock for free.
57
+ *
58
+ * @see https://github.com/UseJunior/safe-docx/issues/1037
59
+ * @see https://github.com/UseJunior/safe-docx/issues/627
60
+ */
61
+ import { AsyncLocalStorage } from 'node:async_hooks';
62
+ import { createHash, randomUUID } from 'node:crypto';
63
+ import { closeSync, linkSync, openSync, readFileSync, realpathSync, renameSync, rmSync, statSync, writeSync } from 'node:fs';
64
+ import os from 'node:os';
65
+ import path from 'node:path';
66
+ /** A holder older than this is presumed dead even if its PID looks alive (PID reuse). Oracle
67
+ * launches are bounded far below this: the probe times out at 30s, an oracle batch at
68
+ * 20s + 2 × 45s, a generation probe at 45s. */
69
+ export const DEFAULT_STALE_LOCK_MS = 10 * 60_000;
70
+ /** Default wait for a contended lock before giving up with a diagnostic. */
71
+ export const DEFAULT_LOCK_TIMEOUT_MS = 5 * 60_000;
72
+ /** A lockfile that exists but cannot be parsed is only stolen after this grace period. */
73
+ const UNREADABLE_LOCK_GRACE_MS = 10_000;
74
+ /** A guard still unparseable after this long was abandoned between `open` and `write`. */
75
+ const GUARD_STALE_MS = 60_000;
76
+ /** Give up on the removal guard after this long (only reachable if the guard dir misbehaves). */
77
+ const GUARD_TIMEOUT_MS = 30_000;
78
+ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
79
+ const errCode = (err) => err?.code;
80
+ function canonicalBinary(soffice) {
81
+ try {
82
+ return realpathSync(soffice);
83
+ }
84
+ catch {
85
+ return path.resolve(soffice);
86
+ }
87
+ }
88
+ /** Lockfile path for a binary: one machine-wide (per OS user temp dir) lock for every real
89
+ * LibreOffice entry point, a per-path lock for anything else. */
90
+ export function sofficeLockPath(soffice) {
91
+ const real = canonicalBinary(soffice);
92
+ const key = /libreoffice/i.test(real) || /libreoffice/i.test(soffice)
93
+ ? 'libreoffice'
94
+ : createHash('sha256').update(real).digest('hex').slice(0, 16);
95
+ return path.join(os.tmpdir(), `safe-docx-soffice-${key}.lock`);
96
+ }
97
+ function readRecord(file) {
98
+ try {
99
+ const parsed = JSON.parse(readFileSync(file, 'utf8'));
100
+ if (typeof parsed.pid !== 'number' || typeof parsed.token !== 'string')
101
+ return null;
102
+ return { pid: parsed.pid, host: String(parsed.host ?? ''), token: parsed.token, at: String(parsed.at ?? '') };
103
+ }
104
+ catch {
105
+ return null;
106
+ }
107
+ }
108
+ /** True unless the holder is provably gone. EPERM means the PID exists but belongs to another
109
+ * user (shared /tmp on Linux), so it counts as alive. A holder on another host cannot be
110
+ * checked and is left to the age-based stale rule. */
111
+ function holderAlive(record) {
112
+ if (record.host && record.host !== os.hostname())
113
+ return true;
114
+ try {
115
+ process.kill(record.pid, 0);
116
+ return true;
117
+ }
118
+ catch (err) {
119
+ return errCode(err) !== 'ESRCH';
120
+ }
121
+ }
122
+ /** Age of the lockfile in ms; null if it no longer exists. Any other stat failure is reported as
123
+ * age 0 (fresh), so an unreadable file is waited on, never stolen or spun on. */
124
+ function lockAgeMs(lockPath) {
125
+ try {
126
+ return Date.now() - statSync(lockPath).mtimeMs;
127
+ }
128
+ catch (err) {
129
+ return errCode(err) === 'ENOENT' ? null : 0;
130
+ }
131
+ }
132
+ /** Exclusive-create `file` holding `record`; false if it already exists. A failed write removes
133
+ * the half-created file (no one else removes a fresh unparseable file) and rethrows. */
134
+ function tryCreate(file, record) {
135
+ let fd;
136
+ try {
137
+ fd = openSync(file, 'wx');
138
+ }
139
+ catch (err) {
140
+ if (errCode(err) === 'EEXIST')
141
+ return false;
142
+ throw err;
143
+ }
144
+ try {
145
+ writeSync(fd, JSON.stringify(record));
146
+ closeSync(fd);
147
+ }
148
+ catch (err) {
149
+ try {
150
+ closeSync(fd);
151
+ }
152
+ catch { /* already closed */ }
153
+ try {
154
+ rmSync(file, { force: true });
155
+ }
156
+ catch { /* best effort */ }
157
+ throw err;
158
+ }
159
+ return true;
160
+ }
161
+ const newRecord = () => ({ pid: process.pid, host: os.hostname(), token: randomUUID(), at: new Date().toISOString() });
162
+ /** Clear an abandoned guard: rename it aside, keep it removed only if it is the record judged
163
+ * stale, otherwise put it back (`link` refuses to overwrite a newer guard). */
164
+ function clearStaleGuard(guard, judged) {
165
+ const aside = `${guard}.stale-${randomUUID()}`;
166
+ try {
167
+ renameSync(guard, aside);
168
+ }
169
+ catch {
170
+ return; // vanished, or cannot be moved — the caller waits and re-evaluates
171
+ }
172
+ const moved = readRecord(aside);
173
+ const same = judged ? moved?.token === judged.token : moved === null;
174
+ if (!same) {
175
+ try {
176
+ linkSync(aside, guard);
177
+ }
178
+ catch { /* a newer guard exists */ }
179
+ }
180
+ try {
181
+ rmSync(aside, { force: true });
182
+ }
183
+ catch { /* best effort */ }
184
+ }
185
+ /** Run `fn` (synchronous filesystem work only) while holding the removal guard. */
186
+ async function underRemovalGuard(lockPath, fn, deadline = Date.now() + GUARD_TIMEOUT_MS) {
187
+ const guard = `${lockPath}.guard`;
188
+ for (;;) {
189
+ const mine = newRecord();
190
+ if (tryCreate(guard, mine)) {
191
+ try {
192
+ fn();
193
+ return;
194
+ }
195
+ finally {
196
+ if (readRecord(guard)?.token === mine.token)
197
+ rmSync(guard, { force: true });
198
+ }
199
+ }
200
+ const holder = readRecord(guard);
201
+ const age = lockAgeMs(guard);
202
+ if (age === null)
203
+ continue; // freed between our create and our read — retry at once
204
+ const stale = holder ? !holderAlive(holder) : age > GUARD_STALE_MS;
205
+ if (stale)
206
+ clearStaleGuard(guard, holder);
207
+ if (Date.now() > deadline) {
208
+ throw new Error(`Timed out waiting for the LibreOffice lock guard at ${guard}` +
209
+ (holder ? ` (recorded holder pid ${holder.pid} since ${holder.at})` : '') +
210
+ '. Delete it only if that process is not a safe-docx LibreOffice launcher.');
211
+ }
212
+ await sleep(5 + Math.floor(Math.random() * 10));
213
+ }
214
+ }
215
+ /**
216
+ * Acquire the lockfile, returning an idempotent async release. Exported for unit tests and the
217
+ * multi-process contention test; production code uses {@link withSofficeLock}.
218
+ */
219
+ export async function acquireSofficeLock(lockPath, { timeoutMs = DEFAULT_LOCK_TIMEOUT_MS, pollMs = 200, staleMs = DEFAULT_STALE_LOCK_MS, } = {}) {
220
+ const deadline = Date.now() + timeoutMs;
221
+ const record = newRecord();
222
+ for (;;) {
223
+ if (tryCreate(lockPath, record)) {
224
+ let released;
225
+ return () => {
226
+ released ??= underRemovalGuard(lockPath, () => {
227
+ if (readRecord(lockPath)?.token === record.token)
228
+ rmSync(lockPath, { force: true });
229
+ }).catch((err) => {
230
+ // Never remove unguarded (a successor could be deleted). The lockfile stays until this
231
+ // process exits (ESRCH) or it ages past staleMs, when waiters reclaim it.
232
+ // eslint-disable-next-line no-console
233
+ console.warn(`[soffice-lock] could not release ${lockPath} (${err.message}); it will be reclaimed as stale.`);
234
+ });
235
+ return released;
236
+ };
237
+ }
238
+ const holder = readRecord(lockPath);
239
+ const age = lockAgeMs(lockPath);
240
+ if (age === null)
241
+ continue; // released between our create and our read — retry the create
242
+ const stale = holder ? !holderAlive(holder) || age > staleMs : age > UNREADABLE_LOCK_GRACE_MS;
243
+ if (stale) {
244
+ // Re-check under the guard: remove only the exact record judged stale. If it changed
245
+ // (released, or replaced by a fresh holder), the next iteration re-evaluates.
246
+ // The guard wait is bounded by the caller's deadline, and a removal that finishes past it
247
+ // does not turn into a late acquisition.
248
+ let removed = false;
249
+ await underRemovalGuard(lockPath, () => {
250
+ const current = readRecord(lockPath);
251
+ const currentAge = lockAgeMs(lockPath);
252
+ const same = holder
253
+ ? current?.token === holder.token
254
+ : current === null && currentAge !== null && currentAge > UNREADABLE_LOCK_GRACE_MS;
255
+ if (same) {
256
+ rmSync(lockPath, { force: true });
257
+ removed = true;
258
+ }
259
+ }, deadline);
260
+ if (removed && Date.now() <= deadline)
261
+ continue;
262
+ }
263
+ if (Date.now() > deadline) {
264
+ throw new Error(`Timed out after ${timeoutMs}ms waiting for the cross-process LibreOffice lock at ${lockPath}` +
265
+ (holder ? ` (held by pid ${holder.pid} on ${holder.host || 'unknown host'} since ${holder.at})` : '') +
266
+ '. Another LibreOffice-driving process appears to be live; delete the lockfile only if none is.');
267
+ }
268
+ await sleep(pollMs + Math.floor(Math.random() * pollMs));
269
+ }
270
+ }
271
+ const leases = new AsyncLocalStorage();
272
+ let warnedUnlocked = false;
273
+ /** Filesystem errors meaning "the lock cannot be created here", not "the lock is contended". */
274
+ const UNWRITABLE = new Set(['EACCES', 'EPERM', 'EROFS']);
275
+ /**
276
+ * Run `fn` while holding the cross-process lock for `soffice`. The lock is released on every
277
+ * exit path, including a throw or timeout inside `fn`. See the module comment for re-entrancy
278
+ * and the unwritable-temp-dir fallback.
279
+ */
280
+ export async function withSofficeLock(soffice, fn, options = {}) {
281
+ const lockPath = options.lockPath ?? sofficeLockPath(soffice);
282
+ const current = leases.getStore();
283
+ if (current?.get(lockPath)?.active)
284
+ return fn();
285
+ let release;
286
+ try {
287
+ release = await acquireSofficeLock(lockPath, options);
288
+ }
289
+ catch (err) {
290
+ if (!UNWRITABLE.has(errCode(err) ?? ''))
291
+ throw err;
292
+ if (!warnedUnlocked) {
293
+ warnedUnlocked = true;
294
+ // eslint-disable-next-line no-console
295
+ console.warn(`[soffice-lock] cannot create ${lockPath} (${errCode(err)}); launching LibreOffice without the cross-process lock.`);
296
+ }
297
+ return fn();
298
+ }
299
+ const lease = { lockPath, active: true };
300
+ try {
301
+ return await leases.run(new Map([...(current ?? []), [lockPath, lease]]), fn);
302
+ }
303
+ finally {
304
+ lease.active = false;
305
+ await release();
306
+ }
307
+ }
308
+ //# sourceMappingURL=soffice-lock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"soffice-lock.js","sourceRoot":"","sources":["../../src/integration/soffice-lock.ts"],"names":[],"mappings":"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"}
@@ -65,6 +65,14 @@ export declare function collectRevisionElements(root: Element | Document): Eleme
65
65
  * otherwise `author` resolves to the ids of every revision it authored.
66
66
  */
67
67
  export declare function resolveSelectedIds(revisionElements: Element[], selector: AiEditSelector): Set<string>;
68
+ /**
69
+ * The selected ids that name a tracked change actually present in
70
+ * `revisionElements`, in selection order. `resolveSelectedIds` keeps requested
71
+ * `revisionIds` verbatim (an unknown id simply filters nothing); this is what a
72
+ * caller should report as selected, so an id that matches no revision is not
73
+ * echoed back as if it had been acted on (#1099).
74
+ */
75
+ export declare function matchedSelectedIds(revisionElements: Element[], selectedIds: Set<string>): string[];
68
76
  /**
69
77
  * Find ambiguous overlaps within a single story: a targeted content-wrapper
70
78
  * revision that structurally contains — or is contained by — a non-targeted
@@ -1 +1 @@
1
- {"version":3,"file":"accept_ai_edits.d.ts","sourceRoot":"","sources":["../../src/primitives/accept_ai_edits.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,OAAO,EAGL,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAiB,KAAK,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAmD9E,wDAAwD;AACxD,MAAM,WAAW,cAAc;IAC7B,gFAAgF;IAChF,WAAW,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IACrC,iFAAiF;IACjF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,gFAAgF;AAChF,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,mFAAmF;AACnF,qBAAa,6BAA8B,SAAQ,KAAK;IACtD,QAAQ,CAAC,IAAI,gCAAgC;IAC7C,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,EAAE,CAAC;gBAC3B,QAAQ,EAAE,iBAAiB,EAAE;CAS1C;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,mBAAmB,CAAC;IAC5B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,iBAAiB,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,mBAAmB,CAAC;IAC5B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,iBAAiB,EAAE,CAAC;CAC/B;AAUD,qEAAqE;AACrE,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,EAAE,CAQ3E;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,gBAAgB,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,cAAc,GAAG,GAAG,CAAC,MAAM,CAAC,CAgBrG;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,EAAE,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,iBAAiB,EAAE,CA6E/G;AAED,qEAAqE;AACrE,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,cAAc,CAKzE;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,GAAG,qBAAqB,CAQ5F;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,GAAG,qBAAqB,CAQ5F"}
1
+ {"version":3,"file":"accept_ai_edits.d.ts","sourceRoot":"","sources":["../../src/primitives/accept_ai_edits.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,OAAO,EAGL,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAiB,KAAK,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAmD9E,wDAAwD;AACxD,MAAM,WAAW,cAAc;IAC7B,gFAAgF;IAChF,WAAW,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IACrC,iFAAiF;IACjF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,gFAAgF;AAChF,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,mFAAmF;AACnF,qBAAa,6BAA8B,SAAQ,KAAK;IACtD,QAAQ,CAAC,IAAI,gCAAgC;IAC7C,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,EAAE,CAAC;gBAC3B,QAAQ,EAAE,iBAAiB,EAAE;CAS1C;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,mBAAmB,CAAC;IAC5B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,iBAAiB,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,mBAAmB,CAAC;IAC5B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,iBAAiB,EAAE,CAAC;CAC/B;AAUD,qEAAqE;AACrE,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,EAAE,CAQ3E;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,gBAAgB,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,cAAc,GAAG,GAAG,CAAC,MAAM,CAAC,CAgBrG;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,gBAAgB,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,CAOlG;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,EAAE,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,iBAAiB,EAAE,CA6E/G;AAED,qEAAqE;AACrE,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,cAAc,CAKzE;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,GAAG,qBAAqB,CAU5F;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,GAAG,qBAAqB,CAU5F"}