import { Subject } from '../Subject'; import { tryCatch } from '../util/tryCatch'; import { errorObject } from '../util/errorObject'; import { OuterSubscriber } from '../OuterSubscriber'; import { subscribeToResult } from '../util/subscribeToResult'; /** * Returns an Observable that mirrors the source Observable with the exception of a `complete`. If the source * Observable calls `complete`, this method will emit to the Observable returned from `notifier`. If that Observable * calls `complete` or `error`, then this method will call `complete` or `error` on the child subscription. Otherwise * this method will resubscribe to the source Observable. * * * * @param {function(notifications: Observable): Observable} notifier - Receives an Observable of notifications with * which a user can `complete` or `error`, aborting the repetition. * @return {Observable} The source Observable modified with repeat logic. * @method repeatWhen * @owner Observable */ export function repeatWhen(notifier) { return (source) => source.lift(new RepeatWhenOperator(notifier)); } class RepeatWhenOperator { constructor(notifier) { this.notifier = notifier; } call(subscriber, source) { return source.subscribe(new RepeatWhenSubscriber(subscriber, this.notifier, source)); } } /** * We need this JSDoc comment for affecting ESDoc. * @ignore * @extends {Ignored} */ class RepeatWhenSubscriber extends OuterSubscriber { constructor(destination, notifier, source) { super(destination); this.notifier = notifier; this.source = source; this.sourceIsBeingSubscribedTo = true; } notifyNext(outerValue, innerValue, outerIndex, innerIndex, innerSub) { this.sourceIsBeingSubscribedTo = true; this.source.subscribe(this); } notifyComplete(innerSub) { if (this.sourceIsBeingSubscribedTo === false) { return super.complete(); } } complete() { this.sourceIsBeingSubscribedTo = false; if (!this.isStopped) { if (!this.retries) { this.subscribeToRetries(); } if (!this.retriesSubscription || this.retriesSubscription.closed) { return super.complete(); } this._unsubscribeAndRecycle(); this.notifications.next(); } } /** @deprecated internal use only */ _unsubscribe() { const { notifications, retriesSubscription } = this; if (notifications) { notifications.unsubscribe(); this.notifications = null; } if (retriesSubscription) { retriesSubscription.unsubscribe(); this.retriesSubscription = null; } this.retries = null; } /** @deprecated internal use only */ _unsubscribeAndRecycle() { const { notifications, retries, retriesSubscription } = this; this.notifications = null; this.retries = null; this.retriesSubscription = null; super._unsubscribeAndRecycle(); this.notifications = notifications; this.retries = retries; this.retriesSubscription = retriesSubscription; return this; } subscribeToRetries() { this.notifications = new Subject(); const retries = tryCatch(this.notifier)(this.notifications); if (retries === errorObject) { return super.complete(); } this.retries = retries; this.retriesSubscription = subscribeToResult(this, retries); } } //# sourceMappingURL=repeatWhen.js.map