| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 | "use strict";var __extends = (this && this.__extends) || function (d, b) {    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];    function __() { this.constructor = d; }    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());};var Subject_1 = require('../Subject');var Observable_1 = require('../Observable');var Subscriber_1 = require('../Subscriber');var Subscription_1 = require('../Subscription');var refCount_1 = require('../operators/refCount');/** * @class ConnectableObservable<T> */var ConnectableObservable = (function (_super) {    __extends(ConnectableObservable, _super);    function ConnectableObservable(/** @deprecated internal use only */ source,         /** @deprecated internal use only */ subjectFactory) {        _super.call(this);        this.source = source;        this.subjectFactory = subjectFactory;        /** @deprecated internal use only */ this._refCount = 0;        this._isComplete = false;    }    /** @deprecated internal use only */ ConnectableObservable.prototype._subscribe = function (subscriber) {        return this.getSubject().subscribe(subscriber);    };    /** @deprecated internal use only */ ConnectableObservable.prototype.getSubject = function () {        var subject = this._subject;        if (!subject || subject.isStopped) {            this._subject = this.subjectFactory();        }        return this._subject;    };    ConnectableObservable.prototype.connect = function () {        var connection = this._connection;        if (!connection) {            this._isComplete = false;            connection = this._connection = new Subscription_1.Subscription();            connection.add(this.source                .subscribe(new ConnectableSubscriber(this.getSubject(), this)));            if (connection.closed) {                this._connection = null;                connection = Subscription_1.Subscription.EMPTY;            }            else {                this._connection = connection;            }        }        return connection;    };    ConnectableObservable.prototype.refCount = function () {        return refCount_1.refCount()(this);    };    return ConnectableObservable;}(Observable_1.Observable));exports.ConnectableObservable = ConnectableObservable;var connectableProto = ConnectableObservable.prototype;exports.connectableObservableDescriptor = {    operator: { value: null },    _refCount: { value: 0, writable: true },    _subject: { value: null, writable: true },    _connection: { value: null, writable: true },    _subscribe: { value: connectableProto._subscribe },    _isComplete: { value: connectableProto._isComplete, writable: true },    getSubject: { value: connectableProto.getSubject },    connect: { value: connectableProto.connect },    refCount: { value: connectableProto.refCount }};var ConnectableSubscriber = (function (_super) {    __extends(ConnectableSubscriber, _super);    function ConnectableSubscriber(destination, connectable) {        _super.call(this, destination);        this.connectable = connectable;    }    ConnectableSubscriber.prototype._error = function (err) {        this._unsubscribe();        _super.prototype._error.call(this, err);    };    ConnectableSubscriber.prototype._complete = function () {        this.connectable._isComplete = true;        this._unsubscribe();        _super.prototype._complete.call(this);    };    /** @deprecated internal use only */ ConnectableSubscriber.prototype._unsubscribe = function () {        var connectable = this.connectable;        if (connectable) {            this.connectable = null;            var connection = connectable._connection;            connectable._refCount = 0;            connectable._subject = null;            connectable._connection = null;            if (connection) {                connection.unsubscribe();            }        }    };    return ConnectableSubscriber;}(Subject_1.SubjectSubscriber));var RefCountOperator = (function () {    function RefCountOperator(connectable) {        this.connectable = connectable;    }    RefCountOperator.prototype.call = function (subscriber, source) {        var connectable = this.connectable;        connectable._refCount++;        var refCounter = new RefCountSubscriber(subscriber, connectable);        var subscription = source.subscribe(refCounter);        if (!refCounter.closed) {            refCounter.connection = connectable.connect();        }        return subscription;    };    return RefCountOperator;}());var RefCountSubscriber = (function (_super) {    __extends(RefCountSubscriber, _super);    function RefCountSubscriber(destination, connectable) {        _super.call(this, destination);        this.connectable = connectable;    }    /** @deprecated internal use only */ RefCountSubscriber.prototype._unsubscribe = function () {        var connectable = this.connectable;        if (!connectable) {            this.connection = null;            return;        }        this.connectable = null;        var refCount = connectable._refCount;        if (refCount <= 0) {            this.connection = null;            return;        }        connectable._refCount = refCount - 1;        if (refCount > 1) {            this.connection = null;            return;        }        ///        // Compare the local RefCountSubscriber's connection Subscription to the        // connection Subscription on the shared ConnectableObservable. In cases        // where the ConnectableObservable source synchronously emits values, and        // the RefCountSubscriber's downstream Observers synchronously unsubscribe,        // execution continues to here before the RefCountOperator has a chance to        // supply the RefCountSubscriber with the shared connection Subscription.        // For example:        // ```        // Observable.range(0, 10)        //   .publish()        //   .refCount()        //   .take(5)        //   .subscribe();        // ```        // In order to account for this case, RefCountSubscriber should only dispose        // the ConnectableObservable's shared connection Subscription if the        // connection Subscription exists, *and* either:        //   a. RefCountSubscriber doesn't have a reference to the shared connection        //      Subscription yet, or,        //   b. RefCountSubscriber's connection Subscription reference is identical        //      to the shared connection Subscription        ///        var connection = this.connection;        var sharedConnection = connectable._connection;        this.connection = null;        if (sharedConnection && (!connection || sharedConnection === connection)) {            sharedConnection.unsubscribe();        }    };    return RefCountSubscriber;}(Subscriber_1.Subscriber));//# sourceMappingURL=ConnectableObservable.js.map
 |