UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

146 lines (145 loc) 5.39 kB
import { n as isVitestRuntimeEnv } from "./env-Di49gJwo.js"; import { t as isGatewayModelPricingEnabled } from "./model-pricing-config-pKJPI_G6.js"; import { r as startHeartbeatRunner } from "./heartbeat-runner-7zBJym-X.js"; import { r as createNoopHeartbeatRunner } from "./server-runtime-startup-services-B_m8NSaC.js"; //#region src/gateway/server-runtime-services.ts /** Starts cron without making gateway startup wait for cron initialization. */ function startGatewayCronWithLogging(params) { params.cron.start().catch((err) => params.logCron.error(`failed to start: ${String(err)}`)); } function clearGatewayMaintenanceHandles(maintenance) { if (!maintenance) return; clearInterval(maintenance.tickInterval); clearInterval(maintenance.healthInterval); clearInterval(maintenance.dedupeCleanup); if (maintenance.mediaCleanup) clearInterval(maintenance.mediaCleanup); } /** Runs maintenance that is intentionally delayed until after the gateway is ready. */ async function runGatewayPostReadyMaintenance(params) { try { const maintenance = await params.startMaintenance(); if (maintenance) params.applyMaintenance(maintenance); } catch (err) { params.log.warn(`gateway post-ready maintenance startup failed: ${String(err)}`); } if (params.shouldStartCron()) { params.markCronStartHandled(); startGatewayCronWithLogging({ cron: params.cron, logCron: params.logCron }); } params.recordPostReadyMemory(); } /** Schedules post-ready maintenance and cancels/cleans handles if shutdown wins the race. */ function scheduleGatewayPostReadyMaintenance(params) { const timer = setTimeout(() => { params.onStarted?.(); if (params.isClosing()) return; runGatewayPostReadyMaintenance({ startMaintenance: async () => { if (params.isClosing()) return null; const maintenance = await params.startMaintenance(); if (params.isClosing()) { clearGatewayMaintenanceHandles(maintenance); return null; } return maintenance; }, applyMaintenance: (maintenance) => { if (params.isClosing()) { clearGatewayMaintenanceHandles(maintenance); return; } params.applyMaintenance(maintenance); }, shouldStartCron: () => !params.isClosing() && params.shouldStartCron(), markCronStartHandled: params.markCronStartHandled, cron: params.cron, logCron: params.logCron, log: params.log, recordPostReadyMemory: () => { if (!params.isClosing()) params.recordPostReadyMemory(); } }); }, params.delayMs); timer.unref?.(); return timer; } function recoverPendingOutboundDeliveries(params) { (async () => { const { recoverPendingDeliveries } = await import("./delivery-queue-BoyNluFA.js"); const { deliverOutboundPayloadsInternal } = await import("./deliver-DD0U1vwf.js"); await recoverPendingDeliveries({ deliver: deliverOutboundPayloadsInternal, log: params.log.child("delivery-recovery"), cfg: params.cfg }); })().catch((err) => params.log.error(`Delivery recovery failed: ${String(err)}`)); } function recoverPendingSessionDeliveries(params) { setTimeout(() => { (async () => { const { recoverPendingRestartContinuationDeliveries } = await import("./server-restart-sentinel-vz7ikyhF.js"); const logRecovery = params.log.child("session-delivery-recovery"); await recoverPendingRestartContinuationDeliveries({ deps: params.deps, log: logRecovery, maxEnqueuedAt: params.maxEnqueuedAt }); })().catch((err) => params.log.error(`Session delivery recovery failed: ${String(err)}`)); }, 1250).unref?.(); } function startGatewayModelPricingRefreshOnDemand(params) { if (!isGatewayModelPricingEnabled(params.config)) return () => {}; let stopped = false; let stopRefresh; (async () => { const { startGatewayModelPricingRefresh } = await import("./model-pricing-cache-BvL6wIT1.js"); if (stopped) return; stopRefresh = startGatewayModelPricingRefresh({ config: params.config, ...params.pluginLookUpTable ? { pluginLookUpTable: params.pluginLookUpTable } : {} }); if (stopped) { stopRefresh(); stopRefresh = void 0; } })().catch((err) => params.log.error(`Model pricing refresh failed to start: ${String(err)}`)); return () => { stopped = true; stopRefresh?.(); stopRefresh = void 0; }; } /** Activates background gateway services after core runtime startup is ready. */ function activateGatewayScheduledServices(params) { if (params.minimalTestGateway) return { heartbeatRunner: createNoopHeartbeatRunner(), stopModelPricingRefresh: () => {} }; const heartbeatRunner = startHeartbeatRunner({ cfg: params.cfgAtStart }); if (params.startCron !== false) startGatewayCronWithLogging({ cron: params.cron, logCron: params.logCron }); recoverPendingOutboundDeliveries({ cfg: params.cfgAtStart, log: params.log }); recoverPendingSessionDeliveries({ deps: params.deps, log: params.log, maxEnqueuedAt: params.sessionDeliveryRecoveryMaxEnqueuedAt }); return { heartbeatRunner, stopModelPricingRefresh: !isVitestRuntimeEnv() ? startGatewayModelPricingRefreshOnDemand({ config: params.cfgAtStart, ...params.pluginLookUpTable ? { pluginLookUpTable: params.pluginLookUpTable } : {}, log: params.log }) : () => {} }; } //#endregion export { startGatewayCronWithLogging as i, runGatewayPostReadyMaintenance as n, scheduleGatewayPostReadyMaintenance as r, activateGatewayScheduledServices as t };