25 lines
1.4 KiB
TypeScript
25 lines
1.4 KiB
TypeScript
import { Worker } from 'node:worker_threads';
|
|
import type { RegulatoryCorpusV2 } from '../../src/domain/regulatory-rag';
|
|
import type { IsoPdfCorpusOptions } from './iso-pdf-corpus';
|
|
|
|
export function prepareIsoCorpusInWorker(options: IsoPdfCorpusOptions, signal?: AbortSignal): Promise<RegulatoryCorpusV2> {
|
|
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}.`)); });
|
|
});
|
|
}
|