Cancel PDF reading and OCR when the offer assistant closes

This commit is contained in:
2026-09-06 10:24:07 +03:00
parent d534ea20b9
commit 3ad9348c20
6 changed files with 109 additions and 25 deletions
+28
View File
@@ -0,0 +1,28 @@
import {test} from 'node:test';
import assert from 'node:assert/strict';
import {readPdfPages} from '../src/services/pdfDocumentReader.js';
import {awaitWithAbort} from '../src/services/abortable.js';
test('cancelling pending OCR cleans the page and prevents reading subsequent pages',async()=>{
const c=new AbortController();let reads=0,cleanups=0;
const doc={numPages:3,getPage:async()=>{reads++;return {getTextContent:async()=>({items:[]}),cleanup:()=>cleanups++};}};
await assert.rejects(readPdfPages(doc,{signal:c.signal,ocrPage:async()=>{c.abort();return new Promise(()=>{});}}),{name:'AbortError'});
assert.equal(reads,1);assert.equal(cleanups,1);
});
test('late page acquisition after cancellation cleans the acquired page',async()=>{
const c=new AbortController();let release,cleanups=0;
const pending=readPdfPages({numPages:1,getPage:()=>new Promise(resolve=>release=resolve)},{signal:c.signal});
c.abort();await assert.rejects(pending,{name:'AbortError'});
release({cleanup:()=>cleanups++});await Promise.resolve();await Promise.resolve();
assert.equal(cleanups,1);
});
test('abort invokes resource cancellation once even if work settles later',async()=>{
const c=new AbortController();let release,cancelled=0;
const pending=awaitWithAbort(new Promise(resolve=>release=resolve),c.signal,()=>cancelled++);
c.abort();await assert.rejects(pending,{name:'AbortError'});
release('late');await Promise.resolve();assert.equal(cancelled,1);
});
test('normal completion removes cancellation callbacks',async()=>{
const c=new AbortController();let cancelled=0;
assert.equal(await awaitWithAbort(Promise.resolve('source'),c.signal,()=>cancelled++),'source');
c.abort();assert.equal(cancelled,0);
});