/** * WebSocket Streaming * * Transport-agnostic WebSocket handler for real-time AI chat. Zero-dependency * by design: instead of bundling a WebSocket implementation, it accepts any * socket satisfying the structural {@link WebSocketLike} interface — Node * `ws` sockets, `Deno.upgradeWebSocket` sockets, Bun sockets, or browser * WebSockets all qualify. * * Wire protocol (JSON text frames): * - client → server: `{ type: 'chat', id, request }`, `{ type: 'cancel', id }` * - server → client: `{ type: 'start' | 'chunk' | 'done' | 'error', id, ... }` * plus periodic `{ type: 'ping' }` heartbeats * * @module */ import type { Bridge } from '@johnhenry/aimatey-core'; /** * Structural WebSocket interface (satisfied by ws, Deno, Bun, browsers). */ export interface WebSocketLike { send(data: string): void; close(code?: number, reason?: string): void; /** DOM-style listener registration. */ addEventListener?(type: 'message' | 'close' | 'error', listener: (event: unknown) => void): void; /** Node ws-style listener registration. */ on?(type: 'message' | 'close' | 'error', listener: (...args: unknown[]) => void): void; } /** * Client → server messages. */ export type WebSocketClientMessage = { type: 'chat'; id: string; request: unknown; } | { type: 'cancel'; id: string; } | { type: 'pong'; }; /** * Server → client messages. */ export type WebSocketServerMessage = { type: 'start'; id: string; } | { type: 'chunk'; id: string; chunk: unknown; } | { type: 'done'; id: string; } | { type: 'error'; id: string | null; error: { message: string; code?: string; }; } | { type: 'ping'; }; /** * Options for the WebSocket handler. */ export interface WebSocketHandlerOptions { /** Maximum concurrent streams per connection. @default 5 */ maxConcurrentStreams?: number; /** Heartbeat interval in milliseconds (0 disables). @default 30000 */ heartbeatMs?: number; /** Error observability hook. */ onError?: (error: Error) => void; } /** * Create a per-connection handler streaming chat over a WebSocket. * * @example * ```typescript * import { WebSocketServer } from 'ws'; * import { createWebSocketHandler } from '@johnhenry/aimatey-http/websocket'; * * const handleSocket = createWebSocketHandler(bridge); * new WebSocketServer({ port: 8080 }).on('connection', handleSocket); * ``` */ export declare function createWebSocketHandler(bridge: Bridge, options?: WebSocketHandlerOptions): (socket: WebSocketLike) => void; /** * Attach the handler to a `ws`-style server's connection event. */ export declare function attachWebSocketServer(server: { on(event: 'connection', listener: (socket: WebSocketLike) => void): void; }, bridge: Bridge, options?: WebSocketHandlerOptions): void; //# sourceMappingURL=index.d.ts.map