Skip to content

Commit 53c7374

Browse files
fix: emit a connect_error event upon connection failure
Related: socketio/socket.io#3734
1 parent b83f89c commit 53c7374

File tree

2 files changed

+38
-0
lines changed

2 files changed

+38
-0
lines changed

lib/socket.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ export class Socket extends Emitter {
8484
this.subs = [
8585
on(io, "open", this.onopen.bind(this)),
8686
on(io, "packet", this.onpacket.bind(this)),
87+
on(io, "error", this.onerror.bind(this)),
8788
on(io, "close", this.onclose.bind(this)),
8889
];
8990
}
@@ -204,6 +205,18 @@ export class Socket extends Emitter {
204205
}
205206
}
206207

208+
/**
209+
* Called upon engine or manager `error`.
210+
*
211+
* @param err
212+
* @private
213+
*/
214+
private onerror(err: Error) {
215+
if (!this.connected) {
216+
super.emit("connect_error", err);
217+
}
218+
}
219+
207220
/**
208221
* Called upon engine `close`.
209222
*

test/socket.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,31 @@ describe("socket", function () {
5050
}, 300);
5151
});
5252

53+
it("fire a connect_error event when the connection cannot be established", (done) => {
54+
const socket = io("http://localhost:9823", {
55+
forceNew: true,
56+
timeout: 100,
57+
});
58+
socket.on("connect_error", () => {
59+
socket.close();
60+
done();
61+
});
62+
});
63+
64+
it("doesn't fire a connect_error event when the connection is already established", (done) => {
65+
const socket = io({ forceNew: true });
66+
socket.on("connect", () => {
67+
socket.io.engine.close(true);
68+
});
69+
socket.on("connect_error", () => {
70+
done(new Error("should not happen"));
71+
});
72+
setTimeout(() => {
73+
socket.close();
74+
done();
75+
}, 300);
76+
});
77+
5378
it("should change socket.id upon reconnection", (done) => {
5479
const socket = io({ forceNew: true });
5580
socket.on("connect", () => {

0 commit comments

Comments
 (0)