mirror of
https://github.com/sbrl/terrain50-cli.git
synced 2024-11-26 07:33:00 +00:00
GzipChildProcess: Update using what we've learnt from nimrod-data-downloader
This commit is contained in:
parent
be6ce52ed3
commit
267a7731e8
1 changed files with 25 additions and 7 deletions
|
@ -2,7 +2,9 @@
|
||||||
|
|
||||||
import EventEmitter from 'events';
|
import EventEmitter from 'events';
|
||||||
import child_process from 'child_process';
|
import child_process from 'child_process';
|
||||||
|
|
||||||
import { end_safe } from '../../helpers/StreamHelpers.mjs';
|
import { end_safe } from '../../helpers/StreamHelpers.mjs';
|
||||||
|
import l from '../../helpers/Log.mjs';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Spawns and manages a gzip child process.
|
* Spawns and manages a gzip child process.
|
||||||
|
@ -17,9 +19,10 @@ class GzipChildProcess extends EventEmitter {
|
||||||
constructor(auto_start = true) {
|
constructor(auto_start = true) {
|
||||||
super();
|
super();
|
||||||
|
|
||||||
|
this.debug = false;
|
||||||
this.child_process = null;
|
this.child_process = null;
|
||||||
|
|
||||||
this.has_exited = false;
|
this.has_ended = false;
|
||||||
|
|
||||||
if(auto_start)
|
if(auto_start)
|
||||||
this.start();
|
this.start();
|
||||||
|
@ -35,9 +38,10 @@ class GzipChildProcess extends EventEmitter {
|
||||||
stdio: [ "pipe", "pipe", "inherit" ]
|
stdio: [ "pipe", "pipe", "inherit" ]
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
this.child_process.on("exit", () => {
|
this.child_process.on("close", () => {
|
||||||
this.has_exited = true;
|
if(this.debug) l.debug("[GzipChildProcess] Close event triggered");
|
||||||
this.emit("exit");
|
this.has_ended = true;
|
||||||
|
this.emit("close");
|
||||||
});
|
});
|
||||||
// FUTURE: Perhaps just throwing the error would be a better choice?
|
// FUTURE: Perhaps just throwing the error would be a better choice?
|
||||||
this.child_process.on("error", (error) => {
|
this.child_process.on("error", (error) => {
|
||||||
|
@ -52,9 +56,23 @@ class GzipChildProcess extends EventEmitter {
|
||||||
* @return {Promise}
|
* @return {Promise}
|
||||||
*/
|
*/
|
||||||
async end_gracefully() {
|
async end_gracefully() {
|
||||||
await end_safe(this.stdin);
|
if(this.debug) l.debug("[GzipChildProcess] end_gracefully called");
|
||||||
if(this.has_exited) return;
|
if(this.has_ended) {
|
||||||
await EventEmitter.once(this, "exit");
|
if(this.debug) l.debug("[GzipChildProcess] It's been ended already - nothing to do");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(!this.stdin.writableFinished) {
|
||||||
|
if(this.debug) l.debug("[GzipChildProcess] Closing stdin");
|
||||||
|
await end_safe(this.stdin);
|
||||||
|
if(this.debug) l.debug("[GzipChildProcess] stdin closed successfully");
|
||||||
|
}
|
||||||
|
if(this.has_ended) {
|
||||||
|
if(this.debug) l.debug("[GzipChildProcess] It's been ended already - nothing to do");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(this.debug) l.debug("[GzipChildProcess] Waiting for close event");
|
||||||
|
await EventEmitter.once(this, "close");
|
||||||
|
if(this.debug) l.debug("[GzipChildProcess] Close event fired, our work is done");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue