| 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<BrowserServerState | null> { |
| 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<void> { |
| const current = state; |
| await stopBrowserRuntime({ |
| current, |
| getState: () => state, |
| clearState: () => { |
| state = null; |
| }, |
| onWarn: (message) => logService.warn(message), |
| }); |
| } |
|
|