- 在editStorageForm中初始化oss_storage_quota_value和oss_quota_unit - 删除重复的旧配额说明块,保留新的当前配额设置显示 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
78 lines
2.9 KiB
JavaScript
78 lines
2.9 KiB
JavaScript
'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;
|