UNPKG

15.7 kBTypeScriptView Raw
1import { Emitter } from "@socket.io/component-emitter";
2import type { Packet, BinaryType, RawData } from "engine.io-parser";
3import { CloseDetails, Transport } from "./transport.js";
4import { CookieJar } from "./globals.node.js";
5export interface SocketOptions {
6 /**
7 * The host that we're connecting to. Set from the URI passed when connecting
8 */
9 host?: string;
10 /**
11 * The hostname for our connection. Set from the URI passed when connecting
12 */
13 hostname?: string;
14 /**
15 * If this is a secure connection. Set from the URI passed when connecting
16 */
17 secure?: boolean;
18 /**
19 * The port for our connection. Set from the URI passed when connecting
20 */
21 port?: string | number;
22 /**
23 * Any query parameters in our uri. Set from the URI passed when connecting
24 */
25 query?: {
26 [key: string]: any;
27 };
28 /**
29 * `http.Agent` to use, defaults to `false` (NodeJS only)
30 *
31 * Note: the type should be "undefined | http.Agent | https.Agent | false", but this would break browser-only clients.
32 *
33 * @see https://nodejs.org/api/http.html#httprequestoptions-callback
34 */
35 agent?: string | boolean;
36 /**
37 * Whether the client should try to upgrade the transport from
38 * long-polling to something better.
39 * @default true
40 */
41 upgrade?: boolean;
42 /**
43 * Forces base 64 encoding for polling transport even when XHR2
44 * responseType is available and WebSocket even if the used standard
45 * supports binary.
46 */
47 forceBase64?: boolean;
48 /**
49 * The param name to use as our timestamp key
50 * @default 't'
51 */
52 timestampParam?: string;
53 /**
54 * Whether to add the timestamp with each transport request. Note: this
55 * is ignored if the browser is IE or Android, in which case requests
56 * are always stamped
57 * @default false
58 */
59 timestampRequests?: boolean;
60 /**
61 * A list of transports to try (in order). Engine.io always attempts to
62 * connect directly with the first one, provided the feature detection test
63 * for it passes.
64 *
65 * @default ['polling','websocket', 'webtransport']
66 */
67 transports?: ("polling" | "websocket" | "webtransport" | string)[] | TransportCtor[];
68 /**
69 * Whether all the transports should be tested, instead of just the first one.
70 *
71 * If set to `true`, the client will first try to connect with HTTP long-polling, and then with WebSocket in case of
72 * failure, and finally with WebTransport if the previous attempts have failed.
73 *
74 * If set to `false` (default), if the connection with HTTP long-polling fails, then the client will not test the
75 * other transports and will abort the connection.
76 *
77 * @default false
78 */
79 tryAllTransports?: boolean;
80 /**
81 * If true and if the previous websocket connection to the server succeeded,
82 * the connection attempt will bypass the normal upgrade process and will
83 * initially try websocket. A connection attempt following a transport error
84 * will use the normal upgrade process. It is recommended you turn this on
85 * only when using SSL/TLS connections, or if you know that your network does
86 * not block websockets.
87 * @default false
88 */
89 rememberUpgrade?: boolean;
90 /**
91 * Timeout for xhr-polling requests in milliseconds (0) (only for polling transport)
92 */
93 requestTimeout?: number;
94 /**
95 * Transport options for Node.js client (headers etc)
96 */
97 transportOptions?: Object;
98 /**
99 * (SSL) Certificate, Private key and CA certificates to use for SSL.
100 * Can be used in Node.js client environment to manually specify
101 * certificate information.
102 */
103 pfx?: string;
104 /**
105 * (SSL) Private key to use for SSL. Can be used in Node.js client
106 * environment to manually specify certificate information.
107 */
108 key?: string;
109 /**
110 * (SSL) A string or passphrase for the private key or pfx. Can be
111 * used in Node.js client environment to manually specify certificate
112 * information.
113 */
114 passphrase?: string;
115 /**
116 * (SSL) Public x509 certificate to use. Can be used in Node.js client
117 * environment to manually specify certificate information.
118 */
119 cert?: string;
120 /**
121 * (SSL) An authority certificate or array of authority certificates to
122 * check the remote host against.. Can be used in Node.js client
123 * environment to manually specify certificate information.
124 */
125 ca?: string | string[];
126 /**
127 * (SSL) A string describing the ciphers to use or exclude. Consult the
128 * [cipher format list]
129 * (http://www.openssl.org/docs/apps/ciphers.html#CIPHER_LIST_FORMAT) for
130 * details on the format.. Can be used in Node.js client environment to
131 * manually specify certificate information.
132 */
133 ciphers?: string;
134 /**
135 * (SSL) If true, the server certificate is verified against the list of
136 * supplied CAs. An 'error' event is emitted if verification fails.
137 * Verification happens at the connection level, before the HTTP request
138 * is sent. Can be used in Node.js client environment to manually specify
139 * certificate information.
140 */
141 rejectUnauthorized?: boolean;
142 /**
143 * Headers that will be passed for each request to the server (via xhr-polling and via websockets).
144 * These values then can be used during handshake or for special proxies.
145 */
146 extraHeaders?: {
147 [header: string]: string;
148 };
149 /**
150 * Whether to include credentials (cookies, authorization headers, TLS
151 * client certificates, etc.) with cross-origin XHR polling requests
152 * @default false
153 */
154 withCredentials?: boolean;
155 /**
156 * Whether to automatically close the connection whenever the beforeunload event is received.
157 * @default false
158 */
159 closeOnBeforeunload?: boolean;
160 /**
161 * Whether to always use the native timeouts. This allows the client to
162 * reconnect when the native timeout functions are overridden, such as when
163 * mock clocks are installed.
164 * @default false
165 */
166 useNativeTimers?: boolean;
167 /**
168 * Whether the heartbeat timer should be unref'ed, in order not to keep the Node.js event loop active.
169 *
170 * @see https://nodejs.org/api/timers.html#timeoutunref
171 * @default false
172 */
173 autoUnref?: boolean;
174 /**
175 * parameters of the WebSocket permessage-deflate extension (see ws module api docs). Set to false to disable.
176 * @default false
177 */
178 perMessageDeflate?: {
179 threshold: number;
180 };
181 /**
182 * The path to get our client file from, in the case of the server
183 * serving it
184 * @default '/engine.io'
185 */
186 path?: string;
187 /**
188 * Whether we should add a trailing slash to the request path.
189 * @default true
190 */
191 addTrailingSlash?: boolean;
192 /**
193 * Either a single protocol string or an array of protocol strings. These strings are used to indicate sub-protocols,
194 * so that a single server can implement multiple WebSocket sub-protocols (for example, you might want one server to
195 * be able to handle different types of interactions depending on the specified protocol)
196 * @default []
197 */
198 protocols?: string | string[];
199}
200type TransportCtor = {
201 new (o: any): Transport;
202};
203type BaseSocketOptions = Omit<SocketOptions, "transports"> & {
204 transports: TransportCtor[];
205};
206interface HandshakeData {
207 sid: string;
208 upgrades: string[];
209 pingInterval: number;
210 pingTimeout: number;
211 maxPayload: number;
212}
213interface SocketReservedEvents {
214 open: () => void;
215 handshake: (data: HandshakeData) => void;
216 packet: (packet: Packet) => void;
217 packetCreate: (packet: Packet) => void;
218 data: (data: RawData) => void;
219 message: (data: RawData) => void;
220 drain: () => void;
221 flush: () => void;
222 heartbeat: () => void;
223 ping: () => void;
224 pong: () => void;
225 error: (err: string | Error) => void;
226 upgrading: (transport: Transport) => void;
227 upgrade: (transport: Transport) => void;
228 upgradeError: (err: Error) => void;
229 close: (reason: string, description?: CloseDetails | Error) => void;
230}
231type SocketState = "opening" | "open" | "closing" | "closed";
232interface WriteOptions {
233 compress?: boolean;
234}
235/**
236 * This class provides a WebSocket-like interface to connect to an Engine.IO server. The connection will be established
237 * with one of the available low-level transports, like HTTP long-polling, WebSocket or WebTransport.
238 *
239 * This class comes without upgrade mechanism, which means that it will keep the first low-level transport that
240 * successfully establishes the connection.
241 *
242 * In order to allow tree-shaking, there are no transports included, that's why the `transports` option is mandatory.
243 *
244 * @example
245 * import { SocketWithoutUpgrade, WebSocket } from "engine.io-client";
246 *
247 * const socket = new SocketWithoutUpgrade({
248 * transports: [WebSocket]
249 * });
250 *
251 * socket.on("open", () => {
252 * socket.send("hello");
253 * });
254 *
255 * @see SocketWithUpgrade
256 * @see Socket
257 */
258export declare class SocketWithoutUpgrade extends Emitter<Record<never, never>, Record<never, never>, SocketReservedEvents> {
259 id: string;
260 transport: Transport;
261 binaryType: BinaryType;
262 readyState: SocketState;
263 writeBuffer: Packet[];
264 protected readonly opts: BaseSocketOptions;
265 protected readonly transports: string[];
266 protected upgrading: boolean;
267 protected setTimeoutFn: typeof setTimeout;
268 private _prevBufferLen;
269 private _pingInterval;
270 private _pingTimeout;
271 private _maxPayload?;
272 private _pingTimeoutTimer;
273 /**
274 * The expiration timestamp of the {@link _pingTimeoutTimer} object is tracked, in case the timer is throttled and the
275 * callback is not fired on time. This can happen for example when a laptop is suspended or when a phone is locked.
276 */
277 private _pingTimeoutTime;
278 private clearTimeoutFn;
279 private readonly _beforeunloadEventListener;
280 private readonly _offlineEventListener;
281 private readonly secure;
282 private readonly hostname;
283 private readonly port;
284 private readonly _transportsByName;
285 /**
286 * The cookie jar will store the cookies sent by the server (Node. js only).
287 */
288 readonly _cookieJar: CookieJar;
289 static priorWebsocketSuccess: boolean;
290 static protocol: number;
291 /**
292 * Socket constructor.
293 *
294 * @param {String|Object} uri - uri or options
295 * @param {Object} opts - options
296 */
297 constructor(uri: string | BaseSocketOptions, opts: BaseSocketOptions);
298 /**
299 * Creates transport of the given type.
300 *
301 * @param {String} name - transport name
302 * @return {Transport}
303 * @private
304 */
305 protected createTransport(name: string): Transport;
306 /**
307 * Initializes transport to use and starts probe.
308 *
309 * @private
310 */
311 private _open;
312 /**
313 * Sets the current transport. Disables the existing one (if any).
314 *
315 * @private
316 */
317 protected setTransport(transport: Transport): void;
318 /**
319 * Called when connection is deemed open.
320 *
321 * @private
322 */
323 protected onOpen(): void;
324 /**
325 * Handles a packet.
326 *
327 * @private
328 */
329 private _onPacket;
330 /**
331 * Called upon handshake completion.
332 *
333 * @param {Object} data - handshake obj
334 * @private
335 */
336 protected onHandshake(data: HandshakeData): void;
337 /**
338 * Sets and resets ping timeout timer based on server pings.
339 *
340 * @private
341 */
342 private _resetPingTimeout;
343 /**
344 * Called on `drain` event
345 *
346 * @private
347 */
348 private _onDrain;
349 /**
350 * Flush write buffers.
351 *
352 * @private
353 */
354 protected flush(): void;
355 /**
356 * Ensure the encoded size of the writeBuffer is below the maxPayload value sent by the server (only for HTTP
357 * long-polling)
358 *
359 * @private
360 */
361 private _getWritablePackets;
362 /**
363 * Checks whether the heartbeat timer has expired but the socket has not yet been notified.
364 *
365 * Note: this method is private for now because it does not really fit the WebSocket API, but if we put it in the
366 * `write()` method then the message would not be buffered by the Socket.IO client.
367 *
368 * @return {boolean}
369 * @private
370 */
371 _hasPingExpired(): boolean;
372 /**
373 * Sends a message.
374 *
375 * @param {String} msg - message.
376 * @param {Object} options.
377 * @param {Function} fn - callback function.
378 * @return {Socket} for chaining.
379 */
380 write(msg: RawData, options?: WriteOptions, fn?: () => void): this;
381 /**
382 * Sends a message. Alias of {@link Socket#write}.
383 *
384 * @param {String} msg - message.
385 * @param {Object} options.
386 * @param {Function} fn - callback function.
387 * @return {Socket} for chaining.
388 */
389 send(msg: RawData, options?: WriteOptions, fn?: () => void): this;
390 /**
391 * Sends a packet.
392 *
393 * @param {String} type: packet type.
394 * @param {String} data.
395 * @param {Object} options.
396 * @param {Function} fn - callback function.
397 * @private
398 */
399 private _sendPacket;
400 /**
401 * Closes the connection.
402 */
403 close(): this;
404 /**
405 * Called upon transport error
406 *
407 * @private
408 */
409 private _onError;
410 /**
411 * Called upon transport close.
412 *
413 * @private
414 */
415 private _onClose;
416}
417/**
418 * This class provides a WebSocket-like interface to connect to an Engine.IO server. The connection will be established
419 * with one of the available low-level transports, like HTTP long-polling, WebSocket or WebTransport.
420 *
421 * This class comes with an upgrade mechanism, which means that once the connection is established with the first
422 * low-level transport, it will try to upgrade to a better transport.
423 *
424 * In order to allow tree-shaking, there are no transports included, that's why the `transports` option is mandatory.
425 *
426 * @example
427 * import { SocketWithUpgrade, WebSocket } from "engine.io-client";
428 *
429 * const socket = new SocketWithUpgrade({
430 * transports: [WebSocket]
431 * });
432 *
433 * socket.on("open", () => {
434 * socket.send("hello");
435 * });
436 *
437 * @see SocketWithoutUpgrade
438 * @see Socket
439 */
440export declare class SocketWithUpgrade extends SocketWithoutUpgrade {
441 private _upgrades;
442 onOpen(): void;
443 /**
444 * Probes a transport.
445 *
446 * @param {String} name - transport name
447 * @private
448 */
449 private _probe;
450 onHandshake(data: HandshakeData): void;
451 /**
452 * Filters upgrades, returning only those matching client transports.
453 *
454 * @param {Array} upgrades - server upgrades
455 * @private
456 */
457 private _filterUpgrades;
458}
459/**
460 * This class provides a WebSocket-like interface to connect to an Engine.IO server. The connection will be established
461 * with one of the available low-level transports, like HTTP long-polling, WebSocket or WebTransport.
462 *
463 * This class comes with an upgrade mechanism, which means that once the connection is established with the first
464 * low-level transport, it will try to upgrade to a better transport.
465 *
466 * @example
467 * import { Socket } from "engine.io-client";
468 *
469 * const socket = new Socket();
470 *
471 * socket.on("open", () => {
472 * socket.send("hello");
473 * });
474 *
475 * @see SocketWithoutUpgrade
476 * @see SocketWithUpgrade
477 */
478export declare class Socket extends SocketWithUpgrade {
479 constructor(uri?: string, opts?: SocketOptions);
480 constructor(opts: SocketOptions);
481}
482export {};