one
Version:
One is a React framework for web, iOS, and Android apps.
60 lines (58 loc) • 1.71 kB
JavaScript
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