From 2aa3cf27311218f2a1ba2e630f4d352968dd87d5 Mon Sep 17 00:00:00 2001 From: Hazelnoot Date: Tue, 6 May 2025 17:27:39 -0400 Subject: [PATCH] debug-log mastodon error responses --- .../api/mastodon/MastodonApiServerService.ts | 20 +++++++++++-------- .../src/server/api/mastodon/MastodonLogger.ts | 7 +++++++ 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/packages/backend/src/server/api/mastodon/MastodonApiServerService.ts b/packages/backend/src/server/api/mastodon/MastodonApiServerService.ts index 5b682df529..359408d882 100644 --- a/packages/backend/src/server/api/mastodon/MastodonApiServerService.ts +++ b/packages/backend/src/server/api/mastodon/MastodonApiServerService.ts @@ -46,17 +46,21 @@ export class MastodonApiServerService { this.serverUtilityService.addCORS(fastify); this.serverUtilityService.addFlattenedQueryType(fastify); - fastify.setErrorHandler((error, request, reply) => { - try { - const data = getErrorData(error); - const status = getErrorStatus(error); + // Convert JS exceptions into error responses + fastify.setErrorHandler((error, _, reply) => { + const data = getErrorData(error); + const status = getErrorStatus(error); - this.logger.error(request, data, status); + reply.code(status).send(data); + }); - reply.code(status).send(data); - } catch (e) { - this.logger.logger.error('Recursive error in mastodon API - this is a bug!', { e }, true); + // Log error responses (including converted JSON exceptions) + fastify.addHook('onSend', (request, reply, payload, done) => { + if (reply.statusCode >= 400) { + const data = getErrorData(payload); + this.logger.error(request, data, reply.statusCode); } + done(); }); // External endpoints diff --git a/packages/backend/src/server/api/mastodon/MastodonLogger.ts b/packages/backend/src/server/api/mastodon/MastodonLogger.ts index 228f9a631b..096a3521a7 100644 --- a/packages/backend/src/server/api/mastodon/MastodonLogger.ts +++ b/packages/backend/src/server/api/mastodon/MastodonLogger.ts @@ -65,6 +65,13 @@ export function getErrorData(error: unknown): MastodonError { return convertGenericError(error); } + if ('error' in error && typeof(error.error) === 'string') { + // "error_description" is string, undefined, or not present. + if (!('error_description' in error) || typeof(error.error_description) === 'string' || typeof(error.error_description) === 'undefined') { + return error as MastodonError; + } + } + return convertUnknownError(error); }