Skip to content

Commit 6494f61

Browse files
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: socketio/socket.io@f7ed81e
1 parent 132f8ec commit 6494f61

File tree

3 files changed

+30
-36
lines changed

3 files changed

+30
-36
lines changed

build/socket.js

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -12,25 +12,19 @@ const component_bind_1 = __importDefault(require("component-bind"));
1212
const has_binary2_1 = __importDefault(require("has-binary2"));
1313
const debug = require("debug")("socket.io-client:socket");
1414
/**
15-
* Internal events (blacklisted).
15+
* Internal events.
1616
* These events can't be emitted by the user.
1717
*
1818
* @api private
1919
*/
20-
const events = {
20+
const RESERVED_EVENTS = {
2121
connect: 1,
22-
connect_error: 1,
23-
connect_timeout: 1,
24-
connecting: 1,
2522
disconnect: 1,
23+
disconnecting: 1,
2624
error: 1,
27-
reconnect: 1,
28-
reconnect_attempt: 1,
29-
reconnect_failed: 1,
30-
reconnect_error: 1,
31-
reconnecting: 1,
32-
ping: 1,
33-
pong: 1,
25+
// EventEmitter reserved events: https://nodejs.org/api/events.html#events_event_newlistener
26+
newListener: 1,
27+
removeListener: 1,
3428
};
3529
class Socket extends component_emitter_1.default {
3630
/**
@@ -88,7 +82,7 @@ class Socket extends component_emitter_1.default {
8882
this.io.open(); // ensure open
8983
if ("open" === this.io.readyState)
9084
this.onopen();
91-
this.emit("connecting");
85+
super.emit("connecting");
9286
return this;
9387
}
9488
connect() {
@@ -99,7 +93,7 @@ class Socket extends component_emitter_1.default {
9993
this.io.open(); // ensure open
10094
if ("open" === this.io.readyState)
10195
this.onopen();
102-
this.emit("connecting");
96+
super.emit("connecting");
10397
return this;
10498
}
10599
/**
@@ -123,9 +117,8 @@ class Socket extends component_emitter_1.default {
123117
* @api public
124118
*/
125119
emit(ev) {
126-
if (events.hasOwnProperty(ev)) {
127-
super.emit.apply(this, arguments);
128-
return this;
120+
if (RESERVED_EVENTS.hasOwnProperty(ev)) {
121+
throw new Error('"' + ev + '" is a reserved event name');
129122
}
130123
const args = to_array_1.default(arguments);
131124
const packet = {
@@ -294,7 +287,7 @@ class Socket extends component_emitter_1.default {
294287
this.id = id;
295288
this.connected = true;
296289
this.disconnected = false;
297-
this.emit("connect");
290+
super.emit("connect");
298291
this.emitBuffered();
299292
}
300293
/**

lib/socket.ts

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,26 +9,20 @@ import { Manager } from "./manager";
99
const debug = require("debug")("socket.io-client:socket");
1010

1111
/**
12-
* Internal events (blacklisted).
12+
* Internal events.
1313
* These events can't be emitted by the user.
1414
*
1515
* @api private
1616
*/
1717

18-
const events = {
18+
const RESERVED_EVENTS = {
1919
connect: 1,
20-
connect_error: 1,
21-
connect_timeout: 1,
22-
connecting: 1,
2320
disconnect: 1,
21+
disconnecting: 1,
2422
error: 1,
25-
reconnect: 1,
26-
reconnect_attempt: 1,
27-
reconnect_failed: 1,
28-
reconnect_error: 1,
29-
reconnecting: 1,
30-
ping: 1,
31-
pong: 1,
23+
// EventEmitter reserved events: https://nodejs.org/api/events.html#events_event_newlistener
24+
newListener: 1,
25+
removeListener: 1,
3226
};
3327

3428
export class Socket extends Emitter {
@@ -97,7 +91,7 @@ export class Socket extends Emitter {
9791
this.subEvents();
9892
if (!this.io.reconnecting) this.io.open(); // ensure open
9993
if ("open" === this.io.readyState) this.onopen();
100-
this.emit("connecting");
94+
super.emit("connecting");
10195
return this;
10296
}
10397

@@ -107,7 +101,7 @@ export class Socket extends Emitter {
107101
this.subEvents();
108102
if (!this.io.reconnecting) this.io.open(); // ensure open
109103
if ("open" === this.io.readyState) this.onopen();
110-
this.emit("connecting");
104+
super.emit("connecting");
111105
return this;
112106
}
113107

@@ -133,9 +127,8 @@ export class Socket extends Emitter {
133127
* @api public
134128
*/
135129
emit(ev) {
136-
if (events.hasOwnProperty(ev)) {
137-
super.emit.apply(this, arguments);
138-
return this;
130+
if (RESERVED_EVENTS.hasOwnProperty(ev)) {
131+
throw new Error('"' + ev + '" is a reserved event name');
139132
}
140133

141134
const args = toArray(arguments);
@@ -324,7 +317,7 @@ export class Socket extends Emitter {
324317
this.id = id;
325318
this.connected = true;
326319
this.disconnected = false;
327-
this.emit("connect");
320+
super.emit("connect");
328321
this.emitBuffered();
329322
}
330323

test/socket.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,4 +182,12 @@ describe("socket", function () {
182182
done();
183183
});
184184
});
185+
186+
it("should throw on reserved event", () => {
187+
const socket = io("/no", { forceNew: true });
188+
189+
expect(() => socket.emit("disconnecting", "goodbye")).to.throwException(
190+
/"disconnecting" is a reserved event name/
191+
);
192+
});
185193
});

0 commit comments

Comments
 (0)