Merge branch 'feat/inda-383-daily-stat' into 'main'
[ProtonMail-WebClient.git] / packages / shared / lib / fetch / ApiError.ts
blob3a6e2379eb11cd0a5a638cbabd354b03a9e3b613
1 export class ApiError extends Error {
2     response?: Response;
4     status: number;
6     data?: any;
8     config: any;
10     constructor(message: string, status: number, name: string) {
11         super(message);
12         Object.setPrototypeOf(this, ApiError.prototype);
13         this.status = status;
14         this.name = name;
15     }
18 export const createApiError = (name: string, response: Response, config: any, data?: any) => {
19     const { statusText, status } = response;
21     const error = new ApiError(statusText, status, name);
23     error.response = response;
24     error.data = data;
25     error.config = config;
27     return error;
30 export const serializeApiErrorData = (error: ApiError) => {
31     /**
32      *      We are only interested in the data here, so we strip almost everything else. In particular:
33      *      * error.response is typically not serializable
34      *      * error.config might not be serializable either (for instance it can include (aborted) abort controllers)
35      */
37     return {
38         name: error.name,
39         status: error.status,
40         statusText: error.response?.statusText || error.message,
41         data: error.data,
42     };
45 export const deserializeApiErrorData = ({
46     name,
47     status,
48     statusText,
49     data,
50 }: ReturnType<typeof serializeApiErrorData>) => {
51     const error = new ApiError(statusText, status, name);
53     error.data = data;
55     return error;
58 export enum CUSTOM_FETCH_ERROR_STATUS_CODE {
59     NO_NETWORK_CONNECTION = 0,
60     TIMEOUT = -1,
63 export const createOfflineError = (config: any) => {
64     const error = new ApiError(
65         'No network connection',
66         CUSTOM_FETCH_ERROR_STATUS_CODE.NO_NETWORK_CONNECTION,
67         'OfflineError'
68     );
69     error.config = config;
70     return error;
73 export const createTimeoutError = (config: any) => {
74     const error = new ApiError('Request timed out', CUSTOM_FETCH_ERROR_STATUS_CODE.TIMEOUT, 'TimeoutError');
75     error.config = config;
76     return error;