import { Worker } from 'node:worker_threads'; import type { RegulatoryCorpusV2 } from '../../src/compliance/regulatory-rag'; import type { IsoPdfCorpusOptions } from './iso-pdf-corpus'; export function prepareIsoCorpusInWorker(options: IsoPdfCorpusOptions, signal?: AbortSignal): Promise { return new Promise((resolve, reject) => { const worker = new Worker(new URL('./iso-pdf-worker.mjs', import.meta.url), { workerData: options, resourceLimits: { maxOldGenerationSizeMb: 768, maxYoungGenerationSizeMb: 128 } }); const timer = setTimeout(() => { void worker.terminate(); reject(new Error('ISO PDF parsing exceeded five minutes.')); }, 5 * 60_000); const abort = () => { clearTimeout(timer); void worker.terminate(); reject(signal!.reason); }; if (signal?.aborted) abort(); else signal?.addEventListener('abort', abort, { once: true }); const finish = (error?: Error, corpus?: RegulatoryCorpusV2) => { clearTimeout(timer); signal?.removeEventListener('abort', abort); if (error) reject(error); else if (corpus) resolve(corpus); }; worker.once('message', (message: { corpus?: RegulatoryCorpusV2; error?: string }) => finish( message.error ? new Error(message.error) : undefined, message.corpus)); worker.once('error', error => finish(error)); worker.once('exit', code => { if (code !== 0) finish(new Error(`ISO PDF parser exited with code ${code}.`)); }); }); }