feat: less verbose errors
This commit is contained in:
52
src/custom/errors.ts
Normal file
52
src/custom/errors.ts
Normal 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");
|
||||||
|
};
|
||||||
@@ -5,6 +5,7 @@ import type {
|
|||||||
DefaultApiApiV3SecretsRawSecretNamePatchRequest,
|
DefaultApiApiV3SecretsRawSecretNamePatchRequest,
|
||||||
DefaultApiApiV3SecretsRawSecretNamePostRequest
|
DefaultApiApiV3SecretsRawSecretNamePostRequest
|
||||||
} from "../infisicalapi_client";
|
} from "../infisicalapi_client";
|
||||||
|
import { newInfisicalError } from "./errors";
|
||||||
|
|
||||||
type SecretType = "shared" | "personal";
|
type SecretType = "shared" | "personal";
|
||||||
|
|
||||||
@@ -48,9 +49,11 @@ export default class SecretsClient {
|
|||||||
#requestOptions: RawAxiosRequestConfig | undefined;
|
#requestOptions: RawAxiosRequestConfig | undefined;
|
||||||
constructor(apiInstance: InfisicalApi, requestOptions: RawAxiosRequestConfig | undefined) {
|
constructor(apiInstance: InfisicalApi, requestOptions: RawAxiosRequestConfig | undefined) {
|
||||||
this.#apiInstance = apiInstance;
|
this.#apiInstance = apiInstance;
|
||||||
|
this.#requestOptions = requestOptions;
|
||||||
}
|
}
|
||||||
|
|
||||||
listSecrets = async (options: ListSecretsOptions) => {
|
listSecrets = async (options: ListSecretsOptions) => {
|
||||||
|
try {
|
||||||
const res = await this.#apiInstance.apiV3SecretsRawGet(
|
const res = await this.#apiInstance.apiV3SecretsRawGet(
|
||||||
{
|
{
|
||||||
environment: options.environment,
|
environment: options.environment,
|
||||||
@@ -64,9 +67,13 @@ export default class SecretsClient {
|
|||||||
this.#requestOptions
|
this.#requestOptions
|
||||||
);
|
);
|
||||||
return res.data;
|
return res.data;
|
||||||
|
} catch (err) {
|
||||||
|
throw newInfisicalError(err);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
getSecret = async (options: GetSecretOptions) => {
|
getSecret = async (options: GetSecretOptions) => {
|
||||||
|
try {
|
||||||
const res = await this.#apiInstance.apiV3SecretsRawSecretNameGet(
|
const res = await this.#apiInstance.apiV3SecretsRawSecretNameGet(
|
||||||
{
|
{
|
||||||
environment: options.environment,
|
environment: options.environment,
|
||||||
@@ -81,9 +88,13 @@ export default class SecretsClient {
|
|||||||
this.#requestOptions
|
this.#requestOptions
|
||||||
);
|
);
|
||||||
return res.data.secret;
|
return res.data.secret;
|
||||||
|
} catch (err) {
|
||||||
|
throw newInfisicalError(err);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
updateSecret = async (secretName: DefaultApiApiV3SecretsRawSecretNamePatchRequest["secretName"], options: UpdateSecretOptions) => {
|
updateSecret = async (secretName: DefaultApiApiV3SecretsRawSecretNamePatchRequest["secretName"], options: UpdateSecretOptions) => {
|
||||||
|
try {
|
||||||
const res = await this.#apiInstance.apiV3SecretsRawSecretNamePatch(
|
const res = await this.#apiInstance.apiV3SecretsRawSecretNamePatch(
|
||||||
{
|
{
|
||||||
secretName,
|
secretName,
|
||||||
@@ -95,9 +106,13 @@ export default class SecretsClient {
|
|||||||
this.#requestOptions
|
this.#requestOptions
|
||||||
);
|
);
|
||||||
return res.data;
|
return res.data;
|
||||||
|
} catch (err) {
|
||||||
|
throw newInfisicalError(err);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
createSecret = async (secretName: DefaultApiApiV3SecretsRawSecretNamePostRequest["secretName"], options: CreateSecretOptions) => {
|
createSecret = async (secretName: DefaultApiApiV3SecretsRawSecretNamePostRequest["secretName"], options: CreateSecretOptions) => {
|
||||||
|
try {
|
||||||
const res = await this.#apiInstance.apiV3SecretsRawSecretNamePost(
|
const res = await this.#apiInstance.apiV3SecretsRawSecretNamePost(
|
||||||
{
|
{
|
||||||
secretName,
|
secretName,
|
||||||
@@ -109,9 +124,13 @@ export default class SecretsClient {
|
|||||||
this.#requestOptions
|
this.#requestOptions
|
||||||
);
|
);
|
||||||
return res.data;
|
return res.data;
|
||||||
|
} catch (err) {
|
||||||
|
throw newInfisicalError(err);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
deleteSecret = async (secretName: DefaultApiApiV3SecretsRawSecretNameDeleteRequest["secretName"], options: DeleteSecretOptions) => {
|
deleteSecret = async (secretName: DefaultApiApiV3SecretsRawSecretNameDeleteRequest["secretName"], options: DeleteSecretOptions) => {
|
||||||
|
try {
|
||||||
const res = await this.#apiInstance.apiV3SecretsRawSecretNameDelete(
|
const res = await this.#apiInstance.apiV3SecretsRawSecretNameDelete(
|
||||||
{
|
{
|
||||||
secretName,
|
secretName,
|
||||||
@@ -123,5 +142,8 @@ export default class SecretsClient {
|
|||||||
this.#requestOptions
|
this.#requestOptions
|
||||||
);
|
);
|
||||||
return res.data;
|
return res.data;
|
||||||
|
} catch (err) {
|
||||||
|
throw newInfisicalError(err);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user