cloudflare/cloudflare-typescript

Public

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

CodeCommitsIssuesPull requestsActionsInsightsSecurity
b9426aec57563b81815d82008272622d2754adf5

Branches

Tags

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

Clone

HTTPS

Download ZIP

src/error.ts

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