events-ex 1.1.7 → 2.0.0-alpha.1
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/.babelrc +9 -0
- package/.eslintrc.yml +30 -0
- package/.mocharc.yml +3 -0
- package/.prettierignore +4 -0
- package/.prettierrc +8 -0
- package/.versionrc +36 -0
- package/CHANGELOG.md +32 -0
- package/README.cn.md +248 -0
- package/README.md +72 -107
- package/ability.js +1 -1
- package/benchmark/many-on.js +20 -12
- package/benchmark/single-on.js +15 -9
- package/docs/.nojekyll +1 -0
- package/docs/README.md +238 -0
- package/docs/classes/event.Event.md +120 -0
- package/docs/classes/index-1.EventEmitter.md +25 -0
- package/docs/classes/index.EventEmitter.md +296 -0
- package/docs/modules/all_off.md +44 -0
- package/docs/modules/consts.md +27 -0
- package/docs/modules/default_methods.md +51 -0
- package/docs/modules/event.md +19 -0
- package/docs/modules/event_emitter.md +57 -0
- package/docs/modules/eventable.md +47 -0
- package/docs/modules/has_listeners.md +40 -0
- package/docs/modules/index-1.md +89 -0
- package/docs/modules/index.md +82 -0
- package/docs/modules/pipe.md +49 -0
- package/docs/modules/pipe_async.md +49 -0
- package/docs/modules/unify.md +46 -0
- package/docs/modules/util_array_remove.md +39 -0
- package/docs/modules/util_object_for_each.md +41 -0
- package/docs/modules/util_string_pad.md +40 -0
- package/docs/modules/util_to_int.md +39 -0
- package/docs/modules/util_valid_callable.md +39 -0
- package/docs/modules/util_valid_object.md +39 -0
- package/docs/modules.md +26 -0
- package/lib/all-off.d.ts +9 -0
- package/lib/all-off.js +24 -0
- package/lib/consts.d.ts +9 -0
- package/lib/consts.js +15 -0
- package/lib/default-methods.d.ts +49 -0
- package/lib/default-methods.js +327 -0
- package/lib/event-emitter.d.ts +8 -0
- package/lib/event-emitter.js +47 -0
- package/lib/event.d.ts +47 -0
- package/lib/event.js +56 -0
- package/lib/eventable.d.ts +2 -0
- package/lib/eventable.js +37 -0
- package/lib/has-listeners.d.ts +2 -0
- package/lib/has-listeners.js +25 -0
- package/lib/index.d.ts +79 -0
- package/lib/index.js +128 -0
- package/lib/pipe-async.d.ts +11 -0
- package/lib/pipe-async.js +62 -0
- package/lib/pipe.d.ts +11 -0
- package/lib/pipe.js +62 -0
- package/lib/unify.d.ts +9 -0
- package/lib/unify.js +72 -0
- package/lib/util/array-remove.d.ts +2 -0
- package/lib/util/array-remove.js +21 -0
- package/lib/util/object-for-each.d.ts +2 -0
- package/lib/util/object-for-each.js +25 -0
- package/lib/util/string-pad.d.ts +2 -0
- package/lib/util/string-pad.js +26 -0
- package/lib/util/to-int.d.ts +2 -0
- package/lib/util/to-int.js +20 -0
- package/lib/util/valid-callable.d.ts +2 -0
- package/lib/util/valid-callable.js +15 -0
- package/lib/util/valid-object.d.ts +2 -0
- package/lib/util/valid-object.js +16 -0
- package/package.json +35 -9
- package/src/all-off.js +16 -0
- package/src/consts.js +9 -0
- package/src/default-methods.js +296 -0
- package/src/event-emitter.js +42 -0
- package/src/event.js +49 -0
- package/src/eventable.js +29 -0
- package/src/has-listeners.js +20 -0
- package/src/index.d.ts +79 -0
- package/src/index.js +21 -0
- package/src/pipe-async.js +53 -0
- package/src/pipe.js +53 -0
- package/src/unify.js +58 -0
- package/src/util/array-remove.js +16 -0
- package/src/util/object-for-each.js +20 -0
- package/src/util/string-pad.js +19 -0
- package/src/util/to-int.js +9 -0
- package/src/util/valid-callable.js +6 -0
- package/src/util/valid-object.js +8 -0
- package/test/add-listeners-test.js +42 -0
- package/test/all-off-test.js +51 -0
- package/test/check-listener-leaks-test.js +76 -0
- package/test/emitter-method-names-test.js +11 -0
- package/test/event-emitter-async-test.js +152 -0
- package/test/event-emitter-test.js +145 -0
- package/test/{eventable.js → eventable-test.js} +12 -16
- package/test/events-listeners-test.js +46 -0
- package/test/events-remove-listeners-test.js +89 -0
- package/test/has-listeners-test.js +44 -0
- package/test/listeners-side-effects-test.js +40 -0
- package/test/max-listeners-test.js +33 -0
- package/test/modify-in-emit-test.js +121 -0
- package/test/no-error-provided-to-error-event-test.js +38 -0
- package/test/num-args-test.js +41 -0
- package/test/once-test.js +44 -0
- package/test/pipe-async-test.js +58 -0
- package/test/pipe-test.js +57 -0
- package/test/remove-all-listeners-test.js +74 -0
- package/test/set-max-listeners-side-effects-test.js +13 -0
- package/test/subclass-test.js +49 -0
- package/test/unify-async-test.js +122 -0
- package/test/unify-test.js +122 -0
- package/tsconfig.json +27 -0
- package/all-off.js +0 -9
- package/consts.js +0 -5
- package/default-methods.js +0 -318
- package/event-emitter.js +0 -41
- package/eventable.js +0 -70
- package/events.d.ts +0 -50
- package/events.js +0 -18
- package/has-listeners.js +0 -16
- package/index.d.ts +0 -3
- package/index.js +0 -3
- package/pipe.js +0 -41
- package/src/default-methods.coffee +0 -218
- package/src/event-emitter.coffee +0 -24
- package/src/eventable.coffee +0 -34
- package/src/events.coffee +0 -9
- package/test/all-off.js +0 -48
- package/test/event-emitter.js +0 -134
- package/test/events-listeners.js +0 -70
- package/test/events-remove-listeners.js +0 -110
- package/test/events.js +0 -22
- package/test/has-listeners.js +0 -42
- package/test/pipe.js +0 -53
- package/test/test-event-emitter-add-listeners.js +0 -61
- package/test/test-event-emitter-check-listener-leaks.js +0 -93
- package/test/test-event-emitter-listeners-side-effects.js +0 -59
- package/test/test-event-emitter-max-listeners.js +0 -49
- package/test/test-event-emitter-method-names.js +0 -27
- package/test/test-event-emitter-modify-in-emit.js +0 -76
- package/test/test-event-emitter-no-error-provided-to-error-event.js +0 -40
- package/test/test-event-emitter-num-args.js +0 -40
- package/test/test-event-emitter-once.js +0 -61
- package/test/test-event-emitter-remove-all-listeners.js +0 -93
- package/test/test-event-emitter-set-max-listeners-side-effects.js +0 -28
- package/test/test-event-emitter-subclass.js +0 -66
- package/test/unify.js +0 -123
- package/unify.js +0 -50
package/.babelrc
ADDED
package/.eslintrc.yml
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
extends:
|
|
2
|
+
- '@antfu'
|
|
3
|
+
- prettier
|
|
4
|
+
plugins:
|
|
5
|
+
- eslint-plugin-tsdoc
|
|
6
|
+
ignorePatterns:
|
|
7
|
+
- web/**
|
|
8
|
+
- docs/**
|
|
9
|
+
rules:
|
|
10
|
+
tsdoc/syntax: off
|
|
11
|
+
no-cond-assign: off
|
|
12
|
+
max-statements-per-line:
|
|
13
|
+
- error
|
|
14
|
+
- max: 3
|
|
15
|
+
prefer-rest-params: off
|
|
16
|
+
no-prototype-builtins: off
|
|
17
|
+
prefer-spread: off
|
|
18
|
+
prefer-arrow-callback: off
|
|
19
|
+
n/prefer-global/buffer: off
|
|
20
|
+
unicorn/prefer-includes: off
|
|
21
|
+
prefer-template: off
|
|
22
|
+
"@typescript-eslint/no-this-alias": off
|
|
23
|
+
"@typescript-eslint/no-invalid-this": off
|
|
24
|
+
"prefer-exponentiation-operator": off
|
|
25
|
+
# curly: [error, multi, consistent]
|
|
26
|
+
# curly: [error, multi-line]
|
|
27
|
+
# max-statements-per-line: off
|
|
28
|
+
# brace-style: [error, 1tbs, {allowSingleLine: true}]
|
|
29
|
+
# '@typescript-eslint/brace-style': off
|
|
30
|
+
# '@typescript-eslint/comma-dangle': off
|
package/.mocharc.yml
ADDED
package/.prettierignore
ADDED
package/.prettierrc
ADDED
package/.versionrc
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"types": [
|
|
3
|
+
{
|
|
4
|
+
"type": "feat",
|
|
5
|
+
"section": "Features"
|
|
6
|
+
},
|
|
7
|
+
{
|
|
8
|
+
"type": "fix",
|
|
9
|
+
"section": "Bug Fixes"
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"type": "chore",
|
|
13
|
+
"hidden": true
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"type": "docs",
|
|
17
|
+
"hidden": true
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"type": "style",
|
|
21
|
+
"hidden": true
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"type": "refactor",
|
|
25
|
+
"section": "Refactor"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"type": "perf",
|
|
29
|
+
"section": "Performance"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"type": "test",
|
|
33
|
+
"hidden": true
|
|
34
|
+
}
|
|
35
|
+
]
|
|
36
|
+
}
|
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file. See [commit-and-tag-version](https://github.com/absolute-version/commit-and-tag-version) for commit guidelines.
|
|
4
|
+
|
|
5
|
+
## [2.0.0-alpha.1](https://github.com/snowyu/events-ex.js/compare/v2.0.0-alpha.0...v2.0.0-alpha.1) (2023-06-13)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
### ⚠ BREAKING CHANGES
|
|
9
|
+
|
|
10
|
+
* remove deprecated files
|
|
11
|
+
|
|
12
|
+
### Refactor
|
|
13
|
+
|
|
14
|
+
* remove deprecated files ([d733a5c](https://github.com/snowyu/events-ex.js/commit/d733a5c6a6c554739ecbcb653996f1e546579fa4))
|
|
15
|
+
|
|
16
|
+
## [2.0.0-alpha.0](https://github.com/snowyu/events-ex.js/compare/v1.1.7...v2.0.0-alpha.0) (2023-05-25)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
### Features
|
|
20
|
+
|
|
21
|
+
* Add emitAsync supports ([c5a52e9](https://github.com/snowyu/events-ex.js/commit/c5a52e93e707b3f9f62b2d39eeb1e4870c0af185))
|
|
22
|
+
* Add emitAsync supports ([97d44df](https://github.com/snowyu/events-ex.js/commit/97d44dfb5b2d5cda34848aaff4ea94c5af67b8f6))
|
|
23
|
+
* **util:** extract util functions to here ([5bedb98](https://github.com/snowyu/events-ex.js/commit/5bedb98486dfa50c09f51d0fc669beb43b39c3b6))
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
### Refactor
|
|
27
|
+
|
|
28
|
+
* **benchmark:** use esm instead of commonjs ([366039e](https://github.com/snowyu/events-ex.js/commit/366039e9ddb8723db8d8a8257436f34af0a8ece8))
|
|
29
|
+
* change exported name to wrapEventEmitter ([b0be8e7](https://github.com/snowyu/events-ex.js/commit/b0be8e72826fa189d03831c747367cfd8b8a6f78))
|
|
30
|
+
* **consts:** change export name to states ([bf5c926](https://github.com/snowyu/events-ex.js/commit/bf5c9268ae29956d7281b4a1fc101952ef81896a))
|
|
31
|
+
* **test:** use mocha instead of tad ([74261eb](https://github.com/snowyu/events-ex.js/commit/74261ebf632274eed90796d84c8f2df3352e62fb))
|
|
32
|
+
* use esm instead of commonjs ([b1f55dc](https://github.com/snowyu/events-ex.js/commit/b1f55dcd15d6e91ec639baa022de68ae874bf109))
|
package/README.cn.md
ADDED
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
### events-ex [](http://travis-ci.org/snowyu/events-ex.js) [](https://npmjs.org/package/events-ex) [](https://npmjs.org/package/events-ex) [](https://npmjs.org/package/events-ex)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
浏览器友好的增强的**事件**[能力][Ability]和类。 它主要是从 [event-emitter][event-emitter] 修改而来的。 本库可以为你的任何类添加(注入)**事件**[能力][Ability]。
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
TODO: 异步事件,添加`emitAsync`方法. 没这么简单,因为要支持bubbling,所以必须顺序执行事件.
|
|
8
|
+
将`bubbling`作为功能选项.如果没有启用,就可以乱发了.
|
|
9
|
+
|
|
10
|
+
当关闭`bubbling`的时候,那么是否还需要用`event`对象传递.
|
|
11
|
+
|
|
12
|
+
首先完成异步支持.已经完成.`emitAsync`方法已经加上.
|
|
13
|
+
|
|
14
|
+
### Features
|
|
15
|
+
|
|
16
|
+
* 重写核心架构
|
|
17
|
+
* 尽最大可能性与[node events][Node Events] and [event-emitter][event-emitter]保持兼容
|
|
18
|
+
* 更强大的 event-able [能力][Ability]
|
|
19
|
+
* 可挂载的事件系统, 用于更好地控制事件处理
|
|
20
|
+
* 支持异步事件通过 `emitAsync` 方法.
|
|
21
|
+
|
|
22
|
+
### 区别
|
|
23
|
+
|
|
24
|
+
* 与 [Node 事件模块](https://nodejs.org/api/events.html) 的区别
|
|
25
|
+
* **`改变`**: 事件支持冒泡机制与中断
|
|
26
|
+
* 事件对象(`Event Object`)作为监听器的 "this" 对象。
|
|
27
|
+
* `result` 属性: 可选, 如果设置,则将该结果返回到事件发射器(`Event Emitter`)。
|
|
28
|
+
* `stopped` 属性: 可选, 如果设置为 `true`,则会阻止剩余的监听器被执行。
|
|
29
|
+
* `target`属性: 事件发射器对象,原本的`this`
|
|
30
|
+
* **`改变`**: `emit` 方法返回监听器回调函数的结果而不是成功状态。
|
|
31
|
+
* **`改变`**: 监听器回调函数的 `this` 对象是 `Event Object` 事件对象而不是事件发射器对象。
|
|
32
|
+
* 事件发射器对象被放入 `Event` 对象的 `target` 属性中。
|
|
33
|
+
* 添加了`emitAsync`方法,支持异步事件
|
|
34
|
+
* 与 [event-emitter](https://github.com/medikoo/event-emitter) 的区别
|
|
35
|
+
* **`改变`**: 事件支持冒泡机制(如上所述)
|
|
36
|
+
* 添加了默认最大监听器数量的类属性,以保持与 Node 事件模块的兼容性。
|
|
37
|
+
* 添加了 `setMaxListeners` 方法,以保持与 Node 事件模块的兼容性。
|
|
38
|
+
* 添加了 `error`、`newListener` 和 `removeListener` 事件,以保持与 Node 事件模块的兼容性。
|
|
39
|
+
* 添加了 `listeners()` 方法,以保持与 Node 事件模块的兼容性。
|
|
40
|
+
* 添加了 `listenerCount()` 类方法,以保持与 Node 事件模块的兼容性。
|
|
41
|
+
* 添加了`emitAsync`方法,支持异步事件
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
### 安装
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
npm install events-ex@alpha
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
### 用法
|
|
52
|
+
|
|
53
|
+
直接继承使用 `EventEmitter` 类
|
|
54
|
+
|
|
55
|
+
```js
|
|
56
|
+
import {EventEmitter} from 'events-ex';
|
|
57
|
+
|
|
58
|
+
class MyClass extends EventEmitter {}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
直接添加/注入事件(event-able)[能力][Ability] 到你的类:
|
|
62
|
+
|
|
63
|
+
```js
|
|
64
|
+
import {eventable} from 'events-ex';
|
|
65
|
+
|
|
66
|
+
class MyClass extends MyRoot {}
|
|
67
|
+
|
|
68
|
+
// inject the eventable ability to MyClass
|
|
69
|
+
eventable(MyClass);
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
现在,可以在你的类中使用事件了:
|
|
73
|
+
|
|
74
|
+
```js
|
|
75
|
+
const my = new MyClass;
|
|
76
|
+
|
|
77
|
+
my.on('event', function() {
|
|
78
|
+
console.log('event occur');
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
my.emit('event');
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
事件冒泡机制的使用:
|
|
85
|
+
|
|
86
|
+
```js
|
|
87
|
+
import {EventEmitter, states} from 'events-ex';
|
|
88
|
+
import {isObject} from 'util-ex';
|
|
89
|
+
|
|
90
|
+
class MyDb extends EventEmitter {
|
|
91
|
+
get(key) {
|
|
92
|
+
// Demo the event object bubbling usage:
|
|
93
|
+
let result = this.emit('getting', key)
|
|
94
|
+
if(isObject(result)) {
|
|
95
|
+
if (result.state === states.ABORT) return
|
|
96
|
+
if (result.state === states.DONE) return result.result
|
|
97
|
+
}
|
|
98
|
+
return _get(key)
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
let db = new MyDb
|
|
103
|
+
db.on('getting', function(key){
|
|
104
|
+
result = myGet(key);
|
|
105
|
+
if (result != null) {
|
|
106
|
+
// get the key succ
|
|
107
|
+
this.result = {
|
|
108
|
+
state: states.DONE,
|
|
109
|
+
result: result,
|
|
110
|
+
}
|
|
111
|
+
} else if (result === null) {
|
|
112
|
+
// abort default get key.
|
|
113
|
+
this.result = {state: states.ABORT};
|
|
114
|
+
// this.stopped = true // it will skip other listeners if true
|
|
115
|
+
}
|
|
116
|
+
})
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
event-emitter usage:
|
|
120
|
+
|
|
121
|
+
```javascript
|
|
122
|
+
|
|
123
|
+
import {wrapEventEmitter as ee} from 'events-ex';
|
|
124
|
+
|
|
125
|
+
class MyClass { /* .. */ };
|
|
126
|
+
ee(MyClass.prototype); // All instances of MyClass will expose event-emitter interface
|
|
127
|
+
|
|
128
|
+
const emitter = new MyClass();
|
|
129
|
+
let listener;
|
|
130
|
+
|
|
131
|
+
emitter.on('test', listener = function (args) {
|
|
132
|
+
// … react to 'test' event
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
emitter.once('test', function (args) {
|
|
136
|
+
// … react to first 'test' event (invoked only once!)
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
emitter.emit('test', arg1, arg2/*…args*/); // Two above listeners invoked
|
|
140
|
+
emitter.emit('test', arg1, arg2/*…args*/); // Only first listener invoked
|
|
141
|
+
|
|
142
|
+
emitter.off('test', listener); // Removed first listener
|
|
143
|
+
emitter.emit('test', arg1, arg2/*…args*/); // No listeners invoked
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### API
|
|
147
|
+
|
|
148
|
+
#### eventable(class[, options]) _(events-ex/eventable)_
|
|
149
|
+
|
|
150
|
+
Add the event-able ability to the class directly.
|
|
151
|
+
|
|
152
|
+
* `class`: the class to be injected the ability.
|
|
153
|
+
* `options` _(object)_: optional options
|
|
154
|
+
* `include` _(string[]|string)_: only these emitter methods will be added to the class
|
|
155
|
+
* **NOTE:** static method should use the prefix '@' with name.
|
|
156
|
+
* `exclude` _(string[]|string)_: theses emitter methods would not be added to the class
|
|
157
|
+
* **NOTE:** static method should use the prefix '@' with name.
|
|
158
|
+
* `methods` _(object)_: hooked methods to the class
|
|
159
|
+
* key: the method name to hook.
|
|
160
|
+
* value: the new method function
|
|
161
|
+
* use `this.super()` to call the original method.
|
|
162
|
+
* `this.self` is the original `this` object.
|
|
163
|
+
* `classMethods` _(object)_: hooked class methods to the class
|
|
164
|
+
|
|
165
|
+
```coffee
|
|
166
|
+
eventable = require('events-ex/eventable')
|
|
167
|
+
#OtherClass = require('OtherClass')
|
|
168
|
+
class OtherClass
|
|
169
|
+
exec: -> console.log "my original exec"
|
|
170
|
+
|
|
171
|
+
class MyClass
|
|
172
|
+
# only 'on', 'off', 'emit' and static methods 'listenerCount' added to the class
|
|
173
|
+
eventable MyClass, include: ['on', 'off', 'emit', '@listenerCount']
|
|
174
|
+
|
|
175
|
+
# add the eventable ability to OtherClass and inject the exec method of OtherClass.
|
|
176
|
+
eventable OtherClass, methods:
|
|
177
|
+
exec: ->
|
|
178
|
+
console.log "new exec"
|
|
179
|
+
@super() # call the original method
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
#### allOff(obj) _(events-ex/all-off)_
|
|
183
|
+
|
|
184
|
+
**keep compatible only**: the `removeAllListeners` has already been buildin.
|
|
185
|
+
|
|
186
|
+
Removes all listeners from given event emitter object
|
|
187
|
+
|
|
188
|
+
#### hasListeners(obj[, name]) _(events-ex/has-listeners)_
|
|
189
|
+
|
|
190
|
+
Whether object has some listeners attached to the object.
|
|
191
|
+
When `name` is provided, it checks listeners for specific event name
|
|
192
|
+
|
|
193
|
+
```javascript
|
|
194
|
+
var emitter = ee();
|
|
195
|
+
var hasListeners = require('events-ex/has-listeners');
|
|
196
|
+
var listener = function () {};
|
|
197
|
+
|
|
198
|
+
hasListeners(emitter); // false
|
|
199
|
+
|
|
200
|
+
emitter.on('foo', listener);
|
|
201
|
+
hasListeners(emitter); // true
|
|
202
|
+
hasListeners(emitter, 'foo'); // true
|
|
203
|
+
hasListeners(emitter, 'bar'); // false
|
|
204
|
+
|
|
205
|
+
emitter.off('foo', listener);
|
|
206
|
+
hasListeners(emitter, 'foo'); // false
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
#### pipe(source, target[, emitMethodName]) _(events-ex/pipe)_
|
|
210
|
+
|
|
211
|
+
Pipes all events from _source_ emitter onto _target_ emitter (all events from _source_ emitter will be emitted also on _target_ emitter, but not other way).
|
|
212
|
+
Returns _pipe_ object which exposes `pipe.close` function. Invoke it to close configured _pipe_.
|
|
213
|
+
It works internally by redefinition of `emit` method, if in your interface this method is referenced differently, provide its name (or symbol) with third argument.
|
|
214
|
+
|
|
215
|
+
#### unify(emitter1, emitter2) _(events-ex/unify)_
|
|
216
|
+
|
|
217
|
+
Unifies event handling for two objects. Events emitted on _emitter1_ would be also emitter on _emitter2_, and other way back.
|
|
218
|
+
Non reversible.
|
|
219
|
+
|
|
220
|
+
```javascript
|
|
221
|
+
var eeUnify = require('events-ex/unify');
|
|
222
|
+
|
|
223
|
+
var emitter1 = ee(), listener1, listener3;
|
|
224
|
+
var emitter2 = ee(), listener2, listener4;
|
|
225
|
+
|
|
226
|
+
emitter1.on('test', listener1 = function () { });
|
|
227
|
+
emitter2.on('test', listener2 = function () { });
|
|
228
|
+
|
|
229
|
+
emitter1.emit('test'); // Invoked listener1
|
|
230
|
+
emitter2.emit('test'); // Invoked listener2
|
|
231
|
+
|
|
232
|
+
var unify = eeUnify(emitter1, emitter2);
|
|
233
|
+
|
|
234
|
+
emitter1.emit('test'); // Invoked listener1 and listener2
|
|
235
|
+
emitter2.emit('test'); // Invoked listener1 and listener2
|
|
236
|
+
|
|
237
|
+
emitter1.on('test', listener3 = function () { });
|
|
238
|
+
emitter2.on('test', listener4 = function () { });
|
|
239
|
+
|
|
240
|
+
emitter1.emit('test'); // Invoked listener1, listener2, listener3 and listener4
|
|
241
|
+
emitter2.emit('test'); // Invoked listener1, listener2, listener3 and listener4
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
[event-emitter]: https://github.com/medikoo/event-emitter
|
|
246
|
+
[Node Events]: https://nodejs.org/api/events.html
|
|
247
|
+
[Ability]: https://github.com/snowyu/custom-ability.js
|
|
248
|
+
|
package/README.md
CHANGED
|
@@ -1,76 +1,68 @@
|
|
|
1
1
|
### events-ex [](http://travis-ci.org/snowyu/events-ex.js) [](https://npmjs.org/package/events-ex) [](https://npmjs.org/package/events-ex) [](https://npmjs.org/package/events-ex)
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
Browser-friendly enhanced
|
|
5
|
-
|
|
4
|
+
Browser-friendly enhanced event emitter [ability][Ability] and class. It's modified from [event-emitter][event-emitter] mainly. It can add/inject the event-able [ability][Ability] to your any class.
|
|
6
5
|
|
|
7
6
|
### Features
|
|
8
7
|
|
|
9
|
-
*
|
|
10
|
-
* keep most compatible with [node events](nodejs.org/api/events.html) and [event-emitter]
|
|
11
|
-
|
|
12
|
-
*
|
|
8
|
+
* Rewrite of the core architecture for improved performance and more powerful event-able ability
|
|
9
|
+
* keep most compatible with [node events](nodejs.org/api/events.html) and [event-emitter][event-emitter]
|
|
10
|
+
* Hookable event system for more control over event handling
|
|
11
|
+
* Supports async event emitting via `emitAsync` method.
|
|
13
12
|
|
|
14
13
|
### Differences
|
|
15
14
|
|
|
16
|
-
* Difference with [node events](nodejs.org/api/events.html)
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
* **`broken change`**:
|
|
23
|
-
* **`broken change`**:
|
|
24
|
-
*
|
|
15
|
+
* Difference with [node events](https://nodejs.org/api/events.html)
|
|
16
|
+
+ **`broken change`**: The event supports bubbling and interruption
|
|
17
|
+
+ the `event object` as listener's "this" object:
|
|
18
|
+
* `result`: If set, the result is returned to the `Event Emitter`.
|
|
19
|
+
* `stopped`: If set to `true`, it prevents the remaining listeners from being executed.
|
|
20
|
+
* `target`: The `Event Emitter` object, which was originally the `this` object.
|
|
21
|
+
* **`broken change`**: The `emit` return the result of listeners's callback function instead of the successful state.
|
|
22
|
+
* **`broken change`**: The `this` object of listeners' callback function is the `Event` Object instead of the emitter object.
|
|
23
|
+
* The emitter object is put into the `target` property of the `Event` Object.
|
|
24
|
+
* Adds async event emitting via `emitAsync` method.
|
|
25
25
|
* Difference with [event-emitter](https://github.com/medikoo/event-emitter)
|
|
26
|
-
+ **`broken change`**: The event
|
|
27
|
-
+
|
|
28
|
-
+
|
|
29
|
-
+
|
|
30
|
-
+
|
|
31
|
-
+
|
|
26
|
+
+ **`broken change`**: The event supports bubbling and interruption(see above)
|
|
27
|
+
+ Adds the defaultMaxListeners class property to keep compatibility with node events.
|
|
28
|
+
+ Adds the setMaxListeners method to keep compatible with node events.
|
|
29
|
+
+ Adds `error`, `newListener` and `removeListener` events to keep compatibility with node events.
|
|
30
|
+
+ Adds listeners() method to keep compatibility with node events.
|
|
31
|
+
+ Adds listenerCount() class method to keep compatibility with node events.
|
|
32
|
+
* Adds async event emitting via `emitAsync` method.
|
|
32
33
|
|
|
33
34
|
|
|
34
35
|
### Installation
|
|
35
36
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
37
|
+
```bash
|
|
38
|
+
npm install events-ex
|
|
39
|
+
```
|
|
39
40
|
|
|
40
41
|
### Usage
|
|
41
42
|
|
|
43
|
+
Extends from `EventEmitter` class:
|
|
42
44
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
```coffee
|
|
46
|
-
|
|
47
|
-
eventable = require('events-ex/eventable')
|
|
48
|
-
|
|
49
|
-
class MyClass
|
|
50
|
-
# advanced usage see API topic.
|
|
51
|
-
eventable MyClass
|
|
52
|
-
|
|
53
|
-
my = new MyClass
|
|
54
|
-
|
|
55
|
-
my.on 'event', ->
|
|
56
|
-
console.log 'event occur'
|
|
57
|
-
# be care: @(this) is the event object. not the `my` instance.
|
|
58
|
-
# the my instance is @target.
|
|
59
|
-
|
|
60
|
-
my.emit 'event'
|
|
45
|
+
```js
|
|
46
|
+
import {EventEmitter} from 'events-ex';
|
|
61
47
|
|
|
48
|
+
class MyClass extends EventEmitter {}
|
|
62
49
|
```
|
|
63
50
|
|
|
64
|
-
the
|
|
51
|
+
Add/Inject the event-able [ability][Ability] to your class directly:
|
|
65
52
|
|
|
66
53
|
```js
|
|
67
|
-
|
|
54
|
+
import {eventable} from 'events-ex';
|
|
68
55
|
|
|
69
|
-
|
|
56
|
+
class MyClass extends MyRoot {}
|
|
70
57
|
|
|
58
|
+
// inject the eventable ability to MyClass
|
|
71
59
|
eventable(MyClass);
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Now, you can use events in your class:
|
|
72
63
|
|
|
73
|
-
|
|
64
|
+
```js
|
|
65
|
+
const my = new MyClass;
|
|
74
66
|
|
|
75
67
|
my.on('event', function() {
|
|
76
68
|
console.log('event occur');
|
|
@@ -79,53 +71,19 @@ my.on('event', function() {
|
|
|
79
71
|
my.emit('event');
|
|
80
72
|
```
|
|
81
73
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
```coffee
|
|
85
|
-
## Coffee-script demo bubbling usage:
|
|
86
|
-
EventEmitter = require('events-ex')
|
|
87
|
-
inherits = require('inherits-ex')
|
|
88
|
-
ABORT = -1
|
|
89
|
-
DONE = 0
|
|
90
|
-
|
|
91
|
-
class MyDb
|
|
92
|
-
inherits MyDb, EventEmitter
|
|
93
|
-
get: (key)->
|
|
94
|
-
# Demo the event object bubbling usage:
|
|
95
|
-
result = @emit 'getting', key
|
|
96
|
-
if isObject result
|
|
97
|
-
return if result.state is ABORT
|
|
98
|
-
return result.result if result.state is DONE
|
|
99
|
-
_get(key)
|
|
100
|
-
|
|
101
|
-
db = new MyDb
|
|
102
|
-
db.on 'getting', (key)->
|
|
103
|
-
result = myGet(key);
|
|
104
|
-
if result?
|
|
105
|
-
# get the key succ
|
|
106
|
-
this.result =
|
|
107
|
-
state: DONE
|
|
108
|
-
result: result
|
|
109
|
-
else if result is null
|
|
110
|
-
# abort default get key.
|
|
111
|
-
this.result = state: ABORT;
|
|
112
|
-
# this.stopped = true # it will skip other listeners if true
|
|
113
|
-
```
|
|
74
|
+
Bubbling event usage:
|
|
114
75
|
|
|
115
76
|
```js
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
let isObject = require('util-ex/lib/is/type/object')
|
|
119
|
-
const ABORT = -1
|
|
120
|
-
const DONE = 0
|
|
77
|
+
import {EventEmitter, states} from 'events-ex';
|
|
78
|
+
import {isObject} from 'util-ex';
|
|
121
79
|
|
|
122
80
|
class MyDb extends EventEmitter {
|
|
123
81
|
get(key) {
|
|
124
82
|
// Demo the event object bubbling usage:
|
|
125
83
|
let result = this.emit('getting', key)
|
|
126
84
|
if(isObject(result)) {
|
|
127
|
-
if (result.state === ABORT) return
|
|
128
|
-
if (result.state === DONE) return result.result
|
|
85
|
+
if (result.state === states.ABORT) return
|
|
86
|
+
if (result.state === states.DONE) return result.result
|
|
129
87
|
}
|
|
130
88
|
return _get(key)
|
|
131
89
|
}
|
|
@@ -137,12 +95,12 @@ db.on('getting', function(key){
|
|
|
137
95
|
if (result != null) {
|
|
138
96
|
// get the key succ
|
|
139
97
|
this.result = {
|
|
140
|
-
state: DONE,
|
|
98
|
+
state: states.DONE,
|
|
141
99
|
result: result,
|
|
142
100
|
}
|
|
143
101
|
} else if (result === null) {
|
|
144
102
|
// abort default get key.
|
|
145
|
-
this.result = {state: ABORT};
|
|
103
|
+
this.result = {state: states.ABORT};
|
|
146
104
|
// this.stopped = true // it will skip other listeners if true
|
|
147
105
|
}
|
|
148
106
|
})
|
|
@@ -152,12 +110,13 @@ event-emitter usage:
|
|
|
152
110
|
|
|
153
111
|
```javascript
|
|
154
112
|
|
|
155
|
-
|
|
113
|
+
import {wrapEventEmitter as ee} from 'events-ex';
|
|
156
114
|
|
|
157
|
-
|
|
115
|
+
class MyClass { /* .. */ };
|
|
158
116
|
ee(MyClass.prototype); // All instances of MyClass will expose event-emitter interface
|
|
159
117
|
|
|
160
|
-
|
|
118
|
+
const emitter = new MyClass();
|
|
119
|
+
let listener;
|
|
161
120
|
|
|
162
121
|
emitter.on('test', listener = function (args) {
|
|
163
122
|
// … react to 'test' event
|
|
@@ -193,22 +152,26 @@ Add the event-able ability to the class directly.
|
|
|
193
152
|
* `this.self` is the original `this` object.
|
|
194
153
|
* `classMethods` *(object)*: hooked class methods to the class
|
|
195
154
|
|
|
196
|
-
```
|
|
197
|
-
eventable
|
|
198
|
-
|
|
199
|
-
class OtherClass
|
|
200
|
-
exec
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
eventable OtherClass
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
155
|
+
```js
|
|
156
|
+
import {eventable} from 'events-ex'
|
|
157
|
+
|
|
158
|
+
class OtherClass {
|
|
159
|
+
exec() {console.log "my original exec"}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
class MyClass {}
|
|
163
|
+
// only 'on', 'off', 'emit', 'emitAsync' and static methods 'listenerCount' added to the class
|
|
164
|
+
eventable(MyClass, include: ['on', 'off', 'emit', 'emitAsync', '@listenerCount'])
|
|
165
|
+
|
|
166
|
+
// add the eventable ability to OtherClass and inject the exec method of OtherClass.
|
|
167
|
+
eventable(OtherClass, {methods: {
|
|
168
|
+
exec() {
|
|
169
|
+
console.log("new exec")
|
|
170
|
+
this.super() //call the original method
|
|
171
|
+
}}
|
|
172
|
+
})
|
|
211
173
|
```
|
|
174
|
+
|
|
212
175
|
#### allOff(obj) _(events-ex/all-off)_
|
|
213
176
|
|
|
214
177
|
**keep compatible only**: the `removeAllListeners` has already been buildin.
|
|
@@ -221,8 +184,8 @@ Whether object has some listeners attached to the object.
|
|
|
221
184
|
When `name` is provided, it checks listeners for specific event name
|
|
222
185
|
|
|
223
186
|
```javascript
|
|
187
|
+
import {hasListeners, wrapEventEmitter as ee} from 'events-ex/has-listeners';
|
|
224
188
|
var emitter = ee();
|
|
225
|
-
var hasListeners = require('events-ex/has-listeners');
|
|
226
189
|
var listener = function () {};
|
|
227
190
|
|
|
228
191
|
hasListeners(emitter); // false
|
|
@@ -248,7 +211,7 @@ Unifies event handling for two objects. Events emitted on _emitter1_ would be al
|
|
|
248
211
|
Non reversible.
|
|
249
212
|
|
|
250
213
|
```javascript
|
|
251
|
-
|
|
214
|
+
import {unify as eeUnify, wrapEventEmitter as ee} from 'events-ex';
|
|
252
215
|
|
|
253
216
|
var emitter1 = ee(), listener1, listener3;
|
|
254
217
|
var emitter2 = ee(), listener2, listener4;
|
|
@@ -272,3 +235,5 @@ emitter2.emit('test'); // Invoked listener1, listener2, listener3 and listener4
|
|
|
272
235
|
```
|
|
273
236
|
|
|
274
237
|
|
|
238
|
+
[event-emitter]: https://github.com/medikoo/event-emitter
|
|
239
|
+
[Ability]: https://github.com/snowyu/custom-ability.js
|
package/ability.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
module.exports = require('./eventable')
|
|
1
|
+
module.exports = require('./lib/eventable')
|