UNPKG

2.05 kBJavaScriptView Raw
1var events = require('events')
2var util = require('util')
3
4var helper = require('./helper')
5
6var bindAllEvents = function (object, context) {
7 context = context || this
8
9 var bindMethod = function (method) {
10 context.on(helper.camelToSnake(method.substr(2)), function () {
11 var args = Array.prototype.slice.call(arguments, 0)
12 args.push(context)
13 object[method].apply(object, args)
14 })
15 }
16
17 for (var method in object) {
18 if (helper.isFunction(object[method]) && method.substr(0, 2) === 'on') {
19 bindMethod(method)
20 }
21 }
22}
23
24var bufferEvents = function (emitter, eventsToBuffer) {
25 var listeners = []
26 var eventsToReply = []
27 var genericListener = function () {
28 eventsToReply.push(Array.prototype.slice.call(arguments))
29 }
30
31 eventsToBuffer.forEach(function (eventName) {
32 var listener = genericListener.bind(null, eventName)
33 listeners.push(listener)
34 emitter.on(eventName, listener)
35 })
36
37 return function () {
38 if (!eventsToReply) {
39 return
40 }
41
42 // remove all buffering listeners
43 listeners.forEach(function (listener, i) {
44 emitter.removeListener(eventsToBuffer[i], listener)
45 })
46
47 // reply
48 eventsToReply.forEach(function (args) {
49 events.EventEmitter.prototype.emit.apply(emitter, args)
50 })
51
52 // free-up
53 listeners = eventsToReply = null
54 }
55}
56
57// TODO(vojta): log.debug all events
58var EventEmitter = function () {
59 this.bind = bindAllEvents
60
61 this.emitAsync = function (name) {
62 // TODO(vojta): allow passing args
63 // TODO(vojta): ignore/throw if listener call done() multiple times
64 var pending = this.listeners(name).length
65 var deferred = helper.defer()
66 var done = function () {
67 if (!--pending) {
68 deferred.resolve()
69 }
70 }
71
72 this.emit(name, done)
73
74 if (!pending) {
75 deferred.resolve()
76 }
77
78 return deferred.promise
79 }
80}
81
82util.inherits(EventEmitter, events.EventEmitter)
83
84// PUBLISH
85exports.EventEmitter = EventEmitter
86exports.bindAll = bindAllEvents
87exports.bufferEvents = bufferEvents