From 34fe9115b9f7708e4efd2303d51db081304e6722 Mon Sep 17 00:00:00 2001 From: Jannis Braun <151788261+TheZwiss@users.noreply.github.com> Date: Mon, 20 Apr 2026 17:15:22 +0200 Subject: [PATCH] fix: compute target origins for 1-on-1 DMs so pending peers are created MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit getGroupDmTargetOrigins() returned undefined for 1-on-1 DMs, which queueOutboxEvent() treated as 'broadcast to all existing peers'. When no peers existed, nothing was queued and no handshake was ever triggered. Now always computes target origins from DM participants so the pending placeholder creation path runs, enabling ensurePeered() → peer/accept → approval queue flow. --- packages/server/src/utils/federationOutbox.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/server/src/utils/federationOutbox.ts b/packages/server/src/utils/federationOutbox.ts index 822f1748..847fb459 100644 --- a/packages/server/src/utils/federationOutbox.ts +++ b/packages/server/src/utils/federationOutbox.ts @@ -330,21 +330,23 @@ export function getGroupDmTargetOrigins(dmChannelId: string): string[] | undefin .where(eq(schema.dmChannels.id, dmChannelId)) .get(); - // Not a group DM (no owner) — broadcast to all - if (!channel?.ownerId) return undefined; - + // Always compute target origins from participants — both 1-on-1 and group DMs. + // Returning undefined (broadcast to all) would skip the pending-placeholder creation + // in queueOutboxEvent(), preventing relay when no peer exists yet. const participants = getDmParticipants(dmChannelId); const ourOrigin = getOurOrigin(); const origins = new Set(); for (const p of participants) { - // Normalize homeInstance to full URL format to match federation_peers.origin const normalized = p.homeInstance.startsWith('http') ? p.homeInstance : `https://${p.homeInstance}`; if (normalized !== ourOrigin) { origins.add(normalized); } } + // No remote participants — no relay needed + if (origins.size === 0) return undefined; + return Array.from(origins); }