import { EventEmitter } from "events"; import { Socket } from "./socket"; import type { IncomingMessage, Server as HttpServer, ServerResponse } from "http"; import type { CookieSerializeOptions } from "cookie"; import type { CorsOptions, CorsOptionsDelegate } from "cors"; import type { Duplex } from "stream"; import type { EngineRequest } from "./transport"; type Transport = "polling" | "websocket" | "webtransport"; export interface AttachOptions { /** * name of the path to capture * @default "/engine.io" */ path?: string; /** * destroy unhandled upgrade requests * @default true */ destroyUpgrade?: boolean; /** * milliseconds after which unhandled requests are ended * @default 1000 */ destroyUpgradeTimeout?: number; /** * Whether we should add a trailing slash to the request path. * @default true */ addTrailingSlash?: boolean; } export interface ServerOptions { /** * how many ms without a pong packet to consider the connection closed * @default 20000 */ pingTimeout?: number; /** * how many ms before sending a new ping packet * @default 25000 */ pingInterval?: number; /** * how many ms before an uncompleted transport upgrade is cancelled * @default 10000 */ upgradeTimeout?: number; /** * how many bytes or characters a message can be, before closing the session (to avoid DoS). * @default 1e5 (100 KB) */ maxHttpBufferSize?: number; /** * A function that receives a given handshake or upgrade request as its first parameter, * and can decide whether to continue or not. The second argument is a function that needs * to be called with the decided information: fn(err, success), where success is a boolean * value where false means that the request is rejected, and err is an error code. */ allowRequest?: (req: IncomingMessage, fn: (err: string | null | undefined, success: boolean) => void) => void; /** * The low-level transports that are enabled. WebTransport is disabled by default and must be manually enabled: * * @example * new Server({ * transports: ["polling", "websocket", "webtransport"] * }); * * @default ["polling", "websocket"] */ transports?: Transport[]; /** * whether to allow transport upgrades * @default true */ allowUpgrades?: boolean; /** * parameters of the WebSocket permessage-deflate extension (see ws module api docs). Set to false to disable. * @default false */ perMessageDeflate?: boolean | object; /** * parameters of the http compression for the polling transports (see zlib api docs). Set to false to disable. * @default true */ httpCompression?: boolean | object; /** * what WebSocket server implementation to use. Specified module must * conform to the ws interface (see ws module api docs). * An alternative c++ addon is also available by installing eiows module. * * @default `require("ws").Server` */ wsEngine?: any; /** * an optional packet which will be concatenated to the handshake packet emitted by Engine.IO. */ initialPacket?: any; /** * configuration of the cookie that contains the client sid to send as part of handshake response headers. This cookie * might be used for sticky-session. Defaults to not sending any cookie. * @default false */ cookie?: (CookieSerializeOptions & { name: string; }) | boolean; /** * the options that will be forwarded to the cors module */ cors?: CorsOptions | CorsOptionsDelegate; /** * whether to enable compatibility with Socket.IO v2 clients * @default false */ allowEIO3?: boolean; } /** * An Express-compatible middleware. * * Middleware functions are functions that have access to the request object (req), the response object (res), and the * next middleware function in the application’s request-response cycle. * * @see https://expressjs.com/en/guide/using-middleware.html */ type Middleware = (req: IncomingMessage, res: ServerResponse, next: (err?: any) => void) => void; export declare abstract class BaseServer extends EventEmitter { opts: ServerOptions; protected clients: Record; clientsCount: number; protected middlewares: Middleware[]; /** * Server constructor. * * @param {Object} opts - options */ constructor(opts?: ServerOptions); protected abstract init(): any; /** * Compute the pathname of the requests that are handled by the server * @param options * @protected */ protected _computePath(options: AttachOptions): string; /** * Returns a list of available transports for upgrade given a certain transport. * * @return {Array} */ upgrades(transport: string): any; /** * Verifies a request. * * @param {EngineRequest} req * @param upgrade - whether it's an upgrade request * @param fn * @protected */ protected verify(req: any, upgrade: boolean, fn: (errorCode?: number, errorContext?: any) => void): void; /** * Adds a new middleware. * * @example * import helmet from "helmet"; * * engine.use(helmet()); * * @param fn */ use(fn: any): void; /** * Apply the middlewares to the request. * * @param req * @param res * @param callback * @protected */ protected _applyMiddlewares(req: IncomingMessage, res: ServerResponse, callback: (err?: any) => void): void; /** * Closes all clients. */ close(): this; protected abstract cleanup(): any; /** * generate a socket id. * Overwrite this method to generate your custom socket id * * @param {IncomingMessage} req - the request object */ generateId(req: IncomingMessage): any; /** * Handshakes a new client. * * @param {String} transportName * @param {Object} req - the request object * @param {Function} closeConnection * * @protected */ protected handshake(transportName: string, req: any, closeConnection: (errorCode?: number, errorContext?: any) => void): Promise; onWebTransportSession(session: any): Promise; protected abstract createTransport(transportName: any, req: any): any; /** * Protocol errors mappings. */ static errors: { UNKNOWN_TRANSPORT: number; UNKNOWN_SID: number; BAD_HANDSHAKE_METHOD: number; BAD_REQUEST: number; FORBIDDEN: number; UNSUPPORTED_PROTOCOL_VERSION: number; }; static errorMessages: { 0: string; 1: string; 2: string; 3: string; 4: string; 5: string; }; } /** * An Engine.IO server based on Node.js built-in HTTP server and the `ws` package for WebSocket connections. */ export declare class Server extends BaseServer { httpServer?: HttpServer; private ws; /** * Initialize websocket server * * @protected */ protected init(): void; protected cleanup(): void; /** * Prepares a request by processing the query string. * * @private */ private prepare; protected createTransport(transportName: string, req: IncomingMessage): any; /** * Handles an Engine.IO HTTP request. * * @param {EngineRequest} req * @param {ServerResponse} res */ handleRequest(req: EngineRequest, res: ServerResponse): void; /** * Handles an Engine.IO HTTP Upgrade. */ handleUpgrade(req: EngineRequest, socket: Duplex, upgradeHead: Buffer): void; /** * Called upon a ws.io connection. * * @param {ws.Socket} websocket * @private */ private onWebSocket; /** * Captures upgrade requests for a http.Server. * * @param {http.Server} server * @param {Object} options */ attach(server: HttpServer, options?: AttachOptions): void; } export {};