# All files / src event-handler.js

40% Statements 10/25
45.45% Branches 5/11
40% Functions 4/10
40% Lines 10/25

    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74

    77x
    77x
    77x
    77x

    77x

    77x

    77x
    77x
    348x

    348x

     /*
    *
    * All objects in the event handling chain should inherit from this class
    *
    */

    import {logger} from './utils/logger';
    import {ErrorTypes, ErrorDetails} from './errors';
    import Event from './events';

    class EventHandler {

      constructor(hls, ...events) {
        this.hls = hls;
        this.onEvent = this.onEvent.bind(this);
        this.handledEvents = events;
        this.useGenericHandler = true;

        this.registerListeners();
      }

      destroy() {
        this.unregisterListeners();
      }

      isEventHandler() {
        return typeof this.handledEvents === 'object' && this.handledEvents.length && typeof this.onEvent === 'function';
      }

      registerListeners() {
        Eif (this.isEventHandler()) {
          this.handledEvents.forEach(function(event) {
            Iif (event === 'hlsEventGeneric') {
              throw new Error('Forbidden event name: ' + event);
            }
            this.hls.on(event, this.onEvent);
          }, this);
        }
      }

      unregisterListeners() {
        if (this.isEventHandler()) {
          this.handledEvents.forEach(function(event) {
            this.hls.off(event, this.onEvent);
          }, this);
        }
      }

      /**
       * arguments: event (string), data (any)
       */
      onEvent(event, data) {
        this.onEventGeneric(event, data);
      }

      onEventGeneric(event, data) {
        var eventToFunction = function(event, data) {
          var funcName = 'on' + event.replace('hls', '');
          if (typeof this[funcName] !== 'function') {
            throw new Error(`Event ${event} has no generic handler in this ${this.constructor.name} class (tried ${funcName})`);
          }
          return this[funcName].bind(this, data);
        };
        try {
          eventToFunction.call(this, event, data).call();
        } catch (err) {
          logger.error(`internal error happened while processing ${event}:${err.message}`);
          this.hls.trigger(Event.ERROR, {type: ErrorTypes.OTHER_ERROR, details: ErrorDetails.INTERNAL_EXCEPTION, fatal: false, event : event, err : err});
        }
      }
    }

    export default EventHandler;