Skip to content

Commit fddb5b3

Browse files
committed
remove some federation code spread all around
1 parent 86e9b42 commit fddb5b3

File tree

3 files changed

+27
-38
lines changed

3 files changed

+27
-38
lines changed

apps/meteor/app/lib/server/functions/createRoom.ts

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ export const createRoom = async <T extends RoomType>(
156156
rid: string;
157157
}
158158
> => {
159-
const { teamId, ...optionalExtraData } = roomExtraData || ({} as IRoom);
159+
const { teamId, ...extraData } = roomExtraData || ({} as IRoom);
160160

161161
// TODO: use a shared helper to check whether a user is federated
162162
const hasFederatedMembers = members.some((member) => {
@@ -167,23 +167,12 @@ export const createRoom = async <T extends RoomType>(
167167
});
168168

169169
// Prevent adding federated users to rooms that are not marked as federated explicitly
170-
if (hasFederatedMembers && optionalExtraData.federated !== true) {
170+
if (hasFederatedMembers && extraData.federated !== true) {
171171
throw new Meteor.Error('error-federated-users-in-non-federated-rooms', 'Cannot add federated users to non-federated rooms', {
172172
method: 'createRoom',
173173
});
174174
}
175175

176-
const extraData = {
177-
...optionalExtraData,
178-
...((hasFederatedMembers || optionalExtraData.federated) && {
179-
federated: true,
180-
federation: {
181-
version: 1,
182-
// TODO we should be able to provide all values from here, currently we update on callback afterCreateRoom
183-
},
184-
}),
185-
};
186-
187176
await prepareCreateRoomCallback.run({
188177
type,
189178
// name,

apps/meteor/ee/server/hooks/federation/index.ts

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -252,17 +252,30 @@ callbacks.add(
252252
'federation-matrix-before-create-direct-room',
253253
);
254254

255+
callbacks.add('federation.beforeCreateDirectMessage', async (roomUsers) => {
256+
// TODO: use a shared helper to check whether a user is federated
257+
// since the DM creation API doesn't tell us if the room is federated (unlike normal channels),
258+
// we're currently inferring it: if any participant has a Matrix-style ID (@user:server), we treat the DM as federated
259+
const hasFederatedMembers = roomUsers.some((user: unknown) => typeof user === 'string' && user.includes(':') && user.includes('@'));
260+
261+
if (hasFederatedMembers) {
262+
return {
263+
federated: true,
264+
federation: {
265+
version: 1,
266+
},
267+
};
268+
}
269+
});
270+
255271
callbacks.add(
256272
'afterCreateDirectRoom',
257-
async (room: IRoom, params: { members: IUser[]; creatorId: IUser['_id']; mrid?: string }): Promise<void> => {
258-
if (params.mrid) {
259-
await Rooms.setAsFederated(room._id, {
260-
mrid: params.mrid,
261-
origin: params.mrid.split(':').pop()!,
262-
});
273+
async (room: IRoom, params: { members: IUser[]; creatorId: IUser['_id'] }): Promise<void> => {
274+
if (!FederationActions.shouldPerformFederationAction(room)) {
263275
return;
264276
}
265-
if (FederationActions.shouldPerformFederationAction(room)) {
277+
278+
if (!room.federation.mrid) {
266279
await FederationMatrix.createDirectMessageRoom(room, params.members, params.creatorId);
267280
}
268281
},

apps/meteor/server/methods/createDirectMessage.ts

Lines changed: 5 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,6 @@ export async function createDirectMessage(
4343
const options: Exclude<ICreateRoomParams['options'], undefined> = { creator: me._id };
4444
const roomUsers = excludeSelf ? users : [me, ...users];
4545

46-
// TODO: use a shared helper to check whether a user is federated
47-
// since the DM creation API doesn't tell us if the room is federated (unlike normal channels),
48-
// we're currently inferring it: if any participant has a Matrix-style ID (@user:server), we treat the DM as federated
49-
const hasFederatedMembers = roomUsers.some((user) => typeof user === 'string' && user.includes(':') && user.includes('@'));
50-
5146
// allow self-DMs
5247
if (roomUsers.length === 1 && roomUsers[0] !== undefined && typeof roomUsers[0] !== 'string' && roomUsers[0]._id !== me._id) {
5348
throw new Meteor.Error('error-invalid-user', 'Invalid user', {
@@ -78,27 +73,19 @@ export async function createDirectMessage(
7873
if (excludeSelf && (await hasPermissionAsync(userId, 'view-room-administration'))) {
7974
options.subscriptionExtra = { open: true };
8075
}
76+
77+
let extraData = {};
78+
8179
try {
82-
await callbacks.run('federation.beforeCreateDirectMessage', roomUsers);
80+
extraData = await callbacks.run('federation.beforeCreateDirectMessage', roomUsers);
8381
} catch (error) {
8482
throw new Meteor.Error((error as any)?.message);
8583
}
8684
const {
8785
_id: rid,
8886
inserted,
8987
...room
90-
} = await createRoom<'d'>(
91-
'd',
92-
undefined,
93-
undefined,
94-
roomUsers as IUser[],
95-
false,
96-
undefined,
97-
{
98-
...(hasFederatedMembers && { federated: true }),
99-
},
100-
options,
101-
);
88+
} = await createRoom<'d'>('d', undefined, undefined, roomUsers as IUser[], false, undefined, extraData, options);
10289

10390
return {
10491
// @ts-expect-error - room type is already defined in the `createRoom` return type

0 commit comments

Comments
 (0)