'use strict'; const CLOCK_SKEW_ERROR_CODES = [ "AuthFailure", "InvalidSignatureException", "RequestExpired", "RequestInTheFuture", "RequestTimeTooSkewed", "SignatureDoesNotMatch", ]; const THROTTLING_ERROR_CODES = [ "BandwidthLimitExceeded", "EC2ThrottledException", "LimitExceededException", "PriorRequestNotComplete", "ProvisionedThroughputExceededException", "RequestLimitExceeded", "RequestThrottled", "RequestThrottledException", "SlowDown", "ThrottledException", "Throttling", "ThrottlingException", "TooManyRequestsException", "TransactionInProgressException", ]; const TRANSIENT_ERROR_CODES = ["TimeoutError", "RequestTimeout", "RequestTimeoutException"]; const TRANSIENT_ERROR_STATUS_CODES = [500, 502, 503, 504]; const NODEJS_TIMEOUT_ERROR_CODES = ["ECONNRESET", "ECONNREFUSED", "EPIPE", "ETIMEDOUT"]; const NODEJS_NETWORK_ERROR_CODES = ["EHOSTUNREACH", "ENETUNREACH", "ENOTFOUND"]; const isRetryableByTrait = (error) => error?.$retryable !== undefined; const isClockSkewError = (error) => CLOCK_SKEW_ERROR_CODES.includes(error.name); const isClockSkewCorrectedError = (error) => error.$metadata?.clockSkewCorrected; const isBrowserNetworkError = (error) => { const errorMessages = new Set([ "Failed to fetch", "NetworkError when attempting to fetch resource", "The Internet connection appears to be offline", "Load failed", "Network request failed", ]); const isValid = error && error instanceof TypeError; if (!isValid) { return false; } return errorMessages.has(error.message); }; const isThrottlingError = (error) => error.$metadata?.httpStatusCode === 429 || THROTTLING_ERROR_CODES.includes(error.name) || error.$retryable?.throttling == true; const isTransientError = (error, depth = 0) => isRetryableByTrait(error) || isClockSkewCorrectedError(error) || TRANSIENT_ERROR_CODES.includes(error.name) || NODEJS_TIMEOUT_ERROR_CODES.includes(error?.code || "") || NODEJS_NETWORK_ERROR_CODES.includes(error?.code || "") || TRANSIENT_ERROR_STATUS_CODES.includes(error.$metadata?.httpStatusCode || 0) || isBrowserNetworkError(error) || (error.cause !== undefined && depth <= 10 && isTransientError(error.cause, depth + 1)); const isServerError = (error) => { if (error.$metadata?.httpStatusCode !== undefined) { const statusCode = error.$metadata.httpStatusCode; if (500 <= statusCode && statusCode <= 599 && !isTransientError(error)) { return true; } return false; } return false; }; exports.isBrowserNetworkError = isBrowserNetworkError; exports.isClockSkewCorrectedError = isClockSkewCorrectedError; exports.isClockSkewError = isClockSkewError; exports.isRetryableByTrait = isRetryableByTrait; exports.isServerError = isServerError; exports.isThrottlingError = isThrottlingError; exports.isTransientError = isTransientError;