All files / core/MastercardEventEmitter MastercardEventEmitter.class.js

100% Statements 23/23
100% Branches 13/13
100% Functions 7/7
100% Lines 23/23

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43    6x 5x 5x 5x 5x   6x 8x 8x 4x   8x 6x   8x   2x     6x 6x         3x 3x 2x 2x           5x 5x 5x 6x      
function mastercardEventEmitter_injector() {
  /** @type {import('./types').MastercardEventEmitter} */
  return class MastercardEventEmitter {
    constructor () {
      this._emitter = new EventTarget();
      this._eventData = new WeakMap();
      this._callbacks = new Map();
    }
    /** @type {import('./types').MastercardEventEmitter['on']} */
    on(eventName, callback) {
      const proxiedEventHandler = (/** @type {object} */ event) => {
        callback(this._eventData.get(event));
      }
      if (!this._callbacks.has(eventName)) {
        this._callbacks.set(eventName, new WeakMap());
      }
      if (this._callbacks.get(eventName).has(callback)) {
        // Don't double register!
        return;
      }
      // This is so we can look up the actual event handler when calling .off
      this._callbacks.get(eventName).set(callback, proxiedEventHandler);
      this._emitter.addEventListener(eventName, proxiedEventHandler);
    }
 
    /** @type {import('./types').MastercardEventEmitter['off']} */
    off(eventName, callback) {
      const proxiedEventHandler = this._callbacks.get(eventName)?.get(callback);
      if (proxiedEventHandler) {
        this._emitter.removeEventListener(eventName, proxiedEventHandler);
        this._callbacks.get(eventName)?.delete(callback);
      }
    }
 
    /** @type {import('./types').MastercardEventEmitter['emit']} */
    emit(eventName, eventData) {
      const newEvent = new Event(eventName);
      this._eventData.set(newEvent, eventData);
      this._emitter.dispatchEvent(newEvent);
    }
  }
}
export { mastercardEventEmitter_injector };