UNPKG

17.2 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(
116 method: "message",
117 cb: (event: WebSocket.MessageEvent) => void,
118 options?: WebSocket.EventListenerOptions,
119 ): void;
120 addEventListener(
121 method: "close",
122 cb: (event: WebSocket.CloseEvent) => void,
123 options?: WebSocket.EventListenerOptions,
124 ): void;
125 addEventListener(
126 method: "error",
127 cb: (event: WebSocket.ErrorEvent) => void,
128 options?: WebSocket.EventListenerOptions,
129 ): void;
130 addEventListener(
131 method: "open",
132 cb: (event: WebSocket.Event) => void,
133 options?: WebSocket.EventListenerOptions,
134 ): void;
135
136 removeEventListener(method: "message", cb: (event: WebSocket.MessageEvent) => void): void;
137 removeEventListener(method: "close", cb: (event: WebSocket.CloseEvent) => void): void;
138 removeEventListener(method: "error", cb: (event: WebSocket.ErrorEvent) => void): void;
139 removeEventListener(method: "open", cb: (event: WebSocket.Event) => void): void;
140
141 // Events
142 on(event: "close", listener: (this: WebSocket, code: number, reason: Buffer) => void): this;
143 on(event: "error", listener: (this: WebSocket, err: Error) => void): this;
144 on(event: "upgrade", listener: (this: WebSocket, request: IncomingMessage) => void): this;
145 on(event: "message", listener: (this: WebSocket, data: WebSocket.RawData, isBinary: boolean) => void): this;
146 on(event: "open", listener: (this: WebSocket) => void): this;
147 on(event: "ping" | "pong", listener: (this: WebSocket, data: Buffer) => void): this;
148 on(
149 event: "unexpected-response",
150 listener: (this: WebSocket, request: ClientRequest, response: IncomingMessage) => void,
151 ): this;
152 on(event: string | symbol, listener: (this: WebSocket, ...args: any[]) => void): this;
153
154 once(event: "close", listener: (this: WebSocket, code: number, reason: Buffer) => void): this;
155 once(event: "error", listener: (this: WebSocket, err: Error) => void): this;
156 once(event: "upgrade", listener: (this: WebSocket, request: IncomingMessage) => void): this;
157 once(event: "message", listener: (this: WebSocket, data: WebSocket.RawData, isBinary: boolean) => void): this;
158 once(event: "open", listener: (this: WebSocket) => void): this;
159 once(event: "ping" | "pong", listener: (this: WebSocket, data: Buffer) => void): this;
160 once(
161 event: "unexpected-response",
162 listener: (this: WebSocket, request: ClientRequest, response: IncomingMessage) => void,
163 ): this;
164 once(event: string | symbol, listener: (this: WebSocket, ...args: any[]) => void): this;
165
166 off(event: "close", listener: (this: WebSocket, code: number, reason: Buffer) => void): this;
167 off(event: "error", listener: (this: WebSocket, err: Error) => void): this;
168 off(event: "upgrade", listener: (this: WebSocket, request: IncomingMessage) => void): this;
169 off(event: "message", listener: (this: WebSocket, data: WebSocket.RawData, isBinary: boolean) => void): this;
170 off(event: "open", listener: (this: WebSocket) => void): this;
171 off(event: "ping" | "pong", listener: (this: WebSocket, data: Buffer) => void): this;
172 off(
173 event: "unexpected-response",
174 listener: (this: WebSocket, request: ClientRequest, response: IncomingMessage) => void,
175 ): this;
176 off(event: string | symbol, listener: (this: WebSocket, ...args: any[]) => void): this;
177
178 addListener(event: "close", listener: (code: number, reason: Buffer) => void): this;
179 addListener(event: "error", listener: (err: Error) => void): this;
180 addListener(event: "upgrade", listener: (request: IncomingMessage) => void): this;
181 addListener(event: "message", listener: (data: WebSocket.RawData, isBinary: boolean) => void): this;
182 addListener(event: "open", listener: () => void): this;
183 addListener(event: "ping" | "pong", listener: (data: Buffer) => void): this;
184 addListener(
185 event: "unexpected-response",
186 listener: (request: ClientRequest, response: IncomingMessage) => void,
187 ): this;
188 addListener(event: string | symbol, listener: (...args: any[]) => void): this;
189
190 removeListener(event: "close", listener: (code: number, reason: Buffer) => void): this;
191 removeListener(event: "error", listener: (err: Error) => void): this;
192 removeListener(event: "upgrade", listener: (request: IncomingMessage) => void): this;
193 removeListener(event: "message", listener: (data: WebSocket.RawData, isBinary: boolean) => void): this;
194 removeListener(event: "open", listener: () => void): this;
195 removeListener(event: "ping" | "pong", listener: (data: Buffer) => void): this;
196 removeListener(
197 event: "unexpected-response",
198 listener: (request: ClientRequest, response: IncomingMessage) => void,
199 ): this;
200 removeListener(event: string | symbol, listener: (...args: any[]) => void): this;
201}
202
203declare const WebSocketAlias: typeof WebSocket;
204interface WebSocketAlias extends WebSocket {} // eslint-disable-line @typescript-eslint/no-empty-interface
205
206declare namespace WebSocket {
207 /**
208 * Data represents the raw message payload received over the WebSocket.
209 */
210 type RawData = Buffer | ArrayBuffer | Buffer[];
211
212 /**
213 * Data represents the message payload received over the WebSocket.
214 */
215 type Data = string | Buffer | ArrayBuffer | Buffer[];
216
217 /**
218 * CertMeta represents the accepted types for certificate & key data.
219 */
220 type CertMeta = string | string[] | Buffer | Buffer[];
221
222 /**
223 * VerifyClientCallbackSync is a synchronous callback used to inspect the
224 * incoming message. The return value (boolean) of the function determines
225 * whether or not to accept the handshake.
226 */
227 type VerifyClientCallbackSync<Request extends IncomingMessage = IncomingMessage> = (info: {
228 origin: string;
229 secure: boolean;
230 req: Request;
231 }) => boolean;
232
233 /**
234 * VerifyClientCallbackAsync is an asynchronous callback used to inspect the
235 * incoming message. The return value (boolean) of the function determines
236 * whether or not to accept the handshake.
237 */
238 type VerifyClientCallbackAsync<Request extends IncomingMessage = IncomingMessage> = (
239 info: { origin: string; secure: boolean; req: Request },
240 callback: (res: boolean, code?: number, message?: string, headers?: OutgoingHttpHeaders) => void,
241 ) => void;
242
243 interface ClientOptions extends SecureContextOptions {
244 protocol?: string | undefined;
245 followRedirects?: boolean | undefined;
246 generateMask?(mask: Buffer): void;
247 handshakeTimeout?: number | undefined;
248 maxRedirects?: number | undefined;
249 perMessageDeflate?: boolean | PerMessageDeflateOptions | undefined;
250 localAddress?: string | undefined;
251 protocolVersion?: number | undefined;
252 headers?: { [key: string]: string } | undefined;
253 origin?: string | undefined;
254 agent?: Agent | undefined;
255 host?: string | undefined;
256 family?: number | undefined;
257 checkServerIdentity?(servername: string, cert: CertMeta): boolean;
258 rejectUnauthorized?: boolean | undefined;
259 maxPayload?: number | undefined;
260 skipUTF8Validation?: boolean | undefined;
261 }
262
263 interface PerMessageDeflateOptions {
264 serverNoContextTakeover?: boolean | undefined;
265 clientNoContextTakeover?: boolean | undefined;
266 serverMaxWindowBits?: number | undefined;
267 clientMaxWindowBits?: number | undefined;
268 zlibDeflateOptions?: {
269 flush?: number | undefined;
270 finishFlush?: number | undefined;
271 chunkSize?: number | undefined;
272 windowBits?: number | undefined;
273 level?: number | undefined;
274 memLevel?: number | undefined;
275 strategy?: number | undefined;
276 dictionary?: Buffer | Buffer[] | DataView | undefined;
277 info?: boolean | undefined;
278 } | undefined;
279 zlibInflateOptions?: ZlibOptions | undefined;
280 threshold?: number | undefined;
281 concurrencyLimit?: number | undefined;
282 }
283
284 interface Event {
285 type: string;
286 target: WebSocket;
287 }
288
289 interface ErrorEvent {
290 error: any;
291 message: string;
292 type: string;
293 target: WebSocket;
294 }
295
296 interface CloseEvent {
297 wasClean: boolean;
298 code: number;
299 reason: string;
300 type: string;
301 target: WebSocket;
302 }
303
304 interface MessageEvent {
305 data: Data;
306 type: string;
307 target: WebSocket;
308 }
309
310 interface EventListenerOptions {
311 once?: boolean | undefined;
312 }
313
314 interface ServerOptions<
315 U extends typeof WebSocket.WebSocket = typeof WebSocket.WebSocket,
316 V extends typeof IncomingMessage = typeof IncomingMessage,
317 > {
318 host?: string | undefined;
319 port?: number | undefined;
320 backlog?: number | undefined;
321 server?: HTTPServer<V> | HTTPSServer<V> | undefined;
322 verifyClient?:
323 | VerifyClientCallbackAsync<InstanceType<V>>
324 | VerifyClientCallbackSync<InstanceType<V>>
325 | undefined;
326 handleProtocols?: (protocols: Set<string>, request: InstanceType<V>) => string | false;
327 path?: string | undefined;
328 noServer?: boolean | undefined;
329 clientTracking?: boolean | undefined;
330 perMessageDeflate?: boolean | PerMessageDeflateOptions | undefined;
331 maxPayload?: number | undefined;
332 skipUTF8Validation?: boolean | undefined;
333 WebSocket?: U | undefined;
334 }
335
336 interface AddressInfo {
337 address: string;
338 family: string;
339 port: number;
340 }
341
342 // WebSocket Server
343 class Server<
344 T extends typeof WebSocket.WebSocket = typeof WebSocket.WebSocket,
345 U extends typeof IncomingMessage = typeof IncomingMessage,
346 > extends EventEmitter {
347 options: ServerOptions<T, U>;
348 path: string;
349 clients: Set<InstanceType<T>>;
350
351 constructor(options?: ServerOptions<T, U>, callback?: () => void);
352
353 address(): AddressInfo | string;
354 close(cb?: (err?: Error) => void): void;
355 handleUpgrade(
356 request: InstanceType<U>,
357 socket: Duplex,
358 upgradeHead: Buffer,
359 callback: (client: InstanceType<T>, request: InstanceType<U>) => void,
360 ): void;
361 shouldHandle(request: InstanceType<U>): boolean | Promise<boolean>;
362
363 // Events
364 on(event: "connection", cb: (this: Server<T>, socket: InstanceType<T>, request: InstanceType<U>) => void): this;
365 on(event: "error", cb: (this: Server<T>, error: Error) => void): this;
366 on(event: "headers", cb: (this: Server<T>, headers: string[], request: InstanceType<U>) => void): this;
367 on(event: "close" | "listening", cb: (this: Server<T>) => void): this;
368 on(event: string | symbol, listener: (this: Server<T>, ...args: any[]) => void): this;
369
370 once(
371 event: "connection",
372 cb: (this: Server<T>, socket: InstanceType<T>, request: InstanceType<U>) => void,
373 ): this;
374 once(event: "error", cb: (this: Server<T>, error: Error) => void): this;
375 once(event: "headers", cb: (this: Server<T>, headers: string[], request: InstanceType<U>) => void): this;
376 once(event: "close" | "listening", cb: (this: Server<T>) => void): this;
377 once(event: string | symbol, listener: (this: Server<T>, ...args: any[]) => void): this;
378
379 off(
380 event: "connection",
381 cb: (this: Server<T>, socket: InstanceType<T>, request: InstanceType<U>) => void,
382 ): this;
383 off(event: "error", cb: (this: Server<T>, error: Error) => void): this;
384 off(event: "headers", cb: (this: Server<T>, headers: string[], request: InstanceType<U>) => void): this;
385 off(event: "close" | "listening", cb: (this: Server<T>) => void): this;
386 off(event: string | symbol, listener: (this: Server<T>, ...args: any[]) => void): this;
387
388 addListener(event: "connection", cb: (client: InstanceType<T>, request: InstanceType<U>) => void): this;
389 addListener(event: "error", cb: (err: Error) => void): this;
390 addListener(event: "headers", cb: (headers: string[], request: InstanceType<U>) => void): this;
391 addListener(event: "close" | "listening", cb: () => void): this;
392 addListener(event: string | symbol, listener: (...args: any[]) => void): this;
393
394 removeListener(event: "connection", cb: (client: InstanceType<T>, request: InstanceType<U>) => void): this;
395 removeListener(event: "error", cb: (err: Error) => void): this;
396 removeListener(event: "headers", cb: (headers: string[], request: InstanceType<U>) => void): this;
397 removeListener(event: "close" | "listening", cb: () => void): this;
398 removeListener(event: string | symbol, listener: (...args: any[]) => void): this;
399 }
400
401 const WebSocketServer: typeof Server;
402 interface WebSocketServer extends Server {} // eslint-disable-line @typescript-eslint/no-empty-interface
403 const WebSocket: typeof WebSocketAlias;
404 interface WebSocket extends WebSocketAlias {} // eslint-disable-line @typescript-eslint/no-empty-interface
405
406 // WebSocket stream
407 function createWebSocketStream(websocket: WebSocket, options?: DuplexOptions): Duplex;
408}
409
410export = WebSocket;