From 7c9f8116d0cdc0632de7552bdcc6735fe2befb4c Mon Sep 17 00:00:00 2001 From: snowingfox <1503401882@qq.com> Date: Tue, 11 Aug 2026 23:25:09 +0000 Subject: [PATCH] fix(socket.io-client): export reserved-events types to fix ts(4023) on declaration emit Fixes #5307 --- packages/engine.io-client/lib/globals.node.ts | 2 +- packages/engine.io-client/lib/index.ts | 11 +++++-- packages/engine.io-client/lib/socket.ts | 6 ++-- packages/engine.io-client/lib/transport.ts | 2 +- packages/socket.io-client/lib/index.ts | 11 +++++-- packages/socket.io-client/lib/manager.ts | 2 +- packages/socket.io-client/lib/socket.ts | 2 +- .../test/types/ts4023.test.ts | 18 +++++++++++ .../socket.io-client/test/types/tsconfig.json | 30 +++++++++++++++++++ 9 files changed, 73 insertions(+), 11 deletions(-) create mode 100644 packages/socket.io-client/test/types/ts4023.test.ts create mode 100644 packages/socket.io-client/test/types/tsconfig.json diff --git a/packages/engine.io-client/lib/globals.node.ts b/packages/engine.io-client/lib/globals.node.ts index 77d65969b7..a39ce4b7f7 100644 --- a/packages/engine.io-client/lib/globals.node.ts +++ b/packages/engine.io-client/lib/globals.node.ts @@ -6,7 +6,7 @@ export function createCookieJar() { return new CookieJar(); } -interface Cookie { +export interface Cookie { name: string; value: string; expires?: Date; diff --git a/packages/engine.io-client/lib/index.ts b/packages/engine.io-client/lib/index.ts index 80c5041fb4..17cb14276e 100644 --- a/packages/engine.io-client/lib/index.ts +++ b/packages/engine.io-client/lib/index.ts @@ -2,16 +2,23 @@ import { Socket } from "./socket.js"; export { Socket }; export { + HandshakeData, SocketOptions, + SocketReservedEvents, SocketWithoutUpgrade, SocketWithUpgrade, + WriteOptions, } from "./socket.js"; export const protocol = Socket.protocol; -export { Transport, TransportError } from "./transport.js"; +export { + Transport, + TransportError, + TransportReservedEvents, +} from "./transport.js"; export { transports } from "./transports/index.js"; export { installTimerFunctions } from "./util.js"; export { parse } from "./contrib/parseuri.js"; -export { nextTick } from "./globals.node.js"; +export { Cookie, nextTick } from "./globals.node.js"; export { Fetch } from "./transports/polling-fetch.js"; export { XHR as NodeXHR } from "./transports/polling-xhr.node.js"; diff --git a/packages/engine.io-client/lib/socket.ts b/packages/engine.io-client/lib/socket.ts index 47303ab6d0..b548ced5ab 100644 --- a/packages/engine.io-client/lib/socket.ts +++ b/packages/engine.io-client/lib/socket.ts @@ -266,7 +266,7 @@ type BaseSocketOptions = Omit & { transports: TransportCtor[]; }; -interface HandshakeData { +export interface HandshakeData { sid: string; upgrades: string[]; pingInterval: number; @@ -274,7 +274,7 @@ interface HandshakeData { maxPayload: number; } -interface SocketReservedEvents { +export interface SocketReservedEvents { open: () => void; handshake: (data: HandshakeData) => void; packet: (packet: Packet) => void; @@ -295,7 +295,7 @@ interface SocketReservedEvents { type SocketState = "opening" | "open" | "closing" | "closed"; -interface WriteOptions { +export interface WriteOptions { compress?: boolean; } diff --git a/packages/engine.io-client/lib/transport.ts b/packages/engine.io-client/lib/transport.ts index ab72c70961..9bcd30d90c 100644 --- a/packages/engine.io-client/lib/transport.ts +++ b/packages/engine.io-client/lib/transport.ts @@ -25,7 +25,7 @@ export interface CloseDetails { context?: unknown; // context should be typed as CloseEvent | XMLHttpRequest, but these types are not available on non-browser platforms } -interface TransportReservedEvents { +export interface TransportReservedEvents { open: () => void; error: (err: TransportError) => void; packet: (packet: Packet) => void; diff --git a/packages/socket.io-client/lib/index.ts b/packages/socket.io-client/lib/index.ts index 98e94c528e..f6699f07c2 100644 --- a/packages/socket.io-client/lib/index.ts +++ b/packages/socket.io-client/lib/index.ts @@ -1,6 +1,11 @@ import { url } from "./url.js"; -import { Manager, ManagerOptions } from "./manager.js"; -import { DisconnectDescription, Socket, SocketOptions } from "./socket.js"; +import { Manager, ManagerOptions, ManagerReservedEvents } from "./manager.js"; +import { + DisconnectDescription, + Socket, + SocketOptions, + SocketReservedEvents, +} from "./socket.js"; import debugModule from "debug"; // debug() const debug = debugModule("socket.io-client"); // debug() @@ -94,8 +99,10 @@ export { DisconnectDescription, Manager, ManagerOptions, + ManagerReservedEvents, Socket, SocketOptions, + SocketReservedEvents, lookup as io, lookup as connect, lookup as default, diff --git a/packages/socket.io-client/lib/manager.ts b/packages/socket.io-client/lib/manager.ts index 2b56a23127..b9597bf233 100644 --- a/packages/socket.io-client/lib/manager.ts +++ b/packages/socket.io-client/lib/manager.ts @@ -86,7 +86,7 @@ export interface ManagerOptions extends EngineOptions { parser: any; } -interface ManagerReservedEvents { +export interface ManagerReservedEvents { open: () => void; error: (err: Error) => void; ping: () => void; diff --git a/packages/socket.io-client/lib/socket.ts b/packages/socket.io-client/lib/socket.ts index a1713a187b..97650ffe4e 100644 --- a/packages/socket.io-client/lib/socket.ts +++ b/packages/socket.io-client/lib/socket.ts @@ -111,7 +111,7 @@ export type DisconnectDescription = context?: unknown; // context should be typed as CloseEvent | XMLHttpRequest, but these types are not available on non-browser platforms }; -interface SocketReservedEvents { +export interface SocketReservedEvents { connect: () => void; connect_error: (err: Error) => void; disconnect: ( diff --git a/packages/socket.io-client/test/types/ts4023.test.ts b/packages/socket.io-client/test/types/ts4023.test.ts new file mode 100644 index 0000000000..80c99356c0 --- /dev/null +++ b/packages/socket.io-client/test/types/ts4023.test.ts @@ -0,0 +1,18 @@ +import { io } from "socket.io-client"; + +// Reproduces https://github.com/socketio/socket.io/issues/5307 +// +// The public types of Socket / Manager (and the underlying Engine.IO Socket and +// its Transport) are parameterized by "reserved events" maps (SocketReservedEvents, +// ManagerReservedEvents, TransportReservedEvents, ...) that were not exported. +// An exported value whose inferred type references those maps therefore cannot +// be named during declaration emit: `tsc --declaration` fails with ts(4023). +const socket = io("https://example.com"); + +// `listeners` / `write` return (or accept) types that reference the reserved-events +// maps, forcing the declaration emitter to name them. +export const socketListeners = socket.listeners; +export const managerListeners = socket.io.listeners; +export const engineListeners = socket.io.engine.listeners; +export const transportListeners = socket.io.engine.transport.listeners; +export const engineWrite = socket.io.engine.write; diff --git a/packages/socket.io-client/test/types/tsconfig.json b/packages/socket.io-client/test/types/tsconfig.json new file mode 100644 index 0000000000..9f0f3c8683 --- /dev/null +++ b/packages/socket.io-client/test/types/tsconfig.json @@ -0,0 +1,30 @@ +{ + "compilerOptions": { + "target": "es2018", + "module": "esnext", + "moduleResolution": "bundler", + "esModuleInterop": true, + "strict": false, + "skipLibCheck": true, + "declaration": true, + "noEmit": true, + "types": ["node"], + "lib": ["es2018", "dom"], + "paths": { + "@socket.io/component-emitter": [ + "../../../../packages/socket.io-component-emitter/lib/cjs/index.d.ts" + ], + "socket.io-client": [ + "../../../../packages/socket.io-client/lib/index.ts" + ], + "engine.io-client": [ + "../../../../packages/engine.io-client/lib/index.ts" + ], + "socket.io-parser": [ + "../../../../packages/socket.io-parser/lib/index.ts" + ], + "engine.io-parser": ["../../../../packages/engine.io-parser/lib/index.ts"] + } + }, + "include": ["ts4023.test.ts"] +}