12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- 'use strict'
- const EventEmitter = require('events').EventEmitter
- const helper = require('./helper')
- function bufferEvents (emitter, eventsToBuffer) {
- const listeners = []
- const eventsToReply = []
- function genericListener () {
- eventsToReply.push(Array.from(arguments))
- }
- eventsToBuffer.forEach((eventName) => {
- const listener = genericListener.bind(null, eventName)
- listeners.push(listener)
- emitter.on(eventName, listener)
- })
- return function () {
- listeners.forEach((listener, i) => {
- emitter.removeListener(eventsToBuffer[i], listener)
- })
- eventsToReply.forEach((args) => {
- EventEmitter.prototype.emit.apply(emitter, args)
- })
- listeners.length = 0
- eventsToReply.length = 0
- }
- }
- class KarmaEventEmitter extends EventEmitter {
- bind (object) {
- Object.keys(object).forEach((method) => {
- if (method.startsWith('on') && helper.isFunction(object[method])) {
- this.on(helper.camelToSnake(method.substr(2)), function () {
- object[method].apply(object, Array.from(arguments).concat(this))
- })
- }
- })
- }
- emitAsync (name) {
- // TODO(vojta): allow passing args
- // TODO(vojta): ignore/throw if listener call done() multiple times
- let pending = this.listeners(name).length
- const deferred = helper.defer()
- this.emit(name, () => {
- if (!--pending) {
- deferred.resolve()
- }
- })
- if (!pending) {
- deferred.resolve()
- }
- return deferred.promise
- }
- }
- exports.EventEmitter = KarmaEventEmitter
- exports.bufferEvents = bufferEvents
|