fix(federation): assign deterministic federatedId on 1-on-1 DM creation

POST /api/dm created channels with federatedId=NULL, so when the S2S
reply arrived, processCreateEvent couldn't find the channel and created
a duplicate. Now computes the deterministic SHA256 hash at creation time
when either participant is federated.
This commit is contained in:
Jannis Braun
2026-04-01 03:57:42 +02:00
parent 4b596afae5
commit e40a63ba9b
+17
View File
@@ -446,10 +446,27 @@ export async function dmRoutes(app: FastifyInstance): Promise<void> {
const dmChannelId = generateSnowflake(); const dmChannelId = generateSnowflake();
const now = Date.now(); const now = Date.now();
// Compute deterministic federatedId for federated 1-on-1 DMs so that the
// S2S relay can find this channel when the reply arrives, preventing duplicates.
let federatedId: string | null = null;
if (isFederationRelayEnabled()) {
const callerUser = db.select().from(schema.users).where(eq(schema.users.id, request.userId)).get();
const callerHomeUserId = callerUser?.homeUserId || request.userId;
const targetHomeUserId = targetUser.homeUserId || targetUser.id;
const callerHomeInstance = callerUser?.homeInstance || null;
const targetHomeInstance = targetUser.homeInstance || null;
// If either user is federated, this DM needs a federatedId for S2S relay matching
if (callerHomeInstance || targetHomeInstance) {
federatedId = computeFederatedId(callerHomeUserId, targetHomeUserId);
}
}
db.transaction((tx) => { db.transaction((tx) => {
tx.insert(schema.dmChannels).values({ tx.insert(schema.dmChannels).values({
id: dmChannelId, id: dmChannelId,
ownerId: null, ownerId: null,
federatedId,
createdAt: now, createdAt: now,
}).run(); }).run();