Skip to content

Commit d291a4c

Browse files
fix: ignore packets when the transport is silently closed
In some cases, a "Transport not open" error could be thrown when the transport was silently closed in the onbeforeunload event (added in [1]). To reproduce: ```js window.addEventListener("unload", () => { socket.write("..."); }); ``` [1]: ed48b5d Related: socketio/socket.io#3838
1 parent fc5dc6b commit d291a4c

File tree

2 files changed

+33
-1
lines changed

2 files changed

+33
-1
lines changed

lib/transport.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
const parser = require("engine.io-parser");
22
const Emitter = require("component-emitter");
3+
const debug = require("debug")("engine.io-client:transport");
34

45
class Transport extends Emitter {
56
/**
@@ -70,7 +71,8 @@ class Transport extends Emitter {
7071
if ("open" === this.readyState) {
7172
this.write(packets);
7273
} else {
73-
throw new Error("Transport not open");
74+
// this might happen if the transport was silently closed in the beforeunload event handler
75+
debug("transport is not open, discarding packets");
7476
}
7577
}
7678

test/connection.js

+30
Original file line numberDiff line numberDiff line change
@@ -188,4 +188,34 @@ describe("connection", function() {
188188
});
189189
});
190190
}
191+
192+
if (env.browser && typeof addEventListener === "function") {
193+
it("should close the socket when receiving a beforeunload event", done => {
194+
const socket = new Socket();
195+
196+
const createEvent = name => {
197+
if (typeof Event === "function") {
198+
return new Event(name);
199+
} else {
200+
// polyfill for IE
201+
const event = document.createEvent("Event");
202+
event.initEvent(name, true, true);
203+
return event;
204+
}
205+
};
206+
207+
socket.on("open", () => {
208+
const handler = () => {
209+
expect(socket.transport.readyState).to.eql("closed");
210+
expect(() => socket.write("ignored")).to.not.throwException();
211+
212+
removeEventListener("beforeunload", handler, false);
213+
done();
214+
};
215+
216+
addEventListener("beforeunload", handler, false);
217+
dispatchEvent(createEvent("beforeunload"));
218+
});
219+
});
220+
}
191221
});

0 commit comments

Comments
 (0)