-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathEventProxy.js
99 lines (89 loc) · 2.75 KB
/
EventProxy.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
'use strict'
var EventEmitter = require('events').EventEmitter
var inherits = require('inherits')
module.exports = EventProxy
function EventProxy (proxied) {
this._listening = {}
this._ownEvents = {}
this._proxied = proxied
}
inherits(EventProxy, EventEmitter)
Object.assign(EventProxy.prototype, {
_initEventProxy: function (eventName) {
if (this._ownEvents[eventName]) return
// Already listening to proxied event
if (this._listening[eventName] !== undefined) return
var self = this
var listener = function (payload) {
self.emit(eventName, payload)
}
this._listening[eventName] = listener
this._proxied.addListener(eventName, listener)
},
_exitEventProxy: function (eventName) {
if (this._ownEvents[eventName]) return
// Still listener for event given
if (this.listenerCount(eventName) > 0) return
var listener = this._listening[eventName]
// Called without ever being added
if (listener === undefined) return
delete this._listening[eventName]
this._proxied.removeListener(eventName, listener)
},
_exitAll: function () {
for (var eventName of this._listening) {
this._exitEventProxy(eventName)
}
},
addListener: function (eventName, listener) {
EventEmitter.prototype.addListener.call(this, eventName, listener)
this._initEventProxy(eventName)
return this
},
removeListener: function (eventName, listener) {
EventEmitter.prototype.removeListener.call(this, eventName, listener)
this._exitEventProxy(eventName)
return this
},
removeAllListeners: function (eventName) {
EventEmitter.prototype.removeAllListeners.call(this, eventName)
if (arguments.length === 0) {
this._exitAll()
} else {
this._exitEventProxy(eventName)
}
return this
},
once: function (eventName, listener) {
var self = this
var wrapper = function (payload) {
listener(payload)
self.removeListener(eventName, wrapper)
}
return this.addListener(eventName, wrapper)
},
on: function (eventName, listener) {
return this.addListener(eventName, listener)
},
off: function (eventName, listener) {
return this.removeListener(eventName, listener)
}
})
// Node 4 compatibility
if (EventEmitter.prototype.prependListener) {
Object.assign(EventProxy.prototype, {
prependListener: function (eventName, listener) {
EventEmitter.prototype.prependListener.call(this, eventName, listener)
this._initEventProxy(eventName)
return this
},
prependOnceListener: function (eventName, listener) {
var self = this
var wrapper = function (payload) {
listener(payload)
self.removeListener(eventName, wrapper)
}
return this.prependListener(eventName, wrapper)
}
})
}