Websocket
[VSoRC/.git] / node_modules / websocket / node_modules / yaeti / lib / EventTarget.js
1 /**
2  * Expose the _EventTarget class.
3  */
4 module.exports = _EventTarget;
5
6 function _EventTarget() {
7         // Do nothing if called for a native EventTarget object..
8         if (typeof this.addEventListener === 'function') {
9                 return;
10         }
11
12         this._listeners = {};
13
14         this.addEventListener = _addEventListener;
15         this.removeEventListener = _removeEventListener;
16         this.dispatchEvent = _dispatchEvent;
17 }
18
19 Object.defineProperties(_EventTarget.prototype, {
20         listeners: {
21                 get: function () {
22                         return this._listeners;
23                 }
24         }
25 });
26
27 function _addEventListener(type, newListener) {
28         var
29                 listenersType,
30                 i, listener;
31
32         if (!type || !newListener) {
33                 return;
34         }
35
36         listenersType = this._listeners[type];
37         if (listenersType === undefined) {
38                 this._listeners[type] = listenersType = [];
39         }
40
41         for (i = 0; !!(listener = listenersType[i]); i++) {
42                 if (listener === newListener) {
43                         return;
44                 }
45         }
46
47         listenersType.push(newListener);
48 }
49
50 function _removeEventListener(type, oldListener) {
51         var
52                 listenersType,
53                 i, listener;
54
55         if (!type || !oldListener) {
56                 return;
57         }
58
59         listenersType = this._listeners[type];
60         if (listenersType === undefined) {
61                 return;
62         }
63
64         for (i = 0; !!(listener = listenersType[i]); i++) {
65                 if (listener === oldListener) {
66                         listenersType.splice(i, 1);
67                         break;
68                 }
69         }
70
71         if (listenersType.length === 0) {
72                 delete this._listeners[type];
73         }
74 }
75
76 function _dispatchEvent(event) {
77         var
78                 type,
79                 listenersType,
80                 dummyListener,
81                 stopImmediatePropagation = false,
82                 i, listener;
83
84         if (!event || typeof event.type !== 'string') {
85                 throw new Error('`event` must have a valid `type` property');
86         }
87
88         // Do some stuff to emulate DOM Event behavior (just if this is not a
89         // DOM Event object)
90         if (event._yaeti) {
91                 event.target = this;
92                 event.cancelable = true;
93         }
94
95         // Attempt to override the stopImmediatePropagation() method
96         try {
97                 event.stopImmediatePropagation = function () {
98                         stopImmediatePropagation = true;
99                 };
100         } catch (error) {}
101
102         type = event.type;
103         listenersType = (this._listeners[type] || []);
104
105         dummyListener = this['on' + type];
106         if (typeof dummyListener === 'function') {
107                 dummyListener.call(this, event);
108         }
109
110         for (i = 0; !!(listener = listenersType[i]); i++) {
111                 if (stopImmediatePropagation) {
112                         break;
113                 }
114
115                 listener.call(this, event);
116         }
117
118         return !event.defaultPrevented;
119 }