summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHazelnoot <acomputerdog@gmail.com>2025-03-24 12:20:18 -0400
committerHazelnoot <acomputerdog@gmail.com>2025-03-27 19:51:43 -0400
commit971bc6fd3e58ac9e56fd4d507063fa60fa1e58e7 (patch)
treecdda8c00881ea81db23e9e808132adf177dcbed6
parentrename MastodonConverters.ts to matching naming scheme (diff)
downloadsharkey-971bc6fd3e58ac9e56fd4d507063fa60fa1e58e7.tar.gz
sharkey-971bc6fd3e58ac9e56fd4d507063fa60fa1e58e7.tar.bz2
sharkey-971bc6fd3e58ac9e56fd4d507063fa60fa1e58e7.zip
improve mastodon API error handling
-rw-r--r--packages/backend/src/server/api/mastodon/MastodonLogger.ts88
1 files changed, 43 insertions, 45 deletions
diff --git a/packages/backend/src/server/api/mastodon/MastodonLogger.ts b/packages/backend/src/server/api/mastodon/MastodonLogger.ts
index ed3bff5214..57cf876dff 100644
--- a/packages/backend/src/server/api/mastodon/MastodonLogger.ts
+++ b/packages/backend/src/server/api/mastodon/MastodonLogger.ts
@@ -39,48 +39,50 @@ export interface MastodonError {
}
export function getErrorData(error: unknown): MastodonError {
- if (error && typeof(error) === 'object') {
- // AxiosError, comes from the backend
- if ('response' in error) {
- if (typeof(error.response) === 'object' && error.response) {
- if ('data' in error.response) {
- if (typeof(error.response.data) === 'object' && error.response.data) {
- if ('error' in error.response.data) {
- if (typeof(error.response.data.error) === 'object' && error.response.data.error) {
- if ('code' in error.response.data.error) {
- if (typeof(error.response.data.error.code) === 'string') {
- return convertApiError(error.response.data.error as ApiError);
- }
- }
+ // Axios wraps errors from the backend
+ error = unpackAxiosError(error);
- return convertUnknownError(error.response.data.error);
- }
- }
+ if (!error || typeof(error) !== 'object') {
+ return {
+ error: 'UNKNOWN_ERROR',
+ error_description: String(error),
+ };
+ }
- return convertUnknownError(error.response.data);
- }
- }
- }
+ if (error instanceof ApiError) {
+ return convertApiError(error);
+ }
- // No data - this is a fallback to avoid leaking request/response details in the error
- return convertUnknownError();
+ if ('code' in error && typeof (error.code) === 'string') {
+ if ('message' in error && typeof (error.message) === 'string') {
+ return convertApiError(error as ApiError);
}
+ }
- if (error instanceof ApiError) {
- return convertApiError(error);
- }
+ if (error instanceof Error) {
+ return convertGenericError(error);
+ }
- if (error instanceof Error) {
- return convertGenericError(error);
- }
+ return convertUnknownError(error);
+}
+
+function unpackAxiosError(error: unknown): unknown {
+ if (error && typeof(error) === 'object') {
+ if ('response' in error && error.response && typeof (error.response) === 'object') {
+ if ('data' in error.response && error.response.data && typeof (error.response.data) === 'object') {
+ if ('error' in error.response.data && error.response.data.error && typeof(error.response.data.error) === 'object') {
+ return error.response.data.error;
+ }
+
+ return error.response.data;
+ }
- return convertUnknownError(error);
+ // No data - this is a fallback to avoid leaking request/response details in the error
+ return undefined;
+ }
}
- return {
- error: 'UNKNOWN_ERROR',
- error_description: String(error),
- };
+ return error;
}
function convertApiError(apiError: ApiError): MastodonError {
@@ -121,21 +123,17 @@ function convertGenericError(error: Error): MastodonError {
}
export function getErrorStatus(error: unknown): number {
- // AxiosError, comes from the backend
- if (typeof(error) === 'object' && error) {
- if ('response' in error) {
- if (typeof (error.response) === 'object' && error.response) {
- if ('status' in error.response) {
- if (typeof(error.response.status) === 'number') {
- return error.response.status;
- }
- }
+ if (error && typeof(error) === 'object') {
+ // Axios wraps errors from the backend
+ if ('response' in error && typeof (error.response) === 'object' && error.response) {
+ if ('status' in error.response && typeof(error.response.status) === 'number') {
+ return error.response.status;
}
}
- }
- if (error instanceof ApiError && error.httpStatusCode) {
- return error.httpStatusCode;
+ if ('httpStatusCode' in error && typeof(error.httpStatusCode) === 'number') {
+ return error.httpStatusCode;
+ }
}
return 500;