feat(core): Validate shutdown handlers on startup (#8260)
This commit is contained in:
@@ -9,7 +9,7 @@ import { Logger } from '@/Logger';
|
||||
import config from '@/config';
|
||||
import * as Db from '@/Db';
|
||||
import * as CrashJournal from '@/CrashJournal';
|
||||
import { LICENSE_FEATURES, inTest } from '@/constants';
|
||||
import { LICENSE_FEATURES, inDevelopment, inTest } from '@/constants';
|
||||
import { initErrorHandling } from '@/ErrorReporting';
|
||||
import { ExternalHooks } from '@/ExternalHooks';
|
||||
import { NodeTypes } from '@/NodeTypes';
|
||||
@@ -63,6 +63,12 @@ export abstract class BaseCommand extends Command {
|
||||
this.exitWithCrash('There was an error initializing DB', error),
|
||||
);
|
||||
|
||||
// This needs to happen after DB.init() or otherwise DB Connection is not
|
||||
// available via the dependency Container that services depend on.
|
||||
if (inDevelopment || inTest) {
|
||||
this.shutdownService.validate();
|
||||
}
|
||||
|
||||
await this.server?.init();
|
||||
|
||||
await Db.migrate().catch(async (error: Error) =>
|
||||
|
||||
@@ -39,6 +39,26 @@ export class ShutdownService {
|
||||
this.handlersByPriority[priority].push(handler);
|
||||
}
|
||||
|
||||
/** Validates that all the registered shutdown handlers are properly configured */
|
||||
validate() {
|
||||
const handlers = this.handlersByPriority.flat();
|
||||
|
||||
for (const { serviceClass, methodName } of handlers) {
|
||||
if (!Container.has(serviceClass)) {
|
||||
throw new ApplicationError(
|
||||
`Component "${serviceClass.name}" is not registered with the DI container. Any component using @OnShutdown() must be decorated with @Service()`,
|
||||
);
|
||||
}
|
||||
|
||||
const service = Container.get(serviceClass);
|
||||
if (!service[methodName]) {
|
||||
throw new ApplicationError(
|
||||
`Component "${serviceClass.name}" does not have a "${methodName}" method`,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** Signals all registered listeners that the application is shutting down */
|
||||
shutdown() {
|
||||
if (this.shutdownPromise) {
|
||||
|
||||
Reference in New Issue
Block a user