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