| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 | 'use strict';/** * Class representing an event. * * @private */class Event {  /**   * Create a new `Event`.   *   * @param {String} type The name of the event   * @param {Object} target A reference to the target to which the event was dispatched   */  constructor(type, target) {    this.target = target;    this.type = type;  }}/** * Class representing a message event. * * @extends Event * @private */class MessageEvent extends Event {  /**   * Create a new `MessageEvent`.   *   * @param {(String|Buffer|ArrayBuffer|Buffer[])} data The received data   * @param {WebSocket} target A reference to the target to which the event was dispatched   */  constructor(data, target) {    super('message', target);    this.data = data;  }}/** * Class representing a close event. * * @extends Event * @private */class CloseEvent extends Event {  /**   * Create a new `CloseEvent`.   *   * @param {Number} code The status code explaining why the connection is being closed   * @param {String} reason A human-readable string explaining why the connection is closing   * @param {WebSocket} target A reference to the target to which the event was dispatched   */  constructor(code, reason, target) {    super('close', target);    this.wasClean = target._closeFrameReceived && target._closeFrameSent;    this.reason = reason;    this.code = code;  }}/** * Class representing an open event. * * @extends Event * @private */class OpenEvent extends Event {  /**   * Create a new `OpenEvent`.   *   * @param {WebSocket} target A reference to the target to which the event was dispatched   */  constructor(target) {    super('open', target);  }}/** * Class representing an error event. * * @extends Event * @private */class ErrorEvent extends Event {  /**   * Create a new `ErrorEvent`.   *   * @param {Object} error The error that generated this event   * @param {WebSocket} target A reference to the target to which the event was dispatched   */  constructor(error, target) {    super('error', target);    this.message = error.message;    this.error = error;  }}/** * This provides methods for emulating the `EventTarget` interface. It's not * meant to be used directly. * * @mixin */const EventTarget = {  /**   * Register an event listener.   *   * @param {String} method A string representing the event type to listen for   * @param {Function} listener The listener to add   * @public   */  addEventListener(method, listener) {    if (typeof listener !== 'function') return;    function onMessage(data) {      listener.call(this, new MessageEvent(data, this));    }    function onClose(code, message) {      listener.call(this, new CloseEvent(code, message, this));    }    function onError(error) {      listener.call(this, new ErrorEvent(error, this));    }    function onOpen() {      listener.call(this, new OpenEvent(this));    }    if (method === 'message') {      onMessage._listener = listener;      this.on(method, onMessage);    } else if (method === 'close') {      onClose._listener = listener;      this.on(method, onClose);    } else if (method === 'error') {      onError._listener = listener;      this.on(method, onError);    } else if (method === 'open') {      onOpen._listener = listener;      this.on(method, onOpen);    } else {      this.on(method, listener);    }  },  /**   * Remove an event listener.   *   * @param {String} method A string representing the event type to remove   * @param {Function} listener The listener to remove   * @public   */  removeEventListener(method, listener) {    const listeners = this.listeners(method);    for (var i = 0; i < listeners.length; i++) {      if (listeners[i] === listener || listeners[i]._listener === listener) {        this.removeListener(method, listeners[i]);      }    }  }};module.exports = EventTarget;
 |