Skip to content

Instantly share code, notes, and snippets.

@BYK
Created May 19, 2022 22:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save BYK/0de123458375fea91011146de88b442a to your computer and use it in GitHub Desktop.
Save BYK/0de123458375fea91011146de88b442a to your computer and use it in GitHub Desktop.
const getWorkerMessenger = async () => {
const polyfill = (await IE_POLYFILL).default;
const sendMessage: IMessagePoster = (
functionBody: string,
args: unknown[] = [],
callback: ICallback
) => {
const blob = new Blob(
[
polyfill,
'\n',
'var window = self;\n',
'function send(e, v, reportSendError){',
'try {postMessage({value: v, error: e ? {name: e.name, message: e.message, stack: e.stack} : undefined});}',
'catch (err) {if (reportSendError !== false) send(err, undefined, false);}',
'}',
'self.addEventListener("unhandledrejection", function(e){e.preventDefault();send(e.reason, undefined);});',
'onmessage=function (evt){',
'let result, error;',
'try {\n',
functionBody,
'\n',
`result=${CUSTOM_FUNCTION_NAME}.apply(undefined, evt.data);\n`,
'} catch (err) {error = err;}\n',
'if (!error && result && typeof result.then === "function") {\n',
'result.then(',
'function (r) {result = r;},',
'function (e) {error = e;}',
').finally(function () {send(error, result);});\n',
'} else {send(error, result);}\n',
'}',
],
{
type: 'application/javascript',
}
);
const workerURL = URL.createObjectURL(blob);
const worker = new Worker(workerURL);
const cleanup = () => {
worker.terminate();
// Release memory as we may have many and large functions
URL.revokeObjectURL(workerURL);
};
worker.onmessage = ({ data: { value, error } }: { data: IResult }) => {
cleanup();
callback(error ? deserializeError(error) : undefined, value);
};
worker.onerror = (err) => {
err.preventDefault();
err.stopPropagation();
cleanup();
let error = err.error;
if (!error) {
error = deserializeError({
name: 'SyntaxError',
message: err.message,
stack: `${err.message} at ${err.filename}:${err.lineno}:${err.colno}`,
});
}
callback(error, undefined);
};
worker.postMessage(args);
};
sendMessage.type = 'worker';
return sendMessage;
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment