import { AbsoluteLocation, FinalizeHandler, FinalizeHandlerArguments, FinalizeHandlerOutput, FinalizeRequestHandlerOptions, HandlerExecutionContext, MetadataBearer, Pluggable, } from "@aws-sdk/types"; import { RetryResolvedConfig } from "./configurations"; export const retryMiddleware = (options: RetryResolvedConfig) => ( next: FinalizeHandler, context: HandlerExecutionContext ): FinalizeHandler => async (args: FinalizeHandlerArguments): Promise> => { const retryStrategy = await options.retryStrategy(); if (retryStrategy?.mode) context.userAgent = [...(context.userAgent || []), ["cfg/retry-mode", retryStrategy.mode]]; return retryStrategy.retry(next, args); }; export const retryMiddlewareOptions: FinalizeRequestHandlerOptions & AbsoluteLocation = { name: "retryMiddleware", tags: ["RETRY"], step: "finalizeRequest", priority: "high", override: true, }; export const getRetryPlugin = (options: RetryResolvedConfig): Pluggable => ({ applyToStack: (clientStack) => { clientStack.add(retryMiddleware(options), retryMiddlewareOptions); }, });