UNPKG

@reactivex/rxjs

Version:

Reactive Extensions for modern JavaScript

110 lines 3.2 kB
import { SubjectSubscriber } from '../Subject'; import { Observable } from '../Observable'; import { Subscriber } from '../Subscriber'; import { Subscription } from '../Subscription'; /** * @class ConnectableObservable<T> */ export class ConnectableObservable extends Observable { constructor(source, subjectFactory) { super(); this.source = source; this.subjectFactory = subjectFactory; this._refCount = 0; } _subscribe(subscriber) { return this.getSubject().subscribe(subscriber); } getSubject() { const subject = this._subject; if (!subject || subject.isStopped) { this._subject = this.subjectFactory(); } return this._subject; } connect() { let connection = this._connection; if (!connection) { connection = this.source.subscribe(new ConnectableSubscriber(this.getSubject(), this)); if (connection.isUnsubscribed) { this._connection = null; connection = Subscription.EMPTY; } else { this._connection = connection; } } return connection; } refCount() { return this.lift(new RefCountOperator(this)); } } class ConnectableSubscriber extends SubjectSubscriber { constructor(destination, connectable) { super(destination); this.connectable = connectable; } _error(err) { this._unsubscribe(); super._error(err); } _complete() { this._unsubscribe(); super._complete(); } _unsubscribe() { const { connectable } = this; if (connectable) { this.connectable = null; connectable._refCount = 0; connectable._subject = null; connectable._connection = null; } } } class RefCountOperator { constructor(connectable) { this.connectable = connectable; } call(subscriber, source) { const { connectable } = this; connectable._refCount++; const refCounter = new RefCountSubscriber(subscriber, connectable); const subscription = source._subscribe(refCounter); if (!refCounter.isUnsubscribed) { refCounter.connection = connectable.connect(); } return subscription; } } class RefCountSubscriber extends Subscriber { constructor(destination, connectable) { super(destination); this.connectable = connectable; } _unsubscribe() { const { connectable } = this; if (!connectable) { this.connection = null; return; } this.connectable = null; const refCount = connectable._refCount; if (refCount <= 0) { this.connection = null; return; } connectable._refCount = refCount - 1; if (refCount > 1) { this.connection = null; return; } const { connection } = this; if (connection) { this.connection = null; connection.unsubscribe(); } } } //# sourceMappingURL=ConnectableObservable.js.map