cloudflare/cloudflare-typescript

Public

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

CodeCommitsIssuesPull requestsActionsInsightsSecurity
24b75407eecb7edb8411d79abada04e0b91bbf60

Branches

Tags

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

Clone

HTTPS

Download ZIP

src/error.ts

146lines · modecode

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