arnaucube
arnaucube/socketioMEANseedPublic Self-hosted repository
socketioMEANseed/server/node_modules/ee-first/index.js
server/node_modules/ee-first/index.jsRaw
 1
 2module.exports = function first(stuff, done) {
 3  if (!Array.isArray(stuff))
 4    throw new TypeError('arg must be an array of [ee, events...] arrays')
 5
 6  var cleanups = []
 7
 8  for (var i = 0; i < stuff.length; i++) {
 9    var arr = stuff[i]
10
11    if (!Array.isArray(arr) || arr.length < 2)
12      throw new TypeError('each array member must be [ee, events...]')
13
14    var ee = arr[0]
15
16    for (var j = 1; j < arr.length; j++) {
17      var event = arr[j]
18      var fn = listener(event, callback)
19
20      // listen to the event
21      ee.on(event, fn)
22      // push this listener to the list of cleanups
23      cleanups.push({
24        ee: ee,
25        event: event,
26        fn: fn,
27      })
28    }
29  }
30
31  function callback() {
32    cleanup()
33    done.apply(null, arguments)
34  }
35
36  function cleanup() {
37    var x
38    for (var i = 0; i < cleanups.length; i++) {
39      x = cleanups[i]
40      x.ee.removeListener(x.event, x.fn)
41    }
42  }
43
44  function thunk(fn) {
45    done = fn
46  }
47
48  thunk.cancel = cleanup
49
50  return thunk
51}
52
53function listener(event, done) {
54  return function onevent(arg1) {
55    var args = new Array(arguments.length)
56    var ee = this
57    var err = event === 'error'
58      ? arg1
59      : null
60
61    // copy args to prevent arguments escaping scope
62    for (var i = 0; i < args.length; i++) {
63      args[i] = arguments[i]
64    }
65
66    done(err, ee, event, args)
67  }
68}