Skip to content

Commit e748342

Browse files
debdutdebggazzo
andcommitted
fix: process joins from full state (#37156)
Co-authored-by: Guilherme Gazzo <[email protected]>
1 parent c88a4b4 commit e748342

File tree

6 files changed

+120
-511
lines changed

6 files changed

+120
-511
lines changed

ee/packages/federation-matrix/package.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
"@babel/preset-env": "~7.26.0",
99
"@babel/preset-typescript": "~7.26.0",
1010
"@rocket.chat/eslint-config": "workspace:^",
11+
"@rocket.chat/federation-sdk": "0.1.19",
1112
"@types/emojione": "^2.2.9",
1213
"@types/node": "~22.14.0",
1314
"@types/sanitize-html": "^2",
@@ -38,7 +39,6 @@
3839
"@rocket.chat/core-services": "workspace:^",
3940
"@rocket.chat/core-typings": "workspace:^",
4041
"@rocket.chat/emitter": "^0.31.25",
41-
"@rocket.chat/federation-sdk": "0.1.16",
4242
"@rocket.chat/http-router": "workspace:^",
4343
"@rocket.chat/license": "workspace:^",
4444
"@rocket.chat/models": "workspace:^",
@@ -53,5 +53,8 @@
5353
"sanitize-html": "^2.17.0",
5454
"tsyringe": "^4.10.0",
5555
"tweetnacl": "^1.0.3"
56+
},
57+
"peerDependencies": {
58+
"@rocket.chat/federation-sdk": "*"
5659
}
5760
}

ee/packages/federation-matrix/src/FederationMatrix.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {
99
} from '@rocket.chat/core-typings';
1010
import type { MessageQuoteAttachment, IMessage, IRoom, IUser, IRoomNativeFederated } from '@rocket.chat/core-typings';
1111
import { eventIdSchema, getAllServices, roomIdSchema, userIdSchema } from '@rocket.chat/federation-sdk';
12-
import type { EventID, UserID, HomeserverServices, FileMessageType, PresenceState } from '@rocket.chat/federation-sdk';
12+
import type { EventID, UserID, HomeserverServices, FileMessageType, PresenceState, PduForType } from '@rocket.chat/federation-sdk';
1313
import { Logger } from '@rocket.chat/logger';
1414
import { Users, Subscriptions, Messages, Rooms, Settings } from '@rocket.chat/models';
1515
import emojione from 'emojione';
@@ -971,4 +971,21 @@ export class FederationMatrix extends ServiceClass implements IFederationMatrixS
971971

972972
return results;
973973
}
974+
975+
async emitJoin(membershipEvent: PduForType<'m.room.member'>, eventId: EventID) {
976+
if (!this.homeserverServices) {
977+
this.logger.warn('Homeserver services not available, skipping user role room scoped');
978+
return;
979+
}
980+
981+
this.homeserverServices.emitter.emit('homeserver.matrix.membership', {
982+
event_id: eventId,
983+
event: membershipEvent,
984+
room_id: membershipEvent.room_id,
985+
state_key: membershipEvent.state_key,
986+
content: { membership: 'join' },
987+
sender: membershipEvent.sender,
988+
origin_server_ts: Date.now(),
989+
});
990+
}
974991
}

ee/packages/federation-matrix/src/api/_matrix/invite.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Room } from '@rocket.chat/core-services';
1+
import { FederationMatrix, Room } from '@rocket.chat/core-services';
22
import { isUserNativeFederated, type IUser } from '@rocket.chat/core-typings';
33
import { eventIdSchema, roomIdSchema } from '@rocket.chat/federation-sdk';
44
import type {
@@ -172,7 +172,7 @@ async function joinRoom({
172172
await room.joinUser(inviteEvent.roomId, inviteEvent.event.state_key);
173173

174174
// now we create the room we saved post joining
175-
const matrixRoom = await state.getFullRoomState2(inviteEvent.roomId);
175+
const matrixRoom = await state.getLatestRoomState2(inviteEvent.roomId);
176176
if (!matrixRoom) {
177177
throw new Error('room not found not processing invite');
178178
}
@@ -265,6 +265,10 @@ async function joinRoom({
265265
}
266266

267267
await Room.addUserToRoom(internalRoomId, { _id: user._id }, { _id: senderUserId, username: inviteEvent.sender });
268+
269+
for await (const event of matrixRoom.getMemberJoinEvents()) {
270+
await FederationMatrix.emitJoin(event.event, event.eventId);
271+
}
268272
}
269273

270274
async function startJoiningRoom(...opts: Parameters<typeof joinRoom>) {

packages/core-services/package.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
"@babel/preset-typescript": "~7.26.0",
99
"@rocket.chat/apps-engine": "workspace:^",
1010
"@rocket.chat/eslint-config": "workspace:^",
11+
"@rocket.chat/federation-sdk": "0.1.19",
1112
"@rocket.chat/jest-presets": "workspace:~",
1213
"@rocket.chat/tsconfig": "workspace:*",
1314
"@types/jest": "~30.0.0",
@@ -43,5 +44,8 @@
4344
"@rocket.chat/rest-typings": "workspace:^",
4445
"@rocket.chat/tracing": "workspace:^",
4546
"@rocket.chat/ui-kit": "workspace:~"
47+
},
48+
"peerDependencies": {
49+
"@rocket.chat/federation-sdk": "*"
4650
}
4751
}

packages/core-services/src/types/IFederationMatrixService.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type { IMessage, IRoomFederated, IRoomNativeFederated, IUser } from '@rocket.chat/core-typings';
2+
import type { EventID, PduForType } from '@rocket.chat/federation-sdk';
23

34
export interface IFederationMatrixService {
45
createRoom(room: IRoomFederated, owner: IUser, members: string[]): Promise<{ room_id: string; event_id: string }>;
@@ -23,4 +24,5 @@ export interface IFederationMatrixService {
2324
inviteUsersToRoom(room: IRoomFederated, usersUserName: string[], inviter: IUser): Promise<void>;
2425
notifyUserTyping(rid: string, user: string, isTyping: boolean): Promise<void>;
2526
verifyMatrixIds(matrixIds: string[]): Promise<{ [key: string]: string }>;
27+
emitJoin(membershipEvent: PduForType<'m.room.member'>, eventId: EventID): Promise<void>;
2628
}

0 commit comments

Comments
 (0)