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:
@@ -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();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user