UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

68 lines (67 loc) 2.54 kB
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 };