Skip to content

Commit 54468cf

Browse files
feat: add ESM version
Related: socketio/socket.io-client#1536
1 parent cd703fe commit 54468cf

File tree

2 files changed

+171
-0
lines changed

2 files changed

+171
-0
lines changed

index.mjs

Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
1+
/**
2+
* Initialize a new `Emitter`.
3+
*
4+
* @api public
5+
*/
6+
7+
export function Emitter(obj) {
8+
if (obj) return mixin(obj);
9+
}
10+
11+
/**
12+
* Mixin the emitter properties.
13+
*
14+
* @param {Object} obj
15+
* @return {Object}
16+
* @api private
17+
*/
18+
19+
function mixin(obj) {
20+
for (var key in Emitter.prototype) {
21+
obj[key] = Emitter.prototype[key];
22+
}
23+
return obj;
24+
}
25+
26+
/**
27+
* Listen on the given `event` with `fn`.
28+
*
29+
* @param {String} event
30+
* @param {Function} fn
31+
* @return {Emitter}
32+
* @api public
33+
*/
34+
35+
Emitter.prototype.on =
36+
Emitter.prototype.addEventListener = function(event, fn){
37+
this._callbacks = this._callbacks || {};
38+
(this._callbacks['$' + event] = this._callbacks['$' + event] || [])
39+
.push(fn);
40+
return this;
41+
};
42+
43+
/**
44+
* Adds an `event` listener that will be invoked a single
45+
* time then automatically removed.
46+
*
47+
* @param {String} event
48+
* @param {Function} fn
49+
* @return {Emitter}
50+
* @api public
51+
*/
52+
53+
Emitter.prototype.once = function(event, fn){
54+
function on() {
55+
this.off(event, on);
56+
fn.apply(this, arguments);
57+
}
58+
59+
on.fn = fn;
60+
this.on(event, on);
61+
return this;
62+
};
63+
64+
/**
65+
* Remove the given callback for `event` or all
66+
* registered callbacks.
67+
*
68+
* @param {String} event
69+
* @param {Function} fn
70+
* @return {Emitter}
71+
* @api public
72+
*/
73+
74+
Emitter.prototype.off =
75+
Emitter.prototype.removeListener =
76+
Emitter.prototype.removeAllListeners =
77+
Emitter.prototype.removeEventListener = function(event, fn){
78+
this._callbacks = this._callbacks || {};
79+
80+
// all
81+
if (0 == arguments.length) {
82+
this._callbacks = {};
83+
return this;
84+
}
85+
86+
// specific event
87+
var callbacks = this._callbacks['$' + event];
88+
if (!callbacks) return this;
89+
90+
// remove all handlers
91+
if (1 == arguments.length) {
92+
delete this._callbacks['$' + event];
93+
return this;
94+
}
95+
96+
// remove specific handler
97+
var cb;
98+
for (var i = 0; i < callbacks.length; i++) {
99+
cb = callbacks[i];
100+
if (cb === fn || cb.fn === fn) {
101+
callbacks.splice(i, 1);
102+
break;
103+
}
104+
}
105+
106+
// Remove event specific arrays for event types that no
107+
// one is subscribed for to avoid memory leak.
108+
if (callbacks.length === 0) {
109+
delete this._callbacks['$' + event];
110+
}
111+
112+
return this;
113+
};
114+
115+
/**
116+
* Emit `event` with the given args.
117+
*
118+
* @param {String} event
119+
* @param {Mixed} ...
120+
* @return {Emitter}
121+
*/
122+
123+
Emitter.prototype.emit = function(event){
124+
this._callbacks = this._callbacks || {};
125+
126+
var args = new Array(arguments.length - 1)
127+
, callbacks = this._callbacks['$' + event];
128+
129+
for (var i = 1; i < arguments.length; i++) {
130+
args[i - 1] = arguments[i];
131+
}
132+
133+
if (callbacks) {
134+
callbacks = callbacks.slice(0);
135+
for (var i = 0, len = callbacks.length; i < len; ++i) {
136+
callbacks[i].apply(this, args);
137+
}
138+
}
139+
140+
return this;
141+
};
142+
143+
// alias used for reserved events (protected method)
144+
Emitter.prototype.emitReserved = Emitter.prototype.emit;
145+
146+
/**
147+
* Return array of callbacks for `event`.
148+
*
149+
* @param {String} event
150+
* @return {Array}
151+
* @api public
152+
*/
153+
154+
Emitter.prototype.listeners = function(event){
155+
this._callbacks = this._callbacks || {};
156+
return this._callbacks['$' + event] || [];
157+
};
158+
159+
/**
160+
* Check if this emitter has `event` handlers.
161+
*
162+
* @param {String} event
163+
* @return {Boolean}
164+
* @api public
165+
*/
166+
167+
Emitter.prototype.hasListeners = function(event){
168+
return !! this.listeners(event).length;
169+
};

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
}
1414
},
1515
"main": "index.js",
16+
"module": "index.mjs",
1617
"types": "index.d.ts",
1718
"repository": {
1819
"type": "git",
@@ -23,6 +24,7 @@
2324
},
2425
"files": [
2526
"index.js",
27+
"index.mjs",
2628
"index.d.ts",
2729
"LICENSE"
2830
]

0 commit comments

Comments
 (0)