From 73a04c2a9d8c7c224b9ca95ea856665c41f3f410 Mon Sep 17 00:00:00 2001 From: Adam Bradley Date: Thu, 20 Aug 2020 09:20:26 -0500 Subject: [PATCH] fix(exit): ensure all node processes are destroyed on exit --- src/sys/node/node-sys.ts | 73 ++++++++++++++++++++++++++++++---------- 1 file changed, 56 insertions(+), 17 deletions(-) diff --git a/src/sys/node/node-sys.ts b/src/sys/node/node-sys.ts index 03d4f9f5902..37b8f8991e1 100644 --- a/src/sys/node/node-sys.ts +++ b/src/sys/node/node-sys.ts @@ -268,7 +268,18 @@ export function createNodeSys(c: { process?: any } = {}) { rename(oldPath, newPath) { return new Promise(resolve => { fs.rename(oldPath, newPath, error => { - resolve({ oldPath, newPath, error, oldDirs: [], oldFiles: [], newDirs: [], newFiles: [], renamed: [], isFile: false, isDirectory: false }); + resolve({ + oldPath, + newPath, + error, + oldDirs: [], + oldFiles: [], + newDirs: [], + newFiles: [], + renamed: [], + isFile: false, + isDirectory: false, + }); }); }); }, @@ -280,11 +291,25 @@ export function createNodeSys(c: { process?: any } = {}) { const recursive = !!(opts && opts.recursive); if (recursive) { fs.rmdir(p, { recursive: true }, err => { - resolve({ basename: path.basename(p), dirname: path.dirname(p), path: p, removedDirs: [], removedFiles: [], error: err }); + resolve({ + basename: path.basename(p), + dirname: path.dirname(p), + path: p, + removedDirs: [], + removedFiles: [], + error: err, + }); }); } else { fs.rmdir(p, err => { - resolve({ basename: path.basename(p), dirname: path.dirname(p), path: p, removedDirs: [], removedFiles: [], error: err }); + resolve({ + basename: path.basename(p), + dirname: path.dirname(p), + path: p, + removedDirs: [], + removedFiles: [], + error: err, + }); }); } }); @@ -297,9 +322,23 @@ export function createNodeSys(c: { process?: any } = {}) { } else { fs.rmdirSync(p); } - return { basename: path.basename(p), dirname: path.dirname(p), path: p, removedDirs: [], removedFiles: [], error: null }; + return { + basename: path.basename(p), + dirname: path.dirname(p), + path: p, + removedDirs: [], + removedFiles: [], + error: null, + }; } catch (e) { - return { basename: path.basename(p), dirname: path.dirname(p), path: p, removedDirs: [], removedFiles: [], error: e }; + return { + basename: path.basename(p), + dirname: path.dirname(p), + path: p, + removedDirs: [], + removedFiles: [], + error: e, + }; } }, removeFile(p) { @@ -472,7 +511,8 @@ export function createNodeSys(c: { process?: any } = {}) { freemem() { return freemem(); }, - platform: osPlatform === 'darwin' || osPlatform === 'linux' ? osPlatform : osPlatform === 'win32' ? 'windows' : '', + platform: + osPlatform === 'darwin' || osPlatform === 'linux' ? osPlatform : osPlatform === 'win32' ? 'windows' : '', release: release(), totalmem: totalmem(), }, @@ -491,18 +531,17 @@ export function createNodeSys(c: { process?: any } = {}) { 'workbox-build': ['4.3.1', '4.3.1'], }); - prcs.on('SIGINT', () => { - while (true) { - const cb = onInterruptsCallbacks.pop(); - if (isFunction(cb)) { - try { - cb(); - } catch (e) {} - } else { - break; - } + const runInterruptsCallbacks = () => { + let cb: () => void; + while (isFunction((cb = onInterruptsCallbacks.pop()))) { + try { + cb(); + } catch (e) {} } - }); + }; + + prcs.on('SIGINT', runInterruptsCallbacks); + prcs.on('exit', runInterruptsCallbacks); return sys; }