mirror of
https://github.com/directus/directus.git
synced 2026-04-25 03:00:53 -04:00
Use JobQueue when reloading extensions (#13796)
This commit is contained in:
committed by
GitHub
parent
115d89c001
commit
80d0b9cd47
@@ -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[] {
|
||||
|
||||
@@ -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');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user