Skip to content

Commit 63995a1

Browse files
authored
chore: allow federation setting changes without requiring a restart (#37357)
1 parent bbc4eb8 commit 63995a1

File tree

28 files changed

+308
-439
lines changed

28 files changed

+308
-439
lines changed
Lines changed: 58 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,75 @@
11
import { api, FederationMatrix as FederationMatrixService } from '@rocket.chat/core-services';
2-
import { FederationMatrix, setupFederationMatrix } from '@rocket.chat/federation-matrix';
2+
import { FederationMatrix, configureFederationMatrixSettings, setupFederationMatrix } from '@rocket.chat/federation-matrix';
33
import { InstanceStatus } from '@rocket.chat/instance-status';
4+
import { License } from '@rocket.chat/license';
45
import { Logger } from '@rocket.chat/logger';
56

7+
import { settings } from '../../../app/settings/server';
68
import { StreamerCentral } from '../../../server/modules/streamer/streamer.module';
79
import { registerFederationRoutes } from '../api/federation';
810

911
const logger = new Logger('Federation');
1012

11-
export const startFederationService = async (): Promise<void> => {
13+
let serviceEnabled = false;
14+
15+
const configureFederation = async () => {
16+
// only registers the typing listener if the service is enabled
17+
serviceEnabled = (await License.hasModule('federation')) && settings.get('Federation_Service_Enabled');
18+
if (!serviceEnabled) {
19+
return;
20+
}
21+
1222
try {
13-
const isEnabled = await setupFederationMatrix(InstanceStatus.id());
23+
configureFederationMatrixSettings({
24+
instanceId: InstanceStatus.id(),
25+
domain: settings.get('Federation_Service_Domain'),
26+
signingKey: settings.get('Federation_Service_Matrix_Signing_Key'),
27+
signingAlgorithm: settings.get('Federation_Service_Matrix_Signing_Algorithm'),
28+
signingVersion: settings.get('Federation_Service_Matrix_Signing_Version'),
29+
allowedEncryptedRooms: settings.get('Federation_Service_Join_Encrypted_Rooms'),
30+
allowedNonPrivateRooms: settings.get('Federation_Service_Join_Non_Private_Rooms'),
31+
processEDUTyping: settings.get('Federation_Service_EDU_Process_Typing'),
32+
processEDUPresence: settings.get('Federation_Service_EDU_Process_Presence'),
33+
});
34+
} catch (error) {
35+
logger.error('Failed to start federation-matrix service:', error);
36+
}
37+
};
1438

15-
api.registerService(new FederationMatrix());
39+
export const startFederationService = async (): Promise<void> => {
40+
api.registerService(new FederationMatrix());
1641

17-
await registerFederationRoutes();
42+
await registerFederationRoutes();
1843

19-
// only registers the typing listener if the service is enabled
20-
if (!isEnabled) {
44+
// TODO move to service/setup?
45+
StreamerCentral.on('broadcast', (name, eventName, args) => {
46+
if (!serviceEnabled) {
2147
return;
2248
}
2349

24-
// TODO move to service/setup?
25-
StreamerCentral.on('broadcast', (name, eventName, args) => {
26-
if (name === 'notify-room' && eventName.endsWith('user-activity')) {
27-
const [rid] = eventName.split('/');
28-
const [user, activity] = args;
29-
void FederationMatrixService.notifyUserTyping(rid, user, activity.includes('user-typing'));
30-
}
31-
});
32-
} catch (error) {
33-
logger.error('Failed to start federation-matrix service:', error);
34-
}
50+
if (name === 'notify-room' && eventName.endsWith('user-activity')) {
51+
const [rid] = eventName.split('/');
52+
const [user, activity] = args;
53+
void FederationMatrixService.notifyUserTyping(rid, user, activity.includes('user-typing'));
54+
}
55+
});
56+
57+
await setupFederationMatrix();
58+
59+
settings.watchMultiple(
60+
[
61+
'Federation_Service_Enabled',
62+
'Federation_Service_Domain',
63+
'Federation_Service_EDU_Process_Typing',
64+
'Federation_Service_EDU_Process_Presence',
65+
'Federation_Service_Matrix_Signing_Key',
66+
'Federation_Service_Matrix_Signing_Algorithm',
67+
'Federation_Service_Matrix_Signing_Version',
68+
'Federation_Service_Join_Encrypted_Rooms',
69+
'Federation_Service_Join_Non_Private_Rooms',
70+
],
71+
async () => {
72+
await configureFederation();
73+
},
74+
);
3575
};

apps/meteor/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@
252252
"@rocket.chat/emitter": "~0.31.25",
253253
"@rocket.chat/favicon": "workspace:^",
254254
"@rocket.chat/federation-matrix": "workspace:^",
255-
"@rocket.chat/federation-sdk": "0.2.0",
255+
"@rocket.chat/federation-sdk": "0.3.0",
256256
"@rocket.chat/freeswitch": "workspace:^",
257257
"@rocket.chat/fuselage": "~0.66.4",
258258
"@rocket.chat/fuselage-forms": "~0.1.0",

ee/packages/federation-matrix/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
"@rocket.chat/core-services": "workspace:^",
3939
"@rocket.chat/core-typings": "workspace:^",
4040
"@rocket.chat/emitter": "^0.31.25",
41-
"@rocket.chat/federation-sdk": "0.2.0",
41+
"@rocket.chat/federation-sdk": "0.3.0",
4242
"@rocket.chat/http-router": "workspace:^",
4343
"@rocket.chat/license": "workspace:^",
4444
"@rocket.chat/models": "workspace:^",
@@ -47,7 +47,7 @@
4747
"emojione": "^4.5.0",
4848
"marked": "^16.1.2",
4949
"mongodb": "6.16.0",
50-
"pino": "^9.11.0",
50+
"pino": "^8.21.0",
5151
"reflect-metadata": "^0.2.2",
5252
"sanitize-html": "~2.17.0",
5353
"tsyringe": "^4.10.0",

0 commit comments

Comments
 (0)