UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

82 lines (81 loc) 2.99 kB
import { s as BrowserProfileUnavailableError } from "./errors-6hPg4OWh.js"; import { s as isBrowserRuntimeRunning } from "./server-context.lifecycle-Tmt_A8dN.js"; import { r as stopBrowserRuntime, t as createBrowserRuntimeState } from "./runtime-lifecycle-DhKurfgJ.js"; import { t as createBrowserRouteContext } from "./server-context-CSIC6Xps.js"; //#region extensions/browser/src/browser-control-state.ts let state = null; let owner = null; let lifecycleTail = Promise.resolve(); let completedEffectiveStops = 0; /** Serialize complete Browser runtime start/stop workflows. */ function enqueueBrowserControlLifecycle(run) { const result = lifecycleTail.then(run, run); lifecycleTail = result.then(() => {}, () => {}); return result; } /** Queue startup, but never turn a request made during shutdown into a post-stop restart. */ function withBrowserControlStart(run) { const effectiveStopsAtRequest = completedEffectiveStops; return enqueueBrowserControlLifecycle(() => { if (completedEffectiveStops !== effectiveStopsAtRequest || (state ? !isBrowserRuntimeRunning(state) : false)) throw new BrowserProfileUnavailableError("Browser runtime is stopping."); return run(); }); } function getBrowserControlState() { return state && isBrowserRuntimeRunning(state) ? state : null; } /** Create a route context bound to the current shared browser runtime. */ function createBrowserControlContext() { return createBrowserRouteContext({ getState: () => state, refreshConfigFromDisk: true }); } /** * Start or attach the shared runtime. Call only from a queued `withBrowserControlStart` entry. */ async function ensureBrowserControlRuntime(params) { if (state && isBrowserRuntimeRunning(state)) { if (params.server) { state.server = params.server; state.port = params.port; state.resolved = { ...params.resolved, controlPort: params.port }; owner = "server"; } return state; } if (state) throw new BrowserProfileUnavailableError("Browser runtime cleanup must finish before restart."); state = await createBrowserRuntimeState({ server: params.server ?? null, port: params.port, resolved: params.resolved, onWarn: params.onWarn }); owner = params.owner; return state; } /** Stop the shared browser runtime when the requesting owner is allowed to do so. */ function stopBrowserControlRuntime(params) { return enqueueBrowserControlLifecycle(async () => { const current = state; if (!current) return null; if (params.requestedBy === "service" && current.server && owner === "server") return null; await stopBrowserRuntime({ current, getState: () => state, clearState: () => { state = null; owner = null; }, closeServer: params.closeServer, onWarn: params.onWarn }); completedEffectiveStops += 1; return current; }); } //#endregion export { withBrowserControlStart as a, stopBrowserControlRuntime as i, ensureBrowserControlRuntime as n, getBrowserControlState as r, createBrowserControlContext as t };