From d8219217abbc036e4075c3df773ddff20806da61 Mon Sep 17 00:00:00 2001 From: Mark Wubben Date: Thu, 6 Apr 2017 09:54:50 +0100 Subject: [PATCH] Avoid MaxListenersExceededWarning in Sequence Fixes #1345. --- lib/sequence.js | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/lib/sequence.js b/lib/sequence.js index 237449a63..1e5960a98 100644 --- a/lib/sequence.js +++ b/lib/sequence.js @@ -1,5 +1,29 @@ 'use strict'; +const beforeExitSubscribers = new Set(); +const beforeExitHandler = () => { + for (const subscriber of beforeExitSubscribers) { + subscriber(); + } +}; +const onBeforeExit = subscriber => { + if (beforeExitSubscribers.size === 0) { + // Only listen for the event once, no matter how many Sequences are run + // concurrently. + process.on('beforeExit', beforeExitHandler); + } + + beforeExitSubscribers.add(subscriber); + return { + dispose() { + beforeExitSubscribers.delete(subscriber); + if (beforeExitSubscribers.size === 0) { + process.removeListener('beforeExit', beforeExitHandler); + } + } + }; +}; + class Sequence { constructor(runnables, bail) { if (!Array.isArray(runnables)) { @@ -14,16 +38,15 @@ class Sequence { const iterator = this.runnables[Symbol.iterator](); let activeRunnable; - const onBeforeExit = () => { + const beforeExit = onBeforeExit(() => { if (activeRunnable.finishDueToInactivity) { activeRunnable.finishDueToInactivity(); } - }; - process.on('beforeExit', onBeforeExit); + }); let allPassed = true; const finish = () => { - process.removeListener('beforeExit', onBeforeExit); + beforeExit.dispose(); return allPassed; };