diff options
author | EuAndreh <eu@euandre.org> | 2024-03-07 19:23:32 -0300 |
---|---|---|
committer | EuAndreh <eu@euandre.org> | 2024-03-07 19:23:43 -0300 |
commit | 76a41d1728fa8111d72e18293297528d35d5aa78 (patch) | |
tree | 3f80a6cd63b6fee9d2b852c3e897ec13e18d1227 /src | |
parent | src/hero.mjs: makePipeReader() now returns a function for closing it (diff) | |
download | papod-76a41d1728fa8111d72e18293297528d35d5aa78.tar.gz papod-76a41d1728fa8111d72e18293297528d35d5aa78.tar.xz |
src/hero.mjs: Add makeReopeningPipeReader()
This addresses point nÂș 2 from commit
40118a188fb05219d1188ff775ce71f66c8cb56a.
Diffstat (limited to 'src')
-rw-r--r-- | src/hero.mjs | 45 |
1 files changed, 41 insertions, 4 deletions
diff --git a/src/hero.mjs b/src/hero.mjs index ed105cd..716921f 100644 --- a/src/hero.mjs +++ b/src/hero.mjs @@ -350,14 +350,51 @@ export const makeLineEmitter = fn => { }; }; +export const makeReopeningPipeReader = (shouldReopenPipe, path, { + lineFn, + logger, +} = {}, out) => { + const reader = fs.createReadStream(path, "UTF-8") + out.ref = reader; + reader.on("data", makeLineEmitter(lineFn)); + reader.on("close", () => { + if (shouldReopenPipe.ref) { + logger.debug({ + message: "pipe closed, reopening", + }); + makeReopeningPipeReader( + shouldReopenPipe, + path, + { lineFn, logger }, + out, + ); + return; + } + + logger.debug({ + message: "pipe closed, NOT reopening", + }); + }); +}; + export const makePipeReaderFn = ({ lineFn = lineHandler, + logger = log, } = {}) => path => { mkfifo(path); - fs.createReadStream(path, "UTF-8").on("data", makeLineEmitter(lineFn)); - return () => - new Promise((resolve, reject) => - fs.createWriteStream(path).end().close(resolve)); + let shouldReopenPipe = { ref: true }; + const pipe = {}; + makeReopeningPipeReader( + shouldReopenPipe, + path, + { lineFn, logger }, + pipe, + ); + return () => new Promise((resolve, reject) => { + shouldReopenPipe.ref = false; + fs.createWriteStream(path).end().close(); + pipe.ref.on("close", resolve); + }); }; export const makePipeReader = makePipeReaderFn(); |