cscg24-guacamole

CSCG 2024 Challenge 'Guacamole Mashup'
git clone https://git.sinitax.com/sinitax/cscg24-guacamole
Log | Files | Refs | sfeed.txt

index.js (2962B)


      1'use strict';
      2
      3var has = Object.prototype.hasOwnProperty;
      4
      5/**
      6 * An auto incrementing id which we can use to create "unique" Ultron instances
      7 * so we can track the event emitters that are added through the Ultron
      8 * interface.
      9 *
     10 * @type {Number}
     11 * @private
     12 */
     13var id = 0;
     14
     15/**
     16 * Ultron is high-intelligence robot. It gathers intelligence so it can start improving
     17 * upon his rudimentary design. It will learn from your EventEmitting patterns
     18 * and exterminate them.
     19 *
     20 * @constructor
     21 * @param {EventEmitter} ee EventEmitter instance we need to wrap.
     22 * @api public
     23 */
     24function Ultron(ee) {
     25  if (!(this instanceof Ultron)) return new Ultron(ee);
     26
     27  this.id = id++;
     28  this.ee = ee;
     29}
     30
     31/**
     32 * Register a new EventListener for the given event.
     33 *
     34 * @param {String} event Name of the event.
     35 * @param {Functon} fn Callback function.
     36 * @param {Mixed} context The context of the function.
     37 * @returns {Ultron}
     38 * @api public
     39 */
     40Ultron.prototype.on = function on(event, fn, context) {
     41  fn.__ultron = this.id;
     42  this.ee.on(event, fn, context);
     43
     44  return this;
     45};
     46/**
     47 * Add an EventListener that's only called once.
     48 *
     49 * @param {String} event Name of the event.
     50 * @param {Function} fn Callback function.
     51 * @param {Mixed} context The context of the function.
     52 * @returns {Ultron}
     53 * @api public
     54 */
     55Ultron.prototype.once = function once(event, fn, context) {
     56  fn.__ultron = this.id;
     57  this.ee.once(event, fn, context);
     58
     59  return this;
     60};
     61
     62/**
     63 * Remove the listeners we assigned for the given event.
     64 *
     65 * @returns {Ultron}
     66 * @api public
     67 */
     68Ultron.prototype.remove = function remove() {
     69  var args = arguments
     70    , event;
     71
     72  //
     73  // When no event names are provided we assume that we need to clear all the
     74  // events that were assigned through us.
     75  //
     76  if (args.length === 1 && 'string' === typeof args[0]) {
     77    args = args[0].split(/[, ]+/);
     78  } else if (!args.length) {
     79    args = [];
     80
     81    for (event in this.ee._events) {
     82      if (has.call(this.ee._events, event)) args.push(event);
     83    }
     84  }
     85
     86  for (var i = 0; i < args.length; i++) {
     87    var listeners = this.ee.listeners(args[i]);
     88
     89    for (var j = 0; j < listeners.length; j++) {
     90      event = listeners[j];
     91
     92      //
     93      // Once listeners have a `listener` property that stores the real listener
     94      // in the EventEmitter that ships with Node.js.
     95      //
     96      if (event.listener) {
     97        if (event.listener.__ultron !== this.id) continue;
     98        delete event.listener.__ultron;
     99      } else {
    100        if (event.__ultron !== this.id) continue;
    101        delete event.__ultron;
    102      }
    103
    104      this.ee.removeListener(args[i], event);
    105    }
    106  }
    107
    108  return this;
    109};
    110
    111/**
    112 * Destroy the Ultron instance, remove all listeners and release all references.
    113 *
    114 * @returns {Boolean}
    115 * @api public
    116 */
    117Ultron.prototype.destroy = function destroy() {
    118  if (!this.ee) return false;
    119
    120  this.remove();
    121  this.ee = null;
    122
    123  return true;
    124};
    125
    126//
    127// Expose the module.
    128//
    129module.exports = Ultron;