import type { GatewayBindMode } from '../../config/schema.js'; /** Phase-1 channel timings (init + optional defer plan + start + inline replay). Emitted as structured logs. */ export interface GatewayChannelStartupPhase1Metrics { deferChannelConnectUntilAfterHttp: boolean; /** From `gateway.channelConnectDeferMode` (default `auto`). */ channelConnectDeferMode: 'auto' | 'off' | 'explicit'; /** How `deferredChannelIds` were chosen: config off, explicit list, or plugin meta (+ skip). */ channelConnectDeferSource: 'off' | 'explicit' | 'meta'; deferredChannelIds: readonly string[]; deferredChannelCount: number; channelInitMs: number; deferPlanMs: number; channelPhase1StartMs: number; /** Only when replay ran inside `start()`; null when deferred to `onHttpListening`. */ replayOutboundMs: number | null; channelStartupPhase1TotalMs: number; } /** Phase-2 timings after HTTP listen (deferred `start()` + replay). */ export interface GatewayChannelStartupPhase2Metrics { channelConnectDeferMode: 'auto' | 'off' | 'explicit'; channelConnectDeferSource: 'off' | 'explicit' | 'meta'; deferredChannelIds: readonly string[]; channelPhase2DeferredMs: number; replayOutboundMs: number; onHttpListeningTotalMs: number; } export interface GatewayServiceConfig { configPath?: string; /** CLI `--bind` override for startup security guards. */ listenBind?: GatewayBindMode; listenCustomBindHost?: string; /** CLI `--port` override; used for CORS loopback defaults when it differs from config. */ listenPort?: number; enableHotReload?: boolean; /** * When true (GatewayServer), outbound channel connects that declare * `meta.deferConnectUntilAfterListen` run in `onHttpListening()` after bind. * When false, deferred channels start at the end of `start()` (tests / embedded use). */ deferChannelConnectUntilAfterHttp?: boolean; }