"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.retry = void 0; var lift_1 = require("../util/lift"); var OperatorSubscriber_1 = require("./OperatorSubscriber"); var identity_1 = require("../util/identity"); var timer_1 = require("../observable/timer"); var innerFrom_1 = require("../observable/innerFrom"); function retry(configOrCount) { if (configOrCount === void 0) { configOrCount = Infinity; } var config; if (configOrCount && typeof configOrCount === 'object') { config = configOrCount; } else { config = { count: configOrCount, }; } var _a = config.count, count = _a === void 0 ? Infinity : _a, delay = config.delay, _b = config.resetOnSuccess, resetOnSuccess = _b === void 0 ? false : _b; return count <= 0 ? identity_1.identity : lift_1.operate(function (source, subscriber) { var soFar = 0; var innerSub; var subscribeForRetry = function () { var syncUnsub = false; innerSub = source.subscribe(OperatorSubscriber_1.createOperatorSubscriber(subscriber, function (value) { if (resetOnSuccess) { soFar = 0; } subscriber.next(value); }, undefined, function (err) { if (soFar++ < count) { var resub_1 = function () { if (innerSub) { innerSub.unsubscribe(); innerSub = null; subscribeForRetry(); } else { syncUnsub = true; } }; if (delay != null) { var notifier = typeof delay === 'number' ? timer_1.timer(delay) : innerFrom_1.innerFrom(delay(err, soFar)); var notifierSubscriber_1 = OperatorSubscriber_1.createOperatorSubscriber(subscriber, function () { notifierSubscriber_1.unsubscribe(); resub_1(); }, function () { subscriber.complete(); }); notifier.subscribe(notifierSubscriber_1); } else { resub_1(); } } else { subscriber.error(err); } })); if (syncUnsub) { innerSub.unsubscribe(); innerSub = null; subscribeForRetry(); } }; subscribeForRetry(); }); } exports.retry = retry; //# sourceMappingURL=retry.js.map