feat: less verbose errors

This commit is contained in:
Daniel Hougaard
2024-10-10 00:55:50 +04:00
parent 0b1c62f8e5
commit b789129f3d
2 changed files with 134 additions and 60 deletions

52
src/custom/errors.ts Normal file
View File

@@ -0,0 +1,52 @@
import { AxiosError } from "axios";
type TApiErrorResponse = {
statusCode: number;
message: string;
error: string;
};
export class InfisicalSDKError extends Error {
constructor(message: string) {
super(message);
this.message = message;
this.name = "InfisicalSDKError";
}
}
export class InfisicalSDKRequestError extends Error {
constructor(
message: string,
requestData: {
url: string;
method: string;
statusCode: number;
}
) {
super(message);
this.message = `[URL=${requestData.url}] [Method=${requestData.method}] [StatusCode=${requestData.statusCode}] ${message}`;
this.name = "InfisicalSDKRequestError";
}
}
export const newInfisicalError = (error: any) => {
if (error instanceof AxiosError) {
const data = error?.response?.data as TApiErrorResponse;
if (data?.message) {
return new InfisicalSDKRequestError(data.message, {
url: error.response?.config.url || "",
method: error.response?.config.method || "",
statusCode: error.response?.status || 0
});
} else if (error.message) {
return new InfisicalSDKError(error.message);
} else if (error.code) {
// If theres no message but a code is present, it's likely to be an aggregation error. This is not specific to Axios, but it falls under the AxiosError type
return new InfisicalSDKError(error.code);
} else {
return new InfisicalSDKError("Request failed with unknown error");
}
}
return new InfisicalSDKError(error?.message || "An error occurred");
};

View File

@@ -5,6 +5,7 @@ import type {
DefaultApiApiV3SecretsRawSecretNamePatchRequest,
DefaultApiApiV3SecretsRawSecretNamePostRequest
} from "../infisicalapi_client";
import { newInfisicalError } from "./errors";
type SecretType = "shared" | "personal";
@@ -48,9 +49,11 @@ export default class SecretsClient {
#requestOptions: RawAxiosRequestConfig | undefined;
constructor(apiInstance: InfisicalApi, requestOptions: RawAxiosRequestConfig | undefined) {
this.#apiInstance = apiInstance;
this.#requestOptions = requestOptions;
}
listSecrets = async (options: ListSecretsOptions) => {
try {
const res = await this.#apiInstance.apiV3SecretsRawGet(
{
environment: options.environment,
@@ -64,9 +67,13 @@ export default class SecretsClient {
this.#requestOptions
);
return res.data;
} catch (err) {
throw newInfisicalError(err);
}
};
getSecret = async (options: GetSecretOptions) => {
try {
const res = await this.#apiInstance.apiV3SecretsRawSecretNameGet(
{
environment: options.environment,
@@ -81,9 +88,13 @@ export default class SecretsClient {
this.#requestOptions
);
return res.data.secret;
} catch (err) {
throw newInfisicalError(err);
}
};
updateSecret = async (secretName: DefaultApiApiV3SecretsRawSecretNamePatchRequest["secretName"], options: UpdateSecretOptions) => {
try {
const res = await this.#apiInstance.apiV3SecretsRawSecretNamePatch(
{
secretName,
@@ -95,9 +106,13 @@ export default class SecretsClient {
this.#requestOptions
);
return res.data;
} catch (err) {
throw newInfisicalError(err);
}
};
createSecret = async (secretName: DefaultApiApiV3SecretsRawSecretNamePostRequest["secretName"], options: CreateSecretOptions) => {
try {
const res = await this.#apiInstance.apiV3SecretsRawSecretNamePost(
{
secretName,
@@ -109,9 +124,13 @@ export default class SecretsClient {
this.#requestOptions
);
return res.data;
} catch (err) {
throw newInfisicalError(err);
}
};
deleteSecret = async (secretName: DefaultApiApiV3SecretsRawSecretNameDeleteRequest["secretName"], options: DeleteSecretOptions) => {
try {
const res = await this.#apiInstance.apiV3SecretsRawSecretNameDelete(
{
secretName,
@@ -123,5 +142,8 @@ export default class SecretsClient {
this.#requestOptions
);
return res.data;
} catch (err) {
throw newInfisicalError(err);
}
};
}