271 lines
7.8 KiB
TypeScript
271 lines
7.8 KiB
TypeScript
/// <reference types="node" />
|
||
import { EventEmitter } from "events";
|
||
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";
|
||
declare type Transport = "polling" | "websocket";
|
||
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
|
||
*/
|
||
declare type Middleware = (req: IncomingMessage, res: ServerResponse, next: (err?: any) => void) => void;
|
||
export declare abstract class BaseServer extends EventEmitter {
|
||
opts: ServerOptions;
|
||
protected clients: any;
|
||
clientsCount: number;
|
||
protected middlewares: Middleware[];
|
||
/**
|
||
* Server constructor.
|
||
*
|
||
* @param {Object} opts - options
|
||
* @api public
|
||
*/
|
||
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}
|
||
* @api public
|
||
*/
|
||
upgrades(transport: any): any;
|
||
/**
|
||
* Verifies a request.
|
||
*
|
||
* @param {http.IncomingMessage}
|
||
* @return {Boolean} whether the request is valid
|
||
* @api private
|
||
*/
|
||
protected verify(req: any, upgrade: any, fn: any): any;
|
||
/**
|
||
* 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.
|
||
*
|
||
* @api public
|
||
*/
|
||
close(): this;
|
||
protected abstract cleanup(): any;
|
||
/**
|
||
* generate a socket id.
|
||
* Overwrite this method to generate your custom socket id
|
||
*
|
||
* @param {Object} request object
|
||
* @api public
|
||
*/
|
||
generateId(req: any): any;
|
||
/**
|
||
* Handshakes a new client.
|
||
*
|
||
* @param {String} transport name
|
||
* @param {Object} request object
|
||
* @param {Function} closeConnection
|
||
*
|
||
* @api protected
|
||
*/
|
||
protected handshake(transportName: any, req: any, closeConnection: any): Promise<any>;
|
||
onWebTransportSession(session: any): Promise<any>;
|
||
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;
|
||
};
|
||
}
|
||
export declare class Server extends BaseServer {
|
||
httpServer?: HttpServer;
|
||
private ws;
|
||
/**
|
||
* Initialize websocket server
|
||
*
|
||
* @api protected
|
||
*/
|
||
protected init(): void;
|
||
protected cleanup(): void;
|
||
/**
|
||
* Prepares a request by processing the query string.
|
||
*
|
||
* @api private
|
||
*/
|
||
private prepare;
|
||
protected createTransport(transportName: any, req: any): any;
|
||
/**
|
||
* Handles an Engine.IO HTTP request.
|
||
*
|
||
* @param {IncomingMessage} req
|
||
* @param {ServerResponse} res
|
||
* @api public
|
||
*/
|
||
handleRequest(req: IncomingMessage, res: ServerResponse): void;
|
||
/**
|
||
* Handles an Engine.IO HTTP Upgrade.
|
||
*
|
||
* @api public
|
||
*/
|
||
handleUpgrade(req: IncomingMessage, socket: Duplex, upgradeHead: Buffer): void;
|
||
/**
|
||
* Called upon a ws.io connection.
|
||
*
|
||
* @param {ws.Socket} websocket
|
||
* @api private
|
||
*/
|
||
private onWebSocket;
|
||
/**
|
||
* Captures upgrade requests for a http.Server.
|
||
*
|
||
* @param {http.Server} server
|
||
* @param {Object} options
|
||
* @api public
|
||
*/
|
||
attach(server: HttpServer, options?: AttachOptions): void;
|
||
}
|
||
export {};
|