All files emitter.ts

90.9% Statements 20/22
60% Branches 3/5
100% Functions 6/6
90.9% Lines 20/22

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 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60                3x       21x       2x 2x     2x 2x   2x   2x 2x       2x   2x 2x 2x           6x   6x 4x     2x 2x 2x               2x      
export type EventName = "datafile_set" | "context_set" | "sticky_set";
 
export type EventDetails = Record<string, unknown>;
 
export type EventCallback = (details: EventDetails) => void;
 
export type Listeners = Record<EventName, EventCallback[]> | {}; // eslint-disable-line
 
export class Emitter {
  listeners: Listeners;
 
  constructor() {
    this.listeners = {};
  }
 
  on(eventName: EventName, callback: EventCallback) {
    if (!this.listeners[eventName]) {
      this.listeners[eventName] = [];
    }
 
    const listeners = this.listeners[eventName];
    listeners.push(callback);
 
    let isActive = true;
 
    return function unsubscribe() {
      Iif (!isActive) {
        return;
      }
 
      isActive = false;
 
      const index = listeners.indexOf(callback);
      if (index !== -1) {
        listeners.splice(index, 1);
      }
    };
  }
 
  trigger(eventName: EventName, details: EventDetails = {}) {
    const listeners = this.listeners[eventName];
 
    if (!listeners) {
      return;
    }
 
    listeners.forEach(function (listener) {
      try {
        listener(details);
      } catch (err) {
        console.error(err);
      }
    });
  }
 
  clearAll() {
    this.listeners = {};
  }
}