124 lines
2.7 KiB
TypeScript
124 lines
2.7 KiB
TypeScript
import exchangeCommunicationKeys from "./messages/exchangeCommunicationKeys.js";
|
|
import {
|
|
deleteQuery,
|
|
getAuthStatus,
|
|
getAuthStatusKnown,
|
|
getLoggedInDefer,
|
|
getQueries,
|
|
getQuery,
|
|
resetLoggedInDefer,
|
|
setAuthStatus,
|
|
setAuthStatusKnown,
|
|
getAuthStatusDefer,
|
|
} from "./vars.js";
|
|
const kernelMessageHandlers = {
|
|
exchangeCommunicationKeys,
|
|
};
|
|
|
|
export async function handleIncomingMessage(event: MessageEvent) {
|
|
if (event.source === null) {
|
|
return;
|
|
}
|
|
if (event.source === window) {
|
|
return;
|
|
}
|
|
|
|
const data = event.data?.data;
|
|
if (event.data.method === "log") {
|
|
if (data?.isErr === false) {
|
|
console.log(data.message);
|
|
return;
|
|
}
|
|
console.error(data.message);
|
|
}
|
|
|
|
if (event.data.method === "kernelAuthStatus") {
|
|
setAuthStatus(data);
|
|
if (!getAuthStatusKnown()) {
|
|
getAuthStatusDefer().resolve();
|
|
setAuthStatusKnown(true);
|
|
console.log("bootloader is now initialized");
|
|
if (!getAuthStatus().loginComplete) {
|
|
console.log("user is not logged in: waiting until login is confirmed");
|
|
} else {
|
|
getLoggedInDefer().resolve();
|
|
}
|
|
if (getAuthStatus().logoutComplete) {
|
|
resetLoggedInDefer();
|
|
setAuthStatusKnown(false);
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (!("nonce" in event.data)) {
|
|
(event.source as WindowProxy).postMessage(
|
|
{
|
|
nonce: "N/A",
|
|
method: "response",
|
|
err: "message sent to kernel with no nonce",
|
|
},
|
|
event.origin,
|
|
);
|
|
return;
|
|
}
|
|
|
|
if (!("method" in event.data)) {
|
|
(event.source as WindowProxy).postMessage(
|
|
{
|
|
nonce: event.data.nonce,
|
|
method: "response",
|
|
err: "message sent to kernel with no method",
|
|
},
|
|
event.origin,
|
|
);
|
|
return;
|
|
}
|
|
|
|
if (event.data.method in kernelMessageHandlers) {
|
|
let response;
|
|
|
|
try {
|
|
response = await kernelMessageHandlers[event.data.method](
|
|
event.data.data,
|
|
);
|
|
} catch (e: any) {
|
|
response = { err: (e as Error).message };
|
|
}
|
|
|
|
(event.source as WindowProxy).postMessage(
|
|
{
|
|
nonce: event.data.nonce,
|
|
data: response,
|
|
},
|
|
event.origin,
|
|
);
|
|
return;
|
|
}
|
|
if (!(event.data.nonce in getQueries())) {
|
|
return;
|
|
}
|
|
|
|
let receiveResult = getQuery(event.data.nonce);
|
|
if (event.data.method === "response") {
|
|
deleteQuery(event.data.nonce);
|
|
}
|
|
|
|
receiveResult?.(event.data);
|
|
|
|
if (["moduleCall", "response"].includes(event.data.method)) {
|
|
return;
|
|
}
|
|
|
|
(event.source as WindowProxy).postMessage(
|
|
{
|
|
nonce: event.data.nonce,
|
|
method: "response",
|
|
err:
|
|
"unrecognized method (user may need to log in): " + event.data.method,
|
|
},
|
|
event.origin,
|
|
);
|
|
return;
|
|
}
|