Assessor_2.0/server/compliance/iso-pdf-worker-client.ts

25 lines
1.4 KiB
TypeScript

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<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}.`)); });
});
}