diff --git a/packages/engine.io-client/lib/socket.ts b/packages/engine.io-client/lib/socket.ts index eb2fa86371..46d7a4ccd0 100644 --- a/packages/engine.io-client/lib/socket.ts +++ b/packages/engine.io-client/lib/socket.ts @@ -1167,7 +1167,8 @@ export class Socket extends SocketWithUpgrade { constructor(uri?: string, opts?: SocketOptions); constructor(opts: SocketOptions); constructor(uri?: string | SocketOptions, opts: SocketOptions = {}) { - const o = typeof uri === "object" ? uri : opts; + const isOptionsOnly = typeof uri === "object"; + const o = isOptionsOnly ? { ...uri } : { ...opts }; if ( !o.transports || @@ -1178,6 +1179,9 @@ export class Socket extends SocketWithUpgrade { .filter((t) => !!t); } - super(uri as string, o as BaseSocketOptions); + super( + isOptionsOnly ? (o as BaseSocketOptions) : uri, + o as BaseSocketOptions, + ); } } diff --git a/packages/engine.io-client/test/socket.js b/packages/engine.io-client/test/socket.js index 9e87e36170..621c895009 100644 --- a/packages/engine.io-client/test/socket.js +++ b/packages/engine.io-client/test/socket.js @@ -23,6 +23,19 @@ describe("Socket", function () { }); }); + it("should not mutate the caller's transports option", () => { + const optsWithUri = { transports: ["websocket", "polling"] }; + const optsWithoutUri = { transports: ["polling"] }; + + const socketWithUri = new Socket("http://localhost", optsWithUri); + const socketWithoutUri = new Socket(optsWithoutUri); + + expect(optsWithUri.transports).to.eql(["websocket", "polling"]); + expect(optsWithoutUri.transports).to.eql(["polling"]); + socketWithUri.close(); + socketWithoutUri.close(); + }); + it("throws an error when no transports are available", (done) => { const socket = new Socket({ transports: [] }); let errorMessage = "";