cloudflare/cloudflare-typescript

Public

mirrored fromhttps://github.com/cloudflare/cloudflare-typescriptAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
revert-2597-fix-client-send-all-configured-a

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

src/error.ts

136lines · modecode

1// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
3import { castToError, Headers } from './core';
4import * as Shared from './resources/shared';
5
6export class CloudflareError extends Error {}
7
8export class APIError<
9 TStatus extends number | undefined = number | undefined,
10 THeaders extends Headers | undefined = Headers | undefined,
11 TError extends Object | undefined = Object | undefined,
12> extends CloudflareError {
13 /** HTTP status for the response that caused the error */
14 readonly status: TStatus;
15 /** HTTP headers for the response that caused the error */
16 readonly headers: THeaders;
17 /** JSON body of the response that caused the error */
18 readonly error: TError;
19
20 readonly errors: Array<Shared.ErrorData>;
21
22 constructor(status: TStatus, error: TError, message: string | undefined, headers: THeaders) {
23 super(`${APIError.makeMessage(status, error, message)}`);
24 this.status = status;
25 this.headers = headers;
26 this.error = error;
27
28 const data = error as Record<string, any>;
29 this.errors = data?.['errors'] ?? [];
30 }
31
32 private static makeMessage(status: number | undefined, error: any, message: string | undefined) {
33 const msg =
34 error?.message ?
35 typeof error.message === 'string' ?
36 error.message
37 : JSON.stringify(error.message)
38 : error ? JSON.stringify(error)
39 : message;
40
41 if (status && msg) {
42 return `${status} ${msg}`;
43 }
44 if (status) {
45 return `${status} status code (no body)`;
46 }
47 if (msg) {
48 return msg;
49 }
50 return '(no status code or body)';
51 }
52
53 static generate(
54 status: number | undefined,
55 errorResponse: Object | undefined,
56 message: string | undefined,
57 headers: Headers | undefined,
58 ): APIError {
59 if (!status || !headers) {
60 return new APIConnectionError({ message, cause: castToError(errorResponse) });
61 }
62
63 const error = errorResponse as Record<string, any>;
64
65 if (status === 400) {
66 return new BadRequestError(status, error, message, headers);
67 }
68
69 if (status === 401) {
70 return new AuthenticationError(status, error, message, headers);
71 }
72
73 if (status === 403) {
74 return new PermissionDeniedError(status, error, message, headers);
75 }
76
77 if (status === 404) {
78 return new NotFoundError(status, error, message, headers);
79 }
80
81 if (status === 409) {
82 return new ConflictError(status, error, message, headers);
83 }
84
85 if (status === 422) {
86 return new UnprocessableEntityError(status, error, message, headers);
87 }
88
89 if (status === 429) {
90 return new RateLimitError(status, error, message, headers);
91 }
92
93 if (status >= 500) {
94 return new InternalServerError(status, error, message, headers);
95 }
96
97 return new APIError(status, error, message, headers);
98 }
99}
100
101export class APIUserAbortError extends APIError<undefined, undefined, undefined> {
102 constructor({ message }: { message?: string } = {}) {
103 super(undefined, undefined, message || 'Request was aborted.', undefined);
104 }
105}
106
107export class APIConnectionError extends APIError<undefined, undefined, undefined> {
108 constructor({ message, cause }: { message?: string | undefined; cause?: Error | undefined }) {
109 super(undefined, undefined, message || 'Connection error.', undefined);
110 // in some environments the 'cause' property is already declared
111 // @ts-ignore
112 if (cause) this.cause = cause;
113 }
114}
115
116export class APIConnectionTimeoutError extends APIConnectionError {
117 constructor({ message }: { message?: string } = {}) {
118 super({ message: message ?? 'Request timed out.' });
119 }
120}
121
122export class BadRequestError extends APIError<400, Headers> {}
123
124export class AuthenticationError extends APIError<401, Headers> {}
125
126export class PermissionDeniedError extends APIError<403, Headers> {}
127
128export class NotFoundError extends APIError<404, Headers> {}
129
130export class ConflictError extends APIError<409, Headers> {}
131
132export class UnprocessableEntityError extends APIError<422, Headers> {}
133
134export class RateLimitError extends APIError<429, Headers> {}
135
136export class InternalServerError extends APIError<number, Headers> {}
137