/ node_modules / ee-first / index.js
index.js
 1  /*!
 2   * ee-first
 3   * Copyright(c) 2014 Jonathan Ong
 4   * MIT Licensed
 5   */
 6  
 7  'use strict'
 8  
 9  /**
10   * Module exports.
11   * @public
12   */
13  
14  module.exports = first
15  
16  /**
17   * Get the first event in a set of event emitters and event pairs.
18   *
19   * @param {array} stuff
20   * @param {function} done
21   * @public
22   */
23  
24  function first(stuff, done) {
25    if (!Array.isArray(stuff))
26      throw new TypeError('arg must be an array of [ee, events...] arrays')
27  
28    var cleanups = []
29  
30    for (var i = 0; i < stuff.length; i++) {
31      var arr = stuff[i]
32  
33      if (!Array.isArray(arr) || arr.length < 2)
34        throw new TypeError('each array member must be [ee, events...]')
35  
36      var ee = arr[0]
37  
38      for (var j = 1; j < arr.length; j++) {
39        var event = arr[j]
40        var fn = listener(event, callback)
41  
42        // listen to the event
43        ee.on(event, fn)
44        // push this listener to the list of cleanups
45        cleanups.push({
46          ee: ee,
47          event: event,
48          fn: fn,
49        })
50      }
51    }
52  
53    function callback() {
54      cleanup()
55      done.apply(null, arguments)
56    }
57  
58    function cleanup() {
59      var x
60      for (var i = 0; i < cleanups.length; i++) {
61        x = cleanups[i]
62        x.ee.removeListener(x.event, x.fn)
63      }
64    }
65  
66    function thunk(fn) {
67      done = fn
68    }
69  
70    thunk.cancel = cleanup
71  
72    return thunk
73  }
74  
75  /**
76   * Create the event listener.
77   * @private
78   */
79  
80  function listener(event, done) {
81    return function onevent(arg1) {
82      var args = new Array(arguments.length)
83      var ee = this
84      var err = event === 'error'
85        ? arg1
86        : null
87  
88      // copy args to prevent arguments escaping scope
89      for (var i = 0; i < args.length; i++) {
90        args[i] = arguments[i]
91      }
92  
93      done(err, ee, event, args)
94    }
95  }