@lucidcms/core
Version:
The core of the Lucid CMS. It's responsible for spinning up the API and serving the CMS.
2 lines • 3.85 kB
JavaScript
import{copy as e}from"../../i18n/copy.mjs";import t from"../../../constants/constants.mjs";import n from"../../logger/index.mjs";import r from"../execute-single-job.mjs";import{insertJobs as i}from"../insert-job.mjs";const a=`passthrough`;function o(o){return{type:`queue-adapter`,key:a,support:{scheduling:!1},lifecycle:{init:async()=>{n.debug({message:`The passthrough queue has started`,scope:t.logScopes.queueAdapter})},destroy:async()=>{n.debug({message:`The passthrough queue has stopped`,scope:t.logScopes.queueAdapter})}},add:async(s,c)=>{try{let{event:l}=c;if(c.options?.scheduledFor)return{error:{message:e(`server:core.queue.adapters.scheduled.jobs.not.supported`)},data:void 0};n.info({message:`Adding job to the passthrough queue`,scope:t.logScopes.queueAdapter,data:{event:l}});let u=await i(s,{event:l,payloads:[c.payload],options:c.options,adapterKey:a});if(u.error)return u;let d=u.data.jobs[0];if(!d)return{error:{message:e(`server:core.queue.jobs.create.failed`,{defaultMessage:`Failed to create job`})},data:void 0};if(o?.bypassImmediateExecution)return{error:void 0,data:{jobId:d.jobId,event:l,status:u.data.status}};let f=await r(s,{jobId:d.jobId,event:l,payload:c.payload,attempts:0,maxAttempts:1,setNextRetryAt:!1});return f.success===!1&&f.shouldRetry===!1?{error:{message:e(`server:core.queue.jobs.execute.failed`,{defaultMessage:f.message})},data:void 0}:{error:void 0,data:{jobId:d.jobId,event:l,status:u.data.status}}}catch(r){return n.error({error:r,event:`queue.event.add.failed`,message:`Error adding event to the queue`,scope:t.logScopes.queueAdapter,data:{errorMessage:r instanceof Error?r.message:String(r)}}),{error:{message:e(`server:core.queue.jobs.add.failed`,{defaultMessage:`Error adding event to the queue`})},data:void 0}}},addBatch:async(s,c)=>{try{let{event:l}=c;if(c.options?.scheduledFor)return{error:{message:e(`server:core.queue.adapters.scheduled.jobs.not.supported`)},data:void 0};n.info({message:`Adding batch jobs to the passthrough queue`,scope:t.logScopes.queueAdapter,data:{event:l,count:c.payloads.length}});let u=await i(s,{event:l,payloads:c.payloads,options:c.options,adapterKey:a});if(u.error)return u;if(o?.bypassImmediateExecution)return{error:void 0,data:{jobIds:u.data.jobs.map(e=>e.jobId),event:l,status:u.data.status,count:u.data.jobs.length}};let d=t.queue.concurrentLimit,f=[];for(let e=0;e<u.data.jobs.length;e+=d){let t=u.data.jobs.slice(e,e+d).map(e=>({jobId:e.jobId,payload:e.payload}));f.push(t)}n.debug({message:`Processing batch jobs in chunks`,scope:t.logScopes.queueAdapter,data:{totalJobs:u.data.jobs.length,chunkCount:f.length,concurrentLimit:d}});let p=await Promise.allSettled(f.flatMap(e=>e.map(e=>r(s,{jobId:e.jobId,event:l,payload:e.payload,attempts:0,maxAttempts:1})))),m=p.filter(e=>e.status===`rejected`);if(m.length>0){let r=m[0]?.reason,i=r instanceof Error?r.message:`Unknown error`;return n.error({error:r,event:`queue.batch.partial-failure`,message:`Some batch jobs failed`,scope:t.logScopes.queueAdapter,data:{failedCount:m.length,totalCount:p.length}}),{error:{message:e(`server:core.queue.jobs.batch.execute.failed`,{defaultMessage:`${m.length} of ${p.length} jobs failed. First error: ${i}`})},data:void 0}}return n.debug({message:`All batch jobs completed successfully`,scope:t.logScopes.queueAdapter,data:{count:u.data.jobs.length}}),{error:void 0,data:{jobIds:u.data.jobs.map(e=>e.jobId),event:l,status:u.data.status,count:u.data.jobs.length}}}catch(r){return n.error({error:r,event:`queue.batch.add.failed`,message:`Error adding batch events to the queue`,scope:t.logScopes.queueAdapter,data:{errorMessage:r instanceof Error?r.message:String(r)}}),{error:{message:e(`server:core.queue.jobs.add.batch.failed`,{defaultMessage:`Error adding batch events to the queue`})},data:void 0}}}}}export{o as default};
//# sourceMappingURL=passthrough.mjs.map