Fix workflow executor initialization timing issue

- Add lazy initialization when executor is not ready during hook execution
- Handles development hot-reloading scenarios where module registry resets
- Prevents 'Workflow executor not yet initialized' warnings
- Creates workflow executor on-demand when hooks fire before onInit
- Improved error handling and tracking for initialization failures

Resolves: Workflow executor timing issues in development environments
This commit is contained in:
2025-09-09 11:38:40 +02:00
parent c46b58f43e
commit 3749881d5f

View File

@@ -186,19 +186,40 @@ export const workflowsPlugin =
}, 'Collection automation hook triggered') }, 'Collection automation hook triggered')
if (!registry.isInitialized) { if (!registry.isInitialized) {
logger.warn('Workflow executor not yet initialized, skipping execution') logger.warn('Workflow executor not yet initialized, attempting lazy initialization')
return undefined
try {
// Try to create executor if we have a payload instance
if (args.req?.payload) {
logger.info('Creating workflow executor via lazy initialization')
const { WorkflowExecutor } = await import('../core/workflow-executor.js')
const executor = new WorkflowExecutor(args.req.payload, logger)
setWorkflowExecutor(executor, logger)
logger.info('Lazy initialization successful')
} else {
logger.error('Cannot lazy initialize - no payload instance available')
await createFailedWorkflowRun(args, 'Workflow executor not initialized and lazy initialization failed - no payload instance', logger)
return undefined
}
} catch (error) {
logger.error('Lazy initialization failed:', error)
const errorMessage = error instanceof Error ? error.message : String(error)
await createFailedWorkflowRun(args, `Workflow executor lazy initialization failed: ${errorMessage}`, logger)
return undefined
}
} }
if (!registry.executor) { // Re-check registry after potential lazy initialization
const updatedRegistry = getExecutorRegistry()
if (!updatedRegistry.executor) {
logger.error('Workflow executor is null despite being marked as initialized') logger.error('Workflow executor is null despite being marked as initialized')
// Create a failed workflow run to track this issue // Create a failed workflow run to track this issue
await createFailedWorkflowRun(args, 'Executor not available', logger) await createFailedWorkflowRun(args, 'Executor not available after initialization', logger)
return undefined return undefined
} }
logger.debug('Executing triggered workflows...') logger.debug('Executing triggered workflows...')
await registry.executor.executeTriggeredWorkflows( await updatedRegistry.executor.executeTriggeredWorkflows(
args.collection.slug, args.collection.slug,
args.operation, args.operation,
args.doc, args.doc,