From d1a284fa96d034104d57dbf2ce45567f7dbfb55b Mon Sep 17 00:00:00 2001 From: Jannis Fedoruk-Betschki Date: Thu, 25 Sep 2025 13:30:01 +0200 Subject: [PATCH] Fix federation error handling to prevent 500 responses When USE_MQ=false, federation happens synchronously during the HTTP request. If delivery to any follower fails (e.g., deleted accounts, down servers), it causes the entire request to return 500 even though the action itself succeeded. --- src/activitypub/fediverse-bridge.ts | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/src/activitypub/fediverse-bridge.ts b/src/activitypub/fediverse-bridge.ts index d24205bd6..45131f124 100644 --- a/src/activitypub/fediverse-bridge.ts +++ b/src/activitypub/fediverse-bridge.ts @@ -8,6 +8,7 @@ import { Reject, Update, } from '@fedify/fedify'; +import type { Logger } from '@logtape/logtape'; import { v4 as uuidv4 } from 'uuid'; import type { Account } from '@/account/account.entity'; @@ -28,6 +29,7 @@ export class FediverseBridge { private readonly events: EventEmitter, private readonly fedifyContextFactory: FedifyContextFactory, private readonly accountService: AccountService, + private readonly logger: Logger, ) {} async init() { @@ -76,14 +78,25 @@ export class FediverseBridge { ) { const ctx = this.fedifyContextFactory.getFedifyContext(); - await ctx.sendActivity( - { username: account.username }, - 'followers', - activity, - { - preferSharedInbox: true, - }, - ); + try { + await ctx.sendActivity( + { username: account.username }, + 'followers', + activity, + { + preferSharedInbox: true, + }, + ); + } catch (error) { + // The action succeeded, but federation fails. This needs to be handled + // gracefully to avoid 500 responses to the user, in case of synchronous + // federation (e.g. no message queue is used). + this.logger.error('Failed to federate activity to followers: {error}', { + accountId: account.id, + accountUsername: account.username, + error, + }); + } } private async handlePostCreated(event: PostCreatedEvent) {