import { loadConfig } from "../config/config.js"; import { createSubsystemLogger } from "../logging/subsystem.js"; import { resolveBrowserConfig } from "./config.js"; import { ensureBrowserControlAuth } from "./control-auth.js"; import { createBrowserRuntimeState, stopBrowserRuntime } from "./runtime-lifecycle.js"; import { type BrowserServerState, createBrowserRouteContext } from "./server-context.js"; let state: BrowserServerState | null = null; const log = createSubsystemLogger("browser"); const logService = log.child("service"); export function getBrowserControlState(): BrowserServerState | null { return state; } export function createBrowserControlContext() { return createBrowserRouteContext({ getState: () => state, refreshConfigFromDisk: true, }); } export async function startBrowserControlServiceFromConfig(): Promise { if (state) { return state; } const cfg = loadConfig(); const resolved = resolveBrowserConfig(cfg.browser, cfg); if (!resolved.enabled) { return null; } try { const ensured = await ensureBrowserControlAuth({ cfg }); if (ensured.generatedToken) { logService.info("No browser auth configured; generated gateway.auth.token automatically."); } } catch (err) { logService.warn(`failed to auto-configure browser auth: ${String(err)}`); } state = await createBrowserRuntimeState({ server: null, port: resolved.controlPort, resolved, onWarn: (message) => logService.warn(message), }); logService.info( `Browser control service ready (profiles=${Object.keys(resolved.profiles).length})`, ); return state; } export async function stopBrowserControlService(): Promise { const current = state; await stopBrowserRuntime({ current, getState: () => state, clearState: () => { state = null; }, onWarn: (message) => logService.warn(message), }); }