fix(federation): use participant-aware routing for reactions and deletes in group DMs

This commit is contained in:
Jannis Braun
2026-03-26 20:48:43 +01:00
parent d8563ec505
commit fc8b1ab16e
+7 -3
View File
@@ -11,7 +11,7 @@ import { ACTIVITY_LIMITS } from '@backspace/shared/src/activities.js';
import { sanitizeUser } from '../utils/sanitize.js'; import { sanitizeUser } from '../utils/sanitize.js';
import { deleteAttachmentFiles } from '../utils/fileCleanup.js'; import { deleteAttachmentFiles } from '../utils/fileCleanup.js';
import { resolveEmbeds, reResolveEmbeds, embedRowToEmbed } from '../utils/embedResolver.js'; import { resolveEmbeds, reResolveEmbeds, embedRowToEmbed } from '../utils/embedResolver.js';
import { appendMutationLog, queueOutboxEvent, queueDmRelay } from '../utils/federationOutbox.js'; import { appendMutationLog, queueOutboxEvent, queueDmRelay, getGroupDmTargetOrigins } from '../utils/federationOutbox.js';
import { getOurOrigin } from '../utils/federationAuth.js'; import { getOurOrigin } from '../utils/federationAuth.js';
/** /**
@@ -1052,7 +1052,8 @@ function handleDmMessageDelete(event: Record<string, unknown>, userId: string):
// Federation: log mutation and queue for relay // Federation: log mutation and queue for relay
appendMutationLog(messageId, msg.dmChannelId, 'delete'); appendMutationLog(messageId, msg.dmChannelId, 'delete');
queueOutboxEvent(messageId, msg.dmChannelId, 'delete', JSON.stringify({ deleted: true })); const targetOrigins = getGroupDmTargetOrigins(msg.dmChannelId);
queueOutboxEvent(messageId, msg.dmChannelId, 'delete', JSON.stringify({ deleted: true }), targetOrigins);
} }
// ─── Reaction Handlers ───────────────────────────────────────────────────── // ─── Reaction Handlers ─────────────────────────────────────────────────────
@@ -1136,6 +1137,7 @@ function handleReactionAdd(event: Record<string, unknown>, userId: string): void
emoji, emoji,
createdAt: now, createdAt: now,
})); }));
const reactionAddTargetOrigins = getGroupDmTargetOrigins(dmMsg.dmChannelId);
queueOutboxEvent(reactionId, dmMsg.dmChannelId, 'reaction_add', JSON.stringify({ queueOutboxEvent(reactionId, dmMsg.dmChannelId, 'reaction_add', JSON.stringify({
reaction: { reaction: {
messageId: canonicalMessageId, messageId: canonicalMessageId,
@@ -1145,7 +1147,7 @@ function handleReactionAdd(event: Record<string, unknown>, userId: string): void
emoji, emoji,
createdAt: now, createdAt: now,
}, },
})); }), reactionAddTargetOrigins);
} catch (err) { } catch (err) {
// Unique constraint violation (already reacted) // Unique constraint violation (already reacted)
} }
@@ -1213,6 +1215,7 @@ function handleReactionRemove(event: Record<string, unknown>, userId: string): v
homeUserId: removingUser?.homeUserId || userId, homeUserId: removingUser?.homeUserId || userId,
emoji, emoji,
})); }));
const reactionRemoveTargetOrigins = getGroupDmTargetOrigins(dmMsg.dmChannelId);
queueOutboxEvent( queueOutboxEvent(
`${messageId}:${userId}:${emoji}`, `${messageId}:${userId}:${emoji}`,
dmMsg.dmChannelId, dmMsg.dmChannelId,
@@ -1226,6 +1229,7 @@ function handleReactionRemove(event: Record<string, unknown>, userId: string): v
emoji, emoji,
}, },
}), }),
reactionRemoveTargetOrigins,
); );
} }
} }