Если у меня есть поток Node js, скажем, например, из чего-то вроде process.stdin или из fs.createReadStream, как я могу преобразовать его в наблюдаемый поток RxJs, используя RxJs5?

Я вижу, что RxJs-Node имеет метод fromReadableStream, но это выглядит так это не было обновлено в течение почти года.

6
JuanCaicedo 8 Янв 2017 в 23:27

3 ответа

Лучший ответ

Следующее должно работать как для v4, так и для v5 ( заявление об отказе не проверено):

fromStream: function (stream, finishEventName, dataEventName) {
    stream.pause();

    finishEventName || (finishEventName = 'end');
    dataEventName || (dataEventName = 'data');

    return Observable.create(function (observer) {

      // This is the "next" event
      const data$ = Observable.fromEvent(stream, dataEventName);

      // Map this into an error event
      const error$ = Observable.fromEvent(stream, 'error')
        .flatMap(err => Observable.throw(err));

      // Shut down the stream
      const complete$ = Observable.fromEvent(stream, finishEventName);

      // Put it all together and subscribe
      const sub = data$
        .merge(error$)
        .takeUntil(complete$)
        .subscribe(observer);

      // Start the underlying node stream
      stream.resume();

      // Return a handle to destroy the stream
      return sub;
    })

    // Avoid recreating the stream on duplicate subscriptions
    .share();
  },
3
paulpdaniels 9 Янв 2017 в 18:42