1 | var events = require('events')
|
2 | var util = require('util')
|
3 |
|
4 | var helper = require('./helper')
|
5 |
|
6 | var 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 |
|
24 | var 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 |
|
43 | listeners.forEach(function (listener, i) {
|
44 | emitter.removeListener(eventsToBuffer[i], listener)
|
45 | })
|
46 |
|
47 |
|
48 | eventsToReply.forEach(function (args) {
|
49 | events.EventEmitter.prototype.emit.apply(emitter, args)
|
50 | })
|
51 |
|
52 |
|
53 | listeners = eventsToReply = null
|
54 | }
|
55 | }
|
56 |
|
57 |
|
58 | var EventEmitter = function () {
|
59 | this.bind = bindAllEvents
|
60 |
|
61 | this.emitAsync = function (name) {
|
62 |
|
63 |
|
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 |
|
82 | util.inherits(EventEmitter, events.EventEmitter)
|
83 |
|
84 |
|
85 | exports.EventEmitter = EventEmitter
|
86 | exports.bindAll = bindAllEvents
|
87 | exports.bufferEvents = bufferEvents
|