2022-07-31 04:59:51 +00:00
|
|
|
import tldEnum from "@lumeweb/tld-enum";
|
|
|
|
import WebEngine from "../webEngine.js";
|
|
|
|
import InternalProvider from "../contentProviders/internalProvider.js";
|
2022-07-31 05:36:06 +00:00
|
|
|
import ServerProvider from "../contentProviders/serverProvider.js";
|
2023-07-17 14:41:00 +00:00
|
|
|
import { init } from "@lumeweb/libkernel/kernel";
|
2022-08-13 08:19:01 +00:00
|
|
|
import IpfsProvider from "../contentProviders/ipfsProvider.js";
|
2022-08-14 18:36:26 +00:00
|
|
|
import {
|
|
|
|
addQuery,
|
|
|
|
clearOpenPorts,
|
|
|
|
deleteOpenPort,
|
|
|
|
deleteQuery,
|
|
|
|
getAuthStatus,
|
|
|
|
getAuthStatusKnown,
|
2023-07-17 14:42:35 +00:00
|
|
|
getAuthStatusResolve,
|
|
|
|
getBlockForBootloader,
|
|
|
|
getBlockForBridge,
|
|
|
|
getBridgeLoadedResolve,
|
2022-08-14 18:36:26 +00:00
|
|
|
getKernelIframe,
|
|
|
|
getOpenPorts,
|
|
|
|
getPortsNonce,
|
|
|
|
getQueries,
|
|
|
|
getQueriesNonce,
|
|
|
|
getQuery,
|
|
|
|
getTimer,
|
|
|
|
increasePortsNonce,
|
|
|
|
increaseQueriesNonce,
|
|
|
|
setAuthStatus,
|
|
|
|
setAuthStatusKnown,
|
|
|
|
setKernelIframe,
|
|
|
|
setOpenPort,
|
|
|
|
setTimer,
|
2023-07-17 14:42:35 +00:00
|
|
|
weAreBooted,
|
2023-07-17 19:28:58 +00:00
|
|
|
} from "../vars.js";
|
2023-07-17 15:39:16 +00:00
|
|
|
import browser from "webextension-polyfill";
|
2022-07-29 10:37:20 +00:00
|
|
|
|
|
|
|
function logLargeObjects() {
|
2022-08-14 18:36:26 +00:00
|
|
|
let queriesLen = Object.keys(getQueries()).length;
|
|
|
|
let portsLen = Object.keys(getOpenPorts()).length;
|
2022-07-29 10:37:20 +00:00
|
|
|
if (queriesLen > 500) {
|
|
|
|
console.error("queries appears to be leaking:", queriesLen);
|
|
|
|
}
|
|
|
|
if (portsLen > 50) {
|
|
|
|
console.error("ports appears to be leaking:", portsLen);
|
|
|
|
}
|
2022-08-14 18:36:26 +00:00
|
|
|
setTimer(getTimer() * 1.25);
|
|
|
|
setTimeout(logLargeObjects, getTimer());
|
2022-07-29 10:37:20 +00:00
|
|
|
}
|
2023-04-03 17:29:20 +00:00
|
|
|
|
2022-08-14 18:36:26 +00:00
|
|
|
setTimeout(logLargeObjects, getTimer());
|
2022-07-29 10:37:20 +00:00
|
|
|
|
|
|
|
export function queryKernel(query: any): Promise<any> {
|
|
|
|
return new Promise((resolve) => {
|
|
|
|
let receiveResponse = function (data: any) {
|
|
|
|
resolve(data.data);
|
|
|
|
};
|
|
|
|
|
2022-08-22 05:49:58 +00:00
|
|
|
getBlockForBootloader().then(() => {
|
2022-08-14 18:36:26 +00:00
|
|
|
let nonce = getQueriesNonce();
|
|
|
|
increaseQueriesNonce();
|
2022-07-29 10:37:20 +00:00
|
|
|
query.nonce = nonce;
|
2022-08-14 18:36:26 +00:00
|
|
|
addQuery(nonce, receiveResponse);
|
2022-08-22 05:49:58 +00:00
|
|
|
if (getKernelIframe().contentWindow !== null) {
|
|
|
|
(getKernelIframe() as any).contentWindow.postMessage(
|
|
|
|
query,
|
2023-07-17 14:42:35 +00:00
|
|
|
"http://kernel.lume",
|
2022-08-22 05:49:58 +00:00
|
|
|
);
|
2022-07-29 10:37:20 +00:00
|
|
|
} else {
|
|
|
|
console.error(
|
2023-07-17 14:42:35 +00:00
|
|
|
"kernelFrame.contentWindow was null, cannot send message!",
|
2022-07-29 10:37:20 +00:00
|
|
|
);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
2023-04-03 17:29:20 +00:00
|
|
|
|
2022-07-29 10:37:20 +00:00
|
|
|
function handleKernelMessage(event: MessageEvent) {
|
|
|
|
let data = event.data.data;
|
|
|
|
|
2022-07-29 23:42:49 +00:00
|
|
|
if (event.data.method === "kernelBridgeVersion") {
|
2022-08-22 05:49:58 +00:00
|
|
|
getBlockForBridge().then(() => {
|
2022-08-14 18:36:26 +00:00
|
|
|
for (let [, port] of Object.entries(getOpenPorts())) {
|
2022-07-31 04:51:02 +00:00
|
|
|
try {
|
|
|
|
(port as any).postMessage(event.data);
|
|
|
|
} catch {}
|
|
|
|
}
|
|
|
|
});
|
2022-07-29 23:42:49 +00:00
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2023-01-14 08:01:41 +00:00
|
|
|
if (event.origin !== "http://kernel.lume") {
|
2022-07-29 23:42:49 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2022-07-29 10:37:20 +00:00
|
|
|
if (event.data.method === "log") {
|
2023-07-17 19:28:58 +00:00
|
|
|
if (data.isErr !== null && !data.isErr) {
|
2022-07-29 10:37:20 +00:00
|
|
|
console.log(data.message);
|
|
|
|
} else {
|
|
|
|
console.error(data.message);
|
|
|
|
}
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2022-07-29 12:06:11 +00:00
|
|
|
if (event.data.method === "kernelAuthStatus") {
|
2022-08-14 18:36:26 +00:00
|
|
|
setAuthStatus(data);
|
2023-07-17 19:28:58 +00:00
|
|
|
if (!getAuthStatusKnown()) {
|
2022-08-22 05:49:58 +00:00
|
|
|
getAuthStatusResolve()();
|
2022-08-14 18:36:26 +00:00
|
|
|
setAuthStatusKnown(true);
|
2022-07-29 10:37:20 +00:00
|
|
|
console.log("bootloader is now initialized");
|
2023-07-17 19:28:58 +00:00
|
|
|
if (!getAuthStatus().loginComplete) {
|
2022-07-29 10:37:20 +00:00
|
|
|
console.log("user is not logged in: waiting until login is confirmed");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-08-14 18:36:26 +00:00
|
|
|
for (let [, port] of Object.entries(getOpenPorts())) {
|
2022-07-29 10:37:20 +00:00
|
|
|
try {
|
|
|
|
(port as any).postMessage(event.data);
|
|
|
|
} catch {}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (data.logoutComplete === true) {
|
|
|
|
console.log("received logout signal, clearing all ports");
|
|
|
|
|
2022-08-14 18:36:26 +00:00
|
|
|
for (let [, port] of Object.entries(getOpenPorts())) {
|
2022-07-29 10:37:20 +00:00
|
|
|
try {
|
|
|
|
(port as any).disconnect();
|
|
|
|
} catch {}
|
|
|
|
}
|
2022-08-14 18:36:26 +00:00
|
|
|
clearOpenPorts();
|
2022-07-29 10:37:20 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2022-08-14 18:36:26 +00:00
|
|
|
if (!(event.data.nonce in getQueries())) {
|
2022-07-29 10:37:20 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2022-08-14 18:36:26 +00:00
|
|
|
let receiveResult = getQuery(event.data.nonce);
|
2022-07-29 10:37:20 +00:00
|
|
|
if (event.data.method === "response") {
|
2022-08-14 18:36:26 +00:00
|
|
|
deleteQuery(event.data.nonce);
|
2022-07-29 10:37:20 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
receiveResult(event.data);
|
|
|
|
}
|
|
|
|
|
|
|
|
function handleBridgeMessage(
|
|
|
|
port: any,
|
|
|
|
portNonce: number,
|
|
|
|
data: any,
|
2023-07-17 14:42:35 +00:00
|
|
|
domain: string,
|
2022-07-29 10:37:20 +00:00
|
|
|
) {
|
2022-07-31 04:51:02 +00:00
|
|
|
if (data.method === "bridgeLoaded") {
|
2022-08-22 05:49:58 +00:00
|
|
|
getBridgeLoadedResolve()();
|
2022-07-31 04:51:02 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2022-07-29 10:37:20 +00:00
|
|
|
if (!("nonce" in data)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2022-07-29 23:42:49 +00:00
|
|
|
if (data.method === "response") {
|
|
|
|
window.postMessage(data);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2022-07-29 10:37:20 +00:00
|
|
|
if (data.method !== "queryUpdate") {
|
2022-08-14 18:36:26 +00:00
|
|
|
addQuery(data.nonce, (response: any) => {
|
|
|
|
if (portNonce in getOpenPorts()) {
|
2022-07-29 10:37:20 +00:00
|
|
|
port.postMessage(response);
|
|
|
|
}
|
2022-08-14 18:36:26 +00:00
|
|
|
});
|
2022-07-29 10:37:20 +00:00
|
|
|
data["domain"] = domain;
|
|
|
|
}
|
2023-04-03 17:29:20 +00:00
|
|
|
|
2023-01-14 08:01:41 +00:00
|
|
|
getKernelIframe().contentWindow!.postMessage(data, "http://kernel.lume");
|
2022-07-29 10:37:20 +00:00
|
|
|
}
|
2023-04-03 17:29:20 +00:00
|
|
|
|
2022-07-29 10:37:20 +00:00
|
|
|
function bridgeListener(port: any) {
|
2022-08-14 18:36:26 +00:00
|
|
|
let portNonce = getPortsNonce();
|
|
|
|
increasePortsNonce();
|
|
|
|
setOpenPort(portNonce, port);
|
2022-07-29 10:37:20 +00:00
|
|
|
|
|
|
|
port.onDisconnect.addListener(() => {
|
2022-08-14 18:36:26 +00:00
|
|
|
deleteOpenPort(portNonce);
|
2022-07-29 10:37:20 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
let domain = new URL(port.sender.url).hostname;
|
|
|
|
|
|
|
|
port.onMessage.addListener(function (data: any) {
|
|
|
|
handleBridgeMessage(port, portNonce, data, domain);
|
|
|
|
});
|
|
|
|
|
2022-08-22 05:49:58 +00:00
|
|
|
getBlockForBootloader().then(() => {
|
2022-07-29 10:37:20 +00:00
|
|
|
port.postMessage({
|
2022-07-29 23:41:58 +00:00
|
|
|
method: "kernelAuthStatus",
|
2022-08-14 18:36:26 +00:00
|
|
|
data: getAuthStatus(),
|
2022-07-29 10:37:20 +00:00
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
2022-08-14 12:21:09 +00:00
|
|
|
|
|
|
|
async function boot() {
|
|
|
|
tldEnum.list.push("localhost");
|
|
|
|
window.addEventListener("message", handleKernelMessage);
|
|
|
|
browser.runtime.onConnect.addListener(bridgeListener);
|
|
|
|
|
|
|
|
const engine = new WebEngine();
|
|
|
|
engine.registerContentProvider(new InternalProvider(engine));
|
2023-04-03 17:29:20 +00:00
|
|
|
|
2022-08-14 12:21:09 +00:00
|
|
|
engine.registerContentProvider(new IpfsProvider(engine));
|
2022-08-23 19:28:05 +00:00
|
|
|
engine.registerContentProvider(new ServerProvider(engine));
|
2022-08-14 12:21:09 +00:00
|
|
|
|
2022-08-14 18:36:26 +00:00
|
|
|
setKernelIframe(document.createElement("iframe"));
|
2023-01-14 08:01:41 +00:00
|
|
|
getKernelIframe().src = "http://kernel.lume";
|
2023-04-03 17:29:20 +00:00
|
|
|
|
|
|
|
await new Promise((resolve) => {
|
|
|
|
getKernelIframe().onload = () => {
|
|
|
|
init().then(resolve);
|
|
|
|
};
|
|
|
|
document.body.appendChild(getKernelIframe());
|
|
|
|
});
|
|
|
|
|
2023-07-17 14:44:21 +00:00
|
|
|
weAreBooted();
|
2022-08-22 01:48:46 +00:00
|
|
|
}
|
2023-07-17 19:28:58 +00:00
|
|
|
|
|
|
|
browser.runtime.onInstalled.addListener(() => {
|
|
|
|
browser.tabs.create({
|
|
|
|
url: browser.runtime.getURL("onboarding.html"),
|
|
|
|
active: true,
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
boot();
|