/** * @license Use of this source code is governed by an MIT-style license that * can be found in the LICENSE file at https://github.com/cartant/rxjs-etc */ /*tslint:disable:no-use-before-declare*/ import { MonoTypeOperatorFunction, Observable, Operator, SchedulerLike, Subscriber, TeardownLogic, } from "rxjs"; export function unsubscribeOn( scheduler: SchedulerLike, delay: number = 0 ): MonoTypeOperatorFunction { return (source: Observable) => source.lift(new UnsubscribeOnOperator(scheduler, delay)); } /*tslint:disable-next-line:no-unused-declaration*/ class UnsubscribeOnOperator implements Operator { constructor(private scheduler: SchedulerLike, private delay: number) {} call(subscriber: Subscriber, source: any): TeardownLogic { return source.subscribe( new UnsubscribeOnSubscriber(subscriber, this.scheduler, this.delay) ); } } /*tslint:disable-next-line:no-unused-declaration*/ class UnsubscribeOnSubscriber extends Subscriber { constructor( destination: Subscriber, private scheduler: SchedulerLike, private delay: number ) { super(destination); } unsubscribe(): void { const { delay, scheduler } = this; scheduler.schedule(() => super.unsubscribe(), delay); } }