| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 | import { isFunction } from './util/isFunction';import { UnsubscriptionError } from './util/UnsubscriptionError';import { arrRemove } from './util/arrRemove';export class Subscription {    constructor(initialTeardown) {        this.initialTeardown = initialTeardown;        this.closed = false;        this._parentage = null;        this._finalizers = null;    }    unsubscribe() {        let errors;        if (!this.closed) {            this.closed = true;            const { _parentage } = this;            if (_parentage) {                this._parentage = null;                if (Array.isArray(_parentage)) {                    for (const parent of _parentage) {                        parent.remove(this);                    }                }                else {                    _parentage.remove(this);                }            }            const { initialTeardown: initialFinalizer } = this;            if (isFunction(initialFinalizer)) {                try {                    initialFinalizer();                }                catch (e) {                    errors = e instanceof UnsubscriptionError ? e.errors : [e];                }            }            const { _finalizers } = this;            if (_finalizers) {                this._finalizers = null;                for (const finalizer of _finalizers) {                    try {                        execFinalizer(finalizer);                    }                    catch (err) {                        errors = errors !== null && errors !== void 0 ? errors : [];                        if (err instanceof UnsubscriptionError) {                            errors = [...errors, ...err.errors];                        }                        else {                            errors.push(err);                        }                    }                }            }            if (errors) {                throw new UnsubscriptionError(errors);            }        }    }    add(teardown) {        var _a;        if (teardown && teardown !== this) {            if (this.closed) {                execFinalizer(teardown);            }            else {                if (teardown instanceof Subscription) {                    if (teardown.closed || teardown._hasParent(this)) {                        return;                    }                    teardown._addParent(this);                }                (this._finalizers = (_a = this._finalizers) !== null && _a !== void 0 ? _a : []).push(teardown);            }        }    }    _hasParent(parent) {        const { _parentage } = this;        return _parentage === parent || (Array.isArray(_parentage) && _parentage.includes(parent));    }    _addParent(parent) {        const { _parentage } = this;        this._parentage = Array.isArray(_parentage) ? (_parentage.push(parent), _parentage) : _parentage ? [_parentage, parent] : parent;    }    _removeParent(parent) {        const { _parentage } = this;        if (_parentage === parent) {            this._parentage = null;        }        else if (Array.isArray(_parentage)) {            arrRemove(_parentage, parent);        }    }    remove(teardown) {        const { _finalizers } = this;        _finalizers && arrRemove(_finalizers, teardown);        if (teardown instanceof Subscription) {            teardown._removeParent(this);        }    }}Subscription.EMPTY = (() => {    const empty = new Subscription();    empty.closed = true;    return empty;})();export const EMPTY_SUBSCRIPTION = Subscription.EMPTY;export function isSubscription(value) {    return (value instanceof Subscription ||        (value && 'closed' in value && isFunction(value.remove) && isFunction(value.add) && isFunction(value.unsubscribe)));}function execFinalizer(finalizer) {    if (isFunction(finalizer)) {        finalizer();    }    else {        finalizer.unsubscribe();    }}//# sourceMappingURL=Subscription.js.map
 |