| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483 |
- import { Emitter } from "@socket.io/component-emitter";
- import type { Packet, BinaryType, RawData } from "engine.io-parser";
- import { CloseDetails, Transport } from "./transport.js";
- import { CookieJar } from "./globals.node.js";
- export interface SocketOptions {
- /**
- * The host that we're connecting to. Set from the URI passed when connecting
- */
- host?: string;
- /**
- * The hostname for our connection. Set from the URI passed when connecting
- */
- hostname?: string;
- /**
- * If this is a secure connection. Set from the URI passed when connecting
- */
- secure?: boolean;
- /**
- * The port for our connection. Set from the URI passed when connecting
- */
- port?: string | number;
- /**
- * Any query parameters in our uri. Set from the URI passed when connecting
- */
- query?: {
- [key: string]: any;
- };
- /**
- * `http.Agent` to use, defaults to `false` (NodeJS only)
- *
- * Note: the type should be "undefined | http.Agent | https.Agent | false", but this would break browser-only clients.
- *
- * @see https://nodejs.org/api/http.html#httprequestoptions-callback
- */
- agent?: string | boolean;
- /**
- * Whether the client should try to upgrade the transport from
- * long-polling to something better.
- * @default true
- */
- upgrade?: boolean;
- /**
- * Forces base 64 encoding for polling transport even when XHR2
- * responseType is available and WebSocket even if the used standard
- * supports binary.
- */
- forceBase64?: boolean;
- /**
- * The param name to use as our timestamp key
- * @default 't'
- */
- timestampParam?: string;
- /**
- * Whether to add the timestamp with each transport request. Note: this
- * is ignored if the browser is IE or Android, in which case requests
- * are always stamped
- * @default false
- */
- timestampRequests?: boolean;
- /**
- * A list of transports to try (in order). Engine.io always attempts to
- * connect directly with the first one, provided the feature detection test
- * for it passes.
- *
- * @default ['polling','websocket', 'webtransport']
- */
- transports?: ("polling" | "websocket" | "webtransport" | string)[] | TransportCtor[];
- /**
- * Whether all the transports should be tested, instead of just the first one.
- *
- * If set to `true`, the client will first try to connect with HTTP long-polling, and then with WebSocket in case of
- * failure, and finally with WebTransport if the previous attempts have failed.
- *
- * If set to `false` (default), if the connection with HTTP long-polling fails, then the client will not test the
- * other transports and will abort the connection.
- *
- * @default false
- */
- tryAllTransports?: boolean;
- /**
- * If true and if the previous websocket connection to the server succeeded,
- * the connection attempt will bypass the normal upgrade process and will
- * initially try websocket. A connection attempt following a transport error
- * will use the normal upgrade process. It is recommended you turn this on
- * only when using SSL/TLS connections, or if you know that your network does
- * not block websockets.
- * @default false
- */
- rememberUpgrade?: boolean;
- /**
- * Timeout for xhr-polling requests in milliseconds (0) (only for polling transport)
- */
- requestTimeout?: number;
- /**
- * Transport options for Node.js client (headers etc)
- */
- transportOptions?: Object;
- /**
- * (SSL) Certificate, Private key and CA certificates to use for SSL.
- * Can be used in Node.js client environment to manually specify
- * certificate information.
- */
- pfx?: string;
- /**
- * (SSL) Private key to use for SSL. Can be used in Node.js client
- * environment to manually specify certificate information.
- */
- key?: string;
- /**
- * (SSL) A string or passphrase for the private key or pfx. Can be
- * used in Node.js client environment to manually specify certificate
- * information.
- */
- passphrase?: string;
- /**
- * (SSL) Public x509 certificate to use. Can be used in Node.js client
- * environment to manually specify certificate information.
- */
- cert?: string;
- /**
- * (SSL) An authority certificate or array of authority certificates to
- * check the remote host against.. Can be used in Node.js client
- * environment to manually specify certificate information.
- */
- ca?: string | string[];
- /**
- * (SSL) A string describing the ciphers to use or exclude. Consult the
- * [cipher format list]
- * (http://www.openssl.org/docs/apps/ciphers.html#CIPHER_LIST_FORMAT) for
- * details on the format.. Can be used in Node.js client environment to
- * manually specify certificate information.
- */
- ciphers?: string;
- /**
- * (SSL) If true, the server certificate is verified against the list of
- * supplied CAs. An 'error' event is emitted if verification fails.
- * Verification happens at the connection level, before the HTTP request
- * is sent. Can be used in Node.js client environment to manually specify
- * certificate information.
- */
- rejectUnauthorized?: boolean;
- /**
- * Headers that will be passed for each request to the server (via xhr-polling and via websockets).
- * These values then can be used during handshake or for special proxies.
- */
- extraHeaders?: {
- [header: string]: string;
- };
- /**
- * Whether to include credentials (cookies, authorization headers, TLS
- * client certificates, etc.) with cross-origin XHR polling requests
- * @default false
- */
- withCredentials?: boolean;
- /**
- * Whether to automatically close the connection whenever the beforeunload event is received.
- * @default false
- */
- closeOnBeforeunload?: boolean;
- /**
- * Whether to always use the native timeouts. This allows the client to
- * reconnect when the native timeout functions are overridden, such as when
- * mock clocks are installed.
- * @default false
- */
- useNativeTimers?: boolean;
- /**
- * Whether the heartbeat timer should be unref'ed, in order not to keep the Node.js event loop active.
- *
- * @see https://nodejs.org/api/timers.html#timeoutunref
- * @default false
- */
- autoUnref?: boolean;
- /**
- * parameters of the WebSocket permessage-deflate extension (see ws module api docs). Set to false to disable.
- * @default false
- */
- perMessageDeflate?: {
- threshold: number;
- };
- /**
- * The path to get our client file from, in the case of the server
- * serving it
- * @default '/engine.io'
- */
- path?: string;
- /**
- * Whether we should add a trailing slash to the request path.
- * @default true
- */
- addTrailingSlash?: boolean;
- /**
- * Either a single protocol string or an array of protocol strings. These strings are used to indicate sub-protocols,
- * so that a single server can implement multiple WebSocket sub-protocols (for example, you might want one server to
- * be able to handle different types of interactions depending on the specified protocol)
- * @default []
- */
- protocols?: string | string[];
- }
- type TransportCtor = {
- new (o: any): Transport;
- };
- type BaseSocketOptions = Omit<SocketOptions, "transports"> & {
- transports: TransportCtor[];
- };
- interface HandshakeData {
- sid: string;
- upgrades: string[];
- pingInterval: number;
- pingTimeout: number;
- maxPayload: number;
- }
- interface SocketReservedEvents {
- open: () => void;
- handshake: (data: HandshakeData) => void;
- packet: (packet: Packet) => void;
- packetCreate: (packet: Packet) => void;
- data: (data: RawData) => void;
- message: (data: RawData) => void;
- drain: () => void;
- flush: () => void;
- heartbeat: () => void;
- ping: () => void;
- pong: () => void;
- error: (err: string | Error) => void;
- upgrading: (transport: Transport) => void;
- upgrade: (transport: Transport) => void;
- upgradeError: (err: Error) => void;
- close: (reason: string, description?: CloseDetails | Error) => void;
- }
- type SocketState = "opening" | "open" | "closing" | "closed";
- interface WriteOptions {
- compress?: boolean;
- }
- /**
- * This class provides a WebSocket-like interface to connect to an Engine.IO server. The connection will be established
- * with one of the available low-level transports, like HTTP long-polling, WebSocket or WebTransport.
- *
- * This class comes without upgrade mechanism, which means that it will keep the first low-level transport that
- * successfully establishes the connection.
- *
- * In order to allow tree-shaking, there are no transports included, that's why the `transports` option is mandatory.
- *
- * @example
- * import { SocketWithoutUpgrade, WebSocket } from "engine.io-client";
- *
- * const socket = new SocketWithoutUpgrade({
- * transports: [WebSocket]
- * });
- *
- * socket.on("open", () => {
- * socket.send("hello");
- * });
- *
- * @see SocketWithUpgrade
- * @see Socket
- */
- export declare class SocketWithoutUpgrade extends Emitter<Record<never, never>, Record<never, never>, SocketReservedEvents> {
- id: string;
- transport: Transport;
- binaryType: BinaryType;
- readyState: SocketState;
- writeBuffer: Packet[];
- protected readonly opts: BaseSocketOptions;
- protected readonly transports: string[];
- protected upgrading: boolean;
- protected setTimeoutFn: typeof setTimeout;
- private _prevBufferLen;
- private _pingInterval;
- private _pingTimeout;
- private _maxPayload?;
- private _pingTimeoutTimer;
- /**
- * The expiration timestamp of the {@link _pingTimeoutTimer} object is tracked, in case the timer is throttled and the
- * callback is not fired on time. This can happen for example when a laptop is suspended or when a phone is locked.
- */
- private _pingTimeoutTime;
- private clearTimeoutFn;
- private readonly _beforeunloadEventListener;
- private readonly _offlineEventListener;
- private readonly secure;
- private readonly hostname;
- private readonly port;
- private readonly _transportsByName;
- /**
- * The cookie jar will store the cookies sent by the server (Node. js only).
- */
- readonly _cookieJar: CookieJar;
- static priorWebsocketSuccess: boolean;
- static protocol: number;
- /**
- * Socket constructor.
- *
- * @param {String|Object} uri - uri or options
- * @param {Object} opts - options
- */
- constructor(uri: string | BaseSocketOptions, opts: BaseSocketOptions);
- /**
- * Creates transport of the given type.
- *
- * @param {String} name - transport name
- * @return {Transport}
- * @private
- */
- protected createTransport(name: string): Transport;
- /**
- * Initializes transport to use and starts probe.
- *
- * @private
- */
- private _open;
- /**
- * Sets the current transport. Disables the existing one (if any).
- *
- * @private
- */
- protected setTransport(transport: Transport): void;
- /**
- * Called when connection is deemed open.
- *
- * @private
- */
- protected onOpen(): void;
- /**
- * Handles a packet.
- *
- * @private
- */
- private _onPacket;
- /**
- * Called upon handshake completion.
- *
- * @param {Object} data - handshake obj
- * @private
- */
- protected onHandshake(data: HandshakeData): void;
- /**
- * Sets and resets ping timeout timer based on server pings.
- *
- * @private
- */
- private _resetPingTimeout;
- /**
- * Called on `drain` event
- *
- * @private
- */
- private _onDrain;
- /**
- * Flush write buffers.
- *
- * @private
- */
- protected flush(): void;
- /**
- * Ensure the encoded size of the writeBuffer is below the maxPayload value sent by the server (only for HTTP
- * long-polling)
- *
- * @private
- */
- private _getWritablePackets;
- /**
- * Checks whether the heartbeat timer has expired but the socket has not yet been notified.
- *
- * Note: this method is private for now because it does not really fit the WebSocket API, but if we put it in the
- * `write()` method then the message would not be buffered by the Socket.IO client.
- *
- * @return {boolean}
- * @private
- */
- _hasPingExpired(): boolean;
- /**
- * Sends a message.
- *
- * @param {String} msg - message.
- * @param {Object} options.
- * @param {Function} fn - callback function.
- * @return {Socket} for chaining.
- */
- write(msg: RawData, options?: WriteOptions, fn?: () => void): this;
- /**
- * Sends a message. Alias of {@link Socket#write}.
- *
- * @param {String} msg - message.
- * @param {Object} options.
- * @param {Function} fn - callback function.
- * @return {Socket} for chaining.
- */
- send(msg: RawData, options?: WriteOptions, fn?: () => void): this;
- /**
- * Sends a packet.
- *
- * @param {String} type: packet type.
- * @param {String} data.
- * @param {Object} options.
- * @param {Function} fn - callback function.
- * @private
- */
- private _sendPacket;
- /**
- * Closes the connection.
- */
- close(): this;
- /**
- * Called upon transport error
- *
- * @private
- */
- private _onError;
- /**
- * Called upon transport close.
- *
- * @private
- */
- private _onClose;
- }
- /**
- * This class provides a WebSocket-like interface to connect to an Engine.IO server. The connection will be established
- * with one of the available low-level transports, like HTTP long-polling, WebSocket or WebTransport.
- *
- * This class comes with an upgrade mechanism, which means that once the connection is established with the first
- * low-level transport, it will try to upgrade to a better transport.
- *
- * In order to allow tree-shaking, there are no transports included, that's why the `transports` option is mandatory.
- *
- * @example
- * import { SocketWithUpgrade, WebSocket } from "engine.io-client";
- *
- * const socket = new SocketWithUpgrade({
- * transports: [WebSocket]
- * });
- *
- * socket.on("open", () => {
- * socket.send("hello");
- * });
- *
- * @see SocketWithoutUpgrade
- * @see Socket
- */
- export declare class SocketWithUpgrade extends SocketWithoutUpgrade {
- private _upgrades;
- onOpen(): void;
- /**
- * Probes a transport.
- *
- * @param {String} name - transport name
- * @private
- */
- private _probe;
- onHandshake(data: HandshakeData): void;
- /**
- * Filters upgrades, returning only those matching client transports.
- *
- * @param {Array} upgrades - server upgrades
- * @private
- */
- private _filterUpgrades;
- }
- /**
- * This class provides a WebSocket-like interface to connect to an Engine.IO server. The connection will be established
- * with one of the available low-level transports, like HTTP long-polling, WebSocket or WebTransport.
- *
- * This class comes with an upgrade mechanism, which means that once the connection is established with the first
- * low-level transport, it will try to upgrade to a better transport.
- *
- * @example
- * import { Socket } from "engine.io-client";
- *
- * const socket = new Socket();
- *
- * socket.on("open", () => {
- * socket.send("hello");
- * });
- *
- * @see SocketWithoutUpgrade
- * @see SocketWithUpgrade
- */
- export declare class Socket extends SocketWithUpgrade {
- constructor(uri?: string, opts?: SocketOptions);
- constructor(opts: SocketOptions);
- }
- export {};
|