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 de25857365c44..514132a6be154 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,21 @@ 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; + } + + this.homeserverServices.emitter.emit('homeserver.matrix.membership', { + event_id: membershipEvent.eventId, + event: membershipEvent.event, + room_id: membershipEvent.roomId, + state_key: membershipEvent.stateKey, + 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; } 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