Я являюсь автором Scramjet , функциональной среды обработки потоков, которая может быть простым решением для вас.
Если вы согласны с добавлением всего 3 зависимостейВ этом случае это не может быть проще:
const {StringStream} = require("scramjet");
StringStream.from(async function* () {
yield await something();
...
});
Если вы хотите реализовать это самостоятельно, взгляните на исходный код в строке DataStream 112 - это должно произойтибыть довольно простым в реализации.В общем, вам нужно реализовать что-то вроде этого:
function generatorToStream(gen) {
// obtain an iterator
const iter = await gen();
// create your output
const out = new Passthrough();
// this IIFE will do all the work
(async () => {
let done = false;
for await (let chunk of iter) {
// if write returns true, continue, otherwise wait until out is drained.
if (!out.write(chunk)) await new Promise((res, rej) => this.once("drain", res);
}
})()
// handle errors by pushing them to the stream for example
.catch(e => out.emit('error', e));
// return the output stream
return out;
}
Приведенный выше пример более или менее то, что происходит в scramjet - там немного больше оптимизации для сохранения меньшего количества обработчиков событий и так далее, новыше должно хорошо работать в простом случае.