import type { RuntimeHost } from 'mathjslab/runtime'; /** Calculator effects supported without coupling the Worker to the browser DOM. */ export const calculatorRuntimeHost: RuntimeHost = { async request(effect, context) { if (effect.type === 'clock-now') return { value: Date.now() }; if (effect.type !== 'delay') throw new Error('Unsupported calculator effect: ' + effect.type); await new Promise((resolve, reject) => { const signal = context.signal; if (signal?.aborted) { reject(signal.reason); return; } const finish = (): void => { signal?.removeEventListener('abort', abort); resolve(); }; const timer = setTimeout(finish, effect.milliseconds); const abort = (): void => { clearTimeout(timer); signal?.removeEventListener('abort', abort); reject(signal?.reason); }; signal?.addEventListener('abort', abort, { once: true }); }); return {}; }, };