Use JobQueue when reloading extensions (#13796)

This commit is contained in:
Nicola Krumschmidt
2022-06-09 14:06:24 +02:00
committed by GitHub
parent 115d89c001
commit 80d0b9cd47
2 changed files with 34 additions and 24 deletions

View File

@@ -53,6 +53,7 @@ import { isExtensionObject, isHybridExtension, pluralize } from '@directus/share
import { getFlowManager } from './flows';
import globby from 'globby';
import { EventHandler } from './types';
import { JobQueue } from './utils/job-queue';
let extensionManager: ExtensionManager | undefined;
@@ -95,6 +96,7 @@ class ExtensionManager {
private apiEmitter: Emitter;
private endpointRouter: Router;
private reloadQueue: JobQueue;
private watcher: FSWatcher | null = null;
constructor() {
@@ -102,6 +104,8 @@ class ExtensionManager {
this.apiEmitter = new Emitter();
this.endpointRouter = Router();
this.reloadQueue = new JobQueue();
}
public async initialize(options: Partial<Options> = {}): Promise<void> {
@@ -124,35 +128,37 @@ class ExtensionManager {
}
}
public async reload(): Promise<void> {
if (this.isLoaded) {
logger.info('Reloading extensions');
public reload(): void {
this.reloadQueue.enqueue(async () => {
if (this.isLoaded) {
logger.info('Reloading extensions');
const prevExtensions = clone(this.extensions);
const prevExtensions = clone(this.extensions);
await this.unload();
await this.load();
await this.unload();
await this.load();
const added = this.extensions.filter(
(extension) => !prevExtensions.some((prevExtension) => extension.path === prevExtension.path)
);
const removed = prevExtensions.filter(
(prevExtension) => !this.extensions.some((extension) => prevExtension.path === extension.path)
);
const added = this.extensions.filter(
(extension) => !prevExtensions.some((prevExtension) => extension.path === prevExtension.path)
);
const removed = prevExtensions.filter(
(prevExtension) => !this.extensions.some((extension) => prevExtension.path === extension.path)
);
this.updateWatchedExtensions(added, removed);
this.updateWatchedExtensions(added, removed);
const addedExtensions = added.map((extension) => extension.name);
const removedExtensions = removed.map((extension) => extension.name);
if (addedExtensions.length > 0) {
logger.info(`Added extensions: ${addedExtensions.join(', ')}`);
const addedExtensions = added.map((extension) => extension.name);
const removedExtensions = removed.map((extension) => extension.name);
if (addedExtensions.length > 0) {
logger.info(`Added extensions: ${addedExtensions.join(', ')}`);
}
if (removedExtensions.length > 0) {
logger.info(`Removed extensions: ${removedExtensions.join(', ')}`);
}
} else {
logger.warn('Extensions have to be loaded before they can be reloaded');
}
if (removedExtensions.length > 0) {
logger.info(`Removed extensions: ${removedExtensions.join(', ')}`);
}
} else {
logger.warn('Extensions have to be loaded before they can be reloaded');
}
});
}
public getExtensionsList(type?: ExtensionType): string[] {

View File

@@ -66,9 +66,11 @@ class FlowManager {
private operationFlowHandlers: Record<string, any> = {};
private webhookFlowHandlers: Record<string, any> = {};
private reloadQueue = new JobQueue();
private reloadQueue: JobQueue;
constructor() {
this.reloadQueue = new JobQueue();
const messenger = getMessenger();
messenger.subscribe('flows', (event) => {
@@ -77,6 +79,8 @@ class FlowManager {
if (this.isLoaded) {
await this.unload();
await this.load();
} else {
logger.warn('Flows have to be loaded before they can be reloaded');
}
});
}