diff --git a/apps/meteor/app/federation-v2/server/bridge.ts b/apps/meteor/app/federation-v2/server/bridge.ts index 21457fc56101..289f7e9033d4 100644 --- a/apps/meteor/app/federation-v2/server/bridge.ts +++ b/apps/meteor/app/federation-v2/server/bridge.ts @@ -1,10 +1,12 @@ -import { Bridge as MatrixBridge, AppServiceRegistration } from '@rocket.chat/forked-matrix-appservice-bridge'; +import type { Bridge as MatrixBridge } from '@rocket.chat/forked-matrix-appservice-bridge'; import { settings } from '../../settings/server'; -import { IMatrixEvent } from './definitions/IMatrixEvent'; -import { MatrixEventType } from './definitions/MatrixEventType'; +import { Settings } from '../../models/server/raw'; +import type { IMatrixEvent } from './definitions/IMatrixEvent'; +import type { MatrixEventType } from './definitions/MatrixEventType'; import { addToQueue } from './queue'; import { getRegistrationInfo } from './config'; +import { bridgeLogger } from './logger'; class Bridge { private bridgeInstance: MatrixBridge; @@ -14,12 +16,17 @@ class Bridge { public async start(): Promise { try { await this.stop(); - } finally { - this.createInstance(); + await this.createInstance(); + if (!this.isRunning) { await this.bridgeInstance.run(this.getBridgePort()); this.isRunning = true; } + } catch (e) { + bridgeLogger.error('Failed to initialize the matrix-appservice-bridge.', e); + + bridgeLogger.error('Disabling Matrix Bridge. Please resolve error and try again'); + Settings.updateValueById('Federation_Matrix_enabled', false); } } @@ -28,7 +35,7 @@ class Bridge { return; } // the http server can take some minutes to shutdown and this promise to be resolved - await this.bridgeInstance.close(); + await this.bridgeInstance?.close(); this.isRunning = false; } @@ -36,7 +43,12 @@ class Bridge { return this.bridgeInstance; } - private createInstance(): void { + private async createInstance(): Promise { + bridgeLogger.info('Performing Dynamic Import of matrix-appservice-bridge'); + + // Dynamic import to prevent Rocket.Chat from loading the module until needed and then handle if that fails + const { Bridge: MatrixBridge, AppServiceRegistration } = await import('@rocket.chat/forked-matrix-appservice-bridge'); + this.bridgeInstance = new MatrixBridge({ homeserverUrl: settings.get('Federation_Matrix_homeserver_url'), domain: settings.get('Federation_Matrix_homeserver_domain'), diff --git a/apps/meteor/app/federation-v2/server/matrix-client/user.ts b/apps/meteor/app/federation-v2/server/matrix-client/user.ts index 01a9174baba9..28a5d5a4a318 100644 --- a/apps/meteor/app/federation-v2/server/matrix-client/user.ts +++ b/apps/meteor/app/federation-v2/server/matrix-client/user.ts @@ -1,4 +1,4 @@ -import { MatrixProfileInfo } from '@rocket.chat/forked-matrix-bot-sdk'; +import type { MatrixProfileInfo } from '@rocket.chat/forked-matrix-bot-sdk'; import { IUser } from '@rocket.chat/core-typings'; import { matrixBridge } from '../bridge';