UNPKG

@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
"use strict"; 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