| import type { JsonObject } from "./vendor/type-fest/basic"; |
|
|
| |
| |
| export async function createApiError( |
| response: Response, |
| opts?: { requestId?: string; message?: string } |
| ): Promise<never> { |
| const error = new HubApiError(response.url, response.status, response.headers.get("X-Request-Id") ?? opts?.requestId); |
|
|
| error.message = `Api error with status ${error.statusCode}${opts?.message ? `. ${opts.message}` : ""}`; |
|
|
| const trailer = [`URL: ${error.url}`, error.requestId ? `Request ID: ${error.requestId}` : undefined] |
| .filter(Boolean) |
| .join(". "); |
|
|
| if (response.headers.get("Content-Type")?.startsWith("application/json")) { |
| const json = await response.json(); |
| error.message = json.error || json.message || error.message; |
| if (json.error_description) { |
| error.message = error.message ? error.message + `: ${json.error_description}` : json.error_description; |
| } |
| error.data = json; |
| } else { |
| error.data = { message: await response.text() }; |
| } |
|
|
| error.message += `. ${trailer}`; |
|
|
| throw error; |
| } |
|
|
| |
| |
| |
| export class HubApiError extends Error { |
| statusCode: number; |
| url: string; |
| requestId?: string; |
| data?: JsonObject; |
|
|
| constructor(url: string, statusCode: number, requestId?: string, message?: string) { |
| super(message); |
|
|
| this.statusCode = statusCode; |
| this.requestId = requestId; |
| this.url = url; |
| } |
| } |
|
|
| export class InvalidApiResponseFormatError extends Error {} |
|
|