import logManager from '@electron/service/logger'; import type { GatewayLifecycleState } from './process-policy'; export interface GatewayRuntimeStatus { state: GatewayLifecycleState; port: number | null; pid?: number; uptime?: number; error?: string; connectedAt?: number; reconnectAttempts?: number; gatewayReady?: boolean; } type GatewayStateHooks = { emitStatus: (status: GatewayRuntimeStatus) => void; onTransition?: ( previousState: GatewayRuntimeStatus['state'], nextState: GatewayRuntimeStatus['state'], ) => void; }; export class GatewayStateController { private status: GatewayRuntimeStatus = { state: 'stopped', port: null }; constructor(private readonly hooks: GatewayStateHooks) {} getStatus(): GatewayRuntimeStatus { const snapshot = { ...this.status }; if (snapshot.state === 'running' && snapshot.connectedAt) { snapshot.uptime = Date.now() - snapshot.connectedAt; } return snapshot; } isConnected(isSocketOpen: boolean): boolean { return this.status.state === 'running' && isSocketOpen; } setStatus(update: Partial): void { const previousState = this.status.state; this.status = { ...this.status, ...update }; if (this.status.state === 'running' && this.status.connectedAt) { this.status.uptime = Date.now() - this.status.connectedAt; } else if (this.status.state !== 'running') { this.status.uptime = undefined; } this.hooks.emitStatus(this.status); if (previousState !== this.status.state) { logManager.debug(`Gateway state changed: ${previousState} -> ${this.status.state}`); this.hooks.onTransition?.(previousState, this.status.state); } } }