@itwin/imodels-client-management
Version:
iModels API client wrapper for applications that manage iModels.
105 lines • 4.49 kB
JavaScript
/*---------------------------------------------------------------------------------------------
* 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