-
-
Save BYK/0de123458375fea91011146de88b442a to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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