import { EventEmitter } from "node:events"; import type { Socket } from "node:net"; import type { RequestContext } from "./RequestContext.js"; export interface WsOptions { auth?: string; allowedOrigins?: string[]; pingInterval?: number; [key: string]: unknown; } /** * Minimal WebSocket implementation (RFC 6455 framing). * No external dependencies. Handles text frames, ping/pong, close. */ export declare class ForgeWebSocket extends EventEmitter { socket: Socket; ctx: RequestContext; _closed: boolean; _closeSent: boolean; _closeTimer: ReturnType | null; _bufferChunks: Buffer[]; _bufferTotalLen: number; _fragments: Buffer[]; _fragmentOpcode: number; _fragmentsTotalSize: number; _totalBuffered: number; _outboundBuffered: number; _pingTimer: ReturnType | null; _lastPong: number; constructor(socket: Socket, rctx: RequestContext, options?: WsOptions); send(data: string | Buffer): void; sendBinary(data: Buffer | Uint8Array): void; /** * Write a frame to the socket while tracking outbound backpressure. * Increments _outboundBuffered on write; decrements on drain/callback * so _totalBuffered reflects actual pending bytes, not lifetime total. */ _trackOutboundWrite(frame: Buffer): void; close(code?: number, reason?: string): void; /** * P7: Consolidate buffer chunks into a single Buffer only when needed. */ _consolidateBuffer(): void; /** * Get the current buffer as a single Buffer (consolidating if needed). */ get _buffer(): Buffer; /** * Set the buffer (replaces all chunks). */ set _buffer(buf: Buffer); _onData(buf: Buffer): void; _encodeFrame(payload: Buffer, opcode: number): Buffer; _onClose(): void; _startPingInterval(intervalMs: number): void; } //# sourceMappingURL=ForgeWebSocket.d.ts.map