mson-three/src/node/vendor/eventtarget.ts

88 lines
2.4 KiB
TypeScript

//
// None of the following code was written for mson-three explicity.
// attribution is provided where necessary.
//
// all of this junk was copied from abandoned npm modules which mimic browser
// APIs in Node.js in order to make GLTFExporter work.
//
// this is taken from abandoned npm module "eventtarget" by Jesús Leganés Combarro "Piranna"
//
export class EventTarget {
listeners: any = {};
addEventListener(type: string | number, listener: any) {
if (!listener) return;
var listeners_type = this.listeners[type];
if (listeners_type === undefined)
this.listeners[type] = listeners_type = [];
for (var i = 0, l; (l = listeners_type[i]); i++) if (l === listener) return;
listeners_type.push(listener);
}
dispatchEvent(event: {
type: any;
message?: any;
_dispatched?: any;
cancelable?: any;
defaultPrevented?: any;
isTrusted?: any;
preventDefault?: any;
stopImmediatePropagation?: any;
target?: any;
timeStamp?: any;
}) {
if (event._dispatched) throw 'InvalidStateError';
event._dispatched = true;
var type = event.type;
if (type == undefined || type == '') throw 'UNSPECIFIED_EVENT_TYPE_ERR';
var listenerArray = this.listeners[type] || [];
var dummyListener = (this as any)['on' + type];
if (typeof dummyListener == 'function')
listenerArray = listenerArray.concat(dummyListener);
var stopImmediatePropagation = false;
// [ToDo] Use read-only properties instead of attributes when availables
event.cancelable = true;
event.defaultPrevented = false;
event.isTrusted = false;
event.preventDefault = function () {
if (this.cancelable) this.defaultPrevented = true;
};
event.stopImmediatePropagation = function () {
stopImmediatePropagation = true;
};
event.target = this;
event.timeStamp = new Date().getTime();
for (var i = 0, listener; (listener = listenerArray[i]); i++) {
if (stopImmediatePropagation) break;
listener.call(this, event);
}
return !event.defaultPrevented;
}
removeEventListener(type: string | number, listener: any) {
if (!listener) return;
var listeners_type = this.listeners[type];
if (listeners_type === undefined) return;
for (var i = 0, l; (l = listeners_type[i]); i++)
if (l === listener) {
listeners_type.splice(i, 1);
break;
}
if (!listeners_type.length) delete this.listeners[type];
}
}