diff --git a/lib/after-watch.js b/lib/after-watch.js index d241196d..421f748d 100644 --- a/lib/after-watch.js +++ b/lib/after-watch.js @@ -1,6 +1,9 @@ const { stopWebpackCompiler } = require('./compiler'); +const { removeListener } = require("./utils"); -module.exports = function($logger) { +module.exports = function($logger, $liveSyncService) { $logger.info("Stopping webpack watch"); stopWebpackCompiler(); + removeListener($liveSyncService, "liveSyncStopped"); + removeListener(process, "exit"); } diff --git a/lib/before-watch.js b/lib/before-watch.js index 71320cf2..5d65310f 100644 --- a/lib/before-watch.js +++ b/lib/before-watch.js @@ -1,10 +1,11 @@ const { getWebpackProcesses, runWebpackCompiler, stopWebpackCompiler } = require("./compiler"); +const { addListener } = require("./utils"); module.exports = function ($logger, $liveSyncService, $devicesService, hookArgs) { if (hookArgs.config) { const appFilesUpdaterOptions = hookArgs.config.appFilesUpdaterOptions; if (appFilesUpdaterOptions.bundle) { - $liveSyncService.on("liveSyncStopped", data => { + addListener($liveSyncService, "liveSyncStopped", () => { const webpackProcesses = getWebpackProcesses(); Object.keys(webpackProcesses).forEach(platform => { const devices = $devicesService.getDevicesForPlatform(platform); @@ -13,10 +14,7 @@ module.exports = function ($logger, $liveSyncService, $devicesService, hookArgs) } }); }); - - process.on("exit", () => { - stopWebpackCompiler(); - }); + addListener(process, "exit", stopWebpackCompiler); const platforms = hookArgs.config.platforms; return Promise.all(platforms.map(platform => { diff --git a/lib/utils.js b/lib/utils.js index 4df213df..36baaf1d 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -8,6 +8,8 @@ const { isAndroid, } = require("../projectHelpers"); +const eventHandlers = {}; + function debuggingEnabled(liveSyncService, projectDir) { const deviceDescriptors = liveSyncService.getLiveSyncDeviceDescriptors(projectDir); return deviceDescriptors.some(device => device.debugggingEnabled); @@ -76,10 +78,26 @@ function shouldSnapshot(config) { return config.bundle && config.release && platformSupportsSnapshot && osSupportsSnapshot; } +function addListener(eventEmitter, name, handler) { + if (!eventHandlers[name]) { + eventEmitter.on(name, handler); + eventHandlers[name] = handler; + } +} + +function removeListener(eventEmitter, name) { + if (eventHandlers[name]) { + eventEmitter.removeListener(name, eventHandlers[name]); + delete eventHandlers[name]; + } +} + module.exports = { buildEnvData, debuggingEnabled, shouldSnapshot, getUpdatedEmittedFiles, - parseHotUpdateChunkName + parseHotUpdateChunkName, + addListener, + removeListener };