1
0
silverbullet/webapp/src/function_worker.js
2022-02-25 11:27:58 +01:00

79 lines
1.8 KiB
JavaScript

// Nugget: this file is not built by Parcel, it's simply copied to the distribution
// The reason is that somehow Parcel cannot accept using importScripts otherwise
function safeRun(fn) {
fn().catch((e) => {
console.error(e);
});
}
let func = null;
let pendingRequests = {};
console.log("hello world!");
self.addEventListener("syscall", (event) => {
let customEvent = event;
let detail = customEvent.detail;
pendingRequests[detail.id] = detail.callback;
self.postMessage({
type: "syscall",
id: detail.id,
name: detail.name,
args: detail.args,
});
});
self.addEventListener("result", (event) => {
let customEvent = event;
self.postMessage({
type: "result",
result: customEvent.detail,
});
});
self.addEventListener("app-error", (event) => {
let customEvent = event;
self.postMessage({
type: "error",
reason: customEvent.detail,
});
});
self.addEventListener("message", (event) => {
safeRun(async () => {
let messageEvent = event;
let data = messageEvent.data;
switch (data.type) {
case "boot":
console.log("Booting", `./${data.prefix}/function/${data.name}`);
importScripts(`./${data.prefix}/function/${data.name}`);
self.postMessage({
type: "inited",
});
break;
case "invoke":
self.dispatchEvent(
new CustomEvent("invoke-function", {
detail: {
args: data.args || [],
},
})
);
break;
case "syscall-response":
let id = data.id;
const lookup = pendingRequests[id];
if (!lookup) {
console.log(
"Current outstanding requests",
pendingRequests,
"looking up",
id
);
throw Error("Invalid request id");
}
return await lookup(data.data);
}
});
});