Skip to content

Commit 02943fe

Browse files
sampaiodiegoricardogarim
authored andcommitted
regression(native-federation): fix not working with micro services (#37110)
1 parent e377c53 commit 02943fe

File tree

19 files changed

+233
-549
lines changed

19 files changed

+233
-549
lines changed

apps/meteor/ee/server/api/federation.ts

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
1-
import type { IFederationMatrixService } from '@rocket.chat/core-services';
1+
import { FederationMatrix } from '@rocket.chat/core-services';
2+
import { getFederationRoutes } from '@rocket.chat/federation-matrix';
23
import { Logger } from '@rocket.chat/logger';
34
import { ajv } from '@rocket.chat/rest-typings';
45
import type express from 'express';
56
import { WebApp } from 'meteor/webapp';
67

78
import { API } from '../../../app/api/server';
8-
import { isRunningMs } from '../../../server/lib/isRunningMs';
99

1010
const logger = new Logger('FederationRoutes');
1111

12-
let federationService: IFederationMatrixService | undefined;
1312
API.v1.get(
1413
'/federation/matrixIds.verify',
1514
{
@@ -35,28 +34,19 @@ API.v1.get(
3534
},
3635
async function () {
3736
const { matrixIds } = this.queryParams;
38-
if (!federationService) {
39-
throw new Error('Federation service not registered');
40-
}
4137
return API.v1.success({
42-
results: await federationService.verifyMatrixIds(matrixIds),
38+
results: await FederationMatrix.verifyMatrixIds(matrixIds),
4339
});
4440
},
4541
);
4642

47-
export async function registerFederationRoutes(f: IFederationMatrixService): Promise<void> {
48-
federationService = f;
49-
if (isRunningMs()) {
50-
return;
51-
}
52-
43+
export async function registerFederationRoutes(): Promise<void> {
5344
try {
54-
const routes = federationService.getAllRoutes();
55-
(WebApp.rawConnectHandlers as unknown as ReturnType<typeof express>).use(routes.matrix.router).use(routes.wellKnown.router);
45+
const routes = getFederationRoutes();
5646

57-
logger.log('[Federation] Registered federation routes');
47+
(WebApp.rawConnectHandlers as unknown as ReturnType<typeof express>).use(routes.matrix.router).use(routes.wellKnown.router);
5848
} catch (error) {
59-
logger.error('[Federation] Failed to register routes:', error);
49+
logger.error({ msg: '[Federation] Failed to register routes:', err: error });
6050
throw error;
6151
}
6252
}
Lines changed: 12 additions & 112 deletions
Original file line numberDiff line numberDiff line change
@@ -1,135 +1,35 @@
1-
import { api } from '@rocket.chat/core-services';
2-
import { FederationMatrix } from '@rocket.chat/federation-matrix';
1+
import { api, FederationMatrix as FederationMatrixService } from '@rocket.chat/core-services';
2+
import { FederationMatrix, setupFederationMatrix } from '@rocket.chat/federation-matrix';
33
import { InstanceStatus } from '@rocket.chat/instance-status';
4-
import { License } from '@rocket.chat/license';
54
import { Logger } from '@rocket.chat/logger';
65

7-
import { settings } from '../../../app/settings/server';
86
import { StreamerCentral } from '../../../server/modules/streamer/streamer.module';
97
import { registerFederationRoutes } from '../api/federation';
108

119
const logger = new Logger('Federation');
1210

13-
// TODO: should validate if the domain is resolving to us or not correctly
14-
// should use homeserver.getFinalSomethingSomething and validate final Host header to have siteUrl
15-
// this is a minimum sanity check to avoid full urls instead of the expected domain part
16-
function validateDomain(domain: string): boolean {
17-
const value = domain.trim();
18-
19-
if (!value) {
20-
logger.error('The Federation domain is not set');
21-
return false;
22-
}
23-
24-
if (value.toLowerCase() !== value) {
25-
logger.error(`The Federation domain "${value}" cannot have uppercase letters`);
26-
return false;
27-
}
28-
11+
export const startFederationService = async (): Promise<void> => {
2912
try {
30-
const valid = new URL(`https://${value}`).hostname === value;
31-
32-
if (!valid) {
33-
throw new Error();
34-
}
35-
} catch {
36-
logger.error(`The configured Federation domain "${value}" is not valid`);
37-
return false;
38-
}
39-
40-
return true;
41-
}
13+
const isEnabled = await setupFederationMatrix(InstanceStatus.id());
4214

43-
export const startFederationService = async (): Promise<void> => {
44-
let federationMatrixService: FederationMatrix | undefined;
15+
api.registerService(new FederationMatrix());
4516

46-
const shouldStartService = (): boolean => {
47-
const hasLicense = License.hasModule('federation');
48-
const isEnabled = settings.get('Federation_Service_Enabled') === true;
49-
const domain = settings.get<string>('Federation_Service_Domain');
50-
const hasDomain = validateDomain(domain);
51-
return hasLicense && isEnabled && hasDomain;
52-
};
17+
await registerFederationRoutes();
5318

54-
const startService = async (): Promise<void> => {
55-
if (federationMatrixService) {
56-
logger.debug('Federation-matrix service already started... skipping');
19+
// only registers the typing listener if the service is enabled
20+
if (!isEnabled) {
5721
return;
5822
}
5923

60-
logger.debug('Starting federation-matrix service');
61-
federationMatrixService = await FederationMatrix.create(InstanceStatus.id());
62-
24+
// TODO move to service/setup?
6325
StreamerCentral.on('broadcast', (name, eventName, args) => {
64-
if (!federationMatrixService) {
65-
return;
66-
}
6726
if (name === 'notify-room' && eventName.endsWith('user-activity')) {
6827
const [rid] = eventName.split('/');
6928
const [user, activity] = args;
70-
void federationMatrixService.notifyUserTyping(rid, user, activity.includes('user-typing'));
29+
void FederationMatrixService.notifyUserTyping(rid, user, activity.includes('user-typing'));
7130
}
7231
});
73-
74-
try {
75-
api.registerService(federationMatrixService);
76-
await registerFederationRoutes(federationMatrixService);
77-
} catch (error) {
78-
logger.error('Failed to start federation-matrix service:', error);
79-
}
80-
};
81-
82-
const stopService = async (): Promise<void> => {
83-
if (!federationMatrixService) {
84-
logger.debug('Federation-matrix service not registered... skipping');
85-
return;
86-
}
87-
88-
logger.debug('Stopping federation-matrix service');
89-
90-
// TODO: Unregister routes
91-
// await unregisterFederationRoutes(federationMatrixService);
92-
93-
await api.destroyService(federationMatrixService);
94-
federationMatrixService = undefined;
95-
};
96-
97-
if (shouldStartService()) {
98-
await startService();
32+
} catch (error) {
33+
logger.error('Failed to start federation-matrix service:', error);
9934
}
100-
101-
void License.onLicense('federation', async () => {
102-
logger.debug('Federation license became available');
103-
if (shouldStartService()) {
104-
await startService();
105-
}
106-
});
107-
108-
License.onInvalidateLicense(async () => {
109-
logger.debug('License invalidated, checking federation module');
110-
if (!shouldStartService()) {
111-
await stopService();
112-
}
113-
});
114-
115-
settings.watch('Federation_Service_Enabled', async (enabled) => {
116-
logger.debug('Federation_Service_Enabled setting changed:', enabled);
117-
if (shouldStartService()) {
118-
await startService();
119-
} else {
120-
await stopService();
121-
}
122-
});
123-
124-
settings.watch<string>('Federation_Service_Domain', async (domain) => {
125-
logger.debug('Federation_Service_Domain setting changed:', domain);
126-
if (shouldStartService()) {
127-
if (domain.toLowerCase() !== federationMatrixService?.getServerName().toLowerCase()) {
128-
await stopService();
129-
}
130-
await startService();
131-
} else {
132-
await stopService();
133-
}
134-
});
13535
};

apps/meteor/package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,6 @@
255255
"@rocket.chat/emitter": "~0.31.25",
256256
"@rocket.chat/favicon": "workspace:^",
257257
"@rocket.chat/federation-matrix": "workspace:^",
258-
"@rocket.chat/federation-service": "workspace:^",
259258
"@rocket.chat/freeswitch": "workspace:^",
260259
"@rocket.chat/fuselage": "^0.66.4",
261260
"@rocket.chat/fuselage-forms": "^0.1.0",

ee/apps/federation-service/.eslintrc.json

Lines changed: 0 additions & 4 deletions
This file was deleted.

ee/apps/federation-service/CHANGELOG.md

Lines changed: 0 additions & 33 deletions
This file was deleted.

ee/apps/federation-service/package.json

Lines changed: 0 additions & 53 deletions
This file was deleted.

ee/apps/federation-service/src/config.ts

Lines changed: 0 additions & 3 deletions
This file was deleted.

ee/apps/federation-service/src/service.ts

Lines changed: 0 additions & 71 deletions
This file was deleted.

ee/apps/federation-service/tsconfig.json

Lines changed: 0 additions & 19 deletions
This file was deleted.

0 commit comments

Comments
 (0)