From 6494f61be0d38d267d77c30ea4f43941f97b1bc0 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Mon, 12 Oct 2020 14:08:17 +0200 Subject: [PATCH] feat: throw upon reserved event names These events cannot be used by the end users, because they are part of the Socket.IO public API, so using them will now throw an error explicitly. Related: https://github.com/socketio/socket.io/commit/f7ed81e5d23b6dd275dc1e28e616f8d77c7273f6 --- build/socket.js | 29 +++++++++++------------------ lib/socket.ts | 29 +++++++++++------------------ test/socket.js | 8 ++++++++ 3 files changed, 30 insertions(+), 36 deletions(-) diff --git a/build/socket.js b/build/socket.js index 2ca1d5805..7ccf9e869 100644 --- a/build/socket.js +++ b/build/socket.js @@ -12,25 +12,19 @@ const component_bind_1 = __importDefault(require("component-bind")); const has_binary2_1 = __importDefault(require("has-binary2")); const debug = require("debug")("socket.io-client:socket"); /** - * Internal events (blacklisted). + * Internal events. * These events can't be emitted by the user. * * @api private */ -const events = { +const RESERVED_EVENTS = { connect: 1, - connect_error: 1, - connect_timeout: 1, - connecting: 1, disconnect: 1, + disconnecting: 1, error: 1, - reconnect: 1, - reconnect_attempt: 1, - reconnect_failed: 1, - reconnect_error: 1, - reconnecting: 1, - ping: 1, - pong: 1, + // EventEmitter reserved events: https://nodejs.org/api/events.html#events_event_newlistener + newListener: 1, + removeListener: 1, }; class Socket extends component_emitter_1.default { /** @@ -88,7 +82,7 @@ class Socket extends component_emitter_1.default { this.io.open(); // ensure open if ("open" === this.io.readyState) this.onopen(); - this.emit("connecting"); + super.emit("connecting"); return this; } connect() { @@ -99,7 +93,7 @@ class Socket extends component_emitter_1.default { this.io.open(); // ensure open if ("open" === this.io.readyState) this.onopen(); - this.emit("connecting"); + super.emit("connecting"); return this; } /** @@ -123,9 +117,8 @@ class Socket extends component_emitter_1.default { * @api public */ emit(ev) { - if (events.hasOwnProperty(ev)) { - super.emit.apply(this, arguments); - return this; + if (RESERVED_EVENTS.hasOwnProperty(ev)) { + throw new Error('"' + ev + '" is a reserved event name'); } const args = to_array_1.default(arguments); const packet = { @@ -294,7 +287,7 @@ class Socket extends component_emitter_1.default { this.id = id; this.connected = true; this.disconnected = false; - this.emit("connect"); + super.emit("connect"); this.emitBuffered(); } /** diff --git a/lib/socket.ts b/lib/socket.ts index c525b0b1b..faf1efa3a 100644 --- a/lib/socket.ts +++ b/lib/socket.ts @@ -9,26 +9,20 @@ import { Manager } from "./manager"; const debug = require("debug")("socket.io-client:socket"); /** - * Internal events (blacklisted). + * Internal events. * These events can't be emitted by the user. * * @api private */ -const events = { +const RESERVED_EVENTS = { connect: 1, - connect_error: 1, - connect_timeout: 1, - connecting: 1, disconnect: 1, + disconnecting: 1, error: 1, - reconnect: 1, - reconnect_attempt: 1, - reconnect_failed: 1, - reconnect_error: 1, - reconnecting: 1, - ping: 1, - pong: 1, + // EventEmitter reserved events: https://nodejs.org/api/events.html#events_event_newlistener + newListener: 1, + removeListener: 1, }; export class Socket extends Emitter { @@ -97,7 +91,7 @@ export class Socket extends Emitter { this.subEvents(); if (!this.io.reconnecting) this.io.open(); // ensure open if ("open" === this.io.readyState) this.onopen(); - this.emit("connecting"); + super.emit("connecting"); return this; } @@ -107,7 +101,7 @@ export class Socket extends Emitter { this.subEvents(); if (!this.io.reconnecting) this.io.open(); // ensure open if ("open" === this.io.readyState) this.onopen(); - this.emit("connecting"); + super.emit("connecting"); return this; } @@ -133,9 +127,8 @@ export class Socket extends Emitter { * @api public */ emit(ev) { - if (events.hasOwnProperty(ev)) { - super.emit.apply(this, arguments); - return this; + if (RESERVED_EVENTS.hasOwnProperty(ev)) { + throw new Error('"' + ev + '" is a reserved event name'); } const args = toArray(arguments); @@ -324,7 +317,7 @@ export class Socket extends Emitter { this.id = id; this.connected = true; this.disconnected = false; - this.emit("connect"); + super.emit("connect"); this.emitBuffered(); } diff --git a/test/socket.js b/test/socket.js index 04a734621..c4b8a548a 100644 --- a/test/socket.js +++ b/test/socket.js @@ -182,4 +182,12 @@ describe("socket", function () { done(); }); }); + + it("should throw on reserved event", () => { + const socket = io("/no", { forceNew: true }); + + expect(() => socket.emit("disconnecting", "goodbye")).to.throwException( + /"disconnecting" is a reserved event name/ + ); + }); });