Skip to content

Commit 88f0a14

Browse files
committed
[fixup] tests for events proxy, adjust based on results
1 parent e07abd5 commit 88f0a14

File tree

2 files changed

+53
-31
lines changed

2 files changed

+53
-31
lines changed

lib/events.js

+10-31
Original file line numberDiff line numberDiff line change
@@ -87,34 +87,21 @@ EventEmitter.init = function() {
8787
const proxyEventsHandler = {
8888
deleteProperty({ emitter }, prop) {
8989
const events = emitter[kEvents];
90-
if (events === undefined)
91-
return false;
92-
if (!events.has(prop) &&
93-
typeof prop !== 'string' &&
94-
typeof prop !== 'symbol')
95-
prop = String(prop);
96-
return events.delete(prop);
90+
if (events !== undefined)
91+
events.delete(prop);
92+
return true;
9793
},
9894
get({ emitter }, prop) {
9995
const events = emitter[kEvents];
10096
if (events === undefined)
10197
return;
102-
let value = events.get(prop);
103-
if (value === undefined &&
104-
typeof prop !== 'string' &&
105-
typeof prop !== 'symbol')
106-
value = events.get(String(prop));
107-
return value;
98+
return events.get(prop);
10899
},
109100
getOwnPropertyDescriptor({ emitter }, prop) {
110101
const events = emitter[kEvents];
111102
if (events === undefined)
112103
return undefined;
113-
let value = events.get(prop);
114-
if (value === undefined &&
115-
typeof prop !== 'string' &&
116-
typeof prop !== 'symbol')
117-
value = events.get(String(prop));
104+
const value = events.get(prop);
118105
if (value === undefined)
119106
return undefined;
120107
return {
@@ -131,22 +118,13 @@ const proxyEventsHandler = {
131118
const events = emitter[kEvents];
132119
if (events === undefined)
133120
return false;
134-
let has = events.has(prop);
135-
if (!has && typeof prop !== 'string' && typeof prop !== 'symbol')
136-
has = events.has(String(prop));
137-
return has;
121+
return events.has(prop);
138122
},
139123
ownKeys({ emitter }) {
140124
const events = emitter[kEvents];
141-
if (events === undefined)
125+
if (events === undefined || events.size === 0)
142126
return [];
143-
const keys = new Array(events.size);
144-
var i = 0;
145-
for (var [key] of events) {
146-
keys[i++] = typeof key !== 'string' && typeof key !== 'symbol' ?
147-
String(key) : key;
148-
}
149-
return keys;
127+
return [...events.keys()];
150128
},
151129
set({ emitter }, prop, value) {
152130
let events = emitter[kEvents];
@@ -164,7 +142,8 @@ Object.defineProperty(EventEmitter.prototype, '_events', {
164142
const proxy = this[kEventsProxy];
165143
// The proxy target has to be an empty object with a single configurable
166144
// key, because of rules around Proxy handler.ownKeys behaviour
167-
if (proxy === undefined)
145+
if (proxy === undefined ||
146+
this[kEventsProxy] === Object.getPrototypeOf(this)[kEventsProxy])
168147
return this[kEventsProxy] = new Proxy({ emitter: this },
169148
proxyEventsHandler);
170149
return proxy;
+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
'use strict';
2+
3+
require('../common');
4+
const assert = require('assert');
5+
const EventEmitter = require('events');
6+
7+
const _events = EventEmitter.prototype._events;
8+
9+
const ee = new EventEmitter();
10+
const noop = () => {};
11+
12+
assert.notStrictEqual(_events, ee._events);
13+
14+
assert(!(ee._events instanceof Object));
15+
assert.notStrictEqual(ee._events, undefined);
16+
assert.deepStrictEqual(Object.keys(ee._events), []);
17+
assert.strictEqual(ee._events.foo, undefined);
18+
assert.doesNotThrow(() => delete ee._events.foo);
19+
assert.strictEqual('foo' in ee._events, false);
20+
assert.strictEqual(Object.getOwnPropertyDescriptor(ee._events, 'foo'),
21+
undefined);
22+
23+
assert.doesNotThrow(() => ee._events.foo = noop);
24+
25+
assert.strictEqual(ee._events.foo, noop);
26+
assert.deepStrictEqual(Object.keys(ee._events), ['foo']);
27+
assert.deepStrictEqual(ee.listeners('foo'), [noop]);
28+
assert.strictEqual('foo' in ee._events, true);
29+
assert.deepStrictEqual(Object.getOwnPropertyDescriptor(ee._events, 'foo'),
30+
{
31+
value: noop,
32+
writable: true,
33+
configurable: true,
34+
enumerable: true
35+
});
36+
37+
assert.doesNotThrow(() => delete ee._events.foo);
38+
assert.strictEqual(ee._events.foo, undefined);
39+
assert.deepStrictEqual(Object.keys(ee._events), []);
40+
assert.strictEqual('foo' in ee._events, false);
41+
assert.strictEqual(ee.listenerCount('foo'), 0);
42+
assert.strictEqual(Object.getOwnPropertyDescriptor(ee._events, 'foo'),
43+
undefined);

0 commit comments

Comments
 (0)