Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions packages/socket.io-client/lib/socket.ts
Original file line number Diff line number Diff line change
Expand Up @@ -111,9 +111,11 @@ export type DisconnectDescription =
context?: unknown; // context should be typed as CloseEvent | XMLHttpRequest, but these types are not available on non-browser platforms
};

type ConnectError = Error & { data?: any };

interface SocketReservedEvents {
connect: () => void;
connect_error: (err: Error) => void;
connect_error: (err: ConnectError) => void;
disconnect: (
reason: Socket.DisconnectReason,
description?: DisconnectDescription,
Expand Down Expand Up @@ -734,8 +736,7 @@ export class Socket<

case PacketType.CONNECT_ERROR:
this.destroy();
const err = new Error(packet.data.message);
// @ts-ignore
const err: ConnectError = new Error(packet.data.message);
err.data = packet.data.data;
this.emitReserved("connect_error", err);
break;
Expand Down
11 changes: 11 additions & 0 deletions packages/socket.io-client/test/socket.ts
Original file line number Diff line number Diff line change
Expand Up @@ -286,6 +286,17 @@ describe("socket", () => {
});
});

it("should forward the data attached to a middleware error", () => {
return wrap((done) => {
const socket = io(BASE_URL + "/no-with-data", { forceNew: true });
socket.on("connect_error", (err) => {
expect(err.data).to.eql({ code: "UNAUTHORIZED" });
socket.disconnect();
done();
});
});
});

it("should not try to reconnect after a middleware failure", () => {
return wrap((done) => {
const socket = io(BASE_URL + "/no", {
Expand Down
8 changes: 7 additions & 1 deletion packages/socket.io-client/test/support/server.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Server } from "socket.io";
import { ExtendedError, Server } from "socket.io";
import expect = require("expect.js");

export function createServer() {
Expand Down Expand Up @@ -44,6 +44,12 @@ export function createServer() {
next(new Error("Auth failed (custom namespace)"));
});

server.of("/no-with-data").use((socket, next) => {
const err: ExtendedError = new Error("Auth failed (with data)");
err.data = { code: "UNAUTHORIZED" };
next(err);
});

server.on("connection", (socket) => {
// simple test
socket.on("hi", () => {
Expand Down
2 changes: 1 addition & 1 deletion packages/socket.io-client/test/typed-events.test-d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ describe("typed events", () => {
expectError(socket.on("connect", (arg) => {}));

socket.on("connect_error", (err) => {
expectType<Error>(err);
expectType<Error & { data?: any }>(err);
});

socket.on("disconnect", (reason) => {
Expand Down