openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
68 lines (67 loc) • 2.54 kB
JavaScript
import { n as getRuntimeConfig } from "./io.runtime-B9iJRs3w.js";
import "./runtime-config-snapshot-u1Kj68kx.js";
import { a as resolveProfile, r as resolveBrowserConfig } from "./config-BosO4Zbt.js";
import { n as readExtensionRelayToken } from "./relay-auth-DPRfu8tu.js";
import { t as buildBrowserExtensionPairing } from "./extension-pairing-Cyhs6VwJ.js";
import { spawn } from "node:child_process";
import net from "node:net";
//#region extensions/browser/src/browser/extension-relay-daemon-spawn.ts
const PORT_PROBE_TIMEOUT_MS = 750;
/** True when something already accepts connections on the loopback port. */
async function isRelayPortServed(port) {
return await new Promise((resolve) => {
const socket = net.connect({
host: "127.0.0.1",
port
});
const finish = (served) => {
socket.destroy();
resolve(served);
};
socket.setTimeout(PORT_PROBE_TIMEOUT_MS, () => finish(false));
socket.once("connect", () => finish(true));
socket.once("error", () => finish(false));
});
}
/**
* Ensure the standalone relay daemon serves the extension relay port. The
* daemon is spawned detached so it outlives this one-shot native host; binding
* the port is the single-instance lock, so concurrent spawns are harmless.
*/
async function ensureExtensionRelayDaemonProcess(params) {
const resolved = resolveBrowserConfig(params.cfg.browser, params.cfg);
const configured = Object.keys(resolved.profiles).some((name) => {
return resolved.profiles[name]?.driver === "extension" && resolveProfile(resolved, name)?.cdpPort === params.port;
});
if (!resolved.enabled || !configured) throw new Error("Relay port is not configured for an extension profile");
if (!(params.readToken ?? readExtensionRelayToken)()) return "skipped";
if (await (params.probe ?? isRelayPortServed)(params.port)) return "running";
(params.spawnProcess ?? ((command, args) => {
spawn(command, args, {
detached: true,
stdio: "ignore"
}).unref();
}))(params.execPath ?? process.execPath, [
params.entryPath,
"--port",
String(params.port)
]);
return "spawned";
}
//#endregion
//#region extensions/browser/src/browser/extension-native-host.runtime.ts
function buildBrowserNativeHostPairing() {
return buildBrowserExtensionPairing({
cfg: getRuntimeConfig(),
localTransport: "gateway"
});
}
function ensureBrowserNativeRelay(port, entryPath) {
return ensureExtensionRelayDaemonProcess({
port,
cfg: getRuntimeConfig(),
entryPath
});
}
//#endregion
export { buildBrowserNativeHostPairing, ensureBrowserNativeRelay };