Websocket
[VSoRC/.git] / node_modules / websocket / node_modules / yaeti / lib / EventTarget.js
diff --git a/node_modules/websocket/node_modules/yaeti/lib/EventTarget.js b/node_modules/websocket/node_modules/yaeti/lib/EventTarget.js
new file mode 100644 (file)
index 0000000..403c75b
--- /dev/null
@@ -0,0 +1,119 @@
+/**
+ * Expose the _EventTarget class.
+ */
+module.exports = _EventTarget;
+
+function _EventTarget() {
+       // Do nothing if called for a native EventTarget object..
+       if (typeof this.addEventListener === 'function') {
+               return;
+       }
+
+       this._listeners = {};
+
+       this.addEventListener = _addEventListener;
+       this.removeEventListener = _removeEventListener;
+       this.dispatchEvent = _dispatchEvent;
+}
+
+Object.defineProperties(_EventTarget.prototype, {
+       listeners: {
+               get: function () {
+                       return this._listeners;
+               }
+       }
+});
+
+function _addEventListener(type, newListener) {
+       var
+               listenersType,
+               i, listener;
+
+       if (!type || !newListener) {
+               return;
+       }
+
+       listenersType = this._listeners[type];
+       if (listenersType === undefined) {
+               this._listeners[type] = listenersType = [];
+       }
+
+       for (i = 0; !!(listener = listenersType[i]); i++) {
+               if (listener === newListener) {
+                       return;
+               }
+       }
+
+       listenersType.push(newListener);
+}
+
+function _removeEventListener(type, oldListener) {
+       var
+               listenersType,
+               i, listener;
+
+       if (!type || !oldListener) {
+               return;
+       }
+
+       listenersType = this._listeners[type];
+       if (listenersType === undefined) {
+               return;
+       }
+
+       for (i = 0; !!(listener = listenersType[i]); i++) {
+               if (listener === oldListener) {
+                       listenersType.splice(i, 1);
+                       break;
+               }
+       }
+
+       if (listenersType.length === 0) {
+               delete this._listeners[type];
+       }
+}
+
+function _dispatchEvent(event) {
+       var
+               type,
+               listenersType,
+               dummyListener,
+               stopImmediatePropagation = false,
+               i, listener;
+
+       if (!event || typeof event.type !== 'string') {
+               throw new Error('`event` must have a valid `type` property');
+       }
+
+       // Do some stuff to emulate DOM Event behavior (just if this is not a
+       // DOM Event object)
+       if (event._yaeti) {
+               event.target = this;
+               event.cancelable = true;
+       }
+
+       // Attempt to override the stopImmediatePropagation() method
+       try {
+               event.stopImmediatePropagation = function () {
+                       stopImmediatePropagation = true;
+               };
+       } catch (error) {}
+
+       type = event.type;
+       listenersType = (this._listeners[type] || []);
+
+       dummyListener = this['on' + type];
+       if (typeof dummyListener === 'function') {
+               dummyListener.call(this, event);
+       }
+
+       for (i = 0; !!(listener = listenersType[i]); i++) {
+               if (stopImmediatePropagation) {
+                       break;
+               }
+
+               listener.call(this, event);
+       }
+
+       return !event.defaultPrevented;
+}