diff --git a/lib/utils/workers-registry.js b/lib/utils/workers-registry.js index b2004f537..dfc037726 100644 --- a/lib/utils/workers-registry.js +++ b/lib/utils/workers-registry.js @@ -3,6 +3,7 @@ const {EventEmitter} = require('events'); const workerFarm = require('worker-farm'); const Promise = require('bluebird'); +const _ = require('lodash'); const Events = require('../constants/runner-events'); const RuntimeConfig = require('../config/runtime-config'); const WorkerProcess = require('./worker-process'); @@ -17,6 +18,7 @@ module.exports = class WorkersRegistry extends EventEmitter { this._config = config; this._ended = false; this._workerFarm = null; + this._eventBridge = new EventEmitter(); } init() { @@ -37,7 +39,8 @@ module.exports = class WorkersRegistry extends EventEmitter { } register(workerFilepath, exportedMethods) { - const workers = {}; + const workers = Object.create(this._eventBridge); + for (const methodName of exportedMethods) { workers[methodName] = (...args) => { if (this._ended) { @@ -46,6 +49,7 @@ module.exports = class WorkersRegistry extends EventEmitter { return Promise.promisify(this._workerFarm)(workerFilepath, methodName, args); }; } + return workers; } @@ -87,8 +91,8 @@ module.exports = class WorkersRegistry extends EventEmitter { } _initChild(child) { - child.on('message', ({event} = {}) => { - switch (event) { + child.on('message', (data = {}) => { + switch (data.event) { case 'worker.init': child.send({ event: 'master.init', @@ -102,6 +106,11 @@ module.exports = class WorkersRegistry extends EventEmitter { config: this._config.serialize() }); break; + default: + if (data.event) { + this._eventBridge.emit(data.event, _.omit(data, 'event')); + } + break; } }); diff --git a/test/lib/utils/workers-registry.js b/test/lib/utils/workers-registry.js index 17d5f4909..e32545ebe 100644 --- a/test/lib/utils/workers-registry.js +++ b/test/lib/utils/workers-registry.js @@ -120,6 +120,32 @@ describe('WorkersRegistry', () => { config: {foo: 'bar'} }); }); + + it('should emit other events through workers object', () => { + const workersRegistry = mkWorkersRegistry_(); + const workers = workersRegistry.register(null, []); + + const onEvent = sandbox.stub().named('onEvent'); + workers.on('foo', onEvent); + + const child = initChild_(); + child.emit('message', {event: 'foo', bar: 'baz'}); + + assert.calledOnceWith(onEvent, {bar: 'baz'}); + }); + + it('should not emit unknown events (without event field) through workers object', () => { + const workersRegistry = mkWorkersRegistry_(); + const workers = workersRegistry.register(null, []); + + const onEvent = sandbox.stub().named('onEvent'); + workers.on('foo', onEvent); + + const child = initChild_(); + child.emit('message', {foo: 'bar'}); + + assert.notCalled(onEvent); + }); }); describe('execute worker\'s method', () => {