@evolu/web
Version:
Evolu for web
43 lines (42 loc) • 1.12 kB
JavaScript
/**
* Typed wrapper for Web Worker
*
* While Comlink DX is nice, there are still memory leaks and unresolved bugs.
* Use plain Web Worker with a typed wrapper if maximum performance and
* reliability are required.
*
* @module
*/
import { constVoid } from "@evolu/common";
/**
* Wraps a Web Worker to provide a typed interface for sending and receiving
* messages.
*/
export const wrapWebWorker = (createWebWorker) => {
// Server.
if (typeof document === "undefined")
return {
postMessage: constVoid,
onMessage: constVoid,
};
const webWorker = createWebWorker();
const worker = {
postMessage: (message) => {
webWorker.postMessage(message);
},
onMessage: (callback) => {
webWorker.onmessage = (event) => {
callback(event.data);
};
},
};
return worker;
};
export const wrapWebWorkerSelf = (worker) => {
worker.onMessage((message) => {
postMessage(message);
});
self.onmessage = (event) => {
worker.postMessage(event.data);
};
};