79 lines
1.8 KiB
JavaScript
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);
|
|
}
|
|
});
|
|
});
|