node.js – crea un nuevo ReadStream para un nuevo archivo, cuando ese archivo alcanza un tamaño determinado

Siguiendo desde Nodo, ¿cómo puedo canalizar a un nuevo flujo READABLE?

Estoy tratando de iniciar un nuevo ReadStream para mi archivo MP3 codificado en vivo cuando alcanza un cierto tamaño (esencialmente en el búfer previo), usando fs.watch y fs.stat .

Funciona, pero una vez que se inicia ReadStream , no sé cómo salir del observador y mantener la secuencia en funcionamiento.

He intentado una promesa como la que se muestra a continuación, pero eso nunca se resuelve, por streamEncodedFile se llama repetidamente a streamEncodedFile :

 var watcher = fs.watch(mp3RecordingFile); watcher.on('change', (event, path) => { fs.stat(mp3RecordingFile, function (err, stats) { if (stats.size > 75533) { new Promise(function(resolve, reject) { streamEncodedFile(); }) .then(function(result) { watcher.close(); console.log('watcher closed'); }); } }); }); function streamEncodedFile() { var mp3File = fs.createReadStream(mp3RecordingFile); mp3File.on('data', function(buffer){ io.sockets.emit('audio', { buffer: buffer }); }); } 

Mi otro bash patético es intentar iniciar la secuencia solo en un determinado tamaño de archivo:

 watcher.on('change', (event, path) => { fs.stat(mp3RecordingFile, function (err, stats) { console.log(stats.size); if (stats.size > 75533 && stats.size  75535) { watcher.close(); } }); }); 

Probar esta solución, con el almacenamiento en búfer y escribir en el archivo.

 const Writable = require('stream').Writable; const fs = require('fs'); let mp3File = fs.createWriteStream('path/to/file.mp3'); var buffer = new Buffer([]); //in bytes const CHUNK_SIZE = 102400; //100kb //Proxy for emitting and writing to file const myWritable = new Writable({ write(chunk, encoding, callback) { buffer = Buffer.concat([buffer, chunk]); if(buffer.length >= CHUNK_SIZE) { mp3File.write(buffer); io.sockets.emit('audio', { buffer: buffer}); buffer = new Buffer([]); } callback(); } }); myWritable.on('finish', () => { //emit final part if there is data to emit if(buffer.length) { //write final chunk and close fd mp3File.end(buffer); io.sockets.emit('audio', { buffer: buffer}); } }); inbound_stream.pipe(encoder).pipe(myWritable);