UNPKG

payload

Version:

Node, React, Headless CMS and Application Framework built on Next.js

44 lines (43 loc) 1.97 kB
// @ts-strict-ignore import { calculateBackoffWaitUntil } from './calculateBackoffWaitUntil.js'; /** * This is called if a workflow catches an error. It determines if it's a final error * or not and handles logging. */ export function handleWorkflowError({ error, job, req, state, workflowConfig }) { const jobLabel = job.workflowSlug || `Task: ${job.taskSlug}`; let hasFinalError = state.reachedMaxRetries || !!('cancelled' in error && error.cancelled // If any TASK reached max retries, the job has an error ); const maxWorkflowRetries = (typeof workflowConfig.retries === 'object' ? workflowConfig.retries.attempts : workflowConfig.retries) ?? undefined; if (maxWorkflowRetries !== undefined && maxWorkflowRetries !== null && job.totalTried >= maxWorkflowRetries) { hasFinalError = true; state.reachedMaxRetries = true; } // Now let's handle workflow retries if (!hasFinalError) { if (job.waitUntil) { // Check if waitUntil is in the past const waitUntil = new Date(job.waitUntil); if (waitUntil < new Date()) { // Outdated waitUntil, remove it delete job.waitUntil; } } // Job will retry. Let's determine when! const waitUntil = calculateBackoffWaitUntil({ retriesConfig: workflowConfig.retries, totalTried: job.totalTried ?? 0 }); // Update job's waitUntil only if this waitUntil is later than the current one if (!job.waitUntil || waitUntil > new Date(job.waitUntil)) { job.waitUntil = waitUntil.toISOString(); } } req.payload.logger.error({ err: error, msg: `Error running job ${jobLabel} id: ${job.id} attempt ${job.totalTried + 1}${maxWorkflowRetries !== undefined ? '/' + (maxWorkflowRetries + 1) : ''}` }); return { hasFinalError }; } //# sourceMappingURL=handleWorkflowError.js.map