UNPKG

@mcdevsl/superset-ui

Version:
95 lines (89 loc) 3.24 kB
/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ import { SupersetApiError, SupersetApiErrorPayload, SupersetApiMultiErrorsPayload } from './types'; export type ErrorInput = string | Error | Response | SupersetApiErrorPayload; /** * Handle API request errors, convert to consistent Superset API error. * @param error the catched error from SupersetClient.request(...) */ export default async function handleError(error: ErrorInput): Promise<never> { // already a Sueprset error if (error instanceof SupersetApiError) { throw error; } // string is the error message itself if (typeof error === 'string') { throw new SupersetApiError({ message: error }); } // JS errors, normally happens before request was sent if (error instanceof Error) { throw new SupersetApiError({ message: error.message || 'Unknown Error', originalError: error, }); } let errorJson; let originalError; let errorMessage = 'Unknown Error'; let status: number | undefined; let statusText: string | undefined; // catch HTTP errors if (error instanceof Response) { const { status: responseStatus, statusText: responseStatusText } = error; status = responseStatus; statusText = responseStatusText; errorMessage = `${status} ${statusText}`; try { errorJson = (await error.json()) as SupersetApiErrorPayload | SupersetApiMultiErrorsPayload; originalError = errorJson; } catch (error_) { originalError = error; } } else if (error) { errorJson = error; } // when API returns 200 but operation fails (see Python API json_error_response(...)) // or when frontend promise rejects with `{ error: ... }` if (errorJson && ('error' in errorJson || 'message' in errorJson || 'errors' in errorJson)) { let err; if ('errors' in errorJson) { err = errorJson.errors?.[0] || {}; } else if (typeof errorJson.error === 'object') { err = errorJson.error; } else { err = errorJson; } errorMessage = err.message || (err.error as string | undefined) || err.error_type || errorMessage; throw new SupersetApiError({ status, statusText, message: errorMessage, originalError, ...err, }); } // all unknown error throw new SupersetApiError({ status, statusText, message: errorMessage, originalError: error, }); }