From fb6b0efec9fcc154dc9131189d78fcfa0a6c7f46 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Tue, 11 May 2021 09:27:52 +0200 Subject: [PATCH] chore(release): 4.1.0 Diff: https://github.com/socketio/socket.io/compare/4.0.2...4.1.0 --- CHANGELOG.md | 16 + client-dist/socket.io.js | 364 ++++++++++++----------- client-dist/socket.io.js.map | 2 +- client-dist/socket.io.min.js | 4 +- client-dist/socket.io.min.js.map | 2 +- client-dist/socket.io.msgpack.min.js | 4 +- client-dist/socket.io.msgpack.min.js.map | 2 +- package-lock.json | 16 +- package.json | 4 +- 9 files changed, 224 insertions(+), 190 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 49ade83d03..3ace70f89f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,19 @@ +# [4.1.0](https://github.com/socketio/socket.io/compare/4.0.2...4.1.0) (2021-05-11) + + +### Features + +* add support for inter-server communication ([93cce05](https://github.com/socketio/socket.io/commit/93cce05fb3faf91f21fa71212275c776aa161107)) +* notify upon namespace creation ([499c892](https://github.com/socketio/socket.io/commit/499c89250d2db1ab7725ab2b74840e188c267c46)) +* add a "connection_error" event ([7096e98](https://github.com/socketio/engine.io/commit/7096e98a02295a62c8ea2aa56461d4875887092d), from `engine.io`) +* add the "initial_headers" and "headers" events ([2527543](https://github.com/socketio/engine.io/commit/252754353a0e88eb036ebb3082e9d6a9a5f497db), from `engine.io`) + + +### Performance Improvements + +* add support for the "wsPreEncoded" writing option ([dc381b7](https://github.com/socketio/socket.io/commit/dc381b72c6b2f8172001dedd84116122e4cc95b3)) + + ## [4.0.2](https://github.com/socketio/socket.io/compare/4.0.1...4.0.2) (2021-05-06) diff --git a/client-dist/socket.io.js b/client-dist/socket.io.js index 43e2c1d075..c05e62675e 100644 --- a/client-dist/socket.io.js +++ b/client-dist/socket.io.js @@ -1,5 +1,5 @@ /*! - * Socket.IO v4.0.2 + * Socket.IO v4.1.0 * (c) 2014-2021 Guillermo Rauch * Released under the MIT License. */ @@ -2571,7 +2571,8 @@ var Socket = /*#__PURE__*/function (_Emitter) { perMessageDeflate: { threshold: 1024 }, - transportOptions: {} + transportOptions: {}, + closeOnBeforeunload: true }, opts); _this.opts.path = _this.opts.path.replace(/\/$/, "") + "/"; @@ -2588,14 +2589,19 @@ var Socket = /*#__PURE__*/function (_Emitter) { _this.pingTimeoutTimer = null; if (typeof addEventListener === "function") { - addEventListener("beforeunload", function () { - if (_this.transport) { - // silently close the transport - _this.transport.removeAllListeners(); - - _this.transport.close(); - } - }, false); + if (_this.opts.closeOnBeforeunload) { + // Firefox closes the connection when the "beforeunload" event is emitted but not Chrome. This event listener + // ensures every browser behaves the same (no "disconnect" event at the Socket.IO level when the page is + // closed/reloaded) + addEventListener("beforeunload", function () { + if (_this.transport) { + // silently close the transport + _this.transport.removeAllListeners(); + + _this.transport.close(); + } + }, false); + } if (_this.hostname !== "localhost") { _this.offlineEventListener = function () { @@ -2651,15 +2657,16 @@ var Socket = /*#__PURE__*/function (_Emitter) { }, { key: "open", value: function open() { + var _this2 = this; + var transport; if (this.opts.rememberUpgrade && Socket.priorWebsocketSuccess && this.transports.indexOf("websocket") !== -1) { transport = "websocket"; } else if (0 === this.transports.length) { // Emit error on next tick so it can be listened to - var self = this; setTimeout(function () { - self.emit("error", "No transports available"); + _this2.emit("error", "No transports available"); }, 0); return; } else { @@ -2689,8 +2696,9 @@ var Socket = /*#__PURE__*/function (_Emitter) { }, { key: "setTransport", value: function setTransport(transport) { + var _this3 = this; + debug("setting transport %s", transport.name); - var self = this; if (this.transport) { debug("clearing existing transport %s", this.transport.name); @@ -2700,14 +2708,8 @@ var Socket = /*#__PURE__*/function (_Emitter) { this.transport = transport; // set up transport listeners - transport.on("drain", function () { - self.onDrain(); - }).on("packet", function (packet) { - self.onPacket(packet); - }).on("error", function (e) { - self.onError(e); - }).on("close", function () { - self.onClose("transport close"); + transport.on("drain", this.onDrain.bind(this)).on("packet", this.onPacket.bind(this)).on("error", this.onError.bind(this)).on("close", function () { + _this3.onClose("transport close"); }); } /** @@ -2720,20 +2722,16 @@ var Socket = /*#__PURE__*/function (_Emitter) { }, { key: "probe", value: function probe(name) { + var _this4 = this; + debug('probing transport "%s"', name); var transport = this.createTransport(name, { probe: 1 }); var failed = false; - var self = this; Socket.priorWebsocketSuccess = false; - function onTransportOpen() { - if (self.onlyBinaryUpgrades) { - var upgradeLosesBinary = !this.supportsBinary && self.transport.supportsBinary; - failed = failed || upgradeLosesBinary; - } - + var onTransportOpen = function onTransportOpen() { if (failed) return; debug('probe transport "%s" opened', name); transport.send([{ @@ -2745,33 +2743,42 @@ var Socket = /*#__PURE__*/function (_Emitter) { if ("pong" === msg.type && "probe" === msg.data) { debug('probe transport "%s" pong', name); - self.upgrading = true; - self.emit("upgrading", transport); + _this4.upgrading = true; + + _this4.emit("upgrading", transport); + if (!transport) return; Socket.priorWebsocketSuccess = "websocket" === transport.name; - debug('pausing current transport "%s"', self.transport.name); - self.transport.pause(function () { + debug('pausing current transport "%s"', _this4.transport.name); + + _this4.transport.pause(function () { if (failed) return; - if ("closed" === self.readyState) return; + if ("closed" === _this4.readyState) return; debug("changing transport and sending upgrade packet"); cleanup(); - self.setTransport(transport); + + _this4.setTransport(transport); + transport.send([{ type: "upgrade" }]); - self.emit("upgrade", transport); + + _this4.emit("upgrade", transport); + transport = null; - self.upgrading = false; - self.flush(); + _this4.upgrading = false; + + _this4.flush(); }); } else { debug('probe transport "%s" failed', name); var err = new Error("probe error"); err.transport = transport.name; - self.emit("upgradeError", err); + + _this4.emit("upgradeError", err); } }); - } + }; function freezeTransport() { if (failed) return; // Any callback called by transport should be ignored since now @@ -2783,13 +2790,14 @@ var Socket = /*#__PURE__*/function (_Emitter) { } // Handle any error that happens while probing - function onerror(err) { + var onerror = function onerror(err) { var error = new Error("probe error: " + err); error.transport = transport.name; freezeTransport(); debug('probe transport "%s" failed because of error: %s', name, err); - self.emit("upgradeError", error); - } + + _this4.emit("upgradeError", error); + }; function onTransportClose() { onerror("transport closed"); @@ -2809,13 +2817,15 @@ var Socket = /*#__PURE__*/function (_Emitter) { } // Remove all listeners on the transport and on self - function cleanup() { + var cleanup = function cleanup() { transport.removeListener("open", onTransportOpen); transport.removeListener("error", onerror); transport.removeListener("close", onTransportClose); - self.removeListener("close", onclose); - self.removeListener("upgrading", onupgrade); - } + + _this4.removeListener("close", onclose); + + _this4.removeListener("upgrading", onupgrade); + }; transport.once("open", onTransportOpen); transport.once("error", onerror); @@ -2921,11 +2931,11 @@ var Socket = /*#__PURE__*/function (_Emitter) { }, { key: "resetPingTimeout", value: function resetPingTimeout() { - var _this2 = this; + var _this5 = this; clearTimeout(this.pingTimeoutTimer); this.pingTimeoutTimer = setTimeout(function () { - _this2.onClose("ping timeout"); + _this5.onClose("ping timeout"); }, this.pingInterval + this.pingTimeout); if (this.opts.autoUnref) { @@ -3041,14 +3051,37 @@ var Socket = /*#__PURE__*/function (_Emitter) { }, { key: "close", value: function close() { - var self = this; + var _this6 = this; + + var close = function close() { + _this6.onClose("forced close"); + + debug("socket closing - telling transport to close"); + + _this6.transport.close(); + }; + + var cleanupAndClose = function cleanupAndClose() { + _this6.removeListener("upgrade", cleanupAndClose); + + _this6.removeListener("upgradeError", cleanupAndClose); + + close(); + }; + + var waitForUpgrade = function waitForUpgrade() { + // wait for upgrade to finish since we can't send packets while pausing a transport + _this6.once("upgrade", cleanupAndClose); + + _this6.once("upgradeError", cleanupAndClose); + }; if ("opening" === this.readyState || "open" === this.readyState) { this.readyState = "closing"; if (this.writeBuffer.length) { this.once("drain", function () { - if (this.upgrading) { + if (_this6.upgrading) { waitForUpgrade(); } else { close(); @@ -3061,24 +3094,6 @@ var Socket = /*#__PURE__*/function (_Emitter) { } } - function close() { - self.onClose("forced close"); - debug("socket closing - telling transport to close"); - self.transport.close(); - } - - function cleanupAndClose() { - self.removeListener("upgrade", cleanupAndClose); - self.removeListener("upgradeError", cleanupAndClose); - close(); - } - - function waitForUpgrade() { - // wait for upgrade to finish since we can't send packets while pausing a transport - self.once("upgrade", cleanupAndClose); - self.once("upgradeError", cleanupAndClose); - } - return this; } /** @@ -3105,8 +3120,7 @@ var Socket = /*#__PURE__*/function (_Emitter) { key: "onClose", value: function onClose(reason, desc) { if ("opening" === this.readyState || "open" === this.readyState || "closing" === this.readyState) { - debug('socket close with reason: "%s"', reason); - var self = this; // clear timers + debug('socket close with reason: "%s"', reason); // clear timers clearTimeout(this.pingIntervalTimer); clearTimeout(this.pingTimeoutTimer); // stop event from firing again for transport @@ -3129,8 +3143,8 @@ var Socket = /*#__PURE__*/function (_Emitter) { this.emit("close", reason, desc); // clean buffers after, so users can still // grab the buffers on `close` event - self.writeBuffer = []; - self.prevBufferLen = 0; + this.writeBuffer = []; + this.prevBufferLen = 0; } } /** @@ -3494,11 +3508,7 @@ var JSONPPolling = /*#__PURE__*/function (_Polling) { _this.index = callbacks.length; // add callback to jsonp global - var self = _assertThisInitialized(_this); - - callbacks.push(function (msg) { - self.onData(msg); - }); // append to query string + callbacks.push(_this.onData.bind(_assertThisInitialized(_this))); // append to query string _this.query.j = _this.index; return _this; @@ -3542,7 +3552,8 @@ var JSONPPolling = /*#__PURE__*/function (_Polling) { }, { key: "doPoll", value: function doPoll() { - var self = this; + var _this2 = this; + var script = document.createElement("script"); if (this.script) { @@ -3554,7 +3565,7 @@ var JSONPPolling = /*#__PURE__*/function (_Polling) { script.src = this.uri(); script.onerror = function (e) { - self.onError("jsonp poll error", e); + _this2.onError("jsonp poll error", e); }; var insertAt = document.getElementsByTagName("script")[0]; @@ -3587,7 +3598,8 @@ var JSONPPolling = /*#__PURE__*/function (_Polling) { }, { key: "doWrite", value: function doWrite(data, fn) { - var self = this; + var _this3 = this; + var iframe; if (!this.form) { @@ -3615,29 +3627,31 @@ var JSONPPolling = /*#__PURE__*/function (_Polling) { fn(); } - function initIframe() { - if (self.iframe) { + var initIframe = function initIframe() { + if (_this3.iframe) { try { - self.form.removeChild(self.iframe); + _this3.form.removeChild(_this3.iframe); } catch (e) { - self.onError("jsonp polling iframe removal error", e); + _this3.onError("jsonp polling iframe removal error", e); } } try { // ie6 dynamic iframes with target="" support (thanks Chris Lambacher) - var html = '