{"version":3,"file":"retryMiddleware.mjs","sources":["../../../../../src/clients/middleware/retry/retryMiddleware.ts"],"sourcesContent":["import { DEFAULT_RETRY_ATTEMPTS } from './constants';\n/**\n * Middleware that executes the retry logic.\n */\nexport const retryMiddlewareFactory = ({ maxAttempts = DEFAULT_RETRY_ATTEMPTS, retryDecider, computeDelay, abortSignal, }) => {\n    if (maxAttempts < 1) {\n        throw new Error('maxAttempts must be greater than 0');\n    }\n    return (next, context) => async function retryMiddleware(request) {\n        let error;\n        let attemptsCount = context.attemptsCount ?? 0;\n        let response;\n        // When retry is not needed or max attempts is reached, either error or response will be set. This function handles either cases.\n        const handleTerminalErrorOrResponse = () => {\n            if (response) {\n                addOrIncrementMetadataAttempts(response, attemptsCount);\n                return response;\n            }\n            else {\n                addOrIncrementMetadataAttempts(error, attemptsCount);\n                throw error;\n            }\n        };\n        while (!abortSignal?.aborted && attemptsCount < maxAttempts) {\n            try {\n                response = await next(request);\n                error = undefined;\n            }\n            catch (e) {\n                error = e;\n                response = undefined;\n            }\n            // context.attemptsCount may be updated after calling next handler which may retry the request by itself.\n            attemptsCount =\n                (context.attemptsCount ?? 0) > attemptsCount\n                    ? (context.attemptsCount ?? 0)\n                    : attemptsCount + 1;\n            context.attemptsCount = attemptsCount;\n            const { isCredentialsExpiredError, retryable } = await retryDecider(response, error, context);\n            if (retryable) {\n                // Setting isCredentialsInvalid flag to notify signing middleware to forceRefresh credentials provider.\n                context.isCredentialsExpired = !!isCredentialsExpiredError;\n                if (!abortSignal?.aborted && attemptsCount < maxAttempts) {\n                    // prevent sleep for last attempt or cancelled request;\n                    const delay = computeDelay(attemptsCount);\n                    await cancellableSleep(delay, abortSignal);\n                }\n                continue;\n            }\n            else {\n                return handleTerminalErrorOrResponse();\n            }\n        }\n        if (abortSignal?.aborted) {\n            throw new Error('Request aborted.');\n        }\n        else {\n            return handleTerminalErrorOrResponse();\n        }\n    };\n};\nconst cancellableSleep = (timeoutMs, abortSignal) => {\n    if (abortSignal?.aborted) {\n        return Promise.resolve();\n    }\n    let timeoutId;\n    let sleepPromiseResolveFn;\n    const sleepPromise = new Promise(resolve => {\n        sleepPromiseResolveFn = resolve;\n        timeoutId = setTimeout(resolve, timeoutMs);\n    });\n    abortSignal?.addEventListener('abort', function cancelSleep(_) {\n        clearTimeout(timeoutId);\n        abortSignal?.removeEventListener('abort', cancelSleep);\n        sleepPromiseResolveFn();\n    });\n    return sleepPromise;\n};\nconst addOrIncrementMetadataAttempts = (nextHandlerOutput, attempts) => {\n    if (Object.prototype.toString.call(nextHandlerOutput) !== '[object Object]') {\n        return;\n    }\n    nextHandlerOutput.$metadata = {\n        ...(nextHandlerOutput.$metadata ?? {}),\n        attempts,\n    };\n};\n"],"names":[],"mappings":"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"}