프로젝트

일반

사용자정보

통계
| 개정판:

root / HServer / 00.Server / 00.Program / node_modules / ultron / index.js

이력 | 보기 | 이력해설 | 다운로드 (3.04 KB)

1
'use strict';
2

    
3
var 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
 */
13
var 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
 */
24
function 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
 */
40
Ultron.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
 */
55
Ultron.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
 */
68
Ultron.prototype.remove = function remove() {
69
  var args = arguments
70
    , ee = this.ee
71
    , event;
72

    
73
  //
74
  // When no event names are provided we assume that we need to clear all the
75
  // events that were assigned through us.
76
  //
77
  if (args.length === 1 && 'string' === typeof args[0]) {
78
    args = args[0].split(/[, ]+/);
79
  } else if (!args.length) {
80
    if (ee.eventNames) {
81
      args = ee.eventNames();
82
    } else if (ee._events) {
83
      args = [];
84

    
85
      for (event in ee._events) {
86
        if (has.call(ee._events, event)) args.push(event);
87
      }
88

    
89
      if (Object.getOwnPropertySymbols) {
90
        args = args.concat(Object.getOwnPropertySymbols(ee._events));
91
      }
92
    }
93
  }
94

    
95
  for (var i = 0; i < args.length; i++) {
96
    var listeners = ee.listeners(args[i]);
97

    
98
    for (var j = 0; j < listeners.length; j++) {
99
      event = listeners[j];
100

    
101
      //
102
      // Once listeners have a `listener` property that stores the real listener
103
      // in the EventEmitter that ships with Node.js.
104
      //
105
      if (event.listener) {
106
        if (event.listener.__ultron !== this.id) continue;
107
      } else if (event.__ultron !== this.id) {
108
        continue;
109
      }
110

    
111
      ee.removeListener(args[i], event);
112
    }
113
  }
114

    
115
  return this;
116
};
117

    
118
/**
119
 * Destroy the Ultron instance, remove all listeners and release all references.
120
 *
121
 * @returns {Boolean}
122
 * @api public
123
 */
124
Ultron.prototype.destroy = function destroy() {
125
  if (!this.ee) return false;
126

    
127
  this.remove();
128
  this.ee = null;
129

    
130
  return true;
131
};
132

    
133
//
134
// Expose the module.
135
//
136
module.exports = Ultron;