UNPKG

one

Version:

One is a React framework for web, iOS, and Android apps.

60 lines (58 loc) • 1.71 kB
function createWorkerExecutor(createWorker) { const worker = createWorker(); let disposed = false; let failure = null; let pending = null; function fail(error) { if (disposed || failure) return; failure = error; worker.terminate(); const rejected = pending; pending = null; rejected?.reject(error); } worker.onmessage = (event) => { const response = event.data; const revision = response.ok ? response.result.revision : response.revision; if (!pending || revision !== pending.revision) return; const accepted = pending; pending = null; if (response.ok) accepted.resolve(response.result); else accepted.reject(new Error(response.error)); }; worker.onerror = (event) => { event.preventDefault(); fail(new Error(event.message)); }; worker.onmessageerror = () => fail(new Error("background worker response could not be decoded")); return { execute(request, isCurrent) { if (disposed || !isCurrent(request.revision)) return Promise.resolve(null); if (failure) return Promise.reject(failure); if (pending) throw new Error("background calculations must run serially"); return new Promise((resolve, reject) => { pending = { revision: request.revision, resolve, reject }; try { worker.postMessage(request); } catch (error) { pending = null; reject(error instanceof Error ? error : new Error(String(error))); } }); }, dispose() { if (disposed) return; disposed = true; if (!failure) worker.terminate(); const rejected = pending; pending = null; rejected?.reject(new Error("background computation disposed")); } }; } export { createWorkerExecutor }; //# sourceMappingURL=web.mjs.map