Open maneetgoyal opened 4 years ago
function greenlet(fn) {
const script = `self.onmessage = e => self.postMessage((${fn})(e.data));`;
const workerURL = URL.createObjectURL(new Blob([script]));
const worker = new Worker(workerURL);
const instance = (...args) =>
new Promise((resolve, reject) => {
const messageHandler = (e) => {
worker.removeEventListener('message', messageHandler);
resolve(e.data);
};
worker.addEventListener('message', messageHandler);
worker.postMessage(args);
});
instance.dispose = () => {
URL.revokeObjectURL(workerURL);
worker.terminate();
};
return instance;
}
Great library, very useful stuff and absolutely love the size. :)
I've only recently started learning about
Web Workers
and took a look at the source code. So apologies in advance if I am wrong ;). 2 things caught my eyes:So if we do something like the following snippet (taken from the README), it seems that each new function instantiated via
greenlet(...)
will reserve a new thread and a new URL reference.So, if there is a case wherein I don't need to use
getName
after a certain point in my code, those resources are still trapped. They may be very less in size to be of a practical concern, but I am not sure about it and would love if anyone can comment on that.However, if the output function
getName
comes with adispose
method which releases those references, it could be useful. WDYT? Something like:Internally, it could call:
Post
dispose
,getName
can itself becomeundefined
so it's not callable. Or canthrow
a more informative error:The function is disposed/discarded due to .dispose() call.
.Is there a downside to this approach if the contributors already considered any similar approach?