Updating npm externals
[KiwiIRC.git] / node / node_modules / socket.io-client / lib / events.js
1
2 /**
3 * socket.io
4 * Copyright(c) 2011 LearnBoost <dev@learnboost.com>
5 * MIT Licensed
6 */
7
8 (function (exports, io) {
9
10 /**
11 * Expose constructor.
12 */
13
14 exports.EventEmitter = EventEmitter;
15
16 /**
17 * Event emitter constructor.
18 *
19 * @api public.
20 */
21
22 function EventEmitter () {};
23
24 /**
25 * Adds a listener
26 *
27 * @api public
28 */
29
30 EventEmitter.prototype.on = function (name, fn) {
31 if (!this.$events) {
32 this.$events = {};
33 }
34
35 if (!this.$events[name]) {
36 this.$events[name] = fn;
37 } else if (io.util.isArray(this.$events[name])) {
38 this.$events[name].push(fn);
39 } else {
40 this.$events[name] = [this.$events[name], fn];
41 }
42
43 return this;
44 };
45
46 EventEmitter.prototype.addListener = EventEmitter.prototype.on;
47
48 /**
49 * Adds a volatile listener.
50 *
51 * @api public
52 */
53
54 EventEmitter.prototype.once = function (name, fn) {
55 var self = this;
56
57 function on () {
58 self.removeListener(name, on);
59 fn.apply(this, arguments);
60 };
61
62 on.listener = fn;
63 this.on(name, on);
64
65 return this;
66 };
67
68 /**
69 * Removes a listener.
70 *
71 * @api public
72 */
73
74 EventEmitter.prototype.removeListener = function (name, fn) {
75 if (this.$events && this.$events[name]) {
76 var list = this.$events[name];
77
78 if (io.util.isArray(list)) {
79 var pos = -1;
80
81 for (var i = 0, l = list.length; i < l; i++) {
82 if (list[i] === fn || (list[i].listener && list[i].listener === fn)) {
83 pos = i;
84 break;
85 }
86 }
87
88 if (pos < 0) {
89 return this;
90 }
91
92 list.splice(pos, 1);
93
94 if (!list.length) {
95 delete this.$events[name];
96 }
97 } else if (list === fn || (list.listener && list.listener === fn)) {
98 delete this.$events[name];
99 }
100 }
101
102 return this;
103 };
104
105 /**
106 * Removes all listeners for an event.
107 *
108 * @api public
109 */
110
111 EventEmitter.prototype.removeAllListeners = function (name) {
112 // TODO: enable this when node 0.5 is stable
113 //if (name === undefined) {
114 //this.$events = {};
115 //return this;
116 //}
117
118 if (this.$events && this.$events[name]) {
119 this.$events[name] = null;
120 }
121
122 return this;
123 };
124
125 /**
126 * Gets all listeners for a certain event.
127 *
128 * @api publci
129 */
130
131 EventEmitter.prototype.listeners = function (name) {
132 if (!this.$events) {
133 this.$events = {};
134 }
135
136 if (!this.$events[name]) {
137 this.$events[name] = [];
138 }
139
140 if (!io.util.isArray(this.$events[name])) {
141 this.$events[name] = [this.$events[name]];
142 }
143
144 return this.$events[name];
145 };
146
147 /**
148 * Emits an event.
149 *
150 * @api public
151 */
152
153 EventEmitter.prototype.emit = function (name) {
154 if (!this.$events) {
155 return false;
156 }
157
158 var handler = this.$events[name];
159
160 if (!handler) {
161 return false;
162 }
163
164 var args = Array.prototype.slice.call(arguments, 1);
165
166 if ('function' == typeof handler) {
167 handler.apply(this, args);
168 } else if (io.util.isArray(handler)) {
169 var listeners = handler.slice();
170
171 for (var i = 0, l = listeners.length; i < l; i++) {
172 listeners[i].apply(this, args);
173 }
174 } else {
175 return false;
176 }
177
178 return true;
179 };
180
181 })(
182 'undefined' != typeof io ? io : module.exports
183 , 'undefined' != typeof io ? io : module.parent.exports
184 );