From b0d55df4745fc3d588adde3b3f79c30193a3f11f Mon Sep 17 00:00:00 2001 From: Tyler Butler Date: Wed, 31 Jan 2024 07:25:36 -0800 Subject: [PATCH] build(client): Update socket.io-client and remove patch (#19379) The patch to socket.io-client to make it compatible with node16 moduleResolution has been merged and released, so I updated the version of socket.io-client to a version that includes the fix. Also removed the patch. --- package.json | 1 - packages/drivers/driver-base/package.json | 2 +- packages/drivers/local-driver/package.json | 2 +- packages/drivers/odsp-driver/package.json | 2 +- .../drivers/routerlicious-driver/package.json | 2 +- patches/README.md | 9 - patches/socket.io-client@4.7.2.patch | 996 ------------------ pnpm-lock.yaml | 30 +- 8 files changed, 17 insertions(+), 1027 deletions(-) delete mode 100644 patches/socket.io-client@4.7.2.patch diff --git a/package.json b/package.json index 635c5c30c5a5..5516ac4f410b 100644 --- a/package.json +++ b/package.json @@ -376,7 +376,6 @@ }, "patchedDependencies": { "@microsoft/api-extractor@7.39.1": "patches/@microsoft__api-extractor@7.39.1.patch", - "socket.io-client@4.7.2": "patches/socket.io-client@4.7.2.patch", "tsc-multi@1.1.0": "patches/tsc-multi@1.1.0.patch" } } diff --git a/packages/drivers/driver-base/package.json b/packages/drivers/driver-base/package.json index fc2b1c131033..2d32e1918d3a 100644 --- a/packages/drivers/driver-base/package.json +++ b/packages/drivers/driver-base/package.json @@ -146,7 +146,7 @@ "moment": "^2.21.0", "prettier": "~3.0.3", "rimraf": "^4.4.0", - "socket.io-client": "^4.6.1", + "socket.io-client": "^4.7.3", "tsc-multi": "^1.1.0", "typescript": "~5.1.6" }, diff --git a/packages/drivers/local-driver/package.json b/packages/drivers/local-driver/package.json index 48e68bc08aad..17d7fd3253d0 100644 --- a/packages/drivers/local-driver/package.json +++ b/packages/drivers/local-driver/package.json @@ -160,7 +160,7 @@ "moment": "^2.21.0", "prettier": "~3.0.3", "rimraf": "^4.4.0", - "socket.io-client": "^4.6.1", + "socket.io-client": "^4.7.3", "tsc-multi": "^1.1.0", "typescript": "~5.1.6" }, diff --git a/packages/drivers/odsp-driver/package.json b/packages/drivers/odsp-driver/package.json index d39b400db60d..58fcb3dc0c43 100644 --- a/packages/drivers/odsp-driver/package.json +++ b/packages/drivers/odsp-driver/package.json @@ -77,7 +77,7 @@ "@fluidframework/protocol-definitions": "^3.2.0-231454", "@fluidframework/telemetry-utils": "workspace:~", "node-fetch": "^2.6.9", - "socket.io-client": "^4.6.1", + "socket.io-client": "^4.7.3", "uuid": "^9.0.0" }, "devDependencies": { diff --git a/packages/drivers/routerlicious-driver/package.json b/packages/drivers/routerlicious-driver/package.json index 4a7a7ee2e414..da3353a1e40d 100644 --- a/packages/drivers/routerlicious-driver/package.json +++ b/packages/drivers/routerlicious-driver/package.json @@ -130,7 +130,7 @@ "@fluidframework/telemetry-utils": "workspace:~", "cross-fetch": "^3.1.5", "json-stringify-safe": "5.0.1", - "socket.io-client": "^4.6.1", + "socket.io-client": "^4.7.3", "url-parse": "^1.5.8", "uuid": "^9.0.0" }, diff --git a/patches/README.md b/patches/README.md index f655cb00600f..1278b267b377 100644 --- a/patches/README.md +++ b/patches/README.md @@ -7,15 +7,6 @@ The files in this folder are patches for packages we depend on within the repo. Each patch is described here, along with any relevant links to issues or PRs and any additional relevant details. -### socket.io-client - -This patch updates the `exports` field in package.json to be correct for TypeScript projects using -`moduleResolution: node16`. - -It applies the changes covered in this PR: https://github.com/socketio/socket.io-client/pull/1595 - -As soon as a version of the package is released with the changes in that PR, this patch can be removed. - ### @microsoft/api-extractor This patch adds a required fix to make it possible to validate release tag compatibility across package boundaries. diff --git a/patches/socket.io-client@4.7.2.patch b/patches/socket.io-client@4.7.2.patch deleted file mode 100644 index 0300f31f1384..000000000000 --- a/patches/socket.io-client@4.7.2.patch +++ /dev/null @@ -1,996 +0,0 @@ -diff --git a/build/cjs/browser-entrypoint.d.ts b/build/cjs/browser-entrypoint.d.ts -new file mode 100644 -index 0000000000000000000000000000000000000000..18fe370bd5b70a3f79e42fe03f3401bc9a009276 ---- /dev/null -+++ b/build/cjs/browser-entrypoint.d.ts -@@ -0,0 +1,2 @@ -+import { io } from "./index.js"; -+export default io; -diff --git a/build/cjs/contrib/backo2.d.ts b/build/cjs/contrib/backo2.d.ts -new file mode 100644 -index 0000000000000000000000000000000000000000..644c7351a834d209d33f42bb762031dce19a8416 ---- /dev/null -+++ b/build/cjs/contrib/backo2.d.ts -@@ -0,0 +1,12 @@ -+/** -+ * Initialize backoff timer with `opts`. -+ * -+ * - `min` initial timeout in milliseconds [100] -+ * - `max` max timeout [10000] -+ * - `jitter` [0] -+ * - `factor` [2] -+ * -+ * @param {Object} opts -+ * @api public -+ */ -+export declare function Backoff(opts: any): void; -diff --git a/build/cjs/index.d.ts b/build/cjs/index.d.ts -new file mode 100644 -index 0000000000000000000000000000000000000000..be157f84a00cb29b6bc660d8f378d4e2504291e8 ---- /dev/null -+++ b/build/cjs/index.d.ts -@@ -0,0 +1,29 @@ -+import { Manager, ManagerOptions } from "./manager.js"; -+import { Socket, SocketOptions } from "./socket.js"; -+/** -+ * Looks up an existing `Manager` for multiplexing. -+ * If the user summons: -+ * -+ * `io('http://localhost/a');` -+ * `io('http://localhost/b');` -+ * -+ * We reuse the existing instance based on same scheme/port/host, -+ * and we initialize sockets for each namespace. -+ * -+ * @public -+ */ -+declare function lookup(opts?: Partial): Socket; -+declare function lookup(uri: string, opts?: Partial): Socket; -+declare function lookup(uri: string | Partial, opts?: Partial): Socket; -+/** -+ * Protocol version. -+ * -+ * @public -+ */ -+export { protocol } from "socket.io-parser"; -+/** -+ * Expose constructors for standalone build. -+ * -+ * @public -+ */ -+export { Manager, ManagerOptions, Socket, SocketOptions, lookup as io, lookup as connect, lookup as default, }; -diff --git a/build/cjs/manager.d.ts b/build/cjs/manager.d.ts -new file mode 100644 -index 0000000000000000000000000000000000000000..cb5dbb1e13f98e28ba806aeb7ef90e7e6b92f373 ---- /dev/null -+++ b/build/cjs/manager.d.ts -@@ -0,0 +1,291 @@ -+import { Socket as Engine, SocketOptions as EngineOptions } from "engine.io-client"; -+import { Socket, SocketOptions, DisconnectDescription } from "./socket.js"; -+import { Packet } from "socket.io-parser"; -+import { DefaultEventsMap, EventsMap, Emitter } from "@socket.io/component-emitter"; -+export interface ManagerOptions extends EngineOptions { -+ /** -+ * Should we force a new Manager for this connection? -+ * @default false -+ */ -+ forceNew: boolean; -+ /** -+ * Should we multiplex our connection (reuse existing Manager) ? -+ * @default true -+ */ -+ multiplex: boolean; -+ /** -+ * The path to get our client file from, in the case of the server -+ * serving it -+ * @default '/socket.io' -+ */ -+ path: string; -+ /** -+ * Should we allow reconnections? -+ * @default true -+ */ -+ reconnection: boolean; -+ /** -+ * How many reconnection attempts should we try? -+ * @default Infinity -+ */ -+ reconnectionAttempts: number; -+ /** -+ * The time delay in milliseconds between reconnection attempts -+ * @default 1000 -+ */ -+ reconnectionDelay: number; -+ /** -+ * The max time delay in milliseconds between reconnection attempts -+ * @default 5000 -+ */ -+ reconnectionDelayMax: number; -+ /** -+ * Used in the exponential backoff jitter when reconnecting -+ * @default 0.5 -+ */ -+ randomizationFactor: number; -+ /** -+ * The timeout in milliseconds for our connection attempt -+ * @default 20000 -+ */ -+ timeout: number; -+ /** -+ * Should we automatically connect? -+ * @default true -+ */ -+ autoConnect: boolean; -+ /** -+ * the parser to use. Defaults to an instance of the Parser that ships with socket.io. -+ */ -+ parser: any; -+} -+interface ManagerReservedEvents { -+ open: () => void; -+ error: (err: Error) => void; -+ ping: () => void; -+ packet: (packet: Packet) => void; -+ close: (reason: string, description?: DisconnectDescription) => void; -+ reconnect_failed: () => void; -+ reconnect_attempt: (attempt: number) => void; -+ reconnect_error: (err: Error) => void; -+ reconnect: (attempt: number) => void; -+} -+export declare class Manager extends Emitter<{}, {}, ManagerReservedEvents> { -+ /** -+ * The Engine.IO client instance -+ * -+ * @public -+ */ -+ engine: Engine; -+ /** -+ * @private -+ */ -+ _autoConnect: boolean; -+ /** -+ * @private -+ */ -+ _readyState: "opening" | "open" | "closed"; -+ /** -+ * @private -+ */ -+ _reconnecting: boolean; -+ private readonly uri; -+ opts: Partial; -+ private nsps; -+ private subs; -+ private backoff; -+ private setTimeoutFn; -+ private clearTimeoutFn; -+ private _reconnection; -+ private _reconnectionAttempts; -+ private _reconnectionDelay; -+ private _randomizationFactor; -+ private _reconnectionDelayMax; -+ private _timeout; -+ private encoder; -+ private decoder; -+ private skipReconnect; -+ /** -+ * `Manager` constructor. -+ * -+ * @param uri - engine instance or engine uri/opts -+ * @param opts - options -+ * @public -+ */ -+ constructor(opts: Partial); -+ constructor(uri?: string, opts?: Partial); -+ constructor(uri?: string | Partial, opts?: Partial); -+ /** -+ * Sets the `reconnection` config. -+ * -+ * @param {Boolean} v - true/false if it should automatically reconnect -+ * @return {Manager} self or value -+ * @public -+ */ -+ reconnection(v: boolean): this; -+ reconnection(): boolean; -+ reconnection(v?: boolean): this | boolean; -+ /** -+ * Sets the reconnection attempts config. -+ * -+ * @param {Number} v - max reconnection attempts before giving up -+ * @return {Manager} self or value -+ * @public -+ */ -+ reconnectionAttempts(v: number): this; -+ reconnectionAttempts(): number; -+ reconnectionAttempts(v?: number): this | number; -+ /** -+ * Sets the delay between reconnections. -+ * -+ * @param {Number} v - delay -+ * @return {Manager} self or value -+ * @public -+ */ -+ reconnectionDelay(v: number): this; -+ reconnectionDelay(): number; -+ reconnectionDelay(v?: number): this | number; -+ /** -+ * Sets the randomization factor -+ * -+ * @param v - the randomization factor -+ * @return self or value -+ * @public -+ */ -+ randomizationFactor(v: number): this; -+ randomizationFactor(): number; -+ randomizationFactor(v?: number): this | number; -+ /** -+ * Sets the maximum delay between reconnections. -+ * -+ * @param v - delay -+ * @return self or value -+ * @public -+ */ -+ reconnectionDelayMax(v: number): this; -+ reconnectionDelayMax(): number; -+ reconnectionDelayMax(v?: number): this | number; -+ /** -+ * Sets the connection timeout. `false` to disable -+ * -+ * @param v - connection timeout -+ * @return self or value -+ * @public -+ */ -+ timeout(v: number | boolean): this; -+ timeout(): number | boolean; -+ timeout(v?: number | boolean): this | number | boolean; -+ /** -+ * Starts trying to reconnect if reconnection is enabled and we have not -+ * started reconnecting yet -+ * -+ * @private -+ */ -+ private maybeReconnectOnOpen; -+ /** -+ * Sets the current transport `socket`. -+ * -+ * @param {Function} fn - optional, callback -+ * @return self -+ * @public -+ */ -+ open(fn?: (err?: Error) => void): this; -+ /** -+ * Alias for open() -+ * -+ * @return self -+ * @public -+ */ -+ connect(fn?: (err?: Error) => void): this; -+ /** -+ * Called upon transport open. -+ * -+ * @private -+ */ -+ private onopen; -+ /** -+ * Called upon a ping. -+ * -+ * @private -+ */ -+ private onping; -+ /** -+ * Called with data. -+ * -+ * @private -+ */ -+ private ondata; -+ /** -+ * Called when parser fully decodes a packet. -+ * -+ * @private -+ */ -+ private ondecoded; -+ /** -+ * Called upon socket error. -+ * -+ * @private -+ */ -+ private onerror; -+ /** -+ * Creates a new socket for the given `nsp`. -+ * -+ * @return {Socket} -+ * @public -+ */ -+ socket(nsp: string, opts?: Partial): Socket; -+ /** -+ * Called upon a socket close. -+ * -+ * @param socket -+ * @private -+ */ -+ _destroy(socket: Socket): void; -+ /** -+ * Writes a packet. -+ * -+ * @param packet -+ * @private -+ */ -+ _packet(packet: Partial): void; -+ /** -+ * Clean up transport subscriptions and packet buffer. -+ * -+ * @private -+ */ -+ private cleanup; -+ /** -+ * Close the current socket. -+ * -+ * @private -+ */ -+ _close(): void; -+ /** -+ * Alias for close() -+ * -+ * @private -+ */ -+ private disconnect; -+ /** -+ * Called upon engine close. -+ * -+ * @private -+ */ -+ private onclose; -+ /** -+ * Attempt a reconnection. -+ * -+ * @private -+ */ -+ private reconnect; -+ /** -+ * Called upon successful reconnect. -+ * -+ * @private -+ */ -+ private onreconnect; -+} -+export {}; -diff --git a/build/cjs/on.d.ts b/build/cjs/on.d.ts -new file mode 100644 -index 0000000000000000000000000000000000000000..417963474c8ef4c2f160232ceef867b9da01dbb1 ---- /dev/null -+++ b/build/cjs/on.d.ts -@@ -0,0 +1,2 @@ -+import { Emitter } from "@socket.io/component-emitter"; -+export declare function on(obj: Emitter, ev: string, fn: (err?: any) => any): VoidFunction; -diff --git a/build/cjs/socket.d.ts b/build/cjs/socket.d.ts -new file mode 100644 -index 0000000000000000000000000000000000000000..9a4de076117a6203dce303e8c25e83ddbfbc0056 ---- /dev/null -+++ b/build/cjs/socket.d.ts -@@ -0,0 +1,563 @@ -+import { Packet } from "socket.io-parser"; -+import { Manager } from "./manager.js"; -+import { DefaultEventsMap, EventNames, EventParams, EventsMap, Emitter } from "@socket.io/component-emitter"; -+declare type PrependTimeoutError = { -+ [K in keyof T]: T[K] extends (...args: infer Params) => infer Result ? (err: Error, ...args: Params) => Result : T[K]; -+}; -+/** -+ * Utility type to decorate the acknowledgement callbacks with a timeout error. -+ * -+ * This is needed because the timeout() flag breaks the symmetry between the sender and the receiver: -+ * -+ * @example -+ * interface Events { -+ * "my-event": (val: string) => void; -+ * } -+ * -+ * socket.on("my-event", (cb) => { -+ * cb("123"); // one single argument here -+ * }); -+ * -+ * socket.timeout(1000).emit("my-event", (err, val) => { -+ * // two arguments there (the "err" argument is not properly typed) -+ * }); -+ * -+ */ -+export declare type DecorateAcknowledgements = { -+ [K in keyof E]: E[K] extends (...args: infer Params) => infer Result ? (...args: PrependTimeoutError) => Result : E[K]; -+}; -+export declare type Last = T extends [...infer H, infer L] ? L : any; -+export declare type AllButLast = T extends [...infer H, infer L] ? H : any[]; -+export declare type FirstArg = T extends (arg: infer Param) => infer Result ? Param : any; -+export interface SocketOptions { -+ /** -+ * the authentication payload sent when connecting to the Namespace -+ */ -+ auth?: { -+ [key: string]: any; -+ } | ((cb: (data: object) => void) => void); -+ /** -+ * The maximum number of retries. Above the limit, the packet will be discarded. -+ * -+ * Using `Infinity` means the delivery guarantee is "at-least-once" (instead of "at-most-once" by default), but a -+ * smaller value like 10 should be sufficient in practice. -+ */ -+ retries?: number; -+ /** -+ * The default timeout in milliseconds used when waiting for an acknowledgement. -+ */ -+ ackTimeout?: number; -+} -+export declare type DisconnectDescription = Error | { -+ description: string; -+ context?: unknown; -+}; -+interface SocketReservedEvents { -+ connect: () => void; -+ connect_error: (err: Error) => void; -+ disconnect: (reason: Socket.DisconnectReason, description?: DisconnectDescription) => void; -+} -+/** -+ * A Socket is the fundamental class for interacting with the server. -+ * -+ * A Socket belongs to a certain Namespace (by default /) and uses an underlying {@link Manager} to communicate. -+ * -+ * @example -+ * const socket = io(); -+ * -+ * socket.on("connect", () => { -+ * console.log("connected"); -+ * }); -+ * -+ * // send an event to the server -+ * socket.emit("foo", "bar"); -+ * -+ * socket.on("foobar", () => { -+ * // an event was received from the server -+ * }); -+ * -+ * // upon disconnection -+ * socket.on("disconnect", (reason) => { -+ * console.log(`disconnected due to ${reason}`); -+ * }); -+ */ -+export declare class Socket extends Emitter { -+ readonly io: Manager; -+ /** -+ * A unique identifier for the session. -+ * -+ * @example -+ * const socket = io(); -+ * -+ * console.log(socket.id); // undefined -+ * -+ * socket.on("connect", () => { -+ * console.log(socket.id); // "G5p5..." -+ * }); -+ */ -+ id: string; -+ /** -+ * The session ID used for connection state recovery, which must not be shared (unlike {@link id}). -+ * -+ * @private -+ */ -+ private _pid; -+ /** -+ * The offset of the last received packet, which will be sent upon reconnection to allow for the recovery of the connection state. -+ * -+ * @private -+ */ -+ private _lastOffset; -+ /** -+ * Whether the socket is currently connected to the server. -+ * -+ * @example -+ * const socket = io(); -+ * -+ * socket.on("connect", () => { -+ * console.log(socket.connected); // true -+ * }); -+ * -+ * socket.on("disconnect", () => { -+ * console.log(socket.connected); // false -+ * }); -+ */ -+ connected: boolean; -+ /** -+ * Whether the connection state was recovered after a temporary disconnection. In that case, any missed packets will -+ * be transmitted by the server. -+ */ -+ recovered: boolean; -+ /** -+ * Credentials that are sent when accessing a namespace. -+ * -+ * @example -+ * const socket = io({ -+ * auth: { -+ * token: "abcd" -+ * } -+ * }); -+ * -+ * // or with a function -+ * const socket = io({ -+ * auth: (cb) => { -+ * cb({ token: localStorage.token }) -+ * } -+ * }); -+ */ -+ auth: { -+ [key: string]: any; -+ } | ((cb: (data: object) => void) => void); -+ /** -+ * Buffer for packets received before the CONNECT packet -+ */ -+ receiveBuffer: Array>; -+ /** -+ * Buffer for packets that will be sent once the socket is connected -+ */ -+ sendBuffer: Array; -+ /** -+ * The queue of packets to be sent with retry in case of failure. -+ * -+ * Packets are sent one by one, each waiting for the server acknowledgement, in order to guarantee the delivery order. -+ * @private -+ */ -+ private _queue; -+ /** -+ * A sequence to generate the ID of the {@link QueuedPacket}. -+ * @private -+ */ -+ private _queueSeq; -+ private readonly nsp; -+ private readonly _opts; -+ private ids; -+ private acks; -+ private flags; -+ private subs?; -+ private _anyListeners; -+ private _anyOutgoingListeners; -+ /** -+ * `Socket` constructor. -+ */ -+ constructor(io: Manager, nsp: string, opts?: Partial); -+ /** -+ * Whether the socket is currently disconnected -+ * -+ * @example -+ * const socket = io(); -+ * -+ * socket.on("connect", () => { -+ * console.log(socket.disconnected); // false -+ * }); -+ * -+ * socket.on("disconnect", () => { -+ * console.log(socket.disconnected); // true -+ * }); -+ */ -+ get disconnected(): boolean; -+ /** -+ * Subscribe to open, close and packet events -+ * -+ * @private -+ */ -+ private subEvents; -+ /** -+ * Whether the Socket will try to reconnect when its Manager connects or reconnects. -+ * -+ * @example -+ * const socket = io(); -+ * -+ * console.log(socket.active); // true -+ * -+ * socket.on("disconnect", (reason) => { -+ * if (reason === "io server disconnect") { -+ * // the disconnection was initiated by the server, you need to manually reconnect -+ * console.log(socket.active); // false -+ * } -+ * // else the socket will automatically try to reconnect -+ * console.log(socket.active); // true -+ * }); -+ */ -+ get active(): boolean; -+ /** -+ * "Opens" the socket. -+ * -+ * @example -+ * const socket = io({ -+ * autoConnect: false -+ * }); -+ * -+ * socket.connect(); -+ */ -+ connect(): this; -+ /** -+ * Alias for {@link connect()}. -+ */ -+ open(): this; -+ /** -+ * Sends a `message` event. -+ * -+ * This method mimics the WebSocket.send() method. -+ * -+ * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/send -+ * -+ * @example -+ * socket.send("hello"); -+ * -+ * // this is equivalent to -+ * socket.emit("message", "hello"); -+ * -+ * @return self -+ */ -+ send(...args: any[]): this; -+ /** -+ * Override `emit`. -+ * If the event is in `events`, it's emitted normally. -+ * -+ * @example -+ * socket.emit("hello", "world"); -+ * -+ * // all serializable datastructures are supported (no need to call JSON.stringify) -+ * socket.emit("hello", 1, "2", { 3: ["4"], 5: Uint8Array.from([6]) }); -+ * -+ * // with an acknowledgement from the server -+ * socket.emit("hello", "world", (val) => { -+ * // ... -+ * }); -+ * -+ * @return self -+ */ -+ emit>(ev: Ev, ...args: EventParams): this; -+ /** -+ * @private -+ */ -+ private _registerAckCallback; -+ /** -+ * Emits an event and waits for an acknowledgement -+ * -+ * @example -+ * // without timeout -+ * const response = await socket.emitWithAck("hello", "world"); -+ * -+ * // with a specific timeout -+ * try { -+ * const response = await socket.timeout(1000).emitWithAck("hello", "world"); -+ * } catch (err) { -+ * // the server did not acknowledge the event in the given delay -+ * } -+ * -+ * @return a Promise that will be fulfilled when the server acknowledges the event -+ */ -+ emitWithAck>(ev: Ev, ...args: AllButLast>): Promise>>>; -+ /** -+ * Add the packet to the queue. -+ * @param args -+ * @private -+ */ -+ private _addToQueue; -+ /** -+ * Send the first packet of the queue, and wait for an acknowledgement from the server. -+ * @param force - whether to resend a packet that has not been acknowledged yet -+ * -+ * @private -+ */ -+ private _drainQueue; -+ /** -+ * Sends a packet. -+ * -+ * @param packet -+ * @private -+ */ -+ private packet; -+ /** -+ * Called upon engine `open`. -+ * -+ * @private -+ */ -+ private onopen; -+ /** -+ * Sends a CONNECT packet to initiate the Socket.IO session. -+ * -+ * @param data -+ * @private -+ */ -+ private _sendConnectPacket; -+ /** -+ * Called upon engine or manager `error`. -+ * -+ * @param err -+ * @private -+ */ -+ private onerror; -+ /** -+ * Called upon engine `close`. -+ * -+ * @param reason -+ * @param description -+ * @private -+ */ -+ private onclose; -+ /** -+ * Called with socket packet. -+ * -+ * @param packet -+ * @private -+ */ -+ private onpacket; -+ /** -+ * Called upon a server event. -+ * -+ * @param packet -+ * @private -+ */ -+ private onevent; -+ private emitEvent; -+ /** -+ * Produces an ack callback to emit with an event. -+ * -+ * @private -+ */ -+ private ack; -+ /** -+ * Called upon a server acknowlegement. -+ * -+ * @param packet -+ * @private -+ */ -+ private onack; -+ /** -+ * Called upon server connect. -+ * -+ * @private -+ */ -+ private onconnect; -+ /** -+ * Emit buffered events (received and emitted). -+ * -+ * @private -+ */ -+ private emitBuffered; -+ /** -+ * Called upon server disconnect. -+ * -+ * @private -+ */ -+ private ondisconnect; -+ /** -+ * Called upon forced client/server side disconnections, -+ * this method ensures the manager stops tracking us and -+ * that reconnections don't get triggered for this. -+ * -+ * @private -+ */ -+ private destroy; -+ /** -+ * Disconnects the socket manually. In that case, the socket will not try to reconnect. -+ * -+ * If this is the last active Socket instance of the {@link Manager}, the low-level connection will be closed. -+ * -+ * @example -+ * const socket = io(); -+ * -+ * socket.on("disconnect", (reason) => { -+ * // console.log(reason); prints "io client disconnect" -+ * }); -+ * -+ * socket.disconnect(); -+ * -+ * @return self -+ */ -+ disconnect(): this; -+ /** -+ * Alias for {@link disconnect()}. -+ * -+ * @return self -+ */ -+ close(): this; -+ /** -+ * Sets the compress flag. -+ * -+ * @example -+ * socket.compress(false).emit("hello"); -+ * -+ * @param compress - if `true`, compresses the sending data -+ * @return self -+ */ -+ compress(compress: boolean): this; -+ /** -+ * Sets a modifier for a subsequent event emission that the event message will be dropped when this socket is not -+ * ready to send messages. -+ * -+ * @example -+ * socket.volatile.emit("hello"); // the server may or may not receive it -+ * -+ * @returns self -+ */ -+ get volatile(): this; -+ /** -+ * Sets a modifier for a subsequent event emission that the callback will be called with an error when the -+ * given number of milliseconds have elapsed without an acknowledgement from the server: -+ * -+ * @example -+ * socket.timeout(5000).emit("my-event", (err) => { -+ * if (err) { -+ * // the server did not acknowledge the event in the given delay -+ * } -+ * }); -+ * -+ * @returns self -+ */ -+ timeout(timeout: number): Socket>; -+ /** -+ * Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the -+ * callback. -+ * -+ * @example -+ * socket.onAny((event, ...args) => { -+ * console.log(`got ${event}`); -+ * }); -+ * -+ * @param listener -+ */ -+ onAny(listener: (...args: any[]) => void): this; -+ /** -+ * Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the -+ * callback. The listener is added to the beginning of the listeners array. -+ * -+ * @example -+ * socket.prependAny((event, ...args) => { -+ * console.log(`got event ${event}`); -+ * }); -+ * -+ * @param listener -+ */ -+ prependAny(listener: (...args: any[]) => void): this; -+ /** -+ * Removes the listener that will be fired when any event is emitted. -+ * -+ * @example -+ * const catchAllListener = (event, ...args) => { -+ * console.log(`got event ${event}`); -+ * } -+ * -+ * socket.onAny(catchAllListener); -+ * -+ * // remove a specific listener -+ * socket.offAny(catchAllListener); -+ * -+ * // or remove all listeners -+ * socket.offAny(); -+ * -+ * @param listener -+ */ -+ offAny(listener?: (...args: any[]) => void): this; -+ /** -+ * Returns an array of listeners that are listening for any event that is specified. This array can be manipulated, -+ * e.g. to remove listeners. -+ */ -+ listenersAny(): ((...args: any[]) => void)[]; -+ /** -+ * Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the -+ * callback. -+ * -+ * Note: acknowledgements sent to the server are not included. -+ * -+ * @example -+ * socket.onAnyOutgoing((event, ...args) => { -+ * console.log(`sent event ${event}`); -+ * }); -+ * -+ * @param listener -+ */ -+ onAnyOutgoing(listener: (...args: any[]) => void): this; -+ /** -+ * Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the -+ * callback. The listener is added to the beginning of the listeners array. -+ * -+ * Note: acknowledgements sent to the server are not included. -+ * -+ * @example -+ * socket.prependAnyOutgoing((event, ...args) => { -+ * console.log(`sent event ${event}`); -+ * }); -+ * -+ * @param listener -+ */ -+ prependAnyOutgoing(listener: (...args: any[]) => void): this; -+ /** -+ * Removes the listener that will be fired when any event is emitted. -+ * -+ * @example -+ * const catchAllListener = (event, ...args) => { -+ * console.log(`sent event ${event}`); -+ * } -+ * -+ * socket.onAnyOutgoing(catchAllListener); -+ * -+ * // remove a specific listener -+ * socket.offAnyOutgoing(catchAllListener); -+ * -+ * // or remove all listeners -+ * socket.offAnyOutgoing(); -+ * -+ * @param [listener] - the catch-all listener (optional) -+ */ -+ offAnyOutgoing(listener?: (...args: any[]) => void): this; -+ /** -+ * Returns an array of listeners that are listening for any event that is specified. This array can be manipulated, -+ * e.g. to remove listeners. -+ */ -+ listenersAnyOutgoing(): ((...args: any[]) => void)[]; -+ /** -+ * Notify the listeners for each packet sent -+ * -+ * @param packet -+ * -+ * @private -+ */ -+ private notifyOutgoingListeners; -+} -+export declare namespace Socket { -+ type DisconnectReason = "io server disconnect" | "io client disconnect" | "ping timeout" | "transport close" | "transport error" | "parse error"; -+} -+export {}; -diff --git a/build/cjs/url.d.ts b/build/cjs/url.d.ts -new file mode 100644 -index 0000000000000000000000000000000000000000..d2d669e633daebb2113b1c9e0bbc099cba39c648 ---- /dev/null -+++ b/build/cjs/url.d.ts -@@ -0,0 +1,33 @@ -+declare type ParsedUrl = { -+ source: string; -+ protocol: string; -+ authority: string; -+ userInfo: string; -+ user: string; -+ password: string; -+ host: string; -+ port: string; -+ relative: string; -+ path: string; -+ directory: string; -+ file: string; -+ query: string; -+ anchor: string; -+ pathNames: Array; -+ queryKey: { -+ [key: string]: string; -+ }; -+ id: string; -+ href: string; -+}; -+/** -+ * URL parser. -+ * -+ * @param uri - url -+ * @param path - the request path of the connection -+ * @param loc - An object meant to mimic window.location. -+ * Defaults to window.location. -+ * @public -+ */ -+export declare function url(uri: string | ParsedUrl, path?: string, loc?: Location): ParsedUrl; -+export {}; -diff --git a/package.json b/package.json -index 07c4f86c55ba39b4b55725a42a0d1d6276b88d21..6ca59177b8ef8fe139558cccb4783b78ad75bffc 100644 ---- a/package.json -+++ b/package.json -@@ -22,12 +22,15 @@ - "./dist/socket.io.js": "./dist/socket.io.js", - "./dist/socket.io.js.map": "./dist/socket.io.js.map", - ".": { -- "types": "./build/esm/index.d.ts", - "import": { -+ "types": "./build/esm/index.d.ts", - "node": "./build/esm-debug/index.js", - "default": "./build/esm/index.js" - }, -- "require": "./build/cjs/index.js" -+ "require": { -+ "types": "./build/cjs/index.d.ts", -+ "default": "./build/cjs/index.js" -+ } - }, - "./debug": { - "import": "./build/esm-debug/index.js", \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5b7bf2e666ca..61f94f67eaa6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,9 +13,6 @@ patchedDependencies: '@microsoft/api-extractor@7.39.1': hash: 5jttfhtxwdhxb7mhu7m3cyak6i path: patches/@microsoft__api-extractor@7.39.1.patch - socket.io-client@4.7.2: - hash: p7f5djbjd3zgfisasebtom74n4 - path: patches/socket.io-client@4.7.2.patch tsc-multi@1.1.0: hash: bwju7gmfuwum2ryv7w6vqpkpiy path: patches/tsc-multi@1.1.0.patch @@ -7422,7 +7419,7 @@ importers: moment: ^2.21.0 prettier: ~3.0.3 rimraf: ^4.4.0 - socket.io-client: ^4.6.1 + socket.io-client: ^4.7.3 tsc-multi: ^1.1.0 typescript: ~5.1.6 dependencies: @@ -7454,7 +7451,7 @@ importers: moment: 2.29.4 prettier: 3.0.3 rimraf: 4.4.1 - socket.io-client: 4.7.2_p7f5djbjd3zgfisasebtom74n4 + socket.io-client: 4.7.4 tsc-multi: 1.1.0_bwju7gmfuwum2ryv7w6vqpkpiy_typescript@5.1.6 typescript: 5.1.6 @@ -7592,7 +7589,7 @@ importers: moment: ^2.21.0 prettier: ~3.0.3 rimraf: ^4.4.0 - socket.io-client: ^4.6.1 + socket.io-client: ^4.7.3 tsc-multi: ^1.1.0 typescript: ~5.1.6 url: ^0.11.0 @@ -7639,7 +7636,7 @@ importers: moment: 2.29.4 prettier: 3.0.3 rimraf: 4.4.1 - socket.io-client: 4.7.2_p7f5djbjd3zgfisasebtom74n4 + socket.io-client: 4.7.4 tsc-multi: 1.1.0_bwju7gmfuwum2ryv7w6vqpkpiy_typescript@5.1.6 typescript: 5.1.6 @@ -7680,7 +7677,7 @@ importers: prettier: ~3.0.3 rimraf: ^4.4.0 sinon: ^7.4.2 - socket.io-client: ^4.6.1 + socket.io-client: ^4.7.3 tsc-multi: ^1.1.0 typescript: ~5.1.6 uuid: ^9.0.0 @@ -7697,7 +7694,7 @@ importers: '@fluidframework/protocol-definitions': 3.2.0-231454 '@fluidframework/telemetry-utils': link:../../utils/telemetry-utils node-fetch: 2.7.0 - socket.io-client: 4.7.2_p7f5djbjd3zgfisasebtom74n4 + socket.io-client: 4.7.4 uuid: 9.0.1 devDependencies: '@arethetypeswrong/cli': 0.13.3 @@ -7915,7 +7912,7 @@ importers: prettier: ~3.0.3 rimraf: ^4.4.0 sinon: ^7.4.2 - socket.io-client: ^4.6.1 + socket.io-client: ^4.7.3 tsc-multi: ^1.1.0 typescript: ~5.1.6 url-parse: ^1.5.8 @@ -7934,7 +7931,7 @@ importers: '@fluidframework/telemetry-utils': link:../../utils/telemetry-utils cross-fetch: 3.1.8 json-stringify-safe: 5.0.1 - socket.io-client: 4.7.2_p7f5djbjd3zgfisasebtom74n4 + socket.io-client: 4.7.4 url-parse: 1.5.10 uuid: 9.0.1 devDependencies: @@ -17069,7 +17066,7 @@ packages: '@fluidframework/protocol-definitions': 3.1.0 '@fluidframework/telemetry-utils': 2.0.0-internal.8.0.0 node-fetch: 2.7.0 - socket.io-client: 4.7.2_p7f5djbjd3zgfisasebtom74n4 + socket.io-client: 4.7.4 uuid: 9.0.1 transitivePeerDependencies: - bufferutil @@ -17208,7 +17205,7 @@ packages: '@fluidframework/telemetry-utils': 2.0.0-internal.8.0.0 cross-fetch: 3.1.8 json-stringify-safe: 5.0.1 - socket.io-client: 4.7.2_p7f5djbjd3zgfisasebtom74n4 + socket.io-client: 4.7.4 url-parse: 1.5.10 uuid: 9.0.1 transitivePeerDependencies: @@ -17235,7 +17232,7 @@ packages: '@fluidframework/telemetry-utils': 2.0.0-internal.8.0.0 cross-fetch: 3.1.8 json-stringify-safe: 5.0.1 - socket.io-client: 4.7.2_p7f5djbjd3zgfisasebtom74n4 + socket.io-client: 4.7.4 url-parse: 1.5.10 uuid: 9.0.1 transitivePeerDependencies: @@ -40853,8 +40850,8 @@ packages: - bufferutil - utf-8-validate - /socket.io-client/4.7.2_p7f5djbjd3zgfisasebtom74n4: - resolution: {integrity: sha512-vtA0uD4ibrYD793SOIAwlo8cj6haOeMHrGvwPxJsxH7CeIksqJ+3Zc06RvWTIFgiSqx4A3sOnTXpfAEE2Zyz6w==} + /socket.io-client/4.7.4: + resolution: {integrity: sha512-wh+OkeF0rAVCrABWQBaEjLfb7DVPotMbu0cgWgyR0v6eA4EoVnAwcIeIbcdTE3GT/H3kbdLl7OoH2+asoDRIIg==} engines: {node: '>=10.0.0'} dependencies: '@socket.io/component-emitter': 3.1.0 @@ -40865,7 +40862,6 @@ packages: - bufferutil - supports-color - utf-8-validate - patched: true /socket.io-parser/4.2.4: resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==}