UNPKG

16.8 kBTypeScriptView Raw
1/// <reference types="node" />
2
3import { EventEmitter } from "events";
4import {
5 Agent,
6 ClientRequest,
7 ClientRequestArgs,
8 IncomingMessage,
9 OutgoingHttpHeaders,
10 Server as HTTPServer,
11} from "http";
12import { Server as HTTPSServer } from "https";
13import { Duplex, DuplexOptions } from "stream";
14import { SecureContextOptions } from "tls";
15import { URL } from "url";
16import { ZlibOptions } from "zlib";
17
18// can not get all overload of BufferConstructor['from'], need to copy all it's first arguments here
19// https://github.com/microsoft/TypeScript/issues/32164
20type BufferLike =
21 | string
22 | Buffer
23 | DataView
24 | number
25 | ArrayBufferView
26 | Uint8Array
27 | ArrayBuffer
28 | SharedArrayBuffer
29 | readonly any[]
30 | readonly number[]
31 | { valueOf(): ArrayBuffer }
32 | { valueOf(): SharedArrayBuffer }
33 | { valueOf(): Uint8Array }
34 | { valueOf(): readonly number[] }
35 | { valueOf(): string }
36 | { [Symbol.toPrimitive](hint: string): string };
37
38// WebSocket socket.
39declare class WebSocket extends EventEmitter {
40 /** The connection is not yet open. */
41 static readonly CONNECTING: 0;
42 /** The connection is open and ready to communicate. */
43 static readonly OPEN: 1;
44 /** The connection is in the process of closing. */
45 static readonly CLOSING: 2;
46 /** The connection is closed. */
47 static readonly CLOSED: 3;
48
49 binaryType: "nodebuffer" | "arraybuffer" | "fragments";
50 readonly bufferedAmount: number;
51 readonly extensions: string;
52 /** Indicates whether the websocket is paused */
53 readonly isPaused: boolean;
54 readonly protocol: string;
55 /** The current state of the connection */
56 readonly readyState:
57 | typeof WebSocket.CONNECTING
58 | typeof WebSocket.OPEN
59 | typeof WebSocket.CLOSING
60 | typeof WebSocket.CLOSED;
61 readonly url: string;
62
63 /** The connection is not yet open. */
64 readonly CONNECTING: 0;
65 /** The connection is open and ready to communicate. */
66 readonly OPEN: 1;
67 /** The connection is in the process of closing. */
68 readonly CLOSING: 2;
69 /** The connection is closed. */
70 readonly CLOSED: 3;
71
72 onopen: ((event: WebSocket.Event) => void) | null;
73 onerror: ((event: WebSocket.ErrorEvent) => void) | null;
74 onclose: ((event: WebSocket.CloseEvent) => void) | null;
75 onmessage: ((event: WebSocket.MessageEvent) => void) | null;
76
77 constructor(address: null);
78 constructor(address: string | URL, options?: WebSocket.ClientOptions | ClientRequestArgs);
79 constructor(
80 address: string | URL,
81 protocols?: string | string[],
82 options?: WebSocket.ClientOptions | ClientRequestArgs,
83 );
84
85 close(code?: number, data?: string | Buffer): void;
86 ping(data?: any, mask?: boolean, cb?: (err: Error) => void): void;
87 pong(data?: any, mask?: boolean, cb?: (err: Error) => void): void;
88 // https://github.com/websockets/ws/issues/2076#issuecomment-1250354722
89 send(data: BufferLike, cb?: (err?: Error) => void): void;
90 send(
91 data: BufferLike,
92 options: {
93 mask?: boolean | undefined;
94 binary?: boolean | undefined;
95 compress?: boolean | undefined;
96 fin?: boolean | undefined;
97 },
98 cb?: (err?: Error) => void,
99 ): void;
100 terminate(): void;
101
102 /**
103 * Pause the websocket causing it to stop emitting events. Some events can still be
104 * emitted after this is called, until all buffered data is consumed. This method
105 * is a noop if the ready state is `CONNECTING` or `CLOSED`.
106 */
107 pause(): void;
108 /**
109 * Make a paused socket resume emitting events. This method is a noop if the ready
110 * state is `CONNECTING` or `CLOSED`.
111 */
112 resume(): void;
113
114 // HTML5 WebSocket events
115 addEventListener<K extends keyof WebSocket.WebSocketEventMap>(
116 type: K,
117 listener: (event: WebSocket.WebSocketEventMap[K]) => void,
118 options?: WebSocket.EventListenerOptions,
119 ): void;
120 removeEventListener<K extends keyof WebSocket.WebSocketEventMap>(
121 type: K,
122 listener: (event: WebSocket.WebSocketEventMap[K]) => void,
123 ): void;
124
125 // Events
126 on(event: "close", listener: (this: WebSocket, code: number, reason: Buffer) => void): this;
127 on(event: "error", listener: (this: WebSocket, err: Error) => void): this;
128 on(event: "upgrade", listener: (this: WebSocket, request: IncomingMessage) => void): this;
129 on(event: "message", listener: (this: WebSocket, data: WebSocket.RawData, isBinary: boolean) => void): this;
130 on(event: "open", listener: (this: WebSocket) => void): this;
131 on(event: "ping" | "pong", listener: (this: WebSocket, data: Buffer) => void): this;
132 on(
133 event: "unexpected-response",
134 listener: (this: WebSocket, request: ClientRequest, response: IncomingMessage) => void,
135 ): this;
136 on(event: string | symbol, listener: (this: WebSocket, ...args: any[]) => void): this;
137
138 once(event: "close", listener: (this: WebSocket, code: number, reason: Buffer) => void): this;
139 once(event: "error", listener: (this: WebSocket, err: Error) => void): this;
140 once(event: "upgrade", listener: (this: WebSocket, request: IncomingMessage) => void): this;
141 once(event: "message", listener: (this: WebSocket, data: WebSocket.RawData, isBinary: boolean) => void): this;
142 once(event: "open", listener: (this: WebSocket) => void): this;
143 once(event: "ping" | "pong", listener: (this: WebSocket, data: Buffer) => void): this;
144 once(
145 event: "unexpected-response",
146 listener: (this: WebSocket, request: ClientRequest, response: IncomingMessage) => void,
147 ): this;
148 once(event: string | symbol, listener: (this: WebSocket, ...args: any[]) => void): this;
149
150 off(event: "close", listener: (this: WebSocket, code: number, reason: Buffer) => void): this;
151 off(event: "error", listener: (this: WebSocket, err: Error) => void): this;
152 off(event: "upgrade", listener: (this: WebSocket, request: IncomingMessage) => void): this;
153 off(event: "message", listener: (this: WebSocket, data: WebSocket.RawData, isBinary: boolean) => void): this;
154 off(event: "open", listener: (this: WebSocket) => void): this;
155 off(event: "ping" | "pong", listener: (this: WebSocket, data: Buffer) => void): this;
156 off(
157 event: "unexpected-response",
158 listener: (this: WebSocket, request: ClientRequest, response: IncomingMessage) => void,
159 ): this;
160 off(event: string | symbol, listener: (this: WebSocket, ...args: any[]) => void): this;
161
162 addListener(event: "close", listener: (code: number, reason: Buffer) => void): this;
163 addListener(event: "error", listener: (err: Error) => void): this;
164 addListener(event: "upgrade", listener: (request: IncomingMessage) => void): this;
165 addListener(event: "message", listener: (data: WebSocket.RawData, isBinary: boolean) => void): this;
166 addListener(event: "open", listener: () => void): this;
167 addListener(event: "ping" | "pong", listener: (data: Buffer) => void): this;
168 addListener(
169 event: "unexpected-response",
170 listener: (request: ClientRequest, response: IncomingMessage) => void,
171 ): this;
172 addListener(event: string | symbol, listener: (...args: any[]) => void): this;
173
174 removeListener(event: "close", listener: (code: number, reason: Buffer) => void): this;
175 removeListener(event: "error", listener: (err: Error) => void): this;
176 removeListener(event: "upgrade", listener: (request: IncomingMessage) => void): this;
177 removeListener(event: "message", listener: (data: WebSocket.RawData, isBinary: boolean) => void): this;
178 removeListener(event: "open", listener: () => void): this;
179 removeListener(event: "ping" | "pong", listener: (data: Buffer) => void): this;
180 removeListener(
181 event: "unexpected-response",
182 listener: (request: ClientRequest, response: IncomingMessage) => void,
183 ): this;
184 removeListener(event: string | symbol, listener: (...args: any[]) => void): this;
185}
186
187declare const WebSocketAlias: typeof WebSocket;
188interface WebSocketAlias extends WebSocket {} // eslint-disable-line @typescript-eslint/no-empty-interface
189
190declare namespace WebSocket {
191 /**
192 * Data represents the raw message payload received over the WebSocket.
193 */
194 type RawData = Buffer | ArrayBuffer | Buffer[];
195
196 /**
197 * Data represents the message payload received over the WebSocket.
198 */
199 type Data = string | Buffer | ArrayBuffer | Buffer[];
200
201 /**
202 * CertMeta represents the accepted types for certificate & key data.
203 */
204 type CertMeta = string | string[] | Buffer | Buffer[];
205
206 /**
207 * VerifyClientCallbackSync is a synchronous callback used to inspect the
208 * incoming message. The return value (boolean) of the function determines
209 * whether or not to accept the handshake.
210 */
211 type VerifyClientCallbackSync<Request extends IncomingMessage = IncomingMessage> = (info: {
212 origin: string;
213 secure: boolean;
214 req: Request;
215 }) => boolean;
216
217 /**
218 * VerifyClientCallbackAsync is an asynchronous callback used to inspect the
219 * incoming message. The return value (boolean) of the function determines
220 * whether or not to accept the handshake.
221 */
222 type VerifyClientCallbackAsync<Request extends IncomingMessage = IncomingMessage> = (
223 info: { origin: string; secure: boolean; req: Request },
224 callback: (res: boolean, code?: number, message?: string, headers?: OutgoingHttpHeaders) => void,
225 ) => void;
226
227 interface ClientOptions extends SecureContextOptions {
228 protocol?: string | undefined;
229 followRedirects?: boolean | undefined;
230 generateMask?(mask: Buffer): void;
231 handshakeTimeout?: number | undefined;
232 maxRedirects?: number | undefined;
233 perMessageDeflate?: boolean | PerMessageDeflateOptions | undefined;
234 localAddress?: string | undefined;
235 protocolVersion?: number | undefined;
236 headers?: { [key: string]: string } | undefined;
237 origin?: string | undefined;
238 agent?: Agent | undefined;
239 host?: string | undefined;
240 family?: number | undefined;
241 checkServerIdentity?(servername: string, cert: CertMeta): boolean;
242 rejectUnauthorized?: boolean | undefined;
243 maxPayload?: number | undefined;
244 skipUTF8Validation?: boolean | undefined;
245 }
246
247 interface PerMessageDeflateOptions {
248 serverNoContextTakeover?: boolean | undefined;
249 clientNoContextTakeover?: boolean | undefined;
250 serverMaxWindowBits?: number | undefined;
251 clientMaxWindowBits?: number | undefined;
252 zlibDeflateOptions?: {
253 flush?: number | undefined;
254 finishFlush?: number | undefined;
255 chunkSize?: number | undefined;
256 windowBits?: number | undefined;
257 level?: number | undefined;
258 memLevel?: number | undefined;
259 strategy?: number | undefined;
260 dictionary?: Buffer | Buffer[] | DataView | undefined;
261 info?: boolean | undefined;
262 } | undefined;
263 zlibInflateOptions?: ZlibOptions | undefined;
264 threshold?: number | undefined;
265 concurrencyLimit?: number | undefined;
266 }
267
268 interface Event {
269 type: string;
270 target: WebSocket;
271 }
272
273 interface ErrorEvent {
274 error: any;
275 message: string;
276 type: string;
277 target: WebSocket;
278 }
279
280 interface CloseEvent {
281 wasClean: boolean;
282 code: number;
283 reason: string;
284 type: string;
285 target: WebSocket;
286 }
287
288 interface MessageEvent {
289 data: Data;
290 type: string;
291 target: WebSocket;
292 }
293
294 interface WebSocketEventMap {
295 open: Event;
296 error: ErrorEvent;
297 close: CloseEvent;
298 message: MessageEvent;
299 }
300
301 interface EventListenerOptions {
302 once?: boolean | undefined;
303 }
304
305 interface ServerOptions<
306 U extends typeof WebSocket.WebSocket = typeof WebSocket.WebSocket,
307 V extends typeof IncomingMessage = typeof IncomingMessage,
308 > {
309 host?: string | undefined;
310 port?: number | undefined;
311 backlog?: number | undefined;
312 server?: HTTPServer<V> | HTTPSServer<V> | undefined;
313 verifyClient?:
314 | VerifyClientCallbackAsync<InstanceType<V>>
315 | VerifyClientCallbackSync<InstanceType<V>>
316 | undefined;
317 handleProtocols?: (protocols: Set<string>, request: InstanceType<V>) => string | false;
318 path?: string | undefined;
319 noServer?: boolean | undefined;
320 clientTracking?: boolean | undefined;
321 perMessageDeflate?: boolean | PerMessageDeflateOptions | undefined;
322 maxPayload?: number | undefined;
323 skipUTF8Validation?: boolean | undefined;
324 WebSocket?: U | undefined;
325 }
326
327 interface AddressInfo {
328 address: string;
329 family: string;
330 port: number;
331 }
332
333 // WebSocket Server
334 class Server<
335 T extends typeof WebSocket.WebSocket = typeof WebSocket.WebSocket,
336 U extends typeof IncomingMessage = typeof IncomingMessage,
337 > extends EventEmitter {
338 options: ServerOptions<T, U>;
339 path: string;
340 clients: Set<InstanceType<T>>;
341
342 constructor(options?: ServerOptions<T, U>, callback?: () => void);
343
344 address(): AddressInfo | string;
345 close(cb?: (err?: Error) => void): void;
346 handleUpgrade(
347 request: InstanceType<U>,
348 socket: Duplex,
349 upgradeHead: Buffer,
350 callback: (client: InstanceType<T>, request: InstanceType<U>) => void,
351 ): void;
352 shouldHandle(request: InstanceType<U>): boolean | Promise<boolean>;
353
354 // Events
355 on(event: "connection", cb: (this: Server<T>, socket: InstanceType<T>, request: InstanceType<U>) => void): this;
356 on(event: "error", cb: (this: Server<T>, error: Error) => void): this;
357 on(event: "headers", cb: (this: Server<T>, headers: string[], request: InstanceType<U>) => void): this;
358 on(event: "close" | "listening", cb: (this: Server<T>) => void): this;
359 on(event: string | symbol, listener: (this: Server<T>, ...args: any[]) => void): this;
360
361 once(
362 event: "connection",
363 cb: (this: Server<T>, socket: InstanceType<T>, request: InstanceType<U>) => void,
364 ): this;
365 once(event: "error", cb: (this: Server<T>, error: Error) => void): this;
366 once(event: "headers", cb: (this: Server<T>, headers: string[], request: InstanceType<U>) => void): this;
367 once(event: "close" | "listening", cb: (this: Server<T>) => void): this;
368 once(event: string | symbol, listener: (this: Server<T>, ...args: any[]) => void): this;
369
370 off(
371 event: "connection",
372 cb: (this: Server<T>, socket: InstanceType<T>, request: InstanceType<U>) => void,
373 ): this;
374 off(event: "error", cb: (this: Server<T>, error: Error) => void): this;
375 off(event: "headers", cb: (this: Server<T>, headers: string[], request: InstanceType<U>) => void): this;
376 off(event: "close" | "listening", cb: (this: Server<T>) => void): this;
377 off(event: string | symbol, listener: (this: Server<T>, ...args: any[]) => void): this;
378
379 addListener(event: "connection", cb: (client: InstanceType<T>, request: InstanceType<U>) => void): this;
380 addListener(event: "error", cb: (err: Error) => void): this;
381 addListener(event: "headers", cb: (headers: string[], request: InstanceType<U>) => void): this;
382 addListener(event: "close" | "listening", cb: () => void): this;
383 addListener(event: string | symbol, listener: (...args: any[]) => void): this;
384
385 removeListener(event: "connection", cb: (client: InstanceType<T>, request: InstanceType<U>) => void): this;
386 removeListener(event: "error", cb: (err: Error) => void): this;
387 removeListener(event: "headers", cb: (headers: string[], request: InstanceType<U>) => void): this;
388 removeListener(event: "close" | "listening", cb: () => void): this;
389 removeListener(event: string | symbol, listener: (...args: any[]) => void): this;
390 }
391
392 const WebSocketServer: typeof Server;
393 interface WebSocketServer extends Server {} // eslint-disable-line @typescript-eslint/no-empty-interface
394 const WebSocket: typeof WebSocketAlias;
395 interface WebSocket extends WebSocketAlias {} // eslint-disable-line @typescript-eslint/no-empty-interface
396
397 // WebSocket stream
398 function createWebSocketStream(websocket: WebSocket, options?: DuplexOptions): Duplex;
399}
400
401export = WebSocket;