Объединить fs.createReadStream с потоком process.stdin - PullRequest
0 голосов
/ 09 июля 2019

Итак, у меня есть именно это:

process.stdin.resume().pipe(fs.createWriteStream('file'));

позже я хочу прочитать, что в данный момент находится в файле, но я также хочу передать новые данные из stdin:

const sws = new SomeWriteStream({end:false});

fs.createReadStream('file').pipe(sws).once('finish', () => {
  process.stdin.pipe(sws);
});

вышесказанное может работать, хотя я бы немного боялся, что могут возникнуть эти проблемы :

  1. могут быть данные, которые теряются между конечным событием чтения из файла и временем, которое требуется для подключения потока записи к process.stdin.

  2. Существует вероятность того, что я смогу дублировать данные (хотя 1 более вероятно).

Есть ли способ использовать RxJS для этого? По сути, я хочу «объединить» потоки, но данные из stdin должны идти после того, что находится в файле.

Одним из способов сделать это может быть что-то вроде этого:

const ins = process.stdin.resume().pipe(fs.createWriteStream('file'));
const sws = new SomeWriteStream({end:false});

const w = combine(
     fs.createReadStream('file', {start:0, end: ins.bytesWritten}),
     process.stdin
  ).pipe(sws)

w.on('data', d => {});

но этой функции объединения требуется только записывать данные process.stdin в sws после того, как все данные из файлового потока станут пустыми. Не уверен, как написать функциональность объединения или есть что-то подобное в RxJS.

С точки зрения производительности, первый метод, вероятно, будет лучше, иначе мне придется хранить все новые данные из process.stdin в памяти, пока я жду, пока все данные из файла будут прочитаны.

...