/** * @fileoverview WebSocket Handler - MessageRouter-based real-time communication * @module mobile/websocket-handler * @version 2.0.0 * * Handles WebSocket connections for mobile clients, using MessageRouter * for unified message processing (same as Discord/Slack gateways). * * @example * import { createWebSocketHandler } from './websocket-handler'; * const wsHandler = createWebSocketHandler({ * httpServer, * messageRouter, * sessionStore, * authToken: process.env.MAMA_AUTH_TOKEN * }); */ import { WebSocketServer, WebSocket } from 'ws'; import type { Server as HTTPServer } from 'http'; /** * Message router interface */ interface StreamCallbacks { onDelta?: (text: string) => void; onToolUse?: (toolName: string, input: Record) => void; onToolComplete?: (toolName: string, toolUseId: string, isError: boolean) => void; onFinal?: (response: unknown) => void; onError?: (error: Error) => void; } interface MessageRouter { process(message: NormalizedMessage, options?: { onQueued?: () => void; onStream?: StreamCallbacks; }): Promise; } /** * Session store interface */ interface SessionStore { getHistoryByChannel?(source: string, channelId: string): Array<{ user?: string; bot?: string; timestamp?: number; }>; getHistory?(sessionId: string): Array<{ user?: string; bot?: string; timestamp?: number; }>; } /** * Normalized message for router */ interface NormalizedMessage { source: string; channelId: string; channelName: string; userId: string; text: string; contentBlocks?: ContentBlock[]; metadata: { clientId: string; sessionId?: string; osAgentMode?: boolean; timestamp: number; }; } /** * Content block types */ interface ImageContentBlock { type: 'image'; source: { type: 'base64'; media_type: string; data: string; }; } interface TextContentBlock { type: 'text'; text: string; } type ContentBlock = ImageContentBlock | TextContentBlock; /** * Router result */ interface RouterResult { response: string; sessionId: string; duration: number; } /** * Client info stored in clients Map */ interface ClientInfo { clientId: string; userId: string; ws: WebSocket; isAlive: boolean; connectedAt: string; sessionId?: string; osAgentMode?: boolean; language?: string; } /** * WebSocket handler options */ export interface WebSocketHandlerOptions { httpServer: HTTPServer; messageRouter: MessageRouter; sessionStore: SessionStore; authToken?: string; } /** * Extended WebSocketServer with helper methods */ type ExtendedWebSocketServer = WebSocketServer & { getClients: () => Map; getClientCount: () => number; }; /** * Create WebSocket handler with MessageRouter integration */ export declare function createWebSocketHandler({ httpServer, messageRouter, sessionStore, authToken: _authToken, }: WebSocketHandlerOptions): ExtendedWebSocketServer; /** * WebSocketHandler class (backwards compatibility) * @deprecated Use createWebSocketHandler() instead */ export declare class WebSocketHandler { private wss; constructor(httpServer: HTTPServer, options: Partial); getClients(): Map; getClientCount(): number; close(): void; } export {}; //# sourceMappingURL=websocket-handler.d.ts.map