@lucidcms/core
Version:
The core of the Lucid CMS. It's responsible for spinning up the API and serving the CMS.
1 lines • 12.8 kB
Source Map (JSON)
{"version":3,"file":"passthrough.mjs","names":["constants"],"sources":["../../../../src/libs/queue/adapters/passthrough.ts"],"sourcesContent":["import constants from \"../../../constants/constants.js\";\nimport { copy } from \"../../i18n/index.js\";\nimport logger from \"../../logger/index.js\";\nimport executeSingleJob from \"../execute-single-job.js\";\nimport { insertJobs } from \"../insert-job.js\";\nimport type { QueueAdapterInstance } from \"../types.js\";\n\nconst ADAPTER_KEY = \"passthrough\";\n\ntype PassthroughQueueAdapterOptions = {\n\tbypassImmediateExecution?: boolean;\n};\n\n/**\n * A passthrough queue adapter that will only mock the queue, and execute the event handlers immediately\n */\nfunction passthroughQueueAdapter(): QueueAdapterInstance;\nfunction passthroughQueueAdapter(\n\toptions: PassthroughQueueAdapterOptions,\n): QueueAdapterInstance;\nfunction passthroughQueueAdapter(\n\toptions?: PassthroughQueueAdapterOptions,\n): QueueAdapterInstance {\n\treturn {\n\t\ttype: \"queue-adapter\",\n\t\tkey: ADAPTER_KEY,\n\t\tsupport: {\n\t\t\tscheduling: false,\n\t\t},\n\t\tlifecycle: {\n\t\t\tinit: async () => {\n\t\t\t\tlogger.debug({\n\t\t\t\t\tmessage: \"The passthrough queue has started\",\n\t\t\t\t\tscope: constants.logScopes.queueAdapter,\n\t\t\t\t});\n\t\t\t},\n\t\t\tdestroy: async () => {\n\t\t\t\tlogger.debug({\n\t\t\t\t\tmessage: \"The passthrough queue has stopped\",\n\t\t\t\t\tscope: constants.logScopes.queueAdapter,\n\t\t\t\t});\n\t\t\t},\n\t\t},\n\t\tadd: async (context, params) => {\n\t\t\ttry {\n\t\t\t\tconst { event } = params;\n\t\t\t\tif (params.options?.scheduledFor) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\terror: {\n\t\t\t\t\t\t\tmessage: copy(\n\t\t\t\t\t\t\t\t\"server:core.queue.adapters.scheduled.jobs.not.supported\",\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdata: undefined,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tlogger.info({\n\t\t\t\t\tmessage: \"Adding job to the passthrough queue\",\n\t\t\t\t\tscope: constants.logScopes.queueAdapter,\n\t\t\t\t\tdata: { event },\n\t\t\t\t});\n\n\t\t\t\tconst createJobRes = await insertJobs(context, {\n\t\t\t\t\tevent,\n\t\t\t\t\tpayloads: [params.payload],\n\t\t\t\t\toptions: params.options,\n\t\t\t\t\tadapterKey: ADAPTER_KEY,\n\t\t\t\t});\n\t\t\t\tif (createJobRes.error) return createJobRes;\n\n\t\t\t\tconst jobData = createJobRes.data.jobs[0];\n\t\t\t\tif (!jobData) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\terror: {\n\t\t\t\t\t\t\tmessage: copy(\"server:core.queue.jobs.create.failed\", {\n\t\t\t\t\t\t\t\tdefaultMessage: \"Failed to create job\",\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdata: undefined,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t//* skip immediate execution\n\t\t\t\tif (options?.bypassImmediateExecution) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\terror: undefined,\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\tjobId: jobData.jobId,\n\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\tstatus: createJobRes.data.status,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t//* execute the event handler immediately\n\t\t\t\tconst executeResult = await executeSingleJob(context, {\n\t\t\t\t\tjobId: jobData.jobId,\n\t\t\t\t\tevent: event,\n\t\t\t\t\tpayload: params.payload,\n\t\t\t\t\tattempts: 0,\n\t\t\t\t\tmaxAttempts: 1,\n\t\t\t\t\tsetNextRetryAt: false,\n\t\t\t\t});\n\t\t\t\tif (\n\t\t\t\t\texecuteResult.success === false &&\n\t\t\t\t\texecuteResult.shouldRetry === false\n\t\t\t\t) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\terror: {\n\t\t\t\t\t\t\tmessage: copy(\"server:core.queue.jobs.execute.failed\", {\n\t\t\t\t\t\t\t\tdefaultMessage: executeResult.message,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdata: undefined,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\terror: undefined,\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tjobId: jobData.jobId,\n\t\t\t\t\t\tevent,\n\t\t\t\t\t\tstatus: createJobRes.data.status,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error({\n\t\t\t\t\terror,\n\t\t\t\t\tevent: \"queue.event.add.failed\",\n\t\t\t\t\tmessage: \"Error adding event to the queue\",\n\t\t\t\t\tscope: constants.logScopes.queueAdapter,\n\t\t\t\t\tdata: {\n\t\t\t\t\t\terrorMessage:\n\t\t\t\t\t\t\terror instanceof Error ? error.message : String(error),\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\treturn {\n\t\t\t\t\terror: {\n\t\t\t\t\t\tmessage: copy(\"server:core.queue.jobs.add.failed\", {\n\t\t\t\t\t\t\tdefaultMessage: \"Error adding event to the queue\",\n\t\t\t\t\t\t}),\n\t\t\t\t\t},\n\t\t\t\t\tdata: undefined,\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\t\taddBatch: async (context, params) => {\n\t\t\ttry {\n\t\t\t\tconst { event } = params;\n\t\t\t\tif (params.options?.scheduledFor) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\terror: {\n\t\t\t\t\t\t\tmessage: copy(\n\t\t\t\t\t\t\t\t\"server:core.queue.adapters.scheduled.jobs.not.supported\",\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdata: undefined,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tlogger.info({\n\t\t\t\t\tmessage: \"Adding batch jobs to the passthrough queue\",\n\t\t\t\t\tscope: constants.logScopes.queueAdapter,\n\t\t\t\t\tdata: { event, count: params.payloads.length },\n\t\t\t\t});\n\n\t\t\t\tconst createJobsRes = await insertJobs(context, {\n\t\t\t\t\tevent,\n\t\t\t\t\tpayloads: params.payloads,\n\t\t\t\t\toptions: params.options,\n\t\t\t\t\tadapterKey: ADAPTER_KEY,\n\t\t\t\t});\n\t\t\t\tif (createJobsRes.error) return createJobsRes;\n\n\t\t\t\t//* skip immediate execution\n\t\t\t\tif (options?.bypassImmediateExecution) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\terror: undefined,\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\tjobIds: createJobsRes.data.jobs.map((j) => j.jobId),\n\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\tstatus: createJobsRes.data.status,\n\t\t\t\t\t\t\tcount: createJobsRes.data.jobs.length,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t//* execute the event handlers immediately for all jobs in chunks\n\t\t\t\tconst concurrentLimit = constants.queue.concurrentLimit;\n\n\t\t\t\t//* split jobs into chunks based on concurrent limit\n\t\t\t\tconst jobChunks: Array<\n\t\t\t\t\t{ jobId: string; payload: Record<string, unknown> }[]\n\t\t\t\t> = [];\n\t\t\t\tfor (\n\t\t\t\t\tlet i = 0;\n\t\t\t\t\ti < createJobsRes.data.jobs.length;\n\t\t\t\t\ti += concurrentLimit\n\t\t\t\t) {\n\t\t\t\t\tconst chunk = createJobsRes.data.jobs\n\t\t\t\t\t\t.slice(i, i + concurrentLimit)\n\t\t\t\t\t\t.map((job) => {\n\t\t\t\t\t\t\treturn { jobId: job.jobId, payload: job.payload };\n\t\t\t\t\t\t});\n\t\t\t\t\tjobChunks.push(chunk);\n\t\t\t\t}\n\n\t\t\t\tlogger.debug({\n\t\t\t\t\tmessage: \"Processing batch jobs in chunks\",\n\t\t\t\t\tscope: constants.logScopes.queueAdapter,\n\t\t\t\t\tdata: {\n\t\t\t\t\t\ttotalJobs: createJobsRes.data.jobs.length,\n\t\t\t\t\t\tchunkCount: jobChunks.length,\n\t\t\t\t\t\tconcurrentLimit,\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\t//* process each chunk sequentially\n\t\t\t\tconst allResults = await Promise.allSettled(\n\t\t\t\t\tjobChunks.flatMap((chunk) =>\n\t\t\t\t\t\tchunk.map((job) =>\n\t\t\t\t\t\t\texecuteSingleJob(context, {\n\t\t\t\t\t\t\t\tjobId: job.jobId,\n\t\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t\tpayload: job.payload,\n\t\t\t\t\t\t\t\tattempts: 0,\n\t\t\t\t\t\t\t\tmaxAttempts: 1,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t);\n\n\t\t\t\t//* check if any jobs failed\n\t\t\t\tconst failedJobs = allResults.filter((r) => r.status === \"rejected\");\n\t\t\t\tif (failedJobs.length > 0) {\n\t\t\t\t\tconst firstError = failedJobs[0]?.reason;\n\t\t\t\t\tconst errorMessage =\n\t\t\t\t\t\tfirstError instanceof Error ? firstError.message : \"Unknown error\";\n\n\t\t\t\t\tlogger.error({\n\t\t\t\t\t\terror: firstError,\n\t\t\t\t\t\tevent: \"queue.batch.partial-failure\",\n\t\t\t\t\t\tmessage: \"Some batch jobs failed\",\n\t\t\t\t\t\tscope: constants.logScopes.queueAdapter,\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\tfailedCount: failedJobs.length,\n\t\t\t\t\t\t\ttotalCount: allResults.length,\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\terror: {\n\t\t\t\t\t\t\tmessage: copy(\"server:core.queue.jobs.batch.execute.failed\", {\n\t\t\t\t\t\t\t\tdefaultMessage: `${failedJobs.length} of ${allResults.length} jobs failed. First error: ${errorMessage}`,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdata: undefined,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tlogger.debug({\n\t\t\t\t\tmessage: \"All batch jobs completed successfully\",\n\t\t\t\t\tscope: constants.logScopes.queueAdapter,\n\t\t\t\t\tdata: { count: createJobsRes.data.jobs.length },\n\t\t\t\t});\n\n\t\t\t\treturn {\n\t\t\t\t\terror: undefined,\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tjobIds: createJobsRes.data.jobs.map((j) => j.jobId),\n\t\t\t\t\t\tevent,\n\t\t\t\t\t\tstatus: createJobsRes.data.status,\n\t\t\t\t\t\tcount: createJobsRes.data.jobs.length,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error({\n\t\t\t\t\terror,\n\t\t\t\t\tevent: \"queue.batch.add.failed\",\n\t\t\t\t\tmessage: \"Error adding batch events to the queue\",\n\t\t\t\t\tscope: constants.logScopes.queueAdapter,\n\t\t\t\t\tdata: {\n\t\t\t\t\t\terrorMessage:\n\t\t\t\t\t\t\terror instanceof Error ? error.message : String(error),\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\treturn {\n\t\t\t\t\terror: {\n\t\t\t\t\t\tmessage: copy(\"server:core.queue.jobs.add.batch.failed\", {\n\t\t\t\t\t\t\tdefaultMessage: \"Error adding batch events to the queue\",\n\t\t\t\t\t\t}),\n\t\t\t\t\t},\n\t\t\t\t\tdata: undefined,\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\t};\n}\n\nexport default passthroughQueueAdapter;\n"],"mappings":"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"}