Files
SenMeshNet/electron/plugins/runtime/browserRuntime.mjs
zhaolei 2f9f8da48e
Some checks failed
AI automation / Route event (push) Has been cancelled
AI automation / Hand reopened issue to maintainers (push) Has been cancelled
AI automation / Clean source issue state (push) Has been cancelled
AI automation / Reconcile handoffs (push) Has been cancelled
AI automation / Classify issue (push) Has been cancelled
AI automation / Claude Code smoke (push) Has been cancelled
AI automation / Review issue follow-up (push) Has been cancelled
AI automation / Publish issue follow-up (push) Has been cancelled
AI automation / Implement with Claude Code (push) Has been cancelled
AI automation / Publish implement PR (push) Has been cancelled
AI automation / Continue queued issue comments (push) Has been cancelled
AI automation / Codex review loop (push) Has been cancelled
AI automation / Publish Codex fix (push) Has been cancelled
AI automation / Clear Codex dispatch marker (push) Has been cancelled
AI automation / Own PR re-request Codex (push) Has been cancelled
AI automation / External PR re-request Codex (push) Has been cancelled
AI automation / Poll Codex reaction / retry (push) Has been cancelled
Initial commit: NetMesh smart ops platform with 3D topology, inspection reports, RCA and AI ops assistant
2026-10-15 13:53:04 +08:00

75 lines
1.9 KiB
JavaScript

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,
}, "*");