UNPKG

@itwin/imodels-client-management

Version:

iModels API client wrapper for applications that manage iModels.

105 lines 4.49 kB
/*--------------------------------------------------------------------------------------------- * Copyright (c) Bentley Systems, Incorporated. All rights reserved. * See LICENSE.md in the project root for license terms and full copyright notice. *--------------------------------------------------------------------------------------------*/ import { IModelsErrorCode, } from "../types"; export class IModelsErrorBaseImpl extends Error { code; originalError; constructor(params) { super(); this.name = this.code = params.code; this.message = params.message; this.originalError = params.originalError; } } export class IModelsErrorImpl extends IModelsErrorBaseImpl { details; statusCode; constructor(params) { super(params); this.details = params.details; this.statusCode = params.statusCode; } } export class IModelsErrorParser { static _defaultErrorMessage = "Unknown error occurred"; static _defaultUnauthorizedMessage = "Authorization failed"; static parse(response, originalError) { if (!response.body) return IModelsErrorParser.createUnrecognizedError(response, originalError); if (response.statusCode === 401) return IModelsErrorParser.createUnauthorizedError(response, originalError); const errorFromApi = response.body; const errorCode = IModelsErrorParser.parseCode(errorFromApi?.error?.code); if (errorCode === IModelsErrorCode.Unrecognized) return IModelsErrorParser.createUnrecognizedError(response, originalError); const errorDetails = IModelsErrorParser.parseDetails(errorFromApi.error?.details); const errorMessage = IModelsErrorParser.parseAndFormatMessage(errorFromApi?.error?.message, errorDetails); return new IModelsErrorImpl({ code: errorCode, statusCode: response.statusCode, originalError, message: errorMessage, details: errorDetails, }); } static parseCode(errorCode) { if (!errorCode) return IModelsErrorCode.Unrecognized; const adjustedErrorCode = IModelsErrorParser.adjustErrorCodeCaseToMatchEnum(errorCode); let parsedCode = IModelsErrorCode[adjustedErrorCode]; if (!parsedCode) parsedCode = IModelsErrorCode.Unrecognized; return parsedCode; } static adjustErrorCodeCaseToMatchEnum(errorCode) { return errorCode.replace("iModel", "IModel").replace("iTwin", "ITwin"); } static parseDetails(details) { if (!details) return undefined; return details.map((unparsedDetail) => { return { ...unparsedDetail, code: this.parseCode(unparsedDetail.code) }; }); } static parseAndFormatMessage(message, errorDetails) { let result = message ?? IModelsErrorParser._defaultErrorMessage; if (!errorDetails || errorDetails.length === 0) return result; result += " Details:\n"; for (let i = 0; i < errorDetails.length; i++) { result += `${i + 1}. ${errorDetails[i].code}: ${errorDetails[i].message}`; if (errorDetails[i].target) result += ` Target: ${errorDetails[i].target}.`; result += "\n"; } return result; } static createUnrecognizedError(response, originalError) { return new IModelsErrorImpl({ code: IModelsErrorCode.Unrecognized, statusCode: response.statusCode, originalError, message: `${IModelsErrorParser._defaultErrorMessage}.\n` + `Original error message: ${originalError.message},\n` + `original error code: ${originalError.code},\n` + `response status code: ${response.statusCode},\n` + `response body: ${JSON.stringify(response.body)}`, details: undefined, }); } static createUnauthorizedError(response, originalError) { const errorMessage = response.body?.error?.message ?? response.body?.message ?? IModelsErrorParser._defaultUnauthorizedMessage; return new IModelsErrorImpl({ code: IModelsErrorCode.Unauthorized, statusCode: response.statusCode, originalError, message: errorMessage, details: undefined, }); } } //# sourceMappingURL=IModelsErrorParser.js.map