From bc1f18a25f9fe48eb3158b38bf1c2050d7ab1bbf Mon Sep 17 00:00:00 2001 From: Guilherme Gazzo Date: Thu, 12 May 2022 17:16:51 -0300 Subject: [PATCH 1/2] just load if enabled --- apps/meteor/app/federation-v2/server/bridge.ts | 13 +++++++------ .../app/federation-v2/server/matrix-client/user.ts | 2 +- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/apps/meteor/app/federation-v2/server/bridge.ts b/apps/meteor/app/federation-v2/server/bridge.ts index 21457fc56101..dc7a7ae48afe 100644 --- a/apps/meteor/app/federation-v2/server/bridge.ts +++ b/apps/meteor/app/federation-v2/server/bridge.ts @@ -1,8 +1,8 @@ -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 type { IMatrixEvent } from './definitions/IMatrixEvent'; +import type { MatrixEventType } from './definitions/MatrixEventType'; import { addToQueue } from './queue'; import { getRegistrationInfo } from './config'; @@ -15,7 +15,7 @@ class Bridge { try { await this.stop(); } finally { - this.createInstance(); + await this.createInstance(); if (!this.isRunning) { await this.bridgeInstance.run(this.getBridgePort()); this.isRunning = true; @@ -28,7 +28,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 +36,8 @@ class Bridge { return this.bridgeInstance; } - private createInstance(): void { + private async createInstance(): Promise { + 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'; From f5e1c820b34d74db5e3bc1de193eab98492bc149 Mon Sep 17 00:00:00 2001 From: Aaron Ogle Date: Wed, 18 May 2022 15:11:23 -0500 Subject: [PATCH 2/2] Catch a failed load attempt and disable setting --- apps/meteor/app/federation-v2/server/bridge.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/apps/meteor/app/federation-v2/server/bridge.ts b/apps/meteor/app/federation-v2/server/bridge.ts index dc7a7ae48afe..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 type { Bridge as MatrixBridge } from '@rocket.chat/forked-matrix-appservice-bridge'; import { settings } from '../../settings/server'; +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 { 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); } } @@ -37,7 +44,11 @@ class Bridge { } 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'),