import { __read, __spreadArray } from "tslib"; import { innerFrom } from '../observable/innerFrom'; import { Subject } from '../Subject'; import { SafeSubscriber } from '../Subscriber'; import { operate } from '../util/lift'; export function share(options) { if (options === void 0) { options = {}; } var _a = options.connector, connector = _a === void 0 ? function () { return new Subject(); } : _a, _b = options.resetOnError, resetOnError = _b === void 0 ? true : _b, _c = options.resetOnComplete, resetOnComplete = _c === void 0 ? true : _c, _d = options.resetOnRefCountZero, resetOnRefCountZero = _d === void 0 ? true : _d; return function (wrapperSource) { var connection; var resetConnection; var subject; var refCount = 0; var hasCompleted = false; var hasErrored = false; var cancelReset = function () { resetConnection === null || resetConnection === void 0 ? void 0 : resetConnection.unsubscribe(); resetConnection = undefined; }; var reset = function () { cancelReset(); connection = subject = undefined; hasCompleted = hasErrored = false; }; var resetAndUnsubscribe = function () { var conn = connection; reset(); conn === null || conn === void 0 ? void 0 : conn.unsubscribe(); }; return operate(function (source, subscriber) { refCount++; if (!hasErrored && !hasCompleted) { cancelReset(); } var dest = (subject = subject !== null && subject !== void 0 ? subject : connector()); subscriber.add(function () { refCount--; if (refCount === 0 && !hasErrored && !hasCompleted) { resetConnection = handleReset(resetAndUnsubscribe, resetOnRefCountZero); } }); dest.subscribe(subscriber); if (!connection && refCount > 0) { connection = new SafeSubscriber({ next: function (value) { return dest.next(value); }, error: function (err) { hasErrored = true; cancelReset(); resetConnection = handleReset(reset, resetOnError, err); dest.error(err); }, complete: function () { hasCompleted = true; cancelReset(); resetConnection = handleReset(reset, resetOnComplete); dest.complete(); }, }); innerFrom(source).subscribe(connection); } })(wrapperSource); }; } function handleReset(reset, on) { var args = []; for (var _i = 2; _i < arguments.length; _i++) { args[_i - 2] = arguments[_i]; } if (on === true) { reset(); return; } if (on === false) { return; } var onSubscriber = new SafeSubscriber({ next: function () { onSubscriber.unsubscribe(); reset(); }, }); return on.apply(void 0, __spreadArray([], __read(args))).subscribe(onSubscriber); } //# sourceMappingURL=share.js.map