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}