@supercat1337/event-emitter 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/event-emitter.esm.js +75 -0
- package/dist/event-emitter.min.esm.js +1 -0
- package/index.js +2 -0
- package/jsconfig.json +17 -0
- package/package.json +25 -0
- package/src/EventEmitter.js +109 -0
- package/tests/test.js +78 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
class EventEmitter {
|
|
2
|
+
/**
|
|
3
|
+
* Creates an instance of EventEmitter.
|
|
4
|
+
*
|
|
5
|
+
* @constructor
|
|
6
|
+
*/
|
|
7
|
+
constructor() {
|
|
8
|
+
this.events = {};
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
*
|
|
12
|
+
* @method
|
|
13
|
+
* @param {string} event
|
|
14
|
+
* @param {TListener} listener
|
|
15
|
+
* @returns {Unsubscriber}
|
|
16
|
+
*/
|
|
17
|
+
on(event, listener) {
|
|
18
|
+
if (typeof this.events[event] !== "object") {
|
|
19
|
+
this.events[event] = [];
|
|
20
|
+
}
|
|
21
|
+
this.events[event].push(listener);
|
|
22
|
+
let that = this;
|
|
23
|
+
let unsubscriber = function() {
|
|
24
|
+
that.removeListener(event, listener);
|
|
25
|
+
};
|
|
26
|
+
return unsubscriber;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
*
|
|
30
|
+
* @param {string} event
|
|
31
|
+
* @param {TListener} listener
|
|
32
|
+
*/
|
|
33
|
+
removeListener(event, listener) {
|
|
34
|
+
var idx;
|
|
35
|
+
if (typeof this.events[event] === "object") {
|
|
36
|
+
idx = this.events[event].indexOf(listener);
|
|
37
|
+
if (idx > -1) {
|
|
38
|
+
this.events[event].splice(idx, 1);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
*
|
|
44
|
+
* @param {string} event
|
|
45
|
+
*/
|
|
46
|
+
emit(event) {
|
|
47
|
+
if (typeof this.events[event] !== "object")
|
|
48
|
+
return;
|
|
49
|
+
var i, listeners, length, args = [].slice.call(arguments, 1);
|
|
50
|
+
listeners = this.events[event].slice();
|
|
51
|
+
length = listeners.length;
|
|
52
|
+
for (i = 0; i < length; i++) {
|
|
53
|
+
try {
|
|
54
|
+
listeners[i].apply(this, args);
|
|
55
|
+
} catch (e) {
|
|
56
|
+
console.error(event, args);
|
|
57
|
+
console.error(e);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
*
|
|
63
|
+
* @method
|
|
64
|
+
* @param {string} event
|
|
65
|
+
* @param {TListener} listener
|
|
66
|
+
* @returns {Unsubscriber}
|
|
67
|
+
*/
|
|
68
|
+
once(event, listener) {
|
|
69
|
+
return this.on(event, function g() {
|
|
70
|
+
this.removeListener(event, g);
|
|
71
|
+
listener.apply(this, arguments);
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
export { EventEmitter };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
class o{constructor(){this.events={}}on(t,e){typeof this.events[t]!="object"&&(this.events[t]=[]),this.events[t].push(e);let s=this;return function(){s.removeListener(t,e)}}removeListener(t,e){var s;typeof this.events[t]=="object"&&(s=this.events[t].indexOf(e),s>-1&&this.events[t].splice(s,1))}emit(t){if(typeof this.events[t]=="object"){var e,s,i,r=[].slice.call(arguments,1);for(s=this.events[t].slice(),i=s.length,e=0;e<i;e++)try{s[e].apply(this,r)}catch(n){console.error(t,r),console.error(n)}}}once(t,e){return this.on(t,function s(){this.removeListener(t,s),e.apply(this,arguments)})}}export{o as EventEmitter};
|
package/index.js
ADDED
package/jsconfig.json
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"baseUrl": ".",
|
|
4
|
+
"paths": {
|
|
5
|
+
"src/*": ["./src/*", "./node_modules/*"]
|
|
6
|
+
},
|
|
7
|
+
"target": "ESNext",
|
|
8
|
+
"module": "ES6",
|
|
9
|
+
"noEmit": true,
|
|
10
|
+
"lib": [
|
|
11
|
+
"DOM",
|
|
12
|
+
"ES2020"
|
|
13
|
+
],
|
|
14
|
+
},
|
|
15
|
+
//Add any build/compiled folders here to stop vscode searching those
|
|
16
|
+
"exclude": ["node_modules", "dist"]
|
|
17
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@supercat1337/event-emitter",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Event Emitter",
|
|
5
|
+
"main": "index.js",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"test": "ava",
|
|
8
|
+
"build": "npm run build_esm && npm run build_min_esm",
|
|
9
|
+
"build_esm": "esbuild src/EventEmitter.js --outfile=dist/event-emitter.esm.js",
|
|
10
|
+
"build_min_esm": "esbuild src/EventEmitter.js --minify --outfile=dist/event-emitter.min.esm.js"
|
|
11
|
+
},
|
|
12
|
+
"author": "Supercat",
|
|
13
|
+
"license": "MIT",
|
|
14
|
+
"devDependencies": {
|
|
15
|
+
"ava": "^6.1.2",
|
|
16
|
+
"esbuild": "^0.20.2"
|
|
17
|
+
},
|
|
18
|
+
"type": "module",
|
|
19
|
+
"moduleResolution": "Node",
|
|
20
|
+
"keywords": ["event emitter", "event bus"],
|
|
21
|
+
"publishConfig": {
|
|
22
|
+
"registry": "https://registry.npmjs.org"
|
|
23
|
+
},
|
|
24
|
+
"homepage": "https://github.com/supercat911/event-emitter"
|
|
25
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
3
|
+
/** @module EventEmitter */
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @typedef {Function} TListener
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/** @typedef {()=>void} Unsubscriber */
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
*
|
|
13
|
+
* @class
|
|
14
|
+
* */
|
|
15
|
+
class EventEmitter {
|
|
16
|
+
/**
|
|
17
|
+
* Creates an instance of EventEmitter.
|
|
18
|
+
*
|
|
19
|
+
* @constructor
|
|
20
|
+
*/
|
|
21
|
+
constructor() {
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* @type {Object.<string, TListener[]>}
|
|
25
|
+
*/
|
|
26
|
+
this.events = {};
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
*
|
|
31
|
+
* @method
|
|
32
|
+
* @param {string} event
|
|
33
|
+
* @param {TListener} listener
|
|
34
|
+
* @returns {Unsubscriber}
|
|
35
|
+
*/
|
|
36
|
+
on(event, listener) {
|
|
37
|
+
|
|
38
|
+
if (typeof this.events[event] !== 'object') {
|
|
39
|
+
this.events[event] = [];
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
this.events[event].push(listener);
|
|
43
|
+
|
|
44
|
+
let that = this;
|
|
45
|
+
|
|
46
|
+
let unsubscriber = function () {
|
|
47
|
+
that.removeListener(event, listener);
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
return unsubscriber;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
*
|
|
54
|
+
* @param {string} event
|
|
55
|
+
* @param {TListener} listener
|
|
56
|
+
*/
|
|
57
|
+
removeListener(event, listener) {
|
|
58
|
+
var idx;
|
|
59
|
+
|
|
60
|
+
if (typeof this.events[event] === 'object') {
|
|
61
|
+
idx = this.events[event].indexOf(listener);
|
|
62
|
+
|
|
63
|
+
if (idx > -1) {
|
|
64
|
+
this.events[event].splice(idx, 1);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
*
|
|
71
|
+
* @param {string} event
|
|
72
|
+
*/
|
|
73
|
+
emit(event) {
|
|
74
|
+
if (typeof this.events[event] !== 'object') return;
|
|
75
|
+
|
|
76
|
+
var i, listeners, length, args = [].slice.call(arguments, 1);
|
|
77
|
+
|
|
78
|
+
listeners = this.events[event].slice();
|
|
79
|
+
length = listeners.length;
|
|
80
|
+
|
|
81
|
+
for (i = 0; i < length; i++) {
|
|
82
|
+
|
|
83
|
+
try {
|
|
84
|
+
listeners[i].apply(this, args);
|
|
85
|
+
}
|
|
86
|
+
catch (e) {
|
|
87
|
+
console.error(event, args);
|
|
88
|
+
console.error(e);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
*
|
|
96
|
+
* @method
|
|
97
|
+
* @param {string} event
|
|
98
|
+
* @param {TListener} listener
|
|
99
|
+
* @returns {Unsubscriber}
|
|
100
|
+
*/
|
|
101
|
+
once(event, listener) {
|
|
102
|
+
return this.on(event, function g() {
|
|
103
|
+
this.removeListener(event, g);
|
|
104
|
+
listener.apply(this, arguments);
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export { EventEmitter };
|
package/tests/test.js
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
//@ts-check
|
|
2
|
+
|
|
3
|
+
//import test from "ava";
|
|
4
|
+
import { EventEmitter } from "./../index.js";
|
|
5
|
+
import test from "./../node_modules/ava/entrypoints/main.mjs";
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
test("on(), emit()", t => {
|
|
10
|
+
var ev = new EventEmitter;
|
|
11
|
+
ev.on("foo", () => {
|
|
12
|
+
t.pass();
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
ev.emit("bar");
|
|
16
|
+
ev.emit("foo");
|
|
17
|
+
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
test("once(), emit()", t => {
|
|
21
|
+
var ev = new EventEmitter;
|
|
22
|
+
var foo = 0
|
|
23
|
+
ev.once("foo", () => {
|
|
24
|
+
foo++;
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
ev.emit("foo");
|
|
28
|
+
ev.emit("foo");
|
|
29
|
+
ev.emit("foo");
|
|
30
|
+
|
|
31
|
+
if (foo == 1) {
|
|
32
|
+
t.pass();
|
|
33
|
+
} else {
|
|
34
|
+
t.fail()
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
test("removeListener()", t => {
|
|
39
|
+
var ev = new EventEmitter;
|
|
40
|
+
var foo = 0
|
|
41
|
+
var action = () => {
|
|
42
|
+
foo++;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
ev.on("foo", action);
|
|
46
|
+
ev.removeListener("foo", action);
|
|
47
|
+
|
|
48
|
+
ev.emit("foo");
|
|
49
|
+
ev.emit("foo");
|
|
50
|
+
|
|
51
|
+
if (foo == 0) {
|
|
52
|
+
t.pass();
|
|
53
|
+
} else {
|
|
54
|
+
t.fail()
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
test("Call unsubscriber", t => {
|
|
59
|
+
var ev = new EventEmitter;
|
|
60
|
+
var foo = 0
|
|
61
|
+
var action = () => {
|
|
62
|
+
foo++;
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
var unsubscriber = ev.on("foo", action);
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
ev.emit("foo");
|
|
69
|
+
unsubscriber();
|
|
70
|
+
|
|
71
|
+
ev.emit("foo");
|
|
72
|
+
|
|
73
|
+
if (foo == 1) {
|
|
74
|
+
t.pass();
|
|
75
|
+
} else {
|
|
76
|
+
t.fail()
|
|
77
|
+
}
|
|
78
|
+
});
|