export type RuntimeTransport = 'socket' | 'port'; export type RuntimeTransportPreference = 'auto' | RuntimeTransport; export interface RuntimePortListenEndpoint { type: 'port'; host: string; port: number; } export interface RuntimeSocketListenEndpoint { type: 'socket'; socketPath: string; } export type RuntimeListenEndpoint = RuntimePortListenEndpoint | RuntimeSocketListenEndpoint; export interface RuntimeConnectionTarget { url?: string; socketPath?: string; } export interface RuntimeListenableServer { once(event: 'error', listener: (error: Error) => void): unknown; listen(socketPath: string, listeningListener?: () => void): unknown; listen(port: number, host: string, listeningListener?: () => void): unknown; close(callback: (error?: Error | null) => void): unknown; } export interface RuntimePortAllocationOptions { gatewayPort?: number; cssPort?: number; apiPort?: number; ingressPort?: number; basePort?: number; } export interface RuntimePorts { gateway: number; css: number; api: number; /** * Loopback-only listener that remote forwarding paths (managed tunnels, P2P * data plane) use as their origin, so their requests never count as local. */ ingress: number; } export interface RuntimeHost { readonly name: string; resolveTransport(preference?: RuntimeTransportPreference): RuntimeTransport; allocatePorts(options?: RuntimePortAllocationOptions): Promise; createListenEndpoint(options: { port?: number; host?: string; socketPath?: string; }): RuntimeListenEndpoint; formatListenEndpoint(endpoint: RuntimeListenEndpoint): string; listen(server: RuntimeListenableServer, endpoint: RuntimeListenEndpoint): Promise; close(server: RuntimeListenableServer, endpoint?: RuntimeListenEndpoint): Promise; waitForPortReady(port: number, host?: string, timeoutMs?: number): Promise; isConnectionTargetReady(target: RuntimeConnectionTarget, timeoutMs?: number): Promise; registerSocketOrigins(origin: string, socketPath: string): () => Promise; cleanupSocketPath(socketPath: string): void; }