From a0617730de40463c9b2b71f01275049cdf04bc7a Mon Sep 17 00:00:00 2001 From: Debdut Chakraborty Date: Tue, 7 Oct 2025 16:02:57 +0530 Subject: [PATCH 1/2] fix: process existing join events from state --- .../federation-matrix/src/FederationMatrix.ts | 29 ++++++++++++++++++- .../src/api/_matrix/invite.ts | 9 ++++-- .../src/types/IFederationMatrixService.ts | 1 + 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/ee/packages/federation-matrix/src/FederationMatrix.ts b/ee/packages/federation-matrix/src/FederationMatrix.ts index de25857365c44..320a541ae4654 100644 --- a/ee/packages/federation-matrix/src/FederationMatrix.ts +++ b/ee/packages/federation-matrix/src/FederationMatrix.ts @@ -9,7 +9,15 @@ import { } from '@rocket.chat/core-typings'; import type { MessageQuoteAttachment, IMessage, IRoom, IUser, IRoomNativeFederated } from '@rocket.chat/core-typings'; import { eventIdSchema, getAllServices, roomIdSchema, userIdSchema } from '@rocket.chat/federation-sdk'; -import type { EventID, UserID, HomeserverServices, FileMessageType, PresenceState } from '@rocket.chat/federation-sdk'; +import type { + EventID, + UserID, + HomeserverServices, + FileMessageType, + PresenceState, + PersistentEventBase, + RoomVersion, +} from '@rocket.chat/federation-sdk'; import { Logger } from '@rocket.chat/logger'; import { Users, Subscriptions, Messages, Rooms, Settings } from '@rocket.chat/models'; import emojione from 'emojione'; @@ -971,4 +979,23 @@ export class FederationMatrix extends ServiceClass implements IFederationMatrixS return results; } + + async emitJoin(membershipEvent: PersistentEventBase) { + if (!this.homeserverServices) { + this.logger.warn('Homeserver services not available, skipping user role room scoped'); + return; + } + + console.log('join emitting'); + + this.homeserverServices.emitter.emit('homeserver.matrix.membership', { + event_id: membershipEvent.eventId, + event: membershipEvent.event, + room_id: membershipEvent.roomId, + state_key: membershipEvent.stateKey as UserID, + content: { membership: 'join' }, + sender: membershipEvent.sender, + origin_server_ts: Date.now(), + }); + } } diff --git a/ee/packages/federation-matrix/src/api/_matrix/invite.ts b/ee/packages/federation-matrix/src/api/_matrix/invite.ts index 843a5ff02578b..781f996b5972b 100644 --- a/ee/packages/federation-matrix/src/api/_matrix/invite.ts +++ b/ee/packages/federation-matrix/src/api/_matrix/invite.ts @@ -1,4 +1,4 @@ -import { Room } from '@rocket.chat/core-services'; +import { FederationMatrix, Room } from '@rocket.chat/core-services'; import { isUserNativeFederated, type IUser } from '@rocket.chat/core-typings'; import { eventIdSchema, roomIdSchema } from '@rocket.chat/federation-sdk'; import type { @@ -172,7 +172,7 @@ async function joinRoom({ await room.joinUser(inviteEvent.roomId, inviteEvent.event.state_key); // now we create the room we saved post joining - const matrixRoom = await state.getFullRoomState2(inviteEvent.roomId); + const matrixRoom = await state.getLatestRoomState2(inviteEvent.roomId); if (!matrixRoom) { throw new Error('room not found not processing invite'); } @@ -265,6 +265,11 @@ async function joinRoom({ } await Room.addUserToRoom(internalRoomId, { _id: user._id }, { _id: senderUserId, username: inviteEvent.sender }); + + for await (const event of matrixRoom.getMemberJoinEvents()) { + console.log('emitting another join', event.toStrippedJson()); + await FederationMatrix.emitJoin(event); + } } async function startJoiningRoom(...opts: Parameters) { diff --git a/packages/core-services/src/types/IFederationMatrixService.ts b/packages/core-services/src/types/IFederationMatrixService.ts index 301ab85e94bea..b7ea1f8227fb4 100644 --- a/packages/core-services/src/types/IFederationMatrixService.ts +++ b/packages/core-services/src/types/IFederationMatrixService.ts @@ -23,4 +23,5 @@ export interface IFederationMatrixService { inviteUsersToRoom(room: IRoomFederated, usersUserName: string[], inviter: IUser): Promise; notifyUserTyping(rid: string, user: string, isTyping: boolean): Promise; verifyMatrixIds(matrixIds: string[]): Promise<{ [key: string]: string }>; + emitJoin(membershipEvent: any): Promise; } From 7c07dcbe24541a852cd24f8889bc256a864e6a10 Mon Sep 17 00:00:00 2001 From: Guilherme Gazzo Date: Tue, 7 Oct 2025 11:21:19 -0300 Subject: [PATCH 2/2] chore(federation-sdk): update @rocket.chat/federation-sdk to version 0.1.17 in package.json and yarn.lock --- ee/packages/federation-matrix/package.json | 2 +- ee/packages/federation-matrix/src/FederationMatrix.ts | 4 +--- yarn.lock | 10 +++++----- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/ee/packages/federation-matrix/package.json b/ee/packages/federation-matrix/package.json index b596248afbe91..469a06b926950 100644 --- a/ee/packages/federation-matrix/package.json +++ b/ee/packages/federation-matrix/package.json @@ -38,7 +38,7 @@ "@rocket.chat/core-services": "workspace:^", "@rocket.chat/core-typings": "workspace:^", "@rocket.chat/emitter": "^0.31.25", - "@rocket.chat/federation-sdk": "0.1.16", + "@rocket.chat/federation-sdk": "0.1.17", "@rocket.chat/http-router": "workspace:^", "@rocket.chat/license": "workspace:^", "@rocket.chat/models": "workspace:^", diff --git a/ee/packages/federation-matrix/src/FederationMatrix.ts b/ee/packages/federation-matrix/src/FederationMatrix.ts index 320a541ae4654..514132a6be154 100644 --- a/ee/packages/federation-matrix/src/FederationMatrix.ts +++ b/ee/packages/federation-matrix/src/FederationMatrix.ts @@ -986,13 +986,11 @@ export class FederationMatrix extends ServiceClass implements IFederationMatrixS return; } - console.log('join emitting'); - this.homeserverServices.emitter.emit('homeserver.matrix.membership', { event_id: membershipEvent.eventId, event: membershipEvent.event, room_id: membershipEvent.roomId, - state_key: membershipEvent.stateKey as UserID, + state_key: membershipEvent.stateKey, content: { membership: 'join' }, sender: membershipEvent.sender, origin_server_ts: Date.now(), diff --git a/yarn.lock b/yarn.lock index 9aed4a2154b51..b771f9f5f4678 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7534,7 +7534,7 @@ __metadata: "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/emitter": "npm:^0.31.25" "@rocket.chat/eslint-config": "workspace:^" - "@rocket.chat/federation-sdk": "npm:0.1.16" + "@rocket.chat/federation-sdk": "npm:0.1.17" "@rocket.chat/http-router": "workspace:^" "@rocket.chat/license": "workspace:^" "@rocket.chat/models": "workspace:^" @@ -7560,9 +7560,9 @@ __metadata: languageName: unknown linkType: soft -"@rocket.chat/federation-sdk@npm:0.1.16": - version: 0.1.16 - resolution: "@rocket.chat/federation-sdk@npm:0.1.16" +"@rocket.chat/federation-sdk@npm:0.1.17": + version: 0.1.17 + resolution: "@rocket.chat/federation-sdk@npm:0.1.17" dependencies: "@datastructures-js/priority-queue": "npm:^6.3.3" "@noble/ed25519": "npm:^3.0.0" @@ -7575,7 +7575,7 @@ __metadata: zod: "npm:^3.22.4" peerDependencies: typescript: ~5.9.2 - checksum: 10/88edcce215b91956237c896ce0b5d00fea5aba9c8ebe314cb63f26c8677cde8e9c9c4ad72a0e7ce6ea5be40c2b7d1bbdfae295289acfe7cf242e23a7f0583f63 + checksum: 10/4b83071913a84c275c2b49c55e9993a12812d3ba9945cba9d6c3f2b3bcba4ae5a868de6379853f9c49e93a6dc22f5bb5023fa50245e94b1e0a2a0a003558ef0a languageName: node linkType: hard