Home Reference Source Repository

src/subjects/replaySubject.js

import { Subject } from './subject';

/**
 * ReplaySubject extends Subject. As Subject is a stream of values, ReplaySubject
 * is also a stream, but a little bit different. The difference is that ReplaySubject
 * remembers all values that's been sent to it, and it sends all these values to
 * new subscribers. Take a look at example.
 *
 * @example
 * import { ReplaySubject } from 'rxstream';
 *
 * let stream$ = new ReplaySubject();
 * stream$.next(1);
 * stream$.next(2);
 *
 * stream$.subscribe(value => console.log(value));
 * stream$.next(3);
 * stream$.next(4);
 *
 * // Output is going ot be: 1,2,3,4
 *
 * @class ReplaySubject<T>
 */
export class ReplaySubject extends Subject {

  constructor() {
    super();
    this.calls = [];
  }

  /**
   * Send value to the stream
   * @param {any} data Any value
   */
  next(data) {
    this.calls.push(arguments);
    super.next.apply(this, arguments);
  };

  /**
   * Subscribe to the stream
   * @param {function} callback
   * @returns {Subscription}
   */
  subscribe(callback) {
    if (this.calls.length) {
      this.calls.forEach(callArgs => {
        callback.apply(this, callArgs);
      });
    }

    super.subscribe.apply(this, arguments);
  }
}