summaryrefslogtreecommitdiff
path: root/src/hero.mjs
diff options
context:
space:
mode:
authorEuAndreh <eu@euandre.org>2024-03-07 19:23:32 -0300
committerEuAndreh <eu@euandre.org>2024-03-07 19:23:43 -0300
commit76a41d1728fa8111d72e18293297528d35d5aa78 (patch)
tree3f80a6cd63b6fee9d2b852c3e897ec13e18d1227 /src/hero.mjs
parentsrc/hero.mjs: makePipeReader() now returns a function for closing it (diff)
downloadpapod-76a41d1728fa8111d72e18293297528d35d5aa78.tar.gz
papod-76a41d1728fa8111d72e18293297528d35d5aa78.tar.xz
src/hero.mjs: Add makeReopeningPipeReader()
This addresses point nÂș 2 from commit 40118a188fb05219d1188ff775ce71f66c8cb56a.
Diffstat (limited to 'src/hero.mjs')
-rw-r--r--src/hero.mjs45
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();