Способ stdin
работает, то, что вы хотите, напрямую невозможно.
Как уже отмечали другие, событие end
никогда не сработает без чего-то вроде < /dev/null
, чтобы сгенерировать это EOF . В противном случае программа ожидает, пока терминал отправит ^D
.
Альтернативный подход, который может работать для вас, - установить тайм-аут, который истекает через короткое время, если на stdin
нет активности. Это не идеально, но работает:
function handleData(chunk) {
//clearTimeout(timeout);
gfm.stdin.write(chunk);
}
function handleEnd() {
//clearTimeout(timeout);
gfm.stdin.end();
}
function handleTimeout() {
process.stdin.removeListener('data', handleData);
process.stdin.removeListener('end', handleEnd);
// Do whatever special handling is needed here.
gfm.stdin.end();
}
const timeoutMilliseconds = 100;
process.stdin.on('data', handleData);
process.stdin.on('end', handleEnd);
const timeout = setTimeout(handleTimeout, timeoutMilliseconds);
// You could skip the rest of this code if you just add `clearTimeout(timeout)`
// to the body of `handleData` and `handleEnd` but that would call `clearTimeout` excessively.
function stopTimeout() {
process.stdin.removeListener('data', stopTimeout)
process.stdin.removeListener('end', stopTimeout);
clearTimeout(timeout);
}
process.stdin.on('data', stopTimeout);
process.stdin.on('end', stopTimeout);