import test from 'node:test'; import assert from 'node:assert/strict'; import { mkdtempSync, rmSync } from 'node:fs'; import { tmpdir } from 'node:os'; import { join } from 'node:path'; import { initializeControl, transition } from '../../processing-control/src/state.mjs'; import { withProcessing } from '../../processing-control/src/effects.mjs'; import { webService } from '../src/web.mjs'; test('a root halt aborts the active search-source signal before the normal web deadline', async t => { const root = mkdtempSync(join(tmpdir(), 'processing-web-')); initializeControl(root); t.after(() => rmSync(root, { recursive: true, force: true })); let ready, observed; const started = new Promise(resolve => { ready = resolve; }); const service = webService({ deadlineMs: 3000, search: { search: (_query, { signal }) => new Promise((_resolve, reject) => { observed = signal; signal.addEventListener('abort', () => reject(signal.reason), { once: true }); ready(); }) } }); const call = withProcessing(root, () => service.handle('web.search', { query: 'fixture' })); await started; const began = Date.now(); transition(root, { business: 'demo', human: 'jason', halted: true }); await call.catch(() => {}); assert.equal(observed.aborted, true); assert.equal(observed.reason.name, 'ProcessingError'); assert.ok(Date.now() - began < 1500); });