diff --git a/client/src/templates/Challenges/utils/worker-executor.js b/client/src/templates/Challenges/utils/worker-executor.js index 797a0e55cf3..25e4dfb60b9 100644 --- a/client/src/templates/Challenges/utils/worker-executor.js +++ b/client/src/templates/Challenges/utils/worker-executor.js @@ -129,16 +129,17 @@ const eventify = self => { self.emit = (event, ...args) => { if (typeof self._events[event] !== 'undefined') { - self._events[event].forEach(listener => { + const listeners = self._events[event].slice(); + for (let listener of listeners) { listener.apply(self, args); - }); + } } return self; }; self.once = (event, listener) => { self.on(event, function handler(...args) { - self.removeListener(handler); + self.removeListener(event, handler); listener.apply(self, args); }); return self; diff --git a/client/src/templates/Challenges/utils/worker-executor.test.js b/client/src/templates/Challenges/utils/worker-executor.test.js index 6e44c600bb8..2ebec5833fc 100644 --- a/client/src/templates/Challenges/utils/worker-executor.test.js +++ b/client/src/templates/Challenges/utils/worker-executor.test.js @@ -232,3 +232,15 @@ it('Worker executor should get worker from specified location', async () => { expect(global.Worker).toBeCalledTimes(1); expect(global.Worker).toBeCalledWith('/other/location/test.js'); }); + +it('Task should only emit handler once', () => { + mockWorker(); + const testWorker = createWorker('test'); + const task = testWorker.execute('test'); + const handler = jest.fn(); + task.once('testOnce', handler); + + task.emit('testOnce', handler); + task.emit('testOnce', handler); + expect(handler).toBeCalledTimes(1); +});