payload 3.79.0 → 3.80.0-internal.cee0ccf
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/database/types.d.ts +1 -0
- package/dist/database/types.d.ts.map +1 -1
- package/dist/database/types.js.map +1 -1
- package/dist/index.bundled.d.ts +10 -2
- package/dist/index.d.ts +7 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -1
- package/dist/index.js.map +1 -1
- package/dist/queues/localAPI.d.ts +1 -0
- package/dist/queues/localAPI.d.ts.map +1 -1
- package/dist/queues/localAPI.js +4 -0
- package/dist/queues/localAPI.js.map +1 -1
- package/dist/queues/operations/runJobs/index.d.ts +1 -0
- package/dist/queues/operations/runJobs/index.d.ts.map +1 -1
- package/dist/queues/operations/runJobs/index.js +96 -1
- package/dist/queues/operations/runJobs/index.js.map +1 -1
- package/dist/queues/utilities/updateJob.d.ts +2 -1
- package/dist/queues/utilities/updateJob.d.ts.map +1 -1
- package/dist/queues/utilities/updateJob.js +92 -31
- package/dist/queues/utilities/updateJob.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/queues/localAPI.ts"],"sourcesContent":["import type { BaseJob, RunningJobFromTask } from './config/types/workflowTypes.js'\n\nimport {\n createLocalReq,\n Forbidden,\n type Job,\n type Payload,\n type PayloadRequest,\n type Sort,\n type TypedJobs,\n type Where,\n} from '../index.js'\nimport { jobAfterRead, jobsCollectionSlug } from './config/collection.js'\nimport { handleSchedules, type HandleSchedulesResult } from './operations/handleSchedules/index.js'\nimport { runJobs } from './operations/runJobs/index.js'\nimport { updateJob, updateJobs } from './utilities/updateJob.js'\n\nexport type RunJobsSilent =\n | {\n error?: boolean\n info?: boolean\n }\n | boolean\nexport const getJobsLocalAPI = (payload: Payload) => ({\n handleSchedules: async (args?: {\n /**\n * If you want to schedule jobs from all queues, set this to true.\n * If you set this to true, the `queue` property will be ignored.\n *\n * @default false\n */\n allQueues?: boolean\n // By default, schedule all queues - only scheduling jobs scheduled to be added to the `default` queue would not make sense\n // here, as you'd usually specify a different queue than `default` here, especially if this is used in combination with autorun.\n // The `queue` property for setting up schedules is required, and not optional.\n /**\n * If you want to only schedule jobs that are set to schedule in a specific queue, set this to the queue name.\n *\n * @default jobs from the `default` queue will be executed.\n */\n queue?: string\n req?: PayloadRequest\n }): Promise<HandleSchedulesResult> => {\n const newReq: PayloadRequest = args?.req ?? (await createLocalReq({}, payload))\n\n return await handleSchedules({\n allQueues: args?.allQueues,\n queue: args?.queue,\n req: newReq,\n })\n },\n queue: async <\n // eslint-disable-next-line @typescript-eslint/no-duplicate-type-constituents\n TTaskOrWorkflowSlug extends keyof TypedJobs['tasks'] | keyof TypedJobs['workflows'],\n >(\n args:\n | {\n input: TypedJobs['tasks'][TTaskOrWorkflowSlug]['input']\n meta?: BaseJob['meta']\n /**\n * If set to false, access control as defined in jobsConfig.access.queue will be run.\n * By default, this is true and no access control will be run.\n * If you set this to false and do not have jobsConfig.access.queue defined, the default access control will be\n * run (which is a function that returns `true` if the user is logged in).\n *\n * @default true\n */\n overrideAccess?: boolean\n /**\n * The queue to add the job to.\n * If not specified, the job will be added to the default queue.\n *\n * @default 'default'\n */\n queue?: string\n req?: PayloadRequest\n task: TTaskOrWorkflowSlug extends keyof TypedJobs['tasks'] ? TTaskOrWorkflowSlug : never\n waitUntil?: Date\n workflow?: never\n }\n | {\n input: TypedJobs['workflows'][TTaskOrWorkflowSlug]['input']\n meta?: BaseJob['meta']\n /**\n * If set to false, access control as defined in jobsConfig.access.queue will be run.\n * By default, this is true and no access control will be run.\n * If you set this to false and do not have jobsConfig.access.queue defined, the default access control will be\n * run (which is a function that returns `true` if the user is logged in).\n *\n * @default true\n */\n overrideAccess?: boolean\n /**\n * The queue to add the job to.\n * If not specified, the job will be added to the default queue.\n *\n * @default 'default'\n */\n queue?: string\n req?: PayloadRequest\n task?: never\n waitUntil?: Date\n workflow: TTaskOrWorkflowSlug extends keyof TypedJobs['workflows']\n ? TTaskOrWorkflowSlug\n : never\n },\n ): Promise<\n TTaskOrWorkflowSlug extends keyof TypedJobs['workflows']\n ? Job<TTaskOrWorkflowSlug>\n : RunningJobFromTask<TTaskOrWorkflowSlug>\n > => {\n const overrideAccess = args?.overrideAccess !== false\n const req: PayloadRequest = args.req ?? (await createLocalReq({}, payload))\n\n if (!overrideAccess) {\n /**\n * By default, jobsConfig.access.queue will be `defaultAccess` which is a function that returns `true` if the user is logged in.\n */\n const accessFn = payload.config.jobs?.access?.queue ?? (() => true)\n const hasAccess = await accessFn({ req })\n if (!hasAccess) {\n throw new Forbidden(req.t)\n }\n }\n\n let queue: string | undefined = undefined\n\n // If user specifies queue, use that\n if (args.queue) {\n queue = args.queue\n } else if (args.workflow) {\n // Otherwise, if there is a workflow specified, and it has a default queue to use,\n // use that\n const workflow = payload.config.jobs?.workflows?.find(({ slug }) => slug === args.workflow)\n if (workflow?.queue) {\n queue = workflow.queue\n }\n }\n\n const data: Partial<Job> = {\n input: args.input,\n }\n\n if (queue) {\n data.queue = queue\n }\n if (args.waitUntil) {\n data.waitUntil = args.waitUntil?.toISOString()\n }\n if (args.workflow) {\n data.workflowSlug = args.workflow as string\n }\n if (args.task) {\n data.taskSlug = args.task as string\n }\n\n if (args.meta) {\n data.meta = args.meta\n }\n\n // Compute concurrency key from workflow or task config (only if feature is enabled)\n if (payload.config.jobs?.enableConcurrencyControl) {\n let concurrencyKey: null | string = null\n let supersedes = false\n const queueName = queue || 'default'\n\n if (args.workflow) {\n const workflow = payload.config.jobs?.workflows?.find(({ slug }) => slug === args.workflow)\n if (workflow?.concurrency) {\n const concurrencyConfig = workflow.concurrency\n if (typeof concurrencyConfig === 'function') {\n concurrencyKey = concurrencyConfig({ input: args.input, queue: queueName })\n } else {\n concurrencyKey = concurrencyConfig.key({ input: args.input, queue: queueName })\n supersedes = concurrencyConfig.supersedes ?? false\n }\n }\n } else if (args.task) {\n const task = payload.config.jobs?.tasks?.find(({ slug }) => slug === args.task)\n if (task?.concurrency) {\n const concurrencyConfig = task.concurrency\n if (typeof concurrencyConfig === 'function') {\n concurrencyKey = concurrencyConfig({ input: args.input, queue: queueName })\n } else {\n concurrencyKey = concurrencyConfig.key({ input: args.input, queue: queueName })\n supersedes = concurrencyConfig.supersedes ?? false\n }\n }\n }\n\n if (concurrencyKey) {\n data.concurrencyKey = concurrencyKey\n\n // If supersedes is enabled, delete older pending jobs with the same key\n if (supersedes) {\n if (payload.config.jobs.runHooks) {\n await payload.delete({\n collection: jobsCollectionSlug,\n depth: 0,\n disableTransaction: true,\n where: {\n and: [\n { concurrencyKey: { equals: concurrencyKey } },\n { processing: { equals: false } },\n { completedAt: { exists: false } },\n ],\n },\n })\n } else {\n await payload.db.deleteMany({\n collection: jobsCollectionSlug,\n req,\n where: {\n and: [\n { concurrencyKey: { equals: concurrencyKey } },\n { processing: { equals: false } },\n { completedAt: { exists: false } },\n ],\n },\n })\n }\n }\n }\n }\n\n type ReturnType = TTaskOrWorkflowSlug extends keyof TypedJobs['workflows']\n ? Job<TTaskOrWorkflowSlug>\n : RunningJobFromTask<TTaskOrWorkflowSlug> // Type assertion is still needed here\n\n if (payload?.config?.jobs?.depth || payload?.config?.jobs?.runHooks) {\n return (await payload.create({\n collection: jobsCollectionSlug,\n data,\n depth: payload.config.jobs.depth ?? 0,\n overrideAccess,\n req,\n })) as ReturnType\n } else {\n return jobAfterRead({\n config: payload.config,\n doc: await payload.db.create({\n collection: jobsCollectionSlug,\n data,\n req,\n }),\n }) as unknown as ReturnType\n }\n },\n\n run: async (args?: {\n /**\n * If you want to run jobs from all queues, set this to true.\n * If you set this to true, the `queue` property will be ignored.\n *\n * @default false\n */\n allQueues?: boolean\n /**\n * The maximum number of jobs to run in this invocation\n *\n * @default 10\n */\n limit?: number\n /**\n * If set to false, access control as defined in jobsConfig.access.run will be run.\n * By default, this is true and no access control will be run.\n * If you set this to false and do not have jobsConfig.access.run defined, the default access control will be\n * run (which is a function that returns `true` if the user is logged in).\n *\n * @default true\n */\n overrideAccess?: boolean\n /**\n * Adjust the job processing order using a Payload sort string.\n *\n * FIFO would equal `createdAt` and LIFO would equal `-createdAt`.\n */\n processingOrder?: Sort\n /**\n * If you want to run jobs from a specific queue, set this to the queue name.\n *\n * @default jobs from the `default` queue will be executed.\n */\n queue?: string\n req?: PayloadRequest\n /**\n * By default, jobs are run in parallel.\n * If you want to run them in sequence, set this to true.\n */\n sequential?: boolean\n /**\n * If set to true, the job system will not log any output to the console (for both info and error logs).\n * Can be an option for more granular control over logging.\n *\n * This will not automatically affect user-configured logs (e.g. if you call `console.log` or `payload.logger.info` in your job code).\n *\n * @default false\n */\n silent?: RunJobsSilent\n where?: Where\n }): Promise<ReturnType<typeof runJobs>> => {\n const newReq: PayloadRequest = args?.req ?? (await createLocalReq({}, payload))\n\n return await runJobs({\n allQueues: args?.allQueues,\n limit: args?.limit,\n overrideAccess: args?.overrideAccess !== false,\n processingOrder: args?.processingOrder,\n queue: args?.queue,\n req: newReq,\n sequential: args?.sequential,\n silent: args?.silent,\n where: args?.where,\n })\n },\n\n runByID: async (args: {\n id: number | string\n /**\n * If set to false, access control as defined in jobsConfig.access.run will be run.\n * By default, this is true and no access control will be run.\n * If you set this to false and do not have jobsConfig.access.run defined, the default access control will be\n * run (which is a function that returns `true` if the user is logged in).\n *\n * @default true\n */\n overrideAccess?: boolean\n req?: PayloadRequest\n /**\n * If set to true, the job system will not log any output to the console (for both info and error logs).\n * Can be an option for more granular control over logging.\n *\n * This will not automatically affect user-configured logs (e.g. if you call `console.log` or `payload.logger.info` in your job code).\n *\n * @default false\n */\n silent?: RunJobsSilent\n }): Promise<ReturnType<typeof runJobs>> => {\n const newReq: PayloadRequest = args.req ?? (await createLocalReq({}, payload))\n\n return await runJobs({\n id: args.id,\n overrideAccess: args.overrideAccess !== false,\n req: newReq,\n silent: args.silent,\n })\n },\n\n cancel: async (args: {\n /**\n * If set to false, access control as defined in jobsConfig.access.cancel will be run.\n * By default, this is true and no access control will be run.\n * If you set this to false and do not have jobsConfig.access.cancel defined, the default access control will be\n * run (which is a function that returns `true` if the user is logged in).\n *\n * @default true\n */\n overrideAccess?: boolean\n queue?: string\n req?: PayloadRequest\n where: Where\n }): Promise<void> => {\n const req: PayloadRequest = args.req ?? (await createLocalReq({}, payload))\n\n const overrideAccess = args.overrideAccess !== false\n if (!overrideAccess) {\n /**\n * By default, jobsConfig.access.cancel will be `defaultAccess` which is a function that returns `true` if the user is logged in.\n */\n const accessFn = payload.config.jobs?.access?.cancel ?? (() => true)\n const hasAccess = await accessFn({ req })\n if (!hasAccess) {\n throw new Forbidden(req.t)\n }\n }\n\n const and: Where[] = [\n args.where,\n {\n completedAt: {\n exists: false,\n },\n },\n {\n hasError: {\n not_equals: true,\n },\n },\n ]\n\n if (args.queue) {\n and.push({\n queue: {\n equals: args.queue,\n },\n })\n }\n\n await updateJobs({\n data: {\n completedAt: null,\n error: {\n cancelled: true,\n },\n hasError: true,\n processing: false,\n waitUntil: null,\n },\n depth: 0, // No depth, since we're not returning\n disableTransaction: true,\n req,\n returning: false,\n where: { and },\n })\n },\n\n cancelByID: async (args: {\n id: number | string\n /**\n * If set to false, access control as defined in jobsConfig.access.cancel will be run.\n * By default, this is true and no access control will be run.\n * If you set this to false and do not have jobsConfig.access.cancel defined, the default access control will be\n * run (which is a function that returns `true` if the user is logged in).\n *\n * @default true\n */\n overrideAccess?: boolean\n req?: PayloadRequest\n }): Promise<void> => {\n const req: PayloadRequest = args.req ?? (await createLocalReq({}, payload))\n\n const overrideAccess = args.overrideAccess !== false\n if (!overrideAccess) {\n /**\n * By default, jobsConfig.access.cancel will be `defaultAccess` which is a function that returns `true` if the user is logged in.\n */\n const accessFn = payload.config.jobs?.access?.cancel ?? (() => true)\n const hasAccess = await accessFn({ req })\n if (!hasAccess) {\n throw new Forbidden(req.t)\n }\n }\n\n await updateJob({\n id: args.id,\n data: {\n completedAt: null,\n error: {\n cancelled: true,\n },\n hasError: true,\n processing: false,\n waitUntil: null,\n },\n depth: 0, // No depth, since we're not returning\n disableTransaction: true,\n req,\n returning: false,\n })\n },\n})\n"],"names":["createLocalReq","Forbidden","jobAfterRead","jobsCollectionSlug","handleSchedules","runJobs","updateJob","updateJobs","getJobsLocalAPI","payload","args","newReq","req","allQueues","queue","overrideAccess","accessFn","config","jobs","access","hasAccess","t","undefined","workflow","workflows","find","slug","data","input","waitUntil","toISOString","workflowSlug","task","taskSlug","meta","enableConcurrencyControl","concurrencyKey","supersedes","queueName","concurrency","concurrencyConfig","key","tasks","runHooks","delete","collection","depth","disableTransaction","where","and","equals","processing","completedAt","exists","db","deleteMany","create","doc","run","limit","processingOrder","sequential","silent","runByID","id","cancel","hasError","not_equals","push","error","cancelled","returning","cancelByID"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/queues/localAPI.ts"],"sourcesContent":["import type { BaseJob, RunningJobFromTask } from './config/types/workflowTypes.js'\n\nimport {\n createLocalReq,\n Forbidden,\n type Job,\n type Payload,\n type PayloadRequest,\n type Sort,\n type TypedJobs,\n type Where,\n} from '../index.js'\nimport { jobAfterRead, jobsCollectionSlug } from './config/collection.js'\nimport { handleSchedules, type HandleSchedulesResult } from './operations/handleSchedules/index.js'\nimport { runJobs } from './operations/runJobs/index.js'\nimport { updateJob, updateJobs } from './utilities/updateJob.js'\n\nexport type RunJobsSilent =\n | {\n error?: boolean\n info?: boolean\n }\n | boolean\nexport const getJobsLocalAPI = (payload: Payload) => ({\n handleSchedules: async (args?: {\n /**\n * If you want to schedule jobs from all queues, set this to true.\n * If you set this to true, the `queue` property will be ignored.\n *\n * @default false\n */\n allQueues?: boolean\n // By default, schedule all queues - only scheduling jobs scheduled to be added to the `default` queue would not make sense\n // here, as you'd usually specify a different queue than `default` here, especially if this is used in combination with autorun.\n // The `queue` property for setting up schedules is required, and not optional.\n /**\n * If you want to only schedule jobs that are set to schedule in a specific queue, set this to the queue name.\n *\n * @default jobs from the `default` queue will be executed.\n */\n queue?: string\n req?: PayloadRequest\n }): Promise<HandleSchedulesResult> => {\n const newReq: PayloadRequest = args?.req ?? (await createLocalReq({}, payload))\n\n return await handleSchedules({\n allQueues: args?.allQueues,\n queue: args?.queue,\n req: newReq,\n })\n },\n queue: async <\n // eslint-disable-next-line @typescript-eslint/no-duplicate-type-constituents\n TTaskOrWorkflowSlug extends keyof TypedJobs['tasks'] | keyof TypedJobs['workflows'],\n >(\n args:\n | {\n input: TypedJobs['tasks'][TTaskOrWorkflowSlug]['input']\n meta?: BaseJob['meta']\n /**\n * If set to false, access control as defined in jobsConfig.access.queue will be run.\n * By default, this is true and no access control will be run.\n * If you set this to false and do not have jobsConfig.access.queue defined, the default access control will be\n * run (which is a function that returns `true` if the user is logged in).\n *\n * @default true\n */\n overrideAccess?: boolean\n /**\n * The queue to add the job to.\n * If not specified, the job will be added to the default queue.\n *\n * @default 'default'\n */\n queue?: string\n req?: PayloadRequest\n task: TTaskOrWorkflowSlug extends keyof TypedJobs['tasks'] ? TTaskOrWorkflowSlug : never\n waitUntil?: Date\n workflow?: never\n }\n | {\n input: TypedJobs['workflows'][TTaskOrWorkflowSlug]['input']\n meta?: BaseJob['meta']\n /**\n * If set to false, access control as defined in jobsConfig.access.queue will be run.\n * By default, this is true and no access control will be run.\n * If you set this to false and do not have jobsConfig.access.queue defined, the default access control will be\n * run (which is a function that returns `true` if the user is logged in).\n *\n * @default true\n */\n overrideAccess?: boolean\n /**\n * The queue to add the job to.\n * If not specified, the job will be added to the default queue.\n *\n * @default 'default'\n */\n queue?: string\n req?: PayloadRequest\n task?: never\n waitUntil?: Date\n workflow: TTaskOrWorkflowSlug extends keyof TypedJobs['workflows']\n ? TTaskOrWorkflowSlug\n : never\n },\n ): Promise<\n TTaskOrWorkflowSlug extends keyof TypedJobs['workflows']\n ? Job<TTaskOrWorkflowSlug>\n : RunningJobFromTask<TTaskOrWorkflowSlug>\n > => {\n const overrideAccess = args?.overrideAccess !== false\n const req: PayloadRequest = args.req ?? (await createLocalReq({}, payload))\n\n if (!overrideAccess) {\n /**\n * By default, jobsConfig.access.queue will be `defaultAccess` which is a function that returns `true` if the user is logged in.\n */\n const accessFn = payload.config.jobs?.access?.queue ?? (() => true)\n const hasAccess = await accessFn({ req })\n if (!hasAccess) {\n throw new Forbidden(req.t)\n }\n }\n\n let queue: string | undefined = undefined\n\n // If user specifies queue, use that\n if (args.queue) {\n queue = args.queue\n } else if (args.workflow) {\n // Otherwise, if there is a workflow specified, and it has a default queue to use,\n // use that\n const workflow = payload.config.jobs?.workflows?.find(({ slug }) => slug === args.workflow)\n if (workflow?.queue) {\n queue = workflow.queue\n }\n }\n\n const data: Partial<Job> = {\n input: args.input,\n }\n\n if (queue) {\n data.queue = queue\n }\n if (args.waitUntil) {\n data.waitUntil = args.waitUntil?.toISOString()\n }\n if (args.workflow) {\n data.workflowSlug = args.workflow as string\n }\n if (args.task) {\n data.taskSlug = args.task as string\n }\n\n if (args.meta) {\n data.meta = args.meta\n }\n\n // Compute concurrency key from workflow or task config (only if feature is enabled)\n if (payload.config.jobs?.enableConcurrencyControl) {\n let concurrencyKey: null | string = null\n let supersedes = false\n const queueName = queue || 'default'\n\n if (args.workflow) {\n const workflow = payload.config.jobs?.workflows?.find(({ slug }) => slug === args.workflow)\n if (workflow?.concurrency) {\n const concurrencyConfig = workflow.concurrency\n if (typeof concurrencyConfig === 'function') {\n concurrencyKey = concurrencyConfig({ input: args.input, queue: queueName })\n } else {\n concurrencyKey = concurrencyConfig.key({ input: args.input, queue: queueName })\n supersedes = concurrencyConfig.supersedes ?? false\n }\n }\n } else if (args.task) {\n const task = payload.config.jobs?.tasks?.find(({ slug }) => slug === args.task)\n if (task?.concurrency) {\n const concurrencyConfig = task.concurrency\n if (typeof concurrencyConfig === 'function') {\n concurrencyKey = concurrencyConfig({ input: args.input, queue: queueName })\n } else {\n concurrencyKey = concurrencyConfig.key({ input: args.input, queue: queueName })\n supersedes = concurrencyConfig.supersedes ?? false\n }\n }\n }\n\n if (concurrencyKey) {\n data.concurrencyKey = concurrencyKey\n\n // If supersedes is enabled, delete older pending jobs with the same key\n if (supersedes) {\n if (payload.config.jobs.runHooks) {\n await payload.delete({\n collection: jobsCollectionSlug,\n depth: 0,\n disableTransaction: true,\n where: {\n and: [\n { concurrencyKey: { equals: concurrencyKey } },\n { processing: { equals: false } },\n { completedAt: { exists: false } },\n ],\n },\n })\n } else {\n await payload.db.deleteMany({\n collection: jobsCollectionSlug,\n req,\n where: {\n and: [\n { concurrencyKey: { equals: concurrencyKey } },\n { processing: { equals: false } },\n { completedAt: { exists: false } },\n ],\n },\n })\n }\n }\n }\n }\n\n type ReturnType = TTaskOrWorkflowSlug extends keyof TypedJobs['workflows']\n ? Job<TTaskOrWorkflowSlug>\n : RunningJobFromTask<TTaskOrWorkflowSlug> // Type assertion is still needed here\n\n if (payload?.config?.jobs?.depth || payload?.config?.jobs?.runHooks) {\n console.log('[Queue] creating new job with data (legacy)', data)\n return (await payload.create({\n collection: jobsCollectionSlug,\n data,\n depth: payload.config.jobs.depth ?? 0,\n overrideAccess,\n req,\n })) as ReturnType\n } else {\n console.log('[Queue] creating new job with data', data)\n\n return jobAfterRead({\n config: payload.config,\n doc: await payload.db.create({\n collection: jobsCollectionSlug,\n data,\n req,\n }),\n }) as unknown as ReturnType\n }\n },\n\n run: async (args?: {\n /**\n * If you want to run jobs from all queues, set this to true.\n * If you set this to true, the `queue` property will be ignored.\n *\n * @default false\n */\n allQueues?: boolean\n /**\n * The maximum number of jobs to run in this invocation\n *\n * @default 10\n */\n limit?: number\n /**\n * If set to false, access control as defined in jobsConfig.access.run will be run.\n * By default, this is true and no access control will be run.\n * If you set this to false and do not have jobsConfig.access.run defined, the default access control will be\n * run (which is a function that returns `true` if the user is logged in).\n *\n * @default true\n */\n overrideAccess?: boolean\n /**\n * Adjust the job processing order using a Payload sort string.\n *\n * FIFO would equal `createdAt` and LIFO would equal `-createdAt`.\n */\n processingOrder?: Sort\n /**\n * If you want to run jobs from a specific queue, set this to the queue name.\n *\n * @default jobs from the `default` queue will be executed.\n */\n queue?: string\n randomID?: string\n req?: PayloadRequest\n /**\n * By default, jobs are run in parallel.\n * If you want to run them in sequence, set this to true.\n */\n sequential?: boolean\n /**\n * If set to true, the job system will not log any output to the console (for both info and error logs).\n * Can be an option for more granular control over logging.\n *\n * This will not automatically affect user-configured logs (e.g. if you call `console.log` or `payload.logger.info` in your job code).\n *\n * @default false\n */\n silent?: RunJobsSilent\n where?: Where\n }): Promise<ReturnType<typeof runJobs>> => {\n console.log(`[${args?.randomID}] 1`)\n const newReq: PayloadRequest = args?.req ?? (await createLocalReq({}, payload))\n\n return await runJobs({\n allQueues: args?.allQueues,\n limit: args?.limit,\n overrideAccess: args?.overrideAccess !== false,\n processingOrder: args?.processingOrder,\n queue: args?.queue,\n randomID: args?.randomID,\n req: newReq,\n sequential: args?.sequential,\n silent: args?.silent,\n where: args?.where,\n })\n },\n\n runByID: async (args: {\n id: number | string\n /**\n * If set to false, access control as defined in jobsConfig.access.run will be run.\n * By default, this is true and no access control will be run.\n * If you set this to false and do not have jobsConfig.access.run defined, the default access control will be\n * run (which is a function that returns `true` if the user is logged in).\n *\n * @default true\n */\n overrideAccess?: boolean\n req?: PayloadRequest\n /**\n * If set to true, the job system will not log any output to the console (for both info and error logs).\n * Can be an option for more granular control over logging.\n *\n * This will not automatically affect user-configured logs (e.g. if you call `console.log` or `payload.logger.info` in your job code).\n *\n * @default false\n */\n silent?: RunJobsSilent\n }): Promise<ReturnType<typeof runJobs>> => {\n const newReq: PayloadRequest = args.req ?? (await createLocalReq({}, payload))\n\n return await runJobs({\n id: args.id,\n overrideAccess: args.overrideAccess !== false,\n req: newReq,\n silent: args.silent,\n })\n },\n\n cancel: async (args: {\n /**\n * If set to false, access control as defined in jobsConfig.access.cancel will be run.\n * By default, this is true and no access control will be run.\n * If you set this to false and do not have jobsConfig.access.cancel defined, the default access control will be\n * run (which is a function that returns `true` if the user is logged in).\n *\n * @default true\n */\n overrideAccess?: boolean\n queue?: string\n req?: PayloadRequest\n where: Where\n }): Promise<void> => {\n const req: PayloadRequest = args.req ?? (await createLocalReq({}, payload))\n\n const overrideAccess = args.overrideAccess !== false\n if (!overrideAccess) {\n /**\n * By default, jobsConfig.access.cancel will be `defaultAccess` which is a function that returns `true` if the user is logged in.\n */\n const accessFn = payload.config.jobs?.access?.cancel ?? (() => true)\n const hasAccess = await accessFn({ req })\n if (!hasAccess) {\n throw new Forbidden(req.t)\n }\n }\n\n const and: Where[] = [\n args.where,\n {\n completedAt: {\n exists: false,\n },\n },\n {\n hasError: {\n not_equals: true,\n },\n },\n ]\n\n if (args.queue) {\n and.push({\n queue: {\n equals: args.queue,\n },\n })\n }\n\n await updateJobs({\n data: {\n completedAt: null,\n error: {\n cancelled: true,\n },\n hasError: true,\n processing: false,\n waitUntil: null,\n },\n depth: 0, // No depth, since we're not returning\n disableTransaction: true,\n req,\n returning: false,\n where: { and },\n })\n },\n\n cancelByID: async (args: {\n id: number | string\n /**\n * If set to false, access control as defined in jobsConfig.access.cancel will be run.\n * By default, this is true and no access control will be run.\n * If you set this to false and do not have jobsConfig.access.cancel defined, the default access control will be\n * run (which is a function that returns `true` if the user is logged in).\n *\n * @default true\n */\n overrideAccess?: boolean\n req?: PayloadRequest\n }): Promise<void> => {\n const req: PayloadRequest = args.req ?? (await createLocalReq({}, payload))\n\n const overrideAccess = args.overrideAccess !== false\n if (!overrideAccess) {\n /**\n * By default, jobsConfig.access.cancel will be `defaultAccess` which is a function that returns `true` if the user is logged in.\n */\n const accessFn = payload.config.jobs?.access?.cancel ?? (() => true)\n const hasAccess = await accessFn({ req })\n if (!hasAccess) {\n throw new Forbidden(req.t)\n }\n }\n\n await updateJob({\n id: args.id,\n data: {\n completedAt: null,\n error: {\n cancelled: true,\n },\n hasError: true,\n processing: false,\n waitUntil: null,\n },\n depth: 0, // No depth, since we're not returning\n disableTransaction: true,\n req,\n returning: false,\n })\n },\n})\n"],"names":["createLocalReq","Forbidden","jobAfterRead","jobsCollectionSlug","handleSchedules","runJobs","updateJob","updateJobs","getJobsLocalAPI","payload","args","newReq","req","allQueues","queue","overrideAccess","accessFn","config","jobs","access","hasAccess","t","undefined","workflow","workflows","find","slug","data","input","waitUntil","toISOString","workflowSlug","task","taskSlug","meta","enableConcurrencyControl","concurrencyKey","supersedes","queueName","concurrency","concurrencyConfig","key","tasks","runHooks","delete","collection","depth","disableTransaction","where","and","equals","processing","completedAt","exists","db","deleteMany","console","log","create","doc","run","randomID","limit","processingOrder","sequential","silent","runByID","id","cancel","hasError","not_equals","push","error","cancelled","returning","cancelByID"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/queues/operations/runJobs/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAA;AAG1E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAarD,MAAM,MAAM,WAAW,GAAG;IACxB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB;;OAEG;IACH,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACpB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,IAAI,CAAA;IACtB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,cAAc,CAAA;IACnB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,aAAa,CAAA;IACtB,KAAK,CAAC,EAAE,KAAK,CAAA;CACd,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;IACxC;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB;;OAEG;IACH,wBAAwB,EAAE,MAAM,CAAA;CACjC,CAAA;AAED,eAAO,MAAM,OAAO,SAAgB,WAAW,KAAG,OAAO,CAAC,aAAa,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/queues/operations/runJobs/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAA;AAG1E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAarD,MAAM,MAAM,WAAW,GAAG;IACxB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB;;OAEG;IACH,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACpB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,IAAI,CAAA;IACtB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,GAAG,EAAE,cAAc,CAAA;IACnB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,aAAa,CAAA;IACtB,KAAK,CAAC,EAAE,KAAK,CAAA;CACd,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;IACxC;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB;;OAEG;IACH,wBAAwB,EAAE,MAAM,CAAA;CACjC,CAAA;AAED,eAAO,MAAM,OAAO,SAAgB,WAAW,KAAG,OAAO,CAAC,aAAa,CAmjBtE,CAAA"}
|
|
@@ -9,7 +9,14 @@ import { importHandlerPath } from './runJob/importHandlerPath.js';
|
|
|
9
9
|
import { runJob } from './runJob/index.js';
|
|
10
10
|
import { runJSONJob } from './runJSONJob/index.js';
|
|
11
11
|
export const runJobs = async (args)=>{
|
|
12
|
-
const { id, allQueues = false, limit = 10, overrideAccess, processingOrder, queue = 'default', req, req: { payload, payload: { config: { jobs: jobsConfig } } }, sequential, silent = false, where: whereFromProps } = args;
|
|
12
|
+
const { id, allQueues = false, limit = 10, overrideAccess, processingOrder, queue = 'default', randomID, req, req: { payload, payload: { config: { jobs: jobsConfig } } }, sequential, silent = false, where: whereFromProps } = args;
|
|
13
|
+
console.log(`[${randomID}] 2 - runJobs started`, {
|
|
14
|
+
id,
|
|
15
|
+
allQueues,
|
|
16
|
+
limit,
|
|
17
|
+
queue,
|
|
18
|
+
sequential
|
|
19
|
+
});
|
|
13
20
|
if (!overrideAccess) {
|
|
14
21
|
/**
|
|
15
22
|
* By default, jobsConfig.access.run will be `defaultAccess` which is a function that returns `true` if the user is logged in.
|
|
@@ -21,6 +28,7 @@ export const runJobs = async (args)=>{
|
|
|
21
28
|
throw new Forbidden(req.t);
|
|
22
29
|
}
|
|
23
30
|
}
|
|
31
|
+
console.log(`[${randomID}] 3 - access check passed`);
|
|
24
32
|
const and = [
|
|
25
33
|
{
|
|
26
34
|
completedAt: {
|
|
@@ -62,6 +70,7 @@ export const runJobs = async (args)=>{
|
|
|
62
70
|
if (whereFromProps) {
|
|
63
71
|
and.push(whereFromProps);
|
|
64
72
|
}
|
|
73
|
+
console.log(`[${args?.randomID}] 4`);
|
|
65
74
|
// Only enforce concurrency controls if the feature is enabled
|
|
66
75
|
if (jobsConfig.enableConcurrencyControl) {
|
|
67
76
|
// Find currently running jobs with concurrency keys to enforce exclusive concurrency
|
|
@@ -122,10 +131,15 @@ export const runJobs = async (args)=>{
|
|
|
122
131
|
});
|
|
123
132
|
}
|
|
124
133
|
}
|
|
134
|
+
console.log(`[${randomID}] 5 - concurrency control done, querying jobs`, {
|
|
135
|
+
id,
|
|
136
|
+
enableConcurrencyControl: jobsConfig.enableConcurrencyControl
|
|
137
|
+
});
|
|
125
138
|
// Find all jobs and ensure we set job to processing: true as early as possible to reduce the chance of
|
|
126
139
|
// the same job being picked up by another worker
|
|
127
140
|
let jobs = [];
|
|
128
141
|
if (id) {
|
|
142
|
+
console.log(`[${randomID}] 5.1 - fetching single job by ID: ${id}`);
|
|
129
143
|
// Only one job to run
|
|
130
144
|
const job = await updateJob({
|
|
131
145
|
id,
|
|
@@ -137,12 +151,16 @@ export const runJobs = async (args)=>{
|
|
|
137
151
|
req,
|
|
138
152
|
returning: true
|
|
139
153
|
});
|
|
154
|
+
console.log(`[${randomID}] 5.2 - single job fetched`, {
|
|
155
|
+
found: !!job
|
|
156
|
+
});
|
|
140
157
|
if (job) {
|
|
141
158
|
jobs = [
|
|
142
159
|
job
|
|
143
160
|
];
|
|
144
161
|
}
|
|
145
162
|
} else {
|
|
163
|
+
console.log(`[${randomID}] 5.3 - fetching multiple jobs with limit: ${limit}`);
|
|
146
164
|
let defaultProcessingOrder = payload.collections[jobsCollectionSlug]?.config.defaultSort ?? 'createdAt';
|
|
147
165
|
const processingOrderConfig = jobsConfig.processingOrder;
|
|
148
166
|
if (typeof processingOrderConfig === 'function') {
|
|
@@ -156,10 +174,12 @@ export const runJobs = async (args)=>{
|
|
|
156
174
|
} else if (typeof processingOrderConfig === 'string') {
|
|
157
175
|
defaultProcessingOrder = processingOrderConfig;
|
|
158
176
|
}
|
|
177
|
+
console.log(`[${randomID}] 5.3.1 - using where query "and":`, and);
|
|
159
178
|
const updatedDocs = await updateJobs({
|
|
160
179
|
data: {
|
|
161
180
|
processing: true
|
|
162
181
|
},
|
|
182
|
+
debugID: randomID,
|
|
163
183
|
depth: jobsConfig.depth,
|
|
164
184
|
disableTransaction: true,
|
|
165
185
|
limit,
|
|
@@ -170,11 +190,38 @@ export const runJobs = async (args)=>{
|
|
|
170
190
|
and
|
|
171
191
|
}
|
|
172
192
|
});
|
|
193
|
+
console.log(`[${randomID}] 5.4 - multiple jobs fetched`, {
|
|
194
|
+
count: updatedDocs?.length ?? 0
|
|
195
|
+
});
|
|
196
|
+
if ((updatedDocs?.length ?? 0) > 0) {
|
|
197
|
+
console.log(`[${randomID}] 5.5 - jobs found! fetched:`, {
|
|
198
|
+
jobs: updatedDocs
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
// Fetch ALL jobs using payload.db.find({})
|
|
202
|
+
const allJobs = await payload.db.find({
|
|
203
|
+
collection: jobsCollectionSlug,
|
|
204
|
+
limit: 0,
|
|
205
|
+
req
|
|
206
|
+
});
|
|
207
|
+
console.log(`[${randomID}] 5.6 - all jobs fetched`, {
|
|
208
|
+
allJobs: allJobs?.docs,
|
|
209
|
+
count: allJobs?.totalDocs
|
|
210
|
+
});
|
|
211
|
+
const anyRunnableJobs = allJobs?.docs?.some((job)=>job?.processing === false && job?.hasError === false && !job?.completedAt && !job?.waitUntil);
|
|
212
|
+
if (anyRunnableJobs && updatedDocs?.length === 0) {
|
|
213
|
+
console.log(`[${randomID}] 5.6.1 - potential issue here.`);
|
|
214
|
+
}
|
|
173
215
|
if (updatedDocs) {
|
|
174
216
|
jobs = updatedDocs;
|
|
175
217
|
}
|
|
176
218
|
}
|
|
219
|
+
console.log(`[${randomID}] 6 - jobs to process`, {
|
|
220
|
+
count: jobs.length,
|
|
221
|
+
jobIds: jobs.map((j)=>j.id)
|
|
222
|
+
});
|
|
177
223
|
if (!jobs.length) {
|
|
224
|
+
console.log(`[${randomID}] 7 - no jobs found, returning early`);
|
|
178
225
|
return {
|
|
179
226
|
noJobsRemaining: true,
|
|
180
227
|
remainingJobsFromQueried: 0
|
|
@@ -207,6 +254,7 @@ export const runJobs = async (args)=>{
|
|
|
207
254
|
data: {
|
|
208
255
|
processing: false
|
|
209
256
|
},
|
|
257
|
+
debugID: randomID,
|
|
210
258
|
disableTransaction: true,
|
|
211
259
|
req,
|
|
212
260
|
returning: false,
|
|
@@ -220,12 +268,17 @@ export const runJobs = async (args)=>{
|
|
|
220
268
|
// Use only the filtered jobs going forward
|
|
221
269
|
jobs = jobsToRun;
|
|
222
270
|
}
|
|
271
|
+
console.log(`[${randomID}] 8 - concurrency dedup done`, {
|
|
272
|
+
jobsToRun: jobs.length
|
|
273
|
+
});
|
|
223
274
|
if (!jobs.length) {
|
|
275
|
+
console.log(`[${randomID}] 9 - all jobs were duplicates, returning early`);
|
|
224
276
|
return {
|
|
225
277
|
noJobsRemaining: false,
|
|
226
278
|
remainingJobsFromQueried: 0
|
|
227
279
|
};
|
|
228
280
|
}
|
|
281
|
+
console.log(`[${randomID}] 10 - preparing to run ${jobs.length} jobs`);
|
|
229
282
|
/**
|
|
230
283
|
* Just for logging purposes, we want to know how many jobs are new and how many are existing (= already been tried).
|
|
231
284
|
* This is only for logs - in the end we still want to run all jobs, regardless of whether they are new or existing.
|
|
@@ -240,6 +293,10 @@ export const runJobs = async (args)=>{
|
|
|
240
293
|
existingJobs: [],
|
|
241
294
|
newJobs: []
|
|
242
295
|
});
|
|
296
|
+
console.log(`[${randomID}] 11 - job breakdown`, {
|
|
297
|
+
existingJobCount: existingJobs.length,
|
|
298
|
+
newJobCount: newJobs.length
|
|
299
|
+
});
|
|
243
300
|
if (!silent || typeof silent === 'object' && !silent.info) {
|
|
244
301
|
payload.logger.info({
|
|
245
302
|
msg: `Running ${jobs.length} jobs.`,
|
|
@@ -249,6 +306,11 @@ export const runJobs = async (args)=>{
|
|
|
249
306
|
}
|
|
250
307
|
const successfullyCompletedJobs = [];
|
|
251
308
|
const runSingleJob = async (job)=>{
|
|
309
|
+
console.log(`[${randomID}] job:${job.id} - starting`, {
|
|
310
|
+
taskSlug: job.taskSlug,
|
|
311
|
+
totalTried: job.totalTried,
|
|
312
|
+
workflowSlug: job.workflowSlug
|
|
313
|
+
});
|
|
252
314
|
if (!job.workflowSlug && !job.taskSlug) {
|
|
253
315
|
throw new Error('Job must have either a workflowSlug or a taskSlug');
|
|
254
316
|
}
|
|
@@ -262,6 +324,7 @@ export const runJobs = async (args)=>{
|
|
|
262
324
|
}
|
|
263
325
|
};
|
|
264
326
|
if (!workflowConfig) {
|
|
327
|
+
console.log(`[${randomID}] job:${job.id} - no workflow config found, skipping`);
|
|
265
328
|
return {
|
|
266
329
|
id: job.id,
|
|
267
330
|
result: {
|
|
@@ -302,6 +365,7 @@ export const runJobs = async (args)=>{
|
|
|
302
365
|
}
|
|
303
366
|
}
|
|
304
367
|
if (typeof workflowHandler === 'function') {
|
|
368
|
+
console.log(`[${randomID}] job:${job.id} - running function handler`);
|
|
305
369
|
const result = await runJob({
|
|
306
370
|
job,
|
|
307
371
|
req: jobReq,
|
|
@@ -310,6 +374,9 @@ export const runJobs = async (args)=>{
|
|
|
310
374
|
workflowConfig,
|
|
311
375
|
workflowHandler
|
|
312
376
|
});
|
|
377
|
+
console.log(`[${randomID}] job:${job.id} - completed`, {
|
|
378
|
+
status: result.status
|
|
379
|
+
});
|
|
313
380
|
if (result.status === 'success') {
|
|
314
381
|
successfullyCompletedJobs.push(job.id);
|
|
315
382
|
}
|
|
@@ -318,6 +385,7 @@ export const runJobs = async (args)=>{
|
|
|
318
385
|
result
|
|
319
386
|
};
|
|
320
387
|
} else {
|
|
388
|
+
console.log(`[${randomID}] job:${job.id} - running JSON handler`);
|
|
321
389
|
const result = await runJSONJob({
|
|
322
390
|
job,
|
|
323
391
|
req: jobReq,
|
|
@@ -326,6 +394,9 @@ export const runJobs = async (args)=>{
|
|
|
326
394
|
workflowConfig,
|
|
327
395
|
workflowHandler
|
|
328
396
|
});
|
|
397
|
+
console.log(`[${randomID}] job:${job.id} - completed`, {
|
|
398
|
+
status: result.status
|
|
399
|
+
});
|
|
329
400
|
if (result.status === 'success') {
|
|
330
401
|
successfullyCompletedJobs.push(job.id);
|
|
331
402
|
}
|
|
@@ -336,6 +407,9 @@ export const runJobs = async (args)=>{
|
|
|
336
407
|
}
|
|
337
408
|
} catch (error) {
|
|
338
409
|
if (error instanceof JobCancelledError) {
|
|
410
|
+
console.log(`[${randomID}] job:${job.id} - cancelled`, {
|
|
411
|
+
message: error.message
|
|
412
|
+
});
|
|
339
413
|
if (!job.error?.cancelled || !job.hasError || job.processing || job.completedAt || job.waitUntil) {
|
|
340
414
|
// When using the local API to cancel jobs, the local API will update the job data for us to ensure the job is cancelled.
|
|
341
415
|
// But when throwing a JobCancelledError within a task or workflow handler, we are responsible for updating the job data ourselves.
|
|
@@ -364,11 +438,19 @@ export const runJobs = async (args)=>{
|
|
|
364
438
|
}
|
|
365
439
|
};
|
|
366
440
|
}
|
|
441
|
+
console.log(`[${randomID}] job:${job.id} - error thrown`, {
|
|
442
|
+
error: error instanceof Error ? error.message : String(error)
|
|
443
|
+
});
|
|
367
444
|
throw error;
|
|
368
445
|
}
|
|
369
446
|
};
|
|
447
|
+
console.log(`[${randomID}] 12 - starting job execution`, {
|
|
448
|
+
jobCount: jobs.length,
|
|
449
|
+
sequential
|
|
450
|
+
});
|
|
370
451
|
let resultsArray = [];
|
|
371
452
|
if (sequential) {
|
|
453
|
+
console.log(`[${randomID}] 12.1 - running jobs sequentially`);
|
|
372
454
|
for (const job of jobs){
|
|
373
455
|
const result = await runSingleJob(job);
|
|
374
456
|
if (result) {
|
|
@@ -376,10 +458,18 @@ export const runJobs = async (args)=>{
|
|
|
376
458
|
}
|
|
377
459
|
}
|
|
378
460
|
} else {
|
|
461
|
+
console.log(`[${randomID}] 12.2 - running jobs in parallel`);
|
|
379
462
|
const jobPromises = jobs.map(runSingleJob);
|
|
380
463
|
resultsArray = await Promise.all(jobPromises);
|
|
381
464
|
}
|
|
465
|
+
console.log(`[${randomID}] 13 - all jobs executed`, {
|
|
466
|
+
resultsCount: resultsArray.length,
|
|
467
|
+
successfulCount: successfullyCompletedJobs.length
|
|
468
|
+
});
|
|
382
469
|
if (jobsConfig.deleteJobOnComplete && successfullyCompletedJobs.length) {
|
|
470
|
+
console.log(`[${randomID}] 14 - deleting completed jobs`, {
|
|
471
|
+
count: successfullyCompletedJobs.length
|
|
472
|
+
});
|
|
383
473
|
try {
|
|
384
474
|
if (jobsConfig.runHooks) {
|
|
385
475
|
await payload.delete({
|
|
@@ -425,6 +515,11 @@ export const runJobs = async (args)=>{
|
|
|
425
515
|
remainingJobsFromQueried++; // Can be retried
|
|
426
516
|
}
|
|
427
517
|
}
|
|
518
|
+
console.log(`[${randomID}] 15 - runJobs complete`, {
|
|
519
|
+
remainingJobsFromQueried,
|
|
520
|
+
successCount: successfullyCompletedJobs.length,
|
|
521
|
+
totalProcessed: Object.keys(resultsObject).length
|
|
522
|
+
});
|
|
428
523
|
return {
|
|
429
524
|
jobStatus: resultsObject,
|
|
430
525
|
remainingJobsFromQueried
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/queues/operations/runJobs/index.ts"],"sourcesContent":["import type { Job } from '../../../index.js'\nimport type { PayloadRequest, Sort, Where } from '../../../types/index.js'\nimport type { WorkflowJSON } from '../../config/types/workflowJSONTypes.js'\nimport type { WorkflowConfig, WorkflowHandler } from '../../config/types/workflowTypes.js'\nimport type { RunJobsSilent } from '../../localAPI.js'\nimport type { RunJobResult } from './runJob/index.js'\n\nimport { Forbidden } from '../../../errors/Forbidden.js'\nimport { isolateObjectProperty } from '../../../utilities/isolateObjectProperty.js'\nimport { jobsCollectionSlug } from '../../config/collection.js'\nimport { JobCancelledError } from '../../errors/index.js'\nimport { getCurrentDate } from '../../utilities/getCurrentDate.js'\nimport { updateJob, updateJobs } from '../../utilities/updateJob.js'\nimport { getUpdateJobFunction } from './runJob/getUpdateJobFunction.js'\nimport { importHandlerPath } from './runJob/importHandlerPath.js'\nimport { runJob } from './runJob/index.js'\nimport { runJSONJob } from './runJSONJob/index.js'\n\nexport type RunJobsArgs = {\n /**\n * If you want to run jobs from all queues, set this to true.\n * If you set this to true, the `queue` property will be ignored.\n *\n * @default false\n */\n allQueues?: boolean\n /**\n * ID of the job to run\n */\n id?: number | string\n /**\n * The maximum number of jobs to run in this invocation\n *\n * @default 10\n */\n limit?: number\n overrideAccess?: boolean\n /**\n * Adjust the job processing order\n *\n * FIFO would equal `createdAt` and LIFO would equal `-createdAt`.\n *\n * @default all jobs for all queues will be executed in FIFO order.\n */\n processingOrder?: Sort\n /**\n * If you want to run jobs from a specific queue, set this to the queue name.\n *\n * @default jobs from the `default` queue will be executed.\n */\n queue?: string\n req: PayloadRequest\n /**\n * By default, jobs are run in parallel.\n * If you want to run them in sequence, set this to true.\n */\n sequential?: boolean\n /**\n * If set to true, the job system will not log any output to the console (for both info and error logs).\n * Can be an option for more granular control over logging.\n *\n * This will not automatically affect user-configured logs (e.g. if you call `console.log` or `payload.logger.info` in your job code).\n *\n * @default false\n */\n silent?: RunJobsSilent\n where?: Where\n}\n\nexport type RunJobsResult = {\n jobStatus?: Record<string, RunJobResult>\n /**\n * If this is true, there for sure are no jobs remaining, regardless of the limit\n */\n noJobsRemaining?: boolean\n /**\n * Out of the jobs that were queried & processed (within the set limit), how many are remaining and retryable?\n */\n remainingJobsFromQueried: number\n}\n\nexport const runJobs = async (args: RunJobsArgs): Promise<RunJobsResult> => {\n const {\n id,\n allQueues = false,\n limit = 10,\n overrideAccess,\n processingOrder,\n queue = 'default',\n req,\n req: {\n payload,\n payload: {\n config: { jobs: jobsConfig },\n },\n },\n sequential,\n silent = false,\n where: whereFromProps,\n } = args\n\n if (!overrideAccess) {\n /**\n * By default, jobsConfig.access.run will be `defaultAccess` which is a function that returns `true` if the user is logged in.\n */\n const accessFn = jobsConfig?.access?.run ?? (() => true)\n const hasAccess = await accessFn({ req })\n if (!hasAccess) {\n throw new Forbidden(req.t)\n }\n }\n const and: Where[] = [\n {\n completedAt: {\n exists: false,\n },\n },\n {\n hasError: {\n not_equals: true,\n },\n },\n {\n processing: {\n equals: false,\n },\n },\n {\n or: [\n {\n waitUntil: {\n exists: false,\n },\n },\n {\n waitUntil: {\n less_than: getCurrentDate().toISOString(),\n },\n },\n ],\n },\n ]\n\n if (allQueues !== true) {\n and.push({\n queue: {\n equals: queue ?? 'default',\n },\n })\n }\n\n if (whereFromProps) {\n and.push(whereFromProps)\n }\n\n // Only enforce concurrency controls if the feature is enabled\n if (jobsConfig.enableConcurrencyControl) {\n // Find currently running jobs with concurrency keys to enforce exclusive concurrency\n // Jobs with the same concurrencyKey should not run in parallel\n const runningJobsWithConcurrency = await payload.db.find({\n collection: jobsCollectionSlug,\n limit: 0,\n pagination: false,\n req: { transactionID: undefined },\n select: {\n concurrencyKey: true,\n },\n where: {\n and: [{ processing: { equals: true } }, { concurrencyKey: { exists: true } }],\n },\n })\n\n const runningConcurrencyKeys = new Set<string>()\n if (runningJobsWithConcurrency?.docs) {\n for (const doc of runningJobsWithConcurrency.docs) {\n const concurrencyKey = (doc as Job).concurrencyKey\n if (concurrencyKey) {\n runningConcurrencyKeys.add(concurrencyKey)\n }\n }\n }\n\n // Exclude jobs whose concurrencyKey is already running\n if (runningConcurrencyKeys.size > 0) {\n and.push({\n or: [\n // Jobs without a concurrency key can always run\n { concurrencyKey: { exists: false } },\n // Jobs with a concurrency key that is not currently running can run\n { concurrencyKey: { not_in: [...runningConcurrencyKeys] } },\n ],\n })\n }\n }\n\n // Find all jobs and ensure we set job to processing: true as early as possible to reduce the chance of\n // the same job being picked up by another worker\n let jobs: Job[] = []\n\n if (id) {\n // Only one job to run\n const job = await updateJob({\n id,\n data: {\n processing: true,\n },\n depth: jobsConfig.depth,\n disableTransaction: true,\n req,\n returning: true,\n })\n if (job) {\n jobs = [job]\n }\n } else {\n let defaultProcessingOrder: Sort =\n payload.collections[jobsCollectionSlug]?.config.defaultSort ?? 'createdAt'\n\n const processingOrderConfig = jobsConfig.processingOrder\n if (typeof processingOrderConfig === 'function') {\n defaultProcessingOrder = await processingOrderConfig(args)\n } else if (typeof processingOrderConfig === 'object' && !Array.isArray(processingOrderConfig)) {\n if (\n !allQueues &&\n queue &&\n processingOrderConfig.queues &&\n processingOrderConfig.queues[queue]\n ) {\n defaultProcessingOrder = processingOrderConfig.queues[queue]\n } else if (processingOrderConfig.default) {\n defaultProcessingOrder = processingOrderConfig.default\n }\n } else if (typeof processingOrderConfig === 'string') {\n defaultProcessingOrder = processingOrderConfig\n }\n const updatedDocs = await updateJobs({\n data: {\n processing: true,\n },\n depth: jobsConfig.depth,\n disableTransaction: true,\n limit,\n req,\n returning: true,\n sort: processingOrder ?? defaultProcessingOrder,\n where: { and },\n })\n\n if (updatedDocs) {\n jobs = updatedDocs\n }\n }\n\n if (!jobs.length) {\n return {\n noJobsRemaining: true,\n remainingJobsFromQueried: 0,\n }\n }\n\n // Only handle concurrency deduplication if the feature is enabled\n if (jobsConfig.enableConcurrencyControl) {\n // Handle the case where multiple jobs with the same concurrencyKey were picked up in the same batch\n // We should only run one job per concurrencyKey, release the others back to pending\n const seenConcurrencyKeys = new Set<string>()\n const jobsToRun: Job[] = []\n const jobsToRelease: Job[] = []\n\n for (const job of jobs) {\n if (job.concurrencyKey) {\n if (seenConcurrencyKeys.has(job.concurrencyKey)) {\n // This job has the same concurrencyKey as another job we're already running\n jobsToRelease.push(job)\n } else {\n seenConcurrencyKeys.add(job.concurrencyKey)\n jobsToRun.push(job)\n }\n } else {\n jobsToRun.push(job)\n }\n }\n\n // Release duplicate concurrencyKey jobs back to pending state\n if (jobsToRelease.length > 0) {\n const releaseIds = jobsToRelease.map((job) => job.id)\n await updateJobs({\n data: { processing: false },\n disableTransaction: true,\n req,\n returning: false,\n where: { id: { in: releaseIds } },\n })\n }\n\n // Use only the filtered jobs going forward\n jobs = jobsToRun\n }\n\n if (!jobs.length) {\n return {\n noJobsRemaining: false,\n remainingJobsFromQueried: 0,\n }\n }\n\n /**\n * Just for logging purposes, we want to know how many jobs are new and how many are existing (= already been tried).\n * This is only for logs - in the end we still want to run all jobs, regardless of whether they are new or existing.\n */\n const { existingJobs, newJobs } = jobs.reduce(\n (acc, job) => {\n if (job.totalTried > 0) {\n acc.existingJobs.push(job)\n } else {\n acc.newJobs.push(job)\n }\n return acc\n },\n { existingJobs: [] as Job[], newJobs: [] as Job[] },\n )\n\n if (!silent || (typeof silent === 'object' && !silent.info)) {\n payload.logger.info({\n msg: `Running ${jobs.length} jobs.`,\n new: newJobs?.length,\n retrying: existingJobs?.length,\n })\n }\n\n const successfullyCompletedJobs: (number | string)[] = []\n\n const runSingleJob = async (\n job: Job,\n ): Promise<{\n id: number | string\n result: RunJobResult\n }> => {\n if (!job.workflowSlug && !job.taskSlug) {\n throw new Error('Job must have either a workflowSlug or a taskSlug')\n }\n const jobReq = isolateObjectProperty(req, 'transactionID')\n\n const workflowConfig: WorkflowConfig =\n job.workflowSlug && jobsConfig.workflows?.length\n ? jobsConfig.workflows.find(({ slug }) => slug === job.workflowSlug)!\n : {\n slug: 'singleTask',\n handler: async ({ job, tasks }) => {\n await tasks[job.taskSlug as string]!('1', {\n input: job.input,\n })\n },\n }\n\n if (!workflowConfig) {\n return {\n id: job.id,\n result: {\n status: 'error',\n },\n } // Skip jobs with no workflow configuration\n }\n\n try {\n const updateJob = getUpdateJobFunction(job, jobReq)\n\n // the runner will either be passed to the config\n // OR it will be a path, which we will need to import via eval to avoid\n // Next.js compiler dynamic import expression errors\n let workflowHandler: WorkflowHandler | WorkflowJSON\n if (\n typeof workflowConfig.handler === 'function' ||\n (typeof workflowConfig.handler === 'object' && Array.isArray(workflowConfig.handler))\n ) {\n workflowHandler = workflowConfig.handler\n } else {\n workflowHandler = await importHandlerPath<typeof workflowHandler>(workflowConfig.handler)\n\n if (!workflowHandler) {\n const jobLabel = job.workflowSlug || `Task: ${job.taskSlug}`\n const errorMessage = `Can't find runner while importing with the path ${workflowConfig.handler} in job type ${jobLabel}.`\n if (!silent || (typeof silent === 'object' && !silent.error)) {\n payload.logger.error(errorMessage)\n }\n\n await updateJob({\n error: {\n error: errorMessage,\n },\n hasError: true,\n processing: false,\n })\n\n return {\n id: job.id,\n result: {\n status: 'error-reached-max-retries',\n },\n }\n }\n }\n\n if (typeof workflowHandler === 'function') {\n const result = await runJob({\n job,\n req: jobReq,\n silent,\n updateJob,\n workflowConfig,\n workflowHandler,\n })\n\n if (result.status === 'success') {\n successfullyCompletedJobs.push(job.id)\n }\n\n return { id: job.id, result }\n } else {\n const result = await runJSONJob({\n job,\n req: jobReq,\n silent,\n updateJob,\n workflowConfig,\n workflowHandler,\n })\n\n if (result.status === 'success') {\n successfullyCompletedJobs.push(job.id)\n }\n\n return { id: job.id, result }\n }\n } catch (error) {\n if (error instanceof JobCancelledError) {\n if (\n !(job.error as Record<string, unknown> | undefined)?.cancelled ||\n !job.hasError ||\n job.processing ||\n job.completedAt ||\n job.waitUntil\n ) {\n // When using the local API to cancel jobs, the local API will update the job data for us to ensure the job is cancelled.\n // But when throwing a JobCancelledError within a task or workflow handler, we are responsible for updating the job data ourselves.\n await updateJob({\n id: job.id,\n data: {\n completedAt: null,\n error: {\n cancelled: true,\n message: error.message,\n },\n hasError: true,\n processing: false,\n waitUntil: null,\n },\n depth: 0,\n disableTransaction: true,\n req,\n returning: false,\n })\n }\n\n return {\n id: job.id,\n result: {\n status: 'error-reached-max-retries',\n },\n }\n }\n throw error\n }\n }\n\n let resultsArray: { id: number | string; result: RunJobResult }[] = []\n if (sequential) {\n for (const job of jobs) {\n const result = await runSingleJob(job)\n if (result) {\n resultsArray.push(result)\n }\n }\n } else {\n const jobPromises = jobs.map(runSingleJob)\n resultsArray = (await Promise.all(jobPromises)) as {\n id: number | string\n result: RunJobResult\n }[]\n }\n\n if (jobsConfig.deleteJobOnComplete && successfullyCompletedJobs.length) {\n try {\n if (jobsConfig.runHooks) {\n await payload.delete({\n collection: jobsCollectionSlug,\n depth: 0, // can be 0 since we're not returning anything\n disableTransaction: true,\n where: { id: { in: successfullyCompletedJobs } },\n })\n } else {\n await payload.db.deleteMany({\n collection: jobsCollectionSlug,\n where: { id: { in: successfullyCompletedJobs } },\n })\n }\n } catch (err) {\n if (!silent || (typeof silent === 'object' && !silent.error)) {\n payload.logger.error({\n err,\n msg: `Failed to delete jobs ${successfullyCompletedJobs.join(', ')} on complete`,\n })\n }\n }\n }\n\n const resultsObject: RunJobsResult['jobStatus'] = resultsArray.reduce(\n (acc, cur) => {\n if (cur !== null) {\n // Check if there's a valid result to include\n acc[cur.id] = cur.result\n }\n return acc\n },\n {} as Record<string, RunJobResult>,\n )\n\n let remainingJobsFromQueried = 0\n for (const jobID in resultsObject) {\n const jobResult = resultsObject[jobID]\n if (jobResult?.status === 'error') {\n remainingJobsFromQueried++ // Can be retried\n }\n }\n\n return {\n jobStatus: resultsObject,\n remainingJobsFromQueried,\n }\n}\n"],"names":["Forbidden","isolateObjectProperty","jobsCollectionSlug","JobCancelledError","getCurrentDate","updateJob","updateJobs","getUpdateJobFunction","importHandlerPath","runJob","runJSONJob","runJobs","args","id","allQueues","limit","overrideAccess","processingOrder","queue","req","payload","config","jobs","jobsConfig","sequential","silent","where","whereFromProps","accessFn","access","run","hasAccess","t","and","completedAt","exists","hasError","not_equals","processing","equals","or","waitUntil","less_than","toISOString","push","enableConcurrencyControl","runningJobsWithConcurrency","db","find","collection","pagination","transactionID","undefined","select","concurrencyKey","runningConcurrencyKeys","Set","docs","doc","add","size","not_in","job","data","depth","disableTransaction","returning","defaultProcessingOrder","collections","defaultSort","processingOrderConfig","Array","isArray","queues","default","updatedDocs","sort","length","noJobsRemaining","remainingJobsFromQueried","seenConcurrencyKeys","jobsToRun","jobsToRelease","has","releaseIds","map","in","existingJobs","newJobs","reduce","acc","totalTried","info","logger","msg","new","retrying","successfullyCompletedJobs","runSingleJob","workflowSlug","taskSlug","Error","jobReq","workflowConfig","workflows","slug","handler","tasks","input","result","status","workflowHandler","jobLabel","errorMessage","error","cancelled","message","resultsArray","jobPromises","Promise","all","deleteJobOnComplete","runHooks","delete","deleteMany","err","join","resultsObject","cur","jobID","jobResult","jobStatus"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/queues/operations/runJobs/index.ts"],"sourcesContent":["import type { Job } from '../../../index.js'\nimport type { PayloadRequest, Sort, Where } from '../../../types/index.js'\nimport type { WorkflowJSON } from '../../config/types/workflowJSONTypes.js'\nimport type { WorkflowConfig, WorkflowHandler } from '../../config/types/workflowTypes.js'\nimport type { RunJobsSilent } from '../../localAPI.js'\nimport type { RunJobResult } from './runJob/index.js'\n\nimport { Forbidden } from '../../../errors/Forbidden.js'\nimport { isolateObjectProperty } from '../../../utilities/isolateObjectProperty.js'\nimport { jobsCollectionSlug } from '../../config/collection.js'\nimport { JobCancelledError } from '../../errors/index.js'\nimport { getCurrentDate } from '../../utilities/getCurrentDate.js'\nimport { updateJob, updateJobs } from '../../utilities/updateJob.js'\nimport { getUpdateJobFunction } from './runJob/getUpdateJobFunction.js'\nimport { importHandlerPath } from './runJob/importHandlerPath.js'\nimport { runJob } from './runJob/index.js'\nimport { runJSONJob } from './runJSONJob/index.js'\n\nexport type RunJobsArgs = {\n /**\n * If you want to run jobs from all queues, set this to true.\n * If you set this to true, the `queue` property will be ignored.\n *\n * @default false\n */\n allQueues?: boolean\n /**\n * ID of the job to run\n */\n id?: number | string\n /**\n * The maximum number of jobs to run in this invocation\n *\n * @default 10\n */\n limit?: number\n overrideAccess?: boolean\n /**\n * Adjust the job processing order\n *\n * FIFO would equal `createdAt` and LIFO would equal `-createdAt`.\n *\n * @default all jobs for all queues will be executed in FIFO order.\n */\n processingOrder?: Sort\n /**\n * If you want to run jobs from a specific queue, set this to the queue name.\n *\n * @default jobs from the `default` queue will be executed.\n */\n queue?: string\n randomID?: string\n req: PayloadRequest\n /**\n * By default, jobs are run in parallel.\n * If you want to run them in sequence, set this to true.\n */\n sequential?: boolean\n /**\n * If set to true, the job system will not log any output to the console (for both info and error logs).\n * Can be an option for more granular control over logging.\n *\n * This will not automatically affect user-configured logs (e.g. if you call `console.log` or `payload.logger.info` in your job code).\n *\n * @default false\n */\n silent?: RunJobsSilent\n where?: Where\n}\n\nexport type RunJobsResult = {\n jobStatus?: Record<string, RunJobResult>\n /**\n * If this is true, there for sure are no jobs remaining, regardless of the limit\n */\n noJobsRemaining?: boolean\n /**\n * Out of the jobs that were queried & processed (within the set limit), how many are remaining and retryable?\n */\n remainingJobsFromQueried: number\n}\n\nexport const runJobs = async (args: RunJobsArgs): Promise<RunJobsResult> => {\n const {\n id,\n allQueues = false,\n limit = 10,\n overrideAccess,\n processingOrder,\n queue = 'default',\n randomID,\n req,\n req: {\n payload,\n payload: {\n config: { jobs: jobsConfig },\n },\n },\n sequential,\n silent = false,\n where: whereFromProps,\n } = args\n console.log(`[${randomID}] 2 - runJobs started`, {\n id,\n allQueues,\n limit,\n queue,\n sequential,\n })\n\n if (!overrideAccess) {\n /**\n * By default, jobsConfig.access.run will be `defaultAccess` which is a function that returns `true` if the user is logged in.\n */\n const accessFn = jobsConfig?.access?.run ?? (() => true)\n const hasAccess = await accessFn({ req })\n if (!hasAccess) {\n throw new Forbidden(req.t)\n }\n }\n console.log(`[${randomID}] 3 - access check passed`)\n\n const and: Where[] = [\n {\n completedAt: {\n exists: false,\n },\n },\n {\n hasError: {\n not_equals: true,\n },\n },\n {\n processing: {\n equals: false,\n },\n },\n {\n or: [\n {\n waitUntil: {\n exists: false,\n },\n },\n {\n waitUntil: {\n less_than: getCurrentDate().toISOString(),\n },\n },\n ],\n },\n ]\n\n if (allQueues !== true) {\n and.push({\n queue: {\n equals: queue ?? 'default',\n },\n })\n }\n\n if (whereFromProps) {\n and.push(whereFromProps)\n }\n console.log(`[${args?.randomID}] 4`)\n\n // Only enforce concurrency controls if the feature is enabled\n if (jobsConfig.enableConcurrencyControl) {\n // Find currently running jobs with concurrency keys to enforce exclusive concurrency\n // Jobs with the same concurrencyKey should not run in parallel\n const runningJobsWithConcurrency = await payload.db.find({\n collection: jobsCollectionSlug,\n limit: 0,\n pagination: false,\n req: { transactionID: undefined },\n select: {\n concurrencyKey: true,\n },\n where: {\n and: [{ processing: { equals: true } }, { concurrencyKey: { exists: true } }],\n },\n })\n\n const runningConcurrencyKeys = new Set<string>()\n if (runningJobsWithConcurrency?.docs) {\n for (const doc of runningJobsWithConcurrency.docs) {\n const concurrencyKey = (doc as Job).concurrencyKey\n if (concurrencyKey) {\n runningConcurrencyKeys.add(concurrencyKey)\n }\n }\n }\n\n // Exclude jobs whose concurrencyKey is already running\n if (runningConcurrencyKeys.size > 0) {\n and.push({\n or: [\n // Jobs without a concurrency key can always run\n { concurrencyKey: { exists: false } },\n // Jobs with a concurrency key that is not currently running can run\n { concurrencyKey: { not_in: [...runningConcurrencyKeys] } },\n ],\n })\n }\n }\n\n console.log(`[${randomID}] 5 - concurrency control done, querying jobs`, {\n id,\n enableConcurrencyControl: jobsConfig.enableConcurrencyControl,\n })\n\n // Find all jobs and ensure we set job to processing: true as early as possible to reduce the chance of\n // the same job being picked up by another worker\n let jobs: Job[] = []\n\n if (id) {\n console.log(`[${randomID}] 5.1 - fetching single job by ID: ${id}`)\n\n // Only one job to run\n const job = await updateJob({\n id,\n data: {\n processing: true,\n },\n depth: jobsConfig.depth,\n disableTransaction: true,\n req,\n returning: true,\n })\n console.log(`[${randomID}] 5.2 - single job fetched`, { found: !!job })\n\n if (job) {\n jobs = [job]\n }\n } else {\n console.log(`[${randomID}] 5.3 - fetching multiple jobs with limit: ${limit}`)\n\n let defaultProcessingOrder: Sort =\n payload.collections[jobsCollectionSlug]?.config.defaultSort ?? 'createdAt'\n\n const processingOrderConfig = jobsConfig.processingOrder\n if (typeof processingOrderConfig === 'function') {\n defaultProcessingOrder = await processingOrderConfig(args)\n } else if (typeof processingOrderConfig === 'object' && !Array.isArray(processingOrderConfig)) {\n if (\n !allQueues &&\n queue &&\n processingOrderConfig.queues &&\n processingOrderConfig.queues[queue]\n ) {\n defaultProcessingOrder = processingOrderConfig.queues[queue]\n } else if (processingOrderConfig.default) {\n defaultProcessingOrder = processingOrderConfig.default\n }\n } else if (typeof processingOrderConfig === 'string') {\n defaultProcessingOrder = processingOrderConfig\n }\n\n console.log(`[${randomID}] 5.3.1 - using where query \"and\":`, and)\n\n const updatedDocs = await updateJobs({\n data: {\n processing: true,\n },\n debugID: randomID,\n depth: jobsConfig.depth,\n disableTransaction: true,\n limit,\n req,\n returning: true,\n sort: processingOrder ?? defaultProcessingOrder,\n where: { and },\n })\n console.log(`[${randomID}] 5.4 - multiple jobs fetched`, { count: updatedDocs?.length ?? 0 })\n if ((updatedDocs?.length ?? 0) > 0) {\n console.log(`[${randomID}] 5.5 - jobs found! fetched:`, { jobs: updatedDocs })\n }\n // Fetch ALL jobs using payload.db.find({})\n const allJobs = await payload.db.find({\n collection: jobsCollectionSlug,\n limit: 0,\n req,\n })\n console.log(`[${randomID}] 5.6 - all jobs fetched`, {\n allJobs: allJobs?.docs,\n count: allJobs?.totalDocs,\n })\n\n const anyRunnableJobs = allJobs?.docs?.some(\n (job: any) =>\n job?.processing === false &&\n job?.hasError === false &&\n !job?.completedAt &&\n !job?.waitUntil,\n )\n if (anyRunnableJobs && updatedDocs?.length === 0) {\n console.log(`[${randomID}] 5.6.1 - potential issue here.`)\n }\n\n if (updatedDocs) {\n jobs = updatedDocs\n }\n }\n console.log(`[${randomID}] 6 - jobs to process`, {\n count: jobs.length,\n jobIds: jobs.map((j) => j.id),\n })\n\n if (!jobs.length) {\n console.log(`[${randomID}] 7 - no jobs found, returning early`)\n\n return {\n noJobsRemaining: true,\n remainingJobsFromQueried: 0,\n }\n }\n\n // Only handle concurrency deduplication if the feature is enabled\n if (jobsConfig.enableConcurrencyControl) {\n // Handle the case where multiple jobs with the same concurrencyKey were picked up in the same batch\n // We should only run one job per concurrencyKey, release the others back to pending\n const seenConcurrencyKeys = new Set<string>()\n const jobsToRun: Job[] = []\n const jobsToRelease: Job[] = []\n\n for (const job of jobs) {\n if (job.concurrencyKey) {\n if (seenConcurrencyKeys.has(job.concurrencyKey)) {\n // This job has the same concurrencyKey as another job we're already running\n jobsToRelease.push(job)\n } else {\n seenConcurrencyKeys.add(job.concurrencyKey)\n jobsToRun.push(job)\n }\n } else {\n jobsToRun.push(job)\n }\n }\n\n // Release duplicate concurrencyKey jobs back to pending state\n if (jobsToRelease.length > 0) {\n const releaseIds = jobsToRelease.map((job) => job.id)\n await updateJobs({\n data: { processing: false },\n debugID: randomID,\n disableTransaction: true,\n req,\n returning: false,\n where: { id: { in: releaseIds } },\n })\n }\n\n // Use only the filtered jobs going forward\n jobs = jobsToRun\n }\n console.log(`[${randomID}] 8 - concurrency dedup done`, { jobsToRun: jobs.length })\n\n if (!jobs.length) {\n console.log(`[${randomID}] 9 - all jobs were duplicates, returning early`)\n\n return {\n noJobsRemaining: false,\n remainingJobsFromQueried: 0,\n }\n }\n console.log(`[${randomID}] 10 - preparing to run ${jobs.length} jobs`)\n\n /**\n * Just for logging purposes, we want to know how many jobs are new and how many are existing (= already been tried).\n * This is only for logs - in the end we still want to run all jobs, regardless of whether they are new or existing.\n */\n const { existingJobs, newJobs } = jobs.reduce(\n (acc, job) => {\n if (job.totalTried > 0) {\n acc.existingJobs.push(job)\n } else {\n acc.newJobs.push(job)\n }\n return acc\n },\n { existingJobs: [] as Job[], newJobs: [] as Job[] },\n )\n\n console.log(`[${randomID}] 11 - job breakdown`, {\n existingJobCount: existingJobs.length,\n newJobCount: newJobs.length,\n })\n\n if (!silent || (typeof silent === 'object' && !silent.info)) {\n payload.logger.info({\n msg: `Running ${jobs.length} jobs.`,\n new: newJobs?.length,\n retrying: existingJobs?.length,\n })\n }\n\n const successfullyCompletedJobs: (number | string)[] = []\n\n const runSingleJob = async (\n job: Job,\n ): Promise<{\n id: number | string\n result: RunJobResult\n }> => {\n console.log(`[${randomID}] job:${job.id} - starting`, {\n taskSlug: job.taskSlug,\n totalTried: job.totalTried,\n workflowSlug: job.workflowSlug,\n })\n\n if (!job.workflowSlug && !job.taskSlug) {\n throw new Error('Job must have either a workflowSlug or a taskSlug')\n }\n const jobReq = isolateObjectProperty(req, 'transactionID')\n\n const workflowConfig: WorkflowConfig =\n job.workflowSlug && jobsConfig.workflows?.length\n ? jobsConfig.workflows.find(({ slug }) => slug === job.workflowSlug)!\n : {\n slug: 'singleTask',\n handler: async ({ job, tasks }) => {\n await tasks[job.taskSlug as string]!('1', {\n input: job.input,\n })\n },\n }\n\n if (!workflowConfig) {\n console.log(`[${randomID}] job:${job.id} - no workflow config found, skipping`)\n return {\n id: job.id,\n result: {\n status: 'error',\n },\n } // Skip jobs with no workflow configuration\n }\n\n try {\n const updateJob = getUpdateJobFunction(job, jobReq)\n\n // the runner will either be passed to the config\n // OR it will be a path, which we will need to import via eval to avoid\n // Next.js compiler dynamic import expression errors\n let workflowHandler: WorkflowHandler | WorkflowJSON\n if (\n typeof workflowConfig.handler === 'function' ||\n (typeof workflowConfig.handler === 'object' && Array.isArray(workflowConfig.handler))\n ) {\n workflowHandler = workflowConfig.handler\n } else {\n workflowHandler = await importHandlerPath<typeof workflowHandler>(workflowConfig.handler)\n\n if (!workflowHandler) {\n const jobLabel = job.workflowSlug || `Task: ${job.taskSlug}`\n const errorMessage = `Can't find runner while importing with the path ${workflowConfig.handler} in job type ${jobLabel}.`\n if (!silent || (typeof silent === 'object' && !silent.error)) {\n payload.logger.error(errorMessage)\n }\n\n await updateJob({\n error: {\n error: errorMessage,\n },\n hasError: true,\n processing: false,\n })\n\n return {\n id: job.id,\n result: {\n status: 'error-reached-max-retries',\n },\n }\n }\n }\n\n if (typeof workflowHandler === 'function') {\n console.log(`[${randomID}] job:${job.id} - running function handler`)\n const result = await runJob({\n job,\n req: jobReq,\n silent,\n updateJob,\n workflowConfig,\n workflowHandler,\n })\n\n console.log(`[${randomID}] job:${job.id} - completed`, { status: result.status })\n\n if (result.status === 'success') {\n successfullyCompletedJobs.push(job.id)\n }\n\n return { id: job.id, result }\n } else {\n console.log(`[${randomID}] job:${job.id} - running JSON handler`)\n const result = await runJSONJob({\n job,\n req: jobReq,\n silent,\n updateJob,\n workflowConfig,\n workflowHandler,\n })\n\n console.log(`[${randomID}] job:${job.id} - completed`, { status: result.status })\n\n if (result.status === 'success') {\n successfullyCompletedJobs.push(job.id)\n }\n\n return { id: job.id, result }\n }\n } catch (error) {\n if (error instanceof JobCancelledError) {\n console.log(`[${randomID}] job:${job.id} - cancelled`, { message: error.message })\n if (\n !(job.error as Record<string, unknown> | undefined)?.cancelled ||\n !job.hasError ||\n job.processing ||\n job.completedAt ||\n job.waitUntil\n ) {\n // When using the local API to cancel jobs, the local API will update the job data for us to ensure the job is cancelled.\n // But when throwing a JobCancelledError within a task or workflow handler, we are responsible for updating the job data ourselves.\n await updateJob({\n id: job.id,\n data: {\n completedAt: null,\n error: {\n cancelled: true,\n message: error.message,\n },\n hasError: true,\n processing: false,\n waitUntil: null,\n },\n depth: 0,\n disableTransaction: true,\n req,\n returning: false,\n })\n }\n\n return {\n id: job.id,\n result: {\n status: 'error-reached-max-retries',\n },\n }\n }\n console.log(`[${randomID}] job:${job.id} - error thrown`, {\n error: error instanceof Error ? error.message : String(error),\n })\n throw error\n }\n }\n\n console.log(`[${randomID}] 12 - starting job execution`, {\n jobCount: jobs.length,\n sequential,\n })\n\n let resultsArray: { id: number | string; result: RunJobResult }[] = []\n if (sequential) {\n console.log(`[${randomID}] 12.1 - running jobs sequentially`)\n\n for (const job of jobs) {\n const result = await runSingleJob(job)\n if (result) {\n resultsArray.push(result)\n }\n }\n } else {\n console.log(`[${randomID}] 12.2 - running jobs in parallel`)\n const jobPromises = jobs.map(runSingleJob)\n resultsArray = (await Promise.all(jobPromises)) as {\n id: number | string\n result: RunJobResult\n }[]\n }\n\n console.log(`[${randomID}] 13 - all jobs executed`, {\n resultsCount: resultsArray.length,\n successfulCount: successfullyCompletedJobs.length,\n })\n\n if (jobsConfig.deleteJobOnComplete && successfullyCompletedJobs.length) {\n console.log(`[${randomID}] 14 - deleting completed jobs`, {\n count: successfullyCompletedJobs.length,\n })\n try {\n if (jobsConfig.runHooks) {\n await payload.delete({\n collection: jobsCollectionSlug,\n depth: 0, // can be 0 since we're not returning anything\n disableTransaction: true,\n where: { id: { in: successfullyCompletedJobs } },\n })\n } else {\n await payload.db.deleteMany({\n collection: jobsCollectionSlug,\n where: { id: { in: successfullyCompletedJobs } },\n })\n }\n } catch (err) {\n if (!silent || (typeof silent === 'object' && !silent.error)) {\n payload.logger.error({\n err,\n msg: `Failed to delete jobs ${successfullyCompletedJobs.join(', ')} on complete`,\n })\n }\n }\n }\n\n const resultsObject: RunJobsResult['jobStatus'] = resultsArray.reduce(\n (acc, cur) => {\n if (cur !== null) {\n // Check if there's a valid result to include\n acc[cur.id] = cur.result\n }\n return acc\n },\n {} as Record<string, RunJobResult>,\n )\n\n let remainingJobsFromQueried = 0\n for (const jobID in resultsObject) {\n const jobResult = resultsObject[jobID]\n if (jobResult?.status === 'error') {\n remainingJobsFromQueried++ // Can be retried\n }\n }\n\n console.log(`[${randomID}] 15 - runJobs complete`, {\n remainingJobsFromQueried,\n successCount: successfullyCompletedJobs.length,\n totalProcessed: Object.keys(resultsObject).length,\n })\n\n return {\n jobStatus: resultsObject,\n remainingJobsFromQueried,\n }\n}\n"],"names":["Forbidden","isolateObjectProperty","jobsCollectionSlug","JobCancelledError","getCurrentDate","updateJob","updateJobs","getUpdateJobFunction","importHandlerPath","runJob","runJSONJob","runJobs","args","id","allQueues","limit","overrideAccess","processingOrder","queue","randomID","req","payload","config","jobs","jobsConfig","sequential","silent","where","whereFromProps","console","log","accessFn","access","run","hasAccess","t","and","completedAt","exists","hasError","not_equals","processing","equals","or","waitUntil","less_than","toISOString","push","enableConcurrencyControl","runningJobsWithConcurrency","db","find","collection","pagination","transactionID","undefined","select","concurrencyKey","runningConcurrencyKeys","Set","docs","doc","add","size","not_in","job","data","depth","disableTransaction","returning","found","defaultProcessingOrder","collections","defaultSort","processingOrderConfig","Array","isArray","queues","default","updatedDocs","debugID","sort","count","length","allJobs","totalDocs","anyRunnableJobs","some","jobIds","map","j","noJobsRemaining","remainingJobsFromQueried","seenConcurrencyKeys","jobsToRun","jobsToRelease","has","releaseIds","in","existingJobs","newJobs","reduce","acc","totalTried","existingJobCount","newJobCount","info","logger","msg","new","retrying","successfullyCompletedJobs","runSingleJob","taskSlug","workflowSlug","Error","jobReq","workflowConfig","workflows","slug","handler","tasks","input","result","status","workflowHandler","jobLabel","errorMessage","error","message","cancelled","String","jobCount","resultsArray","jobPromises","Promise","all","resultsCount","successfulCount","deleteJobOnComplete","runHooks","delete","deleteMany","err","join","resultsObject","cur","jobID","jobResult","successCount","totalProcessed","Object","keys","jobStatus"],"mappings":"AAOA,SAASA,SAAS,QAAQ,+BAA8B;AACxD,SAASC,qBAAqB,QAAQ,8CAA6C;AACnF,SAASC,kBAAkB,QAAQ,6BAA4B;AAC/D,SAASC,iBAAiB,QAAQ,wBAAuB;AACzD,SAASC,cAAc,QAAQ,oCAAmC;AAClE,SAASC,SAAS,EAAEC,UAAU,QAAQ,+BAA8B;AACpE,SAASC,oBAAoB,QAAQ,mCAAkC;AACvE,SAASC,iBAAiB,QAAQ,gCAA+B;AACjE,SAASC,MAAM,QAAQ,oBAAmB;AAC1C,SAASC,UAAU,QAAQ,wBAAuB;AAkElD,OAAO,MAAMC,UAAU,OAAOC;IAC5B,MAAM,EACJC,EAAE,EACFC,YAAY,KAAK,EACjBC,QAAQ,EAAE,EACVC,cAAc,EACdC,eAAe,EACfC,QAAQ,SAAS,EACjBC,QAAQ,EACRC,GAAG,EACHA,KAAK,EACHC,OAAO,EACPA,SAAS,EACPC,QAAQ,EAAEC,MAAMC,UAAU,EAAE,EAC7B,EACF,EACDC,UAAU,EACVC,SAAS,KAAK,EACdC,OAAOC,cAAc,EACtB,GAAGhB;IACJiB,QAAQC,GAAG,CAAC,CAAC,CAAC,EAAEX,SAAS,qBAAqB,CAAC,EAAE;QAC/CN;QACAC;QACAC;QACAG;QACAO;IACF;IAEA,IAAI,CAACT,gBAAgB;QACnB;;KAEC,GACD,MAAMe,WAAWP,YAAYQ,QAAQC,OAAQ,CAAA,IAAM,IAAG;QACtD,MAAMC,YAAY,MAAMH,SAAS;YAAEX;QAAI;QACvC,IAAI,CAACc,WAAW;YACd,MAAM,IAAIlC,UAAUoB,IAAIe,CAAC;QAC3B;IACF;IACAN,QAAQC,GAAG,CAAC,CAAC,CAAC,EAAEX,SAAS,yBAAyB,CAAC;IAEnD,MAAMiB,MAAe;QACnB;YACEC,aAAa;gBACXC,QAAQ;YACV;QACF;QACA;YACEC,UAAU;gBACRC,YAAY;YACd;QACF;QACA;YACEC,YAAY;gBACVC,QAAQ;YACV;QACF;QACA;YACEC,IAAI;gBACF;oBACEC,WAAW;wBACTN,QAAQ;oBACV;gBACF;gBACA;oBACEM,WAAW;wBACTC,WAAWzC,iBAAiB0C,WAAW;oBACzC;gBACF;aACD;QACH;KACD;IAED,IAAIhC,cAAc,MAAM;QACtBsB,IAAIW,IAAI,CAAC;YACP7B,OAAO;gBACLwB,QAAQxB,SAAS;YACnB;QACF;IACF;IAEA,IAAIU,gBAAgB;QAClBQ,IAAIW,IAAI,CAACnB;IACX;IACAC,QAAQC,GAAG,CAAC,CAAC,CAAC,EAAElB,MAAMO,SAAS,GAAG,CAAC;IAEnC,8DAA8D;IAC9D,IAAIK,WAAWwB,wBAAwB,EAAE;QACvC,qFAAqF;QACrF,+DAA+D;QAC/D,MAAMC,6BAA6B,MAAM5B,QAAQ6B,EAAE,CAACC,IAAI,CAAC;YACvDC,YAAYlD;YACZa,OAAO;YACPsC,YAAY;YACZjC,KAAK;gBAAEkC,eAAeC;YAAU;YAChCC,QAAQ;gBACNC,gBAAgB;YAClB;YACA9B,OAAO;gBACLS,KAAK;oBAAC;wBAAEK,YAAY;4BAAEC,QAAQ;wBAAK;oBAAE;oBAAG;wBAAEe,gBAAgB;4BAAEnB,QAAQ;wBAAK;oBAAE;iBAAE;YAC/E;QACF;QAEA,MAAMoB,yBAAyB,IAAIC;QACnC,IAAIV,4BAA4BW,MAAM;YACpC,KAAK,MAAMC,OAAOZ,2BAA2BW,IAAI,CAAE;gBACjD,MAAMH,iBAAiB,AAACI,IAAYJ,cAAc;gBAClD,IAAIA,gBAAgB;oBAClBC,uBAAuBI,GAAG,CAACL;gBAC7B;YACF;QACF;QAEA,uDAAuD;QACvD,IAAIC,uBAAuBK,IAAI,GAAG,GAAG;YACnC3B,IAAIW,IAAI,CAAC;gBACPJ,IAAI;oBACF,gDAAgD;oBAChD;wBAAEc,gBAAgB;4BAAEnB,QAAQ;wBAAM;oBAAE;oBACpC,oEAAoE;oBACpE;wBAAEmB,gBAAgB;4BAAEO,QAAQ;mCAAIN;6BAAuB;wBAAC;oBAAE;iBAC3D;YACH;QACF;IACF;IAEA7B,QAAQC,GAAG,CAAC,CAAC,CAAC,EAAEX,SAAS,6CAA6C,CAAC,EAAE;QACvEN;QACAmC,0BAA0BxB,WAAWwB,wBAAwB;IAC/D;IAEA,uGAAuG;IACvG,iDAAiD;IACjD,IAAIzB,OAAc,EAAE;IAEpB,IAAIV,IAAI;QACNgB,QAAQC,GAAG,CAAC,CAAC,CAAC,EAAEX,SAAS,mCAAmC,EAAEN,IAAI;QAElE,sBAAsB;QACtB,MAAMoD,MAAM,MAAM5D,UAAU;YAC1BQ;YACAqD,MAAM;gBACJzB,YAAY;YACd;YACA0B,OAAO3C,WAAW2C,KAAK;YACvBC,oBAAoB;YACpBhD;YACAiD,WAAW;QACb;QACAxC,QAAQC,GAAG,CAAC,CAAC,CAAC,EAAEX,SAAS,0BAA0B,CAAC,EAAE;YAAEmD,OAAO,CAAC,CAACL;QAAI;QAErE,IAAIA,KAAK;YACP1C,OAAO;gBAAC0C;aAAI;QACd;IACF,OAAO;QACLpC,QAAQC,GAAG,CAAC,CAAC,CAAC,EAAEX,SAAS,2CAA2C,EAAEJ,OAAO;QAE7E,IAAIwD,yBACFlD,QAAQmD,WAAW,CAACtE,mBAAmB,EAAEoB,OAAOmD,eAAe;QAEjE,MAAMC,wBAAwBlD,WAAWP,eAAe;QACxD,IAAI,OAAOyD,0BAA0B,YAAY;YAC/CH,yBAAyB,MAAMG,sBAAsB9D;QACvD,OAAO,IAAI,OAAO8D,0BAA0B,YAAY,CAACC,MAAMC,OAAO,CAACF,wBAAwB;YAC7F,IACE,CAAC5D,aACDI,SACAwD,sBAAsBG,MAAM,IAC5BH,sBAAsBG,MAAM,CAAC3D,MAAM,EACnC;gBACAqD,yBAAyBG,sBAAsBG,MAAM,CAAC3D,MAAM;YAC9D,OAAO,IAAIwD,sBAAsBI,OAAO,EAAE;gBACxCP,yBAAyBG,sBAAsBI,OAAO;YACxD;QACF,OAAO,IAAI,OAAOJ,0BAA0B,UAAU;YACpDH,yBAAyBG;QAC3B;QAEA7C,QAAQC,GAAG,CAAC,CAAC,CAAC,EAAEX,SAAS,kCAAkC,CAAC,EAAEiB;QAE9D,MAAM2C,cAAc,MAAMzE,WAAW;YACnC4D,MAAM;gBACJzB,YAAY;YACd;YACAuC,SAAS7D;YACTgD,OAAO3C,WAAW2C,KAAK;YACvBC,oBAAoB;YACpBrD;YACAK;YACAiD,WAAW;YACXY,MAAMhE,mBAAmBsD;YACzB5C,OAAO;gBAAES;YAAI;QACf;QACAP,QAAQC,GAAG,CAAC,CAAC,CAAC,EAAEX,SAAS,6BAA6B,CAAC,EAAE;YAAE+D,OAAOH,aAAaI,UAAU;QAAE;QAC3F,IAAI,AAACJ,CAAAA,aAAaI,UAAU,CAAA,IAAK,GAAG;YAClCtD,QAAQC,GAAG,CAAC,CAAC,CAAC,EAAEX,SAAS,4BAA4B,CAAC,EAAE;gBAAEI,MAAMwD;YAAY;QAC9E;QACA,4CAA4C;QAC5C,MAAMK,UAAU,MAAM/D,QAAQ6B,EAAE,CAACC,IAAI,CAAC;YACpCC,YAAYlD;YACZa,OAAO;YACPK;QACF;QACAS,QAAQC,GAAG,CAAC,CAAC,CAAC,EAAEX,SAAS,wBAAwB,CAAC,EAAE;YAClDiE,SAASA,SAASxB;YAClBsB,OAAOE,SAASC;QAClB;QAEA,MAAMC,kBAAkBF,SAASxB,MAAM2B,KACrC,CAACtB,MACCA,KAAKxB,eAAe,SACpBwB,KAAK1B,aAAa,SAClB,CAAC0B,KAAK5B,eACN,CAAC4B,KAAKrB;QAEV,IAAI0C,mBAAmBP,aAAaI,WAAW,GAAG;YAChDtD,QAAQC,GAAG,CAAC,CAAC,CAAC,EAAEX,SAAS,+BAA+B,CAAC;QAC3D;QAEA,IAAI4D,aAAa;YACfxD,OAAOwD;QACT;IACF;IACAlD,QAAQC,GAAG,CAAC,CAAC,CAAC,EAAEX,SAAS,qBAAqB,CAAC,EAAE;QAC/C+D,OAAO3D,KAAK4D,MAAM;QAClBK,QAAQjE,KAAKkE,GAAG,CAAC,CAACC,IAAMA,EAAE7E,EAAE;IAC9B;IAEA,IAAI,CAACU,KAAK4D,MAAM,EAAE;QAChBtD,QAAQC,GAAG,CAAC,CAAC,CAAC,EAAEX,SAAS,oCAAoC,CAAC;QAE9D,OAAO;YACLwE,iBAAiB;YACjBC,0BAA0B;QAC5B;IACF;IAEA,kEAAkE;IAClE,IAAIpE,WAAWwB,wBAAwB,EAAE;QACvC,oGAAoG;QACpG,oFAAoF;QACpF,MAAM6C,sBAAsB,IAAIlC;QAChC,MAAMmC,YAAmB,EAAE;QAC3B,MAAMC,gBAAuB,EAAE;QAE/B,KAAK,MAAM9B,OAAO1C,KAAM;YACtB,IAAI0C,IAAIR,cAAc,EAAE;gBACtB,IAAIoC,oBAAoBG,GAAG,CAAC/B,IAAIR,cAAc,GAAG;oBAC/C,4EAA4E;oBAC5EsC,cAAchD,IAAI,CAACkB;gBACrB,OAAO;oBACL4B,oBAAoB/B,GAAG,CAACG,IAAIR,cAAc;oBAC1CqC,UAAU/C,IAAI,CAACkB;gBACjB;YACF,OAAO;gBACL6B,UAAU/C,IAAI,CAACkB;YACjB;QACF;QAEA,8DAA8D;QAC9D,IAAI8B,cAAcZ,MAAM,GAAG,GAAG;YAC5B,MAAMc,aAAaF,cAAcN,GAAG,CAAC,CAACxB,MAAQA,IAAIpD,EAAE;YACpD,MAAMP,WAAW;gBACf4D,MAAM;oBAAEzB,YAAY;gBAAM;gBAC1BuC,SAAS7D;gBACTiD,oBAAoB;gBACpBhD;gBACAiD,WAAW;gBACX1C,OAAO;oBAAEd,IAAI;wBAAEqF,IAAID;oBAAW;gBAAE;YAClC;QACF;QAEA,2CAA2C;QAC3C1E,OAAOuE;IACT;IACAjE,QAAQC,GAAG,CAAC,CAAC,CAAC,EAAEX,SAAS,4BAA4B,CAAC,EAAE;QAAE2E,WAAWvE,KAAK4D,MAAM;IAAC;IAEjF,IAAI,CAAC5D,KAAK4D,MAAM,EAAE;QAChBtD,QAAQC,GAAG,CAAC,CAAC,CAAC,EAAEX,SAAS,+CAA+C,CAAC;QAEzE,OAAO;YACLwE,iBAAiB;YACjBC,0BAA0B;QAC5B;IACF;IACA/D,QAAQC,GAAG,CAAC,CAAC,CAAC,EAAEX,SAAS,wBAAwB,EAAEI,KAAK4D,MAAM,CAAC,KAAK,CAAC;IAErE;;;GAGC,GACD,MAAM,EAAEgB,YAAY,EAAEC,OAAO,EAAE,GAAG7E,KAAK8E,MAAM,CAC3C,CAACC,KAAKrC;QACJ,IAAIA,IAAIsC,UAAU,GAAG,GAAG;YACtBD,IAAIH,YAAY,CAACpD,IAAI,CAACkB;QACxB,OAAO;YACLqC,IAAIF,OAAO,CAACrD,IAAI,CAACkB;QACnB;QACA,OAAOqC;IACT,GACA;QAAEH,cAAc,EAAE;QAAWC,SAAS,EAAE;IAAU;IAGpDvE,QAAQC,GAAG,CAAC,CAAC,CAAC,EAAEX,SAAS,oBAAoB,CAAC,EAAE;QAC9CqF,kBAAkBL,aAAahB,MAAM;QACrCsB,aAAaL,QAAQjB,MAAM;IAC7B;IAEA,IAAI,CAACzD,UAAW,OAAOA,WAAW,YAAY,CAACA,OAAOgF,IAAI,EAAG;QAC3DrF,QAAQsF,MAAM,CAACD,IAAI,CAAC;YAClBE,KAAK,CAAC,QAAQ,EAAErF,KAAK4D,MAAM,CAAC,MAAM,CAAC;YACnC0B,KAAKT,SAASjB;YACd2B,UAAUX,cAAchB;QAC1B;IACF;IAEA,MAAM4B,4BAAiD,EAAE;IAEzD,MAAMC,eAAe,OACnB/C;QAKApC,QAAQC,GAAG,CAAC,CAAC,CAAC,EAAEX,SAAS,MAAM,EAAE8C,IAAIpD,EAAE,CAAC,WAAW,CAAC,EAAE;YACpDoG,UAAUhD,IAAIgD,QAAQ;YACtBV,YAAYtC,IAAIsC,UAAU;YAC1BW,cAAcjD,IAAIiD,YAAY;QAChC;QAEA,IAAI,CAACjD,IAAIiD,YAAY,IAAI,CAACjD,IAAIgD,QAAQ,EAAE;YACtC,MAAM,IAAIE,MAAM;QAClB;QACA,MAAMC,SAASnH,sBAAsBmB,KAAK;QAE1C,MAAMiG,iBACJpD,IAAIiD,YAAY,IAAI1F,WAAW8F,SAAS,EAAEnC,SACtC3D,WAAW8F,SAAS,CAACnE,IAAI,CAAC,CAAC,EAAEoE,IAAI,EAAE,GAAKA,SAAStD,IAAIiD,YAAY,IACjE;YACEK,MAAM;YACNC,SAAS,OAAO,EAAEvD,GAAG,EAAEwD,KAAK,EAAE;gBAC5B,MAAMA,KAAK,CAACxD,IAAIgD,QAAQ,CAAW,CAAE,KAAK;oBACxCS,OAAOzD,IAAIyD,KAAK;gBAClB;YACF;QACF;QAEN,IAAI,CAACL,gBAAgB;YACnBxF,QAAQC,GAAG,CAAC,CAAC,CAAC,EAAEX,SAAS,MAAM,EAAE8C,IAAIpD,EAAE,CAAC,qCAAqC,CAAC;YAC9E,OAAO;gBACLA,IAAIoD,IAAIpD,EAAE;gBACV8G,QAAQ;oBACNC,QAAQ;gBACV;YACF,EAAE,2CAA2C;;QAC/C;QAEA,IAAI;YACF,MAAMvH,YAAYE,qBAAqB0D,KAAKmD;YAE5C,iDAAiD;YACjD,uEAAuE;YACvE,oDAAoD;YACpD,IAAIS;YACJ,IACE,OAAOR,eAAeG,OAAO,KAAK,cACjC,OAAOH,eAAeG,OAAO,KAAK,YAAY7C,MAAMC,OAAO,CAACyC,eAAeG,OAAO,GACnF;gBACAK,kBAAkBR,eAAeG,OAAO;YAC1C,OAAO;gBACLK,kBAAkB,MAAMrH,kBAA0C6G,eAAeG,OAAO;gBAExF,IAAI,CAACK,iBAAiB;oBACpB,MAAMC,WAAW7D,IAAIiD,YAAY,IAAI,CAAC,MAAM,EAAEjD,IAAIgD,QAAQ,EAAE;oBAC5D,MAAMc,eAAe,CAAC,gDAAgD,EAAEV,eAAeG,OAAO,CAAC,aAAa,EAAEM,SAAS,CAAC,CAAC;oBACzH,IAAI,CAACpG,UAAW,OAAOA,WAAW,YAAY,CAACA,OAAOsG,KAAK,EAAG;wBAC5D3G,QAAQsF,MAAM,CAACqB,KAAK,CAACD;oBACvB;oBAEA,MAAM1H,UAAU;wBACd2H,OAAO;4BACLA,OAAOD;wBACT;wBACAxF,UAAU;wBACVE,YAAY;oBACd;oBAEA,OAAO;wBACL5B,IAAIoD,IAAIpD,EAAE;wBACV8G,QAAQ;4BACNC,QAAQ;wBACV;oBACF;gBACF;YACF;YAEA,IAAI,OAAOC,oBAAoB,YAAY;gBACzChG,QAAQC,GAAG,CAAC,CAAC,CAAC,EAAEX,SAAS,MAAM,EAAE8C,IAAIpD,EAAE,CAAC,2BAA2B,CAAC;gBACpE,MAAM8G,SAAS,MAAMlH,OAAO;oBAC1BwD;oBACA7C,KAAKgG;oBACL1F;oBACArB;oBACAgH;oBACAQ;gBACF;gBAEAhG,QAAQC,GAAG,CAAC,CAAC,CAAC,EAAEX,SAAS,MAAM,EAAE8C,IAAIpD,EAAE,CAAC,YAAY,CAAC,EAAE;oBAAE+G,QAAQD,OAAOC,MAAM;gBAAC;gBAE/E,IAAID,OAAOC,MAAM,KAAK,WAAW;oBAC/Bb,0BAA0BhE,IAAI,CAACkB,IAAIpD,EAAE;gBACvC;gBAEA,OAAO;oBAAEA,IAAIoD,IAAIpD,EAAE;oBAAE8G;gBAAO;YAC9B,OAAO;gBACL9F,QAAQC,GAAG,CAAC,CAAC,CAAC,EAAEX,SAAS,MAAM,EAAE8C,IAAIpD,EAAE,CAAC,uBAAuB,CAAC;gBAChE,MAAM8G,SAAS,MAAMjH,WAAW;oBAC9BuD;oBACA7C,KAAKgG;oBACL1F;oBACArB;oBACAgH;oBACAQ;gBACF;gBAEAhG,QAAQC,GAAG,CAAC,CAAC,CAAC,EAAEX,SAAS,MAAM,EAAE8C,IAAIpD,EAAE,CAAC,YAAY,CAAC,EAAE;oBAAE+G,QAAQD,OAAOC,MAAM;gBAAC;gBAE/E,IAAID,OAAOC,MAAM,KAAK,WAAW;oBAC/Bb,0BAA0BhE,IAAI,CAACkB,IAAIpD,EAAE;gBACvC;gBAEA,OAAO;oBAAEA,IAAIoD,IAAIpD,EAAE;oBAAE8G;gBAAO;YAC9B;QACF,EAAE,OAAOK,OAAO;YACd,IAAIA,iBAAiB7H,mBAAmB;gBACtC0B,QAAQC,GAAG,CAAC,CAAC,CAAC,EAAEX,SAAS,MAAM,EAAE8C,IAAIpD,EAAE,CAAC,YAAY,CAAC,EAAE;oBAAEoH,SAASD,MAAMC,OAAO;gBAAC;gBAChF,IACE,CAAEhE,IAAI+D,KAAK,EAA0CE,aACrD,CAACjE,IAAI1B,QAAQ,IACb0B,IAAIxB,UAAU,IACdwB,IAAI5B,WAAW,IACf4B,IAAIrB,SAAS,EACb;oBACA,yHAAyH;oBACzH,mIAAmI;oBACnI,MAAMvC,UAAU;wBACdQ,IAAIoD,IAAIpD,EAAE;wBACVqD,MAAM;4BACJ7B,aAAa;4BACb2F,OAAO;gCACLE,WAAW;gCACXD,SAASD,MAAMC,OAAO;4BACxB;4BACA1F,UAAU;4BACVE,YAAY;4BACZG,WAAW;wBACb;wBACAuB,OAAO;wBACPC,oBAAoB;wBACpBhD;wBACAiD,WAAW;oBACb;gBACF;gBAEA,OAAO;oBACLxD,IAAIoD,IAAIpD,EAAE;oBACV8G,QAAQ;wBACNC,QAAQ;oBACV;gBACF;YACF;YACA/F,QAAQC,GAAG,CAAC,CAAC,CAAC,EAAEX,SAAS,MAAM,EAAE8C,IAAIpD,EAAE,CAAC,eAAe,CAAC,EAAE;gBACxDmH,OAAOA,iBAAiBb,QAAQa,MAAMC,OAAO,GAAGE,OAAOH;YACzD;YACA,MAAMA;QACR;IACF;IAEAnG,QAAQC,GAAG,CAAC,CAAC,CAAC,EAAEX,SAAS,6BAA6B,CAAC,EAAE;QACvDiH,UAAU7G,KAAK4D,MAAM;QACrB1D;IACF;IAEA,IAAI4G,eAAgE,EAAE;IACtE,IAAI5G,YAAY;QACdI,QAAQC,GAAG,CAAC,CAAC,CAAC,EAAEX,SAAS,kCAAkC,CAAC;QAE5D,KAAK,MAAM8C,OAAO1C,KAAM;YACtB,MAAMoG,SAAS,MAAMX,aAAa/C;YAClC,IAAI0D,QAAQ;gBACVU,aAAatF,IAAI,CAAC4E;YACpB;QACF;IACF,OAAO;QACL9F,QAAQC,GAAG,CAAC,CAAC,CAAC,EAAEX,SAAS,iCAAiC,CAAC;QAC3D,MAAMmH,cAAc/G,KAAKkE,GAAG,CAACuB;QAC7BqB,eAAgB,MAAME,QAAQC,GAAG,CAACF;IAIpC;IAEAzG,QAAQC,GAAG,CAAC,CAAC,CAAC,EAAEX,SAAS,wBAAwB,CAAC,EAAE;QAClDsH,cAAcJ,aAAalD,MAAM;QACjCuD,iBAAiB3B,0BAA0B5B,MAAM;IACnD;IAEA,IAAI3D,WAAWmH,mBAAmB,IAAI5B,0BAA0B5B,MAAM,EAAE;QACtEtD,QAAQC,GAAG,CAAC,CAAC,CAAC,EAAEX,SAAS,8BAA8B,CAAC,EAAE;YACxD+D,OAAO6B,0BAA0B5B,MAAM;QACzC;QACA,IAAI;YACF,IAAI3D,WAAWoH,QAAQ,EAAE;gBACvB,MAAMvH,QAAQwH,MAAM,CAAC;oBACnBzF,YAAYlD;oBACZiE,OAAO;oBACPC,oBAAoB;oBACpBzC,OAAO;wBAAEd,IAAI;4BAAEqF,IAAIa;wBAA0B;oBAAE;gBACjD;YACF,OAAO;gBACL,MAAM1F,QAAQ6B,EAAE,CAAC4F,UAAU,CAAC;oBAC1B1F,YAAYlD;oBACZyB,OAAO;wBAAEd,IAAI;4BAAEqF,IAAIa;wBAA0B;oBAAE;gBACjD;YACF;QACF,EAAE,OAAOgC,KAAK;YACZ,IAAI,CAACrH,UAAW,OAAOA,WAAW,YAAY,CAACA,OAAOsG,KAAK,EAAG;gBAC5D3G,QAAQsF,MAAM,CAACqB,KAAK,CAAC;oBACnBe;oBACAnC,KAAK,CAAC,sBAAsB,EAAEG,0BAA0BiC,IAAI,CAAC,MAAM,YAAY,CAAC;gBAClF;YACF;QACF;IACF;IAEA,MAAMC,gBAA4CZ,aAAahC,MAAM,CACnE,CAACC,KAAK4C;QACJ,IAAIA,QAAQ,MAAM;YAChB,6CAA6C;YAC7C5C,GAAG,CAAC4C,IAAIrI,EAAE,CAAC,GAAGqI,IAAIvB,MAAM;QAC1B;QACA,OAAOrB;IACT,GACA,CAAC;IAGH,IAAIV,2BAA2B;IAC/B,IAAK,MAAMuD,SAASF,cAAe;QACjC,MAAMG,YAAYH,aAAa,CAACE,MAAM;QACtC,IAAIC,WAAWxB,WAAW,SAAS;YACjChC,4BAA2B,iBAAiB;QAC9C;IACF;IAEA/D,QAAQC,GAAG,CAAC,CAAC,CAAC,EAAEX,SAAS,uBAAuB,CAAC,EAAE;QACjDyE;QACAyD,cAActC,0BAA0B5B,MAAM;QAC9CmE,gBAAgBC,OAAOC,IAAI,CAACP,eAAe9D,MAAM;IACnD;IAEA,OAAO;QACLsE,WAAWR;QACXrD;IACF;AACF,EAAC"}
|
|
@@ -2,6 +2,7 @@ import type { Job } from '../../index.js';
|
|
|
2
2
|
import type { PayloadRequest, Sort, Where } from '../../types/index.js';
|
|
3
3
|
type BaseArgs = {
|
|
4
4
|
data: Partial<Job>;
|
|
5
|
+
debugID?: string;
|
|
5
6
|
depth?: number;
|
|
6
7
|
disableTransaction?: boolean;
|
|
7
8
|
limit?: number;
|
|
@@ -30,6 +31,6 @@ export declare function updateJob(args: ArgsByID & BaseArgs): Promise<Job | unde
|
|
|
30
31
|
* Handles deciding whether it can used direct db methods or not, and if so,
|
|
31
32
|
* manually runs the afterRead hook that populates the `taskStatus` property.
|
|
32
33
|
*/
|
|
33
|
-
export declare function updateJobs({ id, data, depth, disableTransaction, limit: limitArg, req, returning, sort, where: whereArg, }: RunJobsArgs): Promise<Job[] | null>;
|
|
34
|
+
export declare function updateJobs({ id, data, debugID, depth, disableTransaction, limit: limitArg, req, returning, sort, where: whereArg, }: RunJobsArgs): Promise<Job[] | null>;
|
|
34
35
|
export {};
|
|
35
36
|
//# sourceMappingURL=updateJob.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"updateJob.d.ts","sourceRoot":"","sources":["../../../src/queues/utilities/updateJob.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAIvE,KAAK,QAAQ,GAAG;IACd,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,cAAc,CAAA;IACnB,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB,CAAA;AAED,KAAK,QAAQ,GAAG;IACd,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,KAAK,CAAA;IACb,IAAI,CAAC,EAAE,KAAK,CAAA;IACZ,KAAK,CAAC,EAAE,KAAK,CAAA;CACd,CAAA;AAED,KAAK,SAAS,GAAG;IACf,EAAE,CAAC,EAAE,KAAK,CAAA;IACV,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,KAAK,EAAE,KAAK,CAAA;CACb,CAAA;AAED,KAAK,WAAW,GAAG,CAAC,QAAQ,GAAG,SAAS,CAAC,GAAG,QAAQ,CAAA;AAEpD;;GAEG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ,4BAKxD;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,EAC/B,EAAE,EACF,IAAI,EACJ,KAAK,EACL,kBAAkB,EAClB,KAAK,EAAE,QAAQ,EACf,GAAG,EACH,SAAS,EACT,IAAI,EACJ,KAAK,EAAE,QAAQ,GAChB,EAAE,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"updateJob.d.ts","sourceRoot":"","sources":["../../../src/queues/utilities/updateJob.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAIvE,KAAK,QAAQ,GAAG;IACd,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,cAAc,CAAA;IACnB,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB,CAAA;AAED,KAAK,QAAQ,GAAG;IACd,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,KAAK,CAAA;IACb,IAAI,CAAC,EAAE,KAAK,CAAA;IACZ,KAAK,CAAC,EAAE,KAAK,CAAA;CACd,CAAA;AAED,KAAK,SAAS,GAAG;IACf,EAAE,CAAC,EAAE,KAAK,CAAA;IACV,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,KAAK,EAAE,KAAK,CAAA;CACb,CAAA;AAED,KAAK,WAAW,GAAG,CAAC,QAAQ,GAAG,SAAS,CAAC,GAAG,QAAQ,CAAA;AAEpD;;GAEG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ,4BAKxD;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,EAC/B,EAAE,EACF,IAAI,EACJ,OAAO,EACP,KAAK,EACL,kBAAkB,EAClB,KAAK,EAAE,QAAQ,EACf,GAAG,EACH,SAAS,EACT,IAAI,EACJ,KAAK,EAAE,QAAQ,GAChB,EAAE,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAqIrC"}
|