diff --git a/.changeset/chilled-seas-refuse.md b/.changeset/chilled-seas-refuse.md new file mode 100644 index 000000000000..d4066938513d --- /dev/null +++ b/.changeset/chilled-seas-refuse.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/apps-engine': patch +--- + +Fixes the subprocess restarting routine failing to correctly restart apps in some cases diff --git a/packages/apps-engine/src/server/AppManager.ts b/packages/apps-engine/src/server/AppManager.ts index aac30d865015..0a6c4de03214 100644 --- a/packages/apps-engine/src/server/AppManager.ts +++ b/packages/apps-engine/src/server/AppManager.ts @@ -1033,6 +1033,10 @@ export class AppManager { result = false; await app.setStatus(status, silenceStatus); + + // If some error has happened in initialization, like license or installations invalidation + // we need to store this on the DB regardless of what the parameter requests + saveToDb = true; } if (saveToDb) { @@ -1111,6 +1115,10 @@ export class AppManager { } console.error(e); + + // If some error has happened during enabling, like license or installations invalidation + // we need to store this on the DB regardless of what the parameter requests + saveToDb = true; } if (enable) { diff --git a/packages/apps-engine/src/server/runtime/deno/AppsEngineDenoRuntime.ts b/packages/apps-engine/src/server/runtime/deno/AppsEngineDenoRuntime.ts index da23fc82a0e2..61e1fdf3ec4c 100644 --- a/packages/apps-engine/src/server/runtime/deno/AppsEngineDenoRuntime.ts +++ b/packages/apps-engine/src/server/runtime/deno/AppsEngineDenoRuntime.ts @@ -5,7 +5,11 @@ import { type Readable, EventEmitter } from 'stream'; import debugFactory from 'debug'; import * as jsonrpc from 'jsonrpc-lite'; -import { AppStatus } from '../../../definition/AppStatus'; +import { LivenessManager } from './LivenessManager'; +import { ProcessMessenger } from './ProcessMessenger'; +import { bundleLegacyApp } from './bundler'; +import { decoder } from './codec'; +import { AppStatus, AppStatusUtils } from '../../../definition/AppStatus'; import type { AppMethod } from '../../../definition/metadata'; import type { AppManager } from '../../AppManager'; import type { AppBridges } from '../../bridges'; @@ -13,10 +17,6 @@ import type { IParseAppPackageResult } from '../../compiler'; import { AppConsole, type ILoggerStorageEntry } from '../../logging'; import type { AppAccessorManager, AppApiManager } from '../../managers'; import type { AppLogStorage, IAppStorageItem } from '../../storage'; -import { LivenessManager } from './LivenessManager'; -import { ProcessMessenger } from './ProcessMessenger'; -import { bundleLegacyApp } from './bundler'; -import { decoder } from './codec'; const baseDebug = debugFactory('appsEngine:runtime:deno'); @@ -107,7 +107,11 @@ export class DenoRuntimeSubprocessController extends EventEmitter { private readonly livenessManager: LivenessManager; // We need to keep the appSource around in case the Deno process needs to be restarted - constructor(manager: AppManager, private readonly appPackage: IParseAppPackageResult, private readonly storageItem: IAppStorageItem) { + constructor( + manager: AppManager, + private readonly appPackage: IParseAppPackageResult, + private readonly storageItem: IAppStorageItem, + ) { super(); this.debug = baseDebug.extend(appPackage.info.id); @@ -286,6 +290,10 @@ export class DenoRuntimeSubprocessController extends EventEmitter { await this.sendRequest({ method: 'app:initialize' }); await this.sendRequest({ method: 'app:setStatus', params: [this.storageItem.status] }); + if (AppStatusUtils.isEnabled(this.storageItem.status)) { + await this.sendRequest({ method: 'app:onEnable' }); + } + this.state = 'ready'; logger.info('Successfully restarted app subprocess');