58 lines
1.8 KiB
JavaScript
58 lines
1.8 KiB
JavaScript
const TRANSIENT_HTTP_STATUSES = new Set([408, 429, 502, 503, 504]);
|
|
|
|
function isNetworkOrTimeout(error) {
|
|
const code = String(error?.code || "").toUpperCase();
|
|
return (
|
|
code.includes("ETIMEDOUT") ||
|
|
code.includes("ECONNRESET") ||
|
|
code.includes("ENOTFOUND") ||
|
|
code.includes("EAI_AGAIN") ||
|
|
code.includes("ECONNABORTED")
|
|
);
|
|
}
|
|
|
|
function extractUberCode(responseData, fallbackStatus) {
|
|
if (!responseData || typeof responseData !== "object") {
|
|
return fallbackStatus ? `http_${fallbackStatus}` : "unknown_error";
|
|
}
|
|
return responseData.code || responseData.error || responseData.error_code || "unknown_error";
|
|
}
|
|
|
|
function extractUberMessage(responseData, fallbackMessage) {
|
|
if (!responseData || typeof responseData !== "object") {
|
|
return fallbackMessage || "Unknown error";
|
|
}
|
|
return responseData.message || responseData.error_description || fallbackMessage || "Unknown error";
|
|
}
|
|
|
|
function normalizeUberError(error) {
|
|
const status = error?.response?.status || 500;
|
|
const responseData = error?.response?.data;
|
|
const code = extractUberCode(responseData, status);
|
|
const message = extractUberMessage(responseData, error?.message);
|
|
const transient = TRANSIENT_HTTP_STATUSES.has(status) || isNetworkOrTimeout(error);
|
|
|
|
const normalized = new Error(`Uber API request failed: ${status} ${code}`);
|
|
normalized.status = status;
|
|
normalized.code = code;
|
|
normalized.transient = transient;
|
|
normalized.details = responseData || { message };
|
|
return normalized;
|
|
}
|
|
|
|
function isRetryableUberError(error) {
|
|
if (error?.transient === true) {
|
|
return true;
|
|
}
|
|
if (error?.response?.status && TRANSIENT_HTTP_STATUSES.has(error.response.status)) {
|
|
return true;
|
|
}
|
|
return isNetworkOrTimeout(error);
|
|
}
|
|
|
|
module.exports = {
|
|
normalizeUberError,
|
|
isRetryableUberError
|
|
};
|
|
|