Files

75 lines
1.9 KiB
JavaScript
Raw Permalink Normal View History

import { startPluginRuntime } from "./runtimePeer.mjs";
function disableDirectBrowserCapability(name) {
try {
Object.defineProperty(globalThis, name, {
configurable: false,
enumerable: false,
value: undefined,
writable: false,
});
} catch {
try { globalThis[name] = undefined; } catch {}
}
}
function lockDirectBrowserCapabilities() {
for (const name of [
"EventSource",
"RTCPeerConnection",
"SharedWorker",
"WebSocket",
"WebSocketStream",
"WebTransport",
"Worker",
"XMLHttpRequest",
"fetch",
"webkitRTCPeerConnection",
]) disableDirectBrowserCapability(name);
try {
Object.defineProperty(Navigator.prototype, "sendBeacon", {
configurable: false,
enumerable: false,
value: () => false,
writable: false,
});
} catch {}
}
function waitForPort() {
return new Promise((resolve) => {
const acceptPort = (event) => {
if (
event.data?.type !== "netcatty-plugin:connect"
|| event.data?.runtimeToken !== window.location.hostname
) return;
const port = event.ports?.[0];
if (!port) return;
window.removeEventListener("message", acceptPort);
resolve(port);
};
window.addEventListener("message", acceptPort);
window.postMessage({
type: "netcatty-plugin:runtime-ready",
runtimeToken: window.location.hostname,
}, "*");
});
}
const [configResponse, port] = await Promise.all([
fetch(new URL("./config.json", import.meta.url), { cache: "no-store", credentials: "omit" }),
waitForPort(),
]);
if (!configResponse.ok) throw new Error("Unable to load plugin runtime configuration");
const config = await configResponse.json();
lockDirectBrowserCapabilities();
await startPluginRuntime({
port,
config,
loadPlugin: (entryUrl) => import(entryUrl),
});
window.postMessage({
type: "netcatty-plugin:runtime-connected",
runtimeToken: window.location.hostname,
}, "*");