Хм ... это то, что можно решить, используя асинхронную версию stream..read
и поток преобразования.
Теперь вы можете написать (и это будет весело) свою собственную версию, ноФреймворк, который я написал, scramjet уже имеет это async read
, и я полагаю, вы захотите сделать это легко.
Вот самое простое, что я могу придумать, используя AsyncGenerator:
const {BufferStream} = require('scramjet'); // or es6 import;
const input = BufferStream.from(getStreamFromSomewhere());
const output = DataStream.from(async function* () {
while(true) {
const recordLength = (await input.whenRead(4)).readUInt32(0); // read next chunk length
if (!recordLength) return; // stream ends here;
const data1 = await input.whenRead(8);
const data2 = await input.whenRead(8);
const restOfData = [];
for (let i = 0; i < recordLength; i += 4)
restOfData.push((await input.read(4)).readUInt32(0))
yield {data1, data2, restOfData};
}
})
.catch(e => output.end()); // this is a handler for an option where any of the reads past
// recordLength was to return null - perhaps should be better.
Это очень просто в узле v10 или с babel, но если хотите, я могу добавить версию, не относящуюся к AsyncGenerator, здесь.