PageSourceSearch

https://cdn4.hola.org/util/events.js

js hola.org collected 2026-09-24 10:18:48 UTC 6,258 bytes, 216 lines download raw bytes

1/*jslint skip_file:true*/
2(function(){
3var define;
4var is_node = typeof module=='object' && module.exports && module.children;
5if (!is_node)
6    define = self.define;
7else
8    define = require('./require_node.js').define(module, '../');
9define([], function(){
10
11/**
12 * Minimal EventEmitter interface that is molded against the Node.js
13 * EventEmitter interface.
14 *
15 * @constructor
16 * @api public
17 */
18function EventEmitter(){ this._events = {}; }
19
20/**
21 * Return a list of assigned event listeners.
22 *
23 * @param {String} name The events that should be listed.
24 * @returns {Array}
25 * @api public
26 */
27EventEmitter.prototype.listeners = function listeners(name){
28    var events = this._events && this._events[name] || [];
29    var length = events.length, listeners = [], event;
30    for (var i = 0; i<length; event = events[++i])
31        listeners.push(events[i].fn);
32    return listeners;
33};
34
35/**
36 * Emit an event to all registered event listeners.
37 *
38 * @param {String} name The name of the event.
39 * @returns {Boolean} Indication if we've emitted an event.
40 * @api public
41 */
42EventEmitter.prototype.emit = function emit(name, a1, a2, a3, a4, a5){
43    if (!this._events || !this._events[name])
44        return false;
45    var listeners = this._events[name], length = listeners.length;
46    var len = arguments.length, event = listeners[0], args, i;
47    if (length===1)
48    {
49        switch (len)
50        {
51        case 1:
52            event.fn.call(event.context||this);
53            break;
54        case 2:
55            event.fn.call(event.context||this, a1);
56            break;
57        case 3:
58            event.fn.call(event.context||this, a1, a2);
59            break;
60        case 4:
61            event.fn.call(event.context||this, a1, a2, a3);
62            break;
63        case 5:
64            event.fn.call(event.context||this, a1, a2, a3, a4);
65            break;
66        case 6:
67            event.fn.call(event.context||this, a1, a2, a3, a4, a5);
68            break;
69        default:
70            for (i = 1, args = new Array(len-1); i<len; i++)
71                args[i-1] = arguments[i];
72            event.fn.apply(event.context||this, args);
73        }
74        if (event.once)
75            remove_listener.apply(this, [name, event]);
76    }
77    else
78    {
79        for (i = 1, args = new Array(len-1); i<len; i++)
80            args[i-1] = arguments[i];
81        for (i = 0; i<length; event = listeners[++i])
82        {
83            event.fn.apply(event.context||this, args);
84            if (event.once)
85                remove_listener.apply(this, [name, event]);
86        }
87    }
88    return true;
89};
90
91function add_listener(name, fn, opt){
92    opt = opt||{};
93    if (!this._events)
94        this._events = {};
95    if (!this._events[name])
96        this._events[name] = [];
97    var event = {fn: fn};
98    if (opt.context)
99        event.context = opt.context;
100    if (opt.once)
101        event.once = opt.once;
102    if (opt.prepend)
103        this._events[name].unshift(event);
104    else
105        this._events[name].push(event);
106    return this;
107}
108
109function remove_listener(name, listener){
110    if (!this._events || !this._events[name])
111        return this;
112    var listeners = this._events[name], events = [];
113    var is_fn = typeof listener=='function';
114    for (var i = 0, length = listeners.length; i<length; i++){
115        if (!listener)
116            continue;
117        if (is_fn && listeners[i].fn!==listener ||
118            !is_fn && listeners[i]!==listener)
119        {
120            events.push(listeners[i]);
121        }
122    }
123    // reset the array, or remove it completely if we have no more listeners
124    if (events.length)
125        this._events[name] = events;
126    else
127        this._events[name] = null;
128    return this;
129}
130
131/**
132 * Register a new EventListener for the given event.
133 *
134 * @param {String} name Name of the event.
135 * @param {Function} fn Callback function.
136 * @param context The context of the function.
137 * @api public
138 */
139EventEmitter.prototype.on = function on(name, fn, context){
140    return add_listener.apply(this, [name, fn, {context: context}]); };
141
142/**
143 * Add an EventListener that's only called once.
144 *
145 * @param {String} name Name of the event.
146 * @param {Function} fn Callback function.
147 * @param context The context of the function.
148 * @api public
149 */
150EventEmitter.prototype.once = function once(name, fn, context){
151    return add_listener.apply(this, [name, fn,
152        {context: context, once: true}]);
153};
154
155EventEmitter.prototype.prependListener = function prependListener(name, fn,
156    context)
157{
158    return add_listener.apply(this, [name, fn, {context: context,
159        prepend: true}]);
160};
161
162EventEmitter.prototype.prependOnceListener = function prependOnceListener(
163    name, fn, context)
164{
165    return this.prependListener(name, fn, {context: context, prepend: true,
166        once: true});
167};
168
169/**
170 * Remove event listeners.
171 *
172 * @param {String} name The event we want to remove.
173 * @param {Function} fn The listener that we need to find.
174 * @api public
175 */
176EventEmitter.prototype.removeListener = function removeListener(name, fn){
177    return remove_listener.apply(this, [name, fn]); };
178
179/**
180 * Remove all listeners or only the listeners for the specified event.
181 *
182 * @param {String} name The event want to remove all listeners for.
183 * @api public
184 */
185EventEmitter.prototype.removeAllListeners = function removeAllListeners(name){
186  if (!this._events)
187      return this;
188  if (name)
189      this._events[name] = null;
190  else
191      this._events = {};
192  return this;
193};
194
195// alias methods names because people roll like that
196EventEmitter.prototype.off = EventEmitter.prototype.removeListener;
197EventEmitter.prototype.addListener = EventEmitter.prototype.on;
198
199// this function doesn't apply anymore
200EventEmitter.prototype.setMaxListeners = function setMaxListeners(){
201  return this; };
202
203EventEmitter.prototype.eventNames = function eventNames(){
204    var _this = this;
205    return Object.keys(this._events).filter(function(e){
206        return _this._events[e]!==null; });
207};
208
209// expose the module
210EventEmitter.EventEmitter = EventEmitter;
211// XXX pavlo: don't exist in node sources, not used in our code, need to check
212// external usages and remove
213EventEmitter.EventEmitter2 = EventEmitter;
214EventEmitter.EventEmitter3 = EventEmitter;
215
216return EventEmitter; }); })();

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.