@clickup/rest-client
Version:
A syntax sugar tool around Node fetch() API, tailored to work with TypeScript and response validators
60 lines • 2.9 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const RestRateLimitError_1 = __importDefault(require("../errors/RestRateLimitError"));
const RestResponseError_1 = __importDefault(require("../errors/RestResponseError"));
const RestRetriableError_1 = __importDefault(require("../errors/RestRetriableError"));
const RestTokenInvalidError_1 = __importDefault(require("../errors/RestTokenInvalidError"));
const STATUS_TOO_MANY_REQUESTS = 429;
/**
* The general idea is that we turn all logical errors into exceptions and then
* deal with exceptions only. I.e. throwing an exception becomes an internal API
* convention for errors. This is because fetch() throws its own exceptions, and
* also there may be some exceptions during validation of the response, or
* inside a middleware etc.
*/
function throwIfErrorResponse(options, res) {
const isSuccessResponse = options.isSuccessResponse(res);
if (isSuccessResponse === "SUCCESS") {
return;
}
const rateLimitDelayMs = options.isRateLimitError(res);
switch (rateLimitDelayMs) {
case "RATE_LIMIT":
throw new RestRateLimitError_1.default(`isRateLimitError() returned ${rateLimitDelayMs}`, 0, res);
case "BEST_EFFORT":
if (res.status === STATUS_TOO_MANY_REQUESTS) {
const retryAfterHeader = res.headers.get("Retry-After") || "0";
throw new RestRateLimitError_1.default(`Rate limited by HTTP status ${STATUS_TOO_MANY_REQUESTS}`, 1000 * parseInt(retryAfterHeader) || 0, res);
}
break;
case "SOMETHING_ELSE":
break;
default:
throw new RestRateLimitError_1.default(`isRateLimitError() returned retry delay ${rateLimitDelayMs} ms`, rateLimitDelayMs, res);
}
const isTokenInvalidError = options.isTokenInvalidError(res);
if (isTokenInvalidError) {
throw new RestTokenInvalidError_1.default("Invalid app token", res);
}
const retryDelayMs = options.isRetriableError(res, null);
switch (retryDelayMs) {
case "RETRY":
throw new RestRetriableError_1.default(`isRetriableError() returned ${retryDelayMs}`, 0, res);
case "BEST_EFFORT":
case "NEVER_RETRY":
break;
default:
throw new RestRetriableError_1.default(`"isRetriableError() returned retry delay ${retryDelayMs} ms`, retryDelayMs, res);
}
if (isSuccessResponse === "THROW") {
throw new RestResponseError_1.default(`isSuccessResponse() returned ${isSuccessResponse}`, res);
}
if (res.status >= 300) {
throw new RestResponseError_1.default("", res);
}
}
exports.default = throwIfErrorResponse;
//# sourceMappingURL=throwIfErrorResponse.js.map
;