@smart-cloud/publisher-exporter 1.1.32 → 1.1.33
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/queue-runner.js +2 -2
- package/package.json +24 -16
package/dist/queue-runner.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {pathToFileURL}from'url';import f from'fs/promises';import {existsSync,createReadStream,createWriteStream}from'fs';import p from'path';import {spawn}from'child_process';import {randomUUID}from'crypto';import {pipeline}from'stream/promises';import {createGzip}from'zlib';import ne from'http';import ie from'https';function U(e){let t=e.trim();return t==="."?".":t.replace(/\/$/,"")}function oe(e){let t=String(e??"").trim();if(!t)return "";let n=t;if(/^https?:\/\//i.test(n))try{n=new URL(n).pathname;}catch{return ""}if(n=n.split(/[?#]/,1)[0]?.replace(/\\/g,"/").trim()??"",!n)return "";let r=n.endsWith("/"),o=n.replace(/^\/+/,"").split("/").map(i=>i.replace(/[^A-Za-z0-9._-]/g,"")).filter(i=>i.length>0&&i!=="."&&i!=="..");if(o.length===0)return "";let s=`/${o.join("/")}`;return r&&p.extname(s)===""&&(s+="/"),s==="/"?"":s}function x(e){return !e||typeof e!="object"?{}:Object.fromEntries(Object.entries(e).map(([t,n])=>[t.trim(),String(n??"")]).filter(([t])=>t.length>0))}function se(e){if(!e||typeof e!="object")return {};let t={};for(let[n,r]of Object.entries(e)){let o=n.trim();if(!o||!r||typeof r!="object")continue;let s=r,i={};if(typeof s.targetOrigin=="string"){let a=U(s.targetOrigin);a&&(i.targetOrigin=a);}let u=x(s.extraReplacements);if(Object.keys(u).length>0&&(i.extraReplacements=u),s.s3&&typeof s.s3=="object"){let a={},c=s.s3;typeof c.bucket=="string"&&(a.bucket=c.bucket.trim()),typeof c.prefix=="string"&&(a.prefix=c.prefix.trim()),typeof c.region=="string"&&(a.region=c.region.trim()),typeof c.htmlCacheControl=="string"&&(a.htmlCacheControl=c.htmlCacheControl.trim()),typeof c.assetCacheControl=="string"&&(a.assetCacheControl=c.assetCacheControl.trim()),Object.keys(a).length>0&&(i.s3=a);}if(s.cloudFront&&typeof s.cloudFront=="object"){let a={},c=s.cloudFront;typeof c.distributionId=="string"&&(a.distributionId=c.distributionId.trim()),Array.isArray(c.invalidationPaths)&&(a.invalidationPaths=c.invalidationPaths.map(g=>String(g??"").trim()).filter(g=>g.length>0)),Object.keys(a).length>0&&(i.cloudFront=a);}t[o]=i;}return t}function W(e){return e==="PROFESSIONAL"||e==="AGENCY"?e:void 0}function ue(e,t){if(!e||typeof e!="object")return null;let n=e,r=n.command;if(r!=="publish"&&r!=="crawl"&&r!=="deploy"&&r!=="invalidate"&&r!=="retry-timeouts"&&r!=="url")return null;let o=Number.parseInt(String(n.intervalMinutes??"0"),10);if(!Number.isFinite(o)||o<1)return null;let s=String(n.id??`${r}-${t+1}`).trim();if(!s)return null;let i=String(n.deploymentProfile??"").trim(),u=String(n.url??"").trim();return {id:s,enabled:n.enabled!==false,command:r,intervalMinutes:o,...r==="publish"||r==="crawl"?{crawlMode:n.crawlMode==="incremental"?"incremental":"full"}:{},...(r==="publish"||r==="deploy"||r==="invalidate")&&i?{deploymentProfile:i}:{},...u?{url:u}:{}}}function B(e){let t=e&&typeof e=="object"?e:{},n=Array.isArray(t.rules)?t.rules.map((r,o)=>ue(r,o)).filter(r=>!!r):[];return {enabled:t.enabled===true,timezone:typeof t.timezone=="string"&&t.timezone.trim()!==""?t.timezone.trim():"UTC",rules:n}}function ae(e){if(!e||typeof e!="object")return;let t=e,n={};for(let o of ["accountId","siteId"]){let s=t[o];typeof s=="string"&&s.trim()!==""&&(n[o]=s.trim());}let r=Number(t.lastUpdate??0);return Number.isFinite(r)&&r>0&&(n.lastUpdate=Math.floor(r)),t.subscriber===true&&(n.subscriber=true),Object.keys(n).length>0?n:void 0}function T(e){let t=e&&typeof e=="object"?e:{},n=String(t.accountId??"").trim(),r=String(t.siteId??"").trim(),o=t.subscriber===true,s=ae(t.siteSettings),i={...s??{},...n?{accountId:s?.accountId??n}:{},...r?{siteId:s?.siteId??r}:{},...s?.subscriber===true||o?{subscriber:true}:{}},u={},a=String(t.apiBase??"").trim();a&&(u.apiBase=a);let c=String(t.runtimeToken??t.nonce??"").trim();c&&(u.runtimeToken=c);let g=String(t.uploadUrl??"").trim();g&&(u.uploadUrl=g),Object.keys(i).length>0&&(u.siteSettings=i);let d=W(t.subscriptionType);return d&&(u.subscriptionType=d),u}function ce(e){try{let t=new URL(e);globalThis.location=t;}catch{}}function Q(e){return typeof e=="string"?e:e instanceof URL?e.toString():e.url}function le(e,t){let n=new Headers(e instanceof Request?e.headers:void 0);if(t?.headers)for(let[r,o]of new Headers(t.headers).entries())n.set(r,o);return n}async function z(e,t,n=5){let r=new URL(Q(e)),o=String(t?.method??(e instanceof Request?e.method:"GET")).toUpperCase(),s=r.protocol==="http:"?ne:ie,i=le(e,t);return await new Promise((u,a)=>{let c=s.request(r,{method:o,headers:Object.fromEntries(i.entries()),...r.protocol==="https:"?{rejectUnauthorized:false}:{}},g=>{let d=[];g.on("data",l=>{d.push(Buffer.isBuffer(l)?l:Buffer.from(l));}),g.on("error",a),g.on("end",()=>{let l=g.statusCode??0,m=g.headers.location;if(n>0&&m&&[301,302,303,307,308].includes(l)){u(z(new URL(m,r),{method:l===303?"GET":o},n-1));return}let h=new Headers;for(let[P,y]of Object.entries(g.headers))Array.isArray(y)?h.set(P,y.join(", ")):typeof y=="string"&&h.set(P,y);u(new Response(Buffer.concat(d),{status:l,statusText:g.statusMessage??"",headers:h}));});});c.on("error",a),c.end();})}function de(e){let t=T(e.wpsuite),n={...t.siteSettings??{},...t.siteSettings?.subscriber===true||t.subscriptionType==="PROFESSIONAL"||t.subscriptionType==="AGENCY"?{subscriber:true}:{}},r=String(n.accountId??"").trim(),o=String(n.siteId??"").trim(),s=String(t.uploadUrl??"").trim();if(e.wpsuite={...t.apiBase?{apiBase:t.apiBase}:{},...t.runtimeToken?{runtimeToken:t.runtimeToken}:{},...s?{uploadUrl:s}:{},...Object.keys(n).length>0?{siteSettings:n}:{},...t.subscriptionType?{subscriptionType:t.subscriptionType}:{}},!r||!o||!s)return false;ce(e.sourceOrigin);let i=globalThis,a={...i.WpSuite??{},siteSettings:n,uploadUrl:s};return t.apiBase&&(a.apiBase=t.apiBase),i.WpSuite=a,true}async function pe(e){if(!de(e))return null;let t=String(e.wpsuite?.uploadUrl??"").trim(),n=globalThis.fetch;try{e.ignoreHttpsErrors&&typeof n=="function"&&t.startsWith("https://")&&(globalThis.fetch=(async(s,i)=>Q(s).startsWith(t)?z(s,i):n(s,i)));let{getConfig:r}=await import('@smart-cloud/wpsuite-core'),o=await r("publisher");return o&&typeof o=="object"?o:null}catch{return null}finally{typeof n=="function"&&(globalThis.fetch=n);}}function ge(e,t){let n=se(t?.deploymentProfiles),r=String(t?.defaultDeploymentProfile??"").trim(),o=n[r]?r:"",s=W(t?.subscriptionType),i=T(e.wpsuite);return {...e,scheduler:B(t?.scheduler),deploymentProfiles:n,defaultDeploymentProfile:o,...s?{subscriptionType:s}:{},wpsuite:{...i,...i.siteSettings||s?{siteSettings:{...i.siteSettings??{},...i.siteSettings?.subscriber===true||s==="PROFESSIONAL"||s==="AGENCY"?{subscriber:true}:{}}}:{},...s?{subscriptionType:s}:{}}}}function J(e,t){let r=String(e||"").replace(/\\/g,"/").trim().replace(/^\/+|\/+$/g,"");if(!r)return t;let o=r.split("/").map(s=>s.trim()).filter(s=>s.length>0&&s!=="."&&s!=="..");return o.length>0?o.join("/"):t}function me(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?p.resolve(e):""}function L(e,t,n){let r=String(t||"").trim();return r&&p.isAbsolute(r)?p.resolve(r):p.resolve(e,J(r,n))}async function k(e){let t=String(e??"").trim()||process.env.PUBLISHER_CONFIG||"publisher.config.json",n=await f.readFile(t,"utf8"),r=JSON.parse(n);r.sourceOrigin=r.sourceOrigin.replace(/\/$/,""),r.targetOrigin=U(r.targetOrigin),r.ignoreHttpsErrors??=false,r.outputDir=String(r.outputDir||"export").trim()||"export",r.urlRewriteMode||=r.targetOrigin==="."?"relative":"absolute",r.noJavaScriptRenderPathPrefixes||=[],r.seedPaths||=[],r.generated404RequestPath=oe(r.generated404RequestPath),r.sitemapPaths||=["/sitemap_index.xml","/sitemap.xml"],r.allowedAssetHosts||=[],r.assetPathPrefixes||=["/wp-content/","/wp-includes/","/static/","/assets/","/build/","/_next/","/docs/","/sitemap","/robots.txt","/llms.txt"],r.blockedPathPrefixes||=[],r.blockedSearchFragments||=[],r.concurrency||=1,r.maxPages||=0,r.extraReplacements=x(r.extraReplacements),r.postCrawlCopyMap=x(r.postCrawlCopyMap),r.logDir=String(r.logDir||"logs").trim()||"logs",r.verbose??=false,r.logLevel||=r.verbose?"debug":"info",r.s3SyncMode||="sdk-upload-delete",r.readiness||={waitForSelector:null,waitForFunction:null,timeoutMs:1500,fallbackWaitMs:1500},r.readiness.timeoutMs??=1500,r.readiness.fallbackWaitMs??=1500,r.viewport||={width:1440,height:1200},r.navigationTimeoutMs||=3e4,r.assetDownloadConcurrency=Number(r.assetDownloadConcurrency)>0?Number(r.assetDownloadConcurrency):r.concurrency,r.rewriteConcurrency=Number(r.rewriteConcurrency)>0?Number(r.rewriteConcurrency):r.assetDownloadConcurrency,r.wpsuite=T(r.wpsuite),r.scheduler=B(void 0),r.deploymentProfiles={},r.defaultDeploymentProfile="",r.deploymentTargetOverride=String(r.deploymentTargetOverride??"").trim();let o=ge(r,await pe(r)),s=me(),i=s?p.resolve(s,".."):"";return i?(o.outputDir=L(i,o.outputDir,"export"),o.logDir=L(i,o.logDir,"logs")):(p.isAbsolute(o.outputDir)||(o.outputDir=J(o.outputDir,"export")),p.isAbsolute(o.logDir)||(o.logDir=J(o.logDir,"logs"))),o}var I=class extends Error{request;step;constructor(t,n){super(`Stop requested during ${n}.`),this.name="StopRequestedError",this.request=t,this.step=n;}},Pe="queue-mutation.lock",ve=5e3,Ce=3e4;function Re(e){let t=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"",n=process.env.STATIC_PUBLISHER_EXPORTER_DIR||process.cwd(),r=process.env.PUBLISHER_CONFIG||"",o=1;for(let u=0;u<e.length;u++){let a=e[u];a==="--runtime-dir"?t=e[++u]||"":a.startsWith("--runtime-dir=")?t=a.slice(14):a==="--exporter-dir"?n=e[++u]||n:a.startsWith("--exporter-dir=")?n=a.slice(15):a==="--config"?r=e[++u]||"":a.startsWith("--config=")?r=a.slice(9):a==="--max-jobs"?o=Number.parseInt(e[++u]||"1",10):a.startsWith("--max-jobs=")&&(o=Number.parseInt(a.slice(11),10));}if(!t)throw new Error("Missing runtime dir. Use --runtime-dir or STATIC_PUBLISHER_RUNTIME_DIR.");let s=p.resolve(t),i=r?p.resolve(r):p.join(s,"config.json");return {runtimeDir:s,exporterDir:p.resolve(n),configPath:i,maxJobs:Number.isFinite(o)&&o>0?o:1}}async function w(e,t){try{let n=await f.readFile(e,"utf8");return JSON.parse(n)}catch(n){if((n&&typeof n=="object"&&"code"in n?String(n.code||""):"")!=="ENOENT"){let o=n instanceof Error?n.message:String(n);console.warn(`[queue-runner] failed to read JSON ${e}: ${o}`);}return t}}async function S(e,t){await f.mkdir(p.dirname(e),{recursive:true}),await f.writeFile(e,JSON.stringify(t,null,2),"utf8");}function G(e){return p.join(e,Pe)}async function Ae(e){await new Promise(t=>setTimeout(t,e));}async function qe(e){let t=G(e),n=Date.now()+ve;for(;;)try{await f.mkdir(p.dirname(t),{recursive:!0}),await f.writeFile(t,JSON.stringify({pid:process.pid,createdAt:new Date().toISOString()},null,2),{encoding:"utf8",flag:"wx"});return}catch(r){if((r&&typeof r=="object"&&"code"in r?String(r.code||""):"")!=="EEXIST")throw r;let s=await f.stat(t).catch(()=>null);if(s&&Date.now()-s.mtimeMs>Ce){await f.unlink(t).catch(()=>{});continue}if(Date.now()>=n)throw new Error("Timed out acquiring queue mutation lock.",{cause:r});await Ae(50);}}async function Ie(e){await f.unlink(G(e)).catch(()=>{});}async function D(e,t){await qe(e);try{return await t()}finally{await Ie(e);}}function De(e){return p.join(e,"queue-runner-heartbeat.json")}function F(e){return p.join(e,"current-progress.json")}function N(e){return p.join(e,"scheduler-state.json")}function xe(e,t){let r=String(e||"").replace(/\\/g,"/").trim().replace(/^\/+|\/+$/g,"");if(!r)return t;let o=r.split("/").map(s=>s.trim()).filter(s=>s.length>0&&s!=="."&&s!=="..");return o.length>0?o.join("/"):t}async function Y(e){let t=await w(e.configPath||"",null),n=p.resolve(e.runtimeDir,".."),o=(typeof t?.logDir=="string"?t.logDir:"").trim();return o&&p.isAbsolute(o)?p.resolve(o):p.resolve(n,xe(o,"logs"))}function E(e,t){return String(e||"").trim().replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||t}function Je(e){let t=e?new Date(e):new Date;return (Number.isNaN(t.getTime())?new Date:t).toISOString().replace(/[-:]/g,"").replace(/\.\d{3}Z$/,"Z")}function Te(e){return [Je(e.endedAt||e.startedAt),E(e.command||"job","job"),E(e.id||"job","job"),E(e.status||"finished","finished")].join("-")}function ke(e){return e.endsWith(".log.jsonl")||e.endsWith(".errors.jsonl")||e.endsWith(".rejected.jsonl")?true:["current-crawl-event.json","rejected.jsonl","ignored.jsonl","skipped-http.jsonl","errors.jsonl","timings.jsonl","rejected.json","ignored.json","skipped-http.json","errors.json","timings.json"].includes(e)}function Ee(e){return e==="errors.json"||e==="errors.jsonl"||e.endsWith(".errors.jsonl")?"errors":e==="ignored.json"||e==="ignored.jsonl"?"ignored":e==="rejected.json"||e==="rejected.jsonl"||e.endsWith(".rejected.jsonl")?"rejected":e==="skipped-http.json"||e==="skipped-http.jsonl"?"skipped-http":e==="timings.json"||e==="timings.jsonl"?"timings":e==="current-progress.json"?"current-progress":e==="current-crawl-event.json"?"current-crawl-event":e.endsWith(".log.jsonl")?e.replace(/\.log\.jsonl$/i,"-log"):e.replace(/\.[^.]+$/u,"")||"artifact"}function je(e){return e.endsWith(".gz")?"application/gzip":e.endsWith(".jsonl")?"application/x-ndjson":e.endsWith(".json")?"application/json":"text/plain"}async function _(e,t,n){let r=`${n}.gz`,o=p.join(t,r);await pipeline(createReadStream(e),createGzip({level:9}),createWriteStream(o));let[s,i]=await Promise.all([f.stat(e),f.stat(o)]);return {role:Ee(n),originalFileName:n,storedFileName:r,compressed:true,compression:"gzip",contentType:je(r),originalSize:s.size,storedSize:i.size}}async function H(e,t){let n=await Y(t),r=new Date().toISOString(),o=Te(e),s=p.join(n,"archive",o),i=[],u=[];await f.mkdir(s,{recursive:true});try{let g=await f.readdir(n,{withFileTypes:!0});for(let d of g){if(!d.isFile()||!ke(d.name))continue;let l=await _(p.join(n,d.name),s,d.name);u.push(l),i.push(l.storedFileName);}}catch(g){if((g&&typeof g=="object"&&"code"in g?String(g.code||""):"")!=="ENOENT")throw g}let a=F(t.runtimeDir);if(existsSync(a)){let g=await _(a,s,"current-progress.json");u.push(g),i.push(g.storedFileName);}let c=[...i,"job.json"];return await S(p.join(s,"job.json"),{manifestVersion:1,archivedAt:r,archiveKey:o,archiveDir:s,logDir:n,runtimeDir:t.runtimeDir,exporterDir:t.exporterDir,configPath:t.configPath||"",archivedFiles:c,artifacts:u,job:e}),{archiveKey:o,archiveDir:s,archiveCreatedAt:r,archivedFiles:c,artifacts:u}}function Oe(e){return p.join(e,"audit-events.jsonl")}function j(e){return p.join(e,"stop-request.json")}async function Z(e){try{let t=await f.readFile(j(e),"utf8"),n=JSON.parse(t);return n&&typeof n=="object"?n:null}catch{return null}}async function $(e,t){let n=await Z(e);if(!n)return null;let r=String(n.targetJobId||"").trim();return r&&r!==t?null:n}async function O(e,t){if(!t){await f.unlink(j(e)).catch(()=>{});return}let n=await Z(e);if(!n)return;let r=String(n.targetJobId||"").trim();(!r||r===t)&&await f.unlink(j(e)).catch(()=>{});}async function A(e,t){try{let n={occurredAt:t.occurredAt||new Date().toISOString(),status:t.status||"info",actorSource:t.actorSource||"queue-runner",...t};await f.mkdir(e,{recursive:!0}),await f.appendFile(Oe(e),`${JSON.stringify(n)}
|
|
2
|
-
`,"utf8");}catch{}}async function b(e,t,n){let r={checkedAt:new Date().toISOString(),status:t,pid:process.pid,nodePath:process.execPath,nodeVersion:process.version,runtimeDir:e.runtimeDir,exporterDir:e.exporterDir,...n??{}};try{await S(De(e.runtimeDir),r);}catch{}}async function q(e){try{await f.unlink(F(e));}catch{}}function Fe(e,t){let n=e.command;if(n!=="publish"&&n!=="crawl"&&n!=="deploy"&&n!=="invalidate"&&n!=="retry-timeouts"&&n!=="url")return null;let r=Number.parseInt(String(e.intervalMinutes??"0"),10);if(!Number.isFinite(r)||r<1)return null;let o=(e.id||`${n}-${t+1}`).trim();if(!o)return null;let s=e.enabled!==false,i=typeof e.url=="string"?e.url.trim():"",u=typeof e.deploymentProfile=="string"?e.deploymentProfile.trim():"",a=(n==="publish"||n==="crawl")&&e.crawlMode==="incremental"?"incremental":"full";return n==="url"&&!i?null:{id:o,enabled:s,command:n,intervalMinutes:r,...n==="publish"||n==="crawl"?{crawlMode:a}:{},...(n==="publish"||n==="deploy"||n==="invalidate")&&u?{deploymentProfile:u}:{},...i?{url:i}:{}}}async function Me(e){let t=await k(e.configPath).catch(()=>null),n=t?.scheduler,r=Array.isArray(n?.rules)?n.rules.map((o,s)=>Fe(o,s)).filter(o=>!!o):[];return {enabled:!!n?.enabled,timezone:typeof n?.timezone=="string"&&n.timezone.trim()?n.timezone.trim():"UTC",rules:r,wpsuite:t?.wpsuite}}function Le(e,t){let n=(t.url||"").trim(),r=t.crawlMode||"full",o=(t.deploymentProfile||"").trim();return e.some(s=>s.command===t.command&&(s.url||"").trim()===n&&(s.crawlMode||"full")===r&&(s.deploymentProfile||"").trim()===o&&(s.status===void 0||s.status==="queued"||s.status==="running"))}async function Ue(e,t){if(!t.allowSchedulerAutoEnqueue)return 0;let n=await Me(e);if(!n.enabled||n.rules.length===0)return 0;if(t.assertActiveSubscriptionForIdentity)try{await t.assertActiveSubscriptionForIdentity(n.wpsuite??null);}catch(a){let c=a instanceof Error?a.message:String(a);return console.warn(`[queue-runner] scheduler auto-enqueue skipped: ${c}`),0}let r=p.join(e.runtimeDir,"queue.json"),o=p.join(e.runtimeDir,"current-run.json"),s=Date.now(),i=0,u=[];await D(e.runtimeDir,async()=>{let a=await w(r,[]),c=await w(o,null),g=await w(N(e.runtimeDir),{lastEnqueuedBucketByRuleId:{}}),d=[...a];c&&c.status==="running"&&d.unshift(c);for(let l of n.rules){if(!l.enabled)continue;let m=l.intervalMinutes*60*1e3,h=Math.floor(s/m),P=g.lastEnqueuedBucketByRuleId[l.id]??-1;if(h<=P||Le(d,{command:l.command,url:l.url,crawlMode:l.crawlMode,deploymentProfile:l.deploymentProfile}))continue;let y={id:randomUUID(),command:l.command,...(l.command==="publish"||l.command==="crawl")&&l.crawlMode?{crawlMode:l.crawlMode}:{},...(l.command==="publish"||l.command==="deploy"||l.command==="invalidate")&&l.deploymentProfile?{deploymentProfile:l.deploymentProfile}:{},...l.url?{url:l.url}:{},enqueueSource:"scheduler",...n.wpsuite?{wpsuite:n.wpsuite}:{},status:"queued",createdAt:new Date().toISOString(),createdBy:0};a.push(y),d.push(y),u.push({job:y,rule:l}),g.lastEnqueuedBucketByRuleId[l.id]=h,i+=1;}i>0&&(await S(r,a),await S(N(e.runtimeDir),g));});for(let a of u)await A(e.runtimeDir,{eventType:"job-created",status:"queued",actorSource:"queue-runner-scheduler",jobId:a.job.id,command:a.job.command,message:"Scheduler auto-enqueued a job.",details:{ruleId:a.rule.id,intervalMinutes:a.rule.intervalMinutes,timezone:n.timezone,deploymentProfile:a.rule.deploymentProfile||"",url:a.rule.url||""}});return i}async function We(e){let t={pid:process.pid,startedAt:new Date().toISOString()};await f.writeFile(e,JSON.stringify(t,null,2),{encoding:"utf8",flag:"wx"});}async function Be(e){try{await f.unlink(e);}catch{}}function Qe(e,t){let n=[p.join(e,"dist",`${t}.js`),p.join(e,`${t}.js`)];for(let r of n)if(existsSync(r))return r;throw new Error(`Cannot find ${t}.js in ${p.join(e,"dist")} or ${e}`)}async function C(e,t,n,r,o,s,i){if(i){let c=await $(t,i);if(c)throw new I(c,n)}let u=Qe(e,n),a={...process.env,...s??{}};return a.STATIC_PUBLISHER_RUNTIME_DIR=t,o&&(a.PUBLISHER_CONFIG=o),await new Promise((c,g)=>{let d=null,l=null,m=null,h=false,P=spawn(process.execPath,[u,...r],{cwd:e,env:a,stdio:"inherit"}),y=()=>{l&&clearInterval(l),m&&clearTimeout(m);},te=async()=>{if(!(!i||d||h)){h=true;try{let R=await $(t,i);if(!R)return;d=R,P.kill("SIGTERM"),m=setTimeout(()=>{P.kill("SIGKILL");},1e4);}finally{h=false;}}};i&&(l=setInterval(()=>{te();},1e3)),P.on("error",R=>{y(),g(R);}),P.on("close",(R,M)=>{if(y(),d){g(new I(d,n));return}R===0?c():g(new Error(`${n} exited with code ${R??-1}${M?` (signal ${M})`:""}`));});}),0}function ze(e){let t=e.awsTempCreds;if(!t)return {};let n={};return typeof t.accessKeyId=="string"&&t.accessKeyId.trim()!==""&&(n.AWS_ACCESS_KEY_ID=t.accessKeyId.trim()),typeof t.secretAccessKey=="string"&&t.secretAccessKey.trim()!==""&&(n.AWS_SECRET_ACCESS_KEY=t.secretAccessKey.trim()),typeof t.sessionToken=="string"&&t.sessionToken.trim()!==""&&(n.AWS_SESSION_TOKEN=t.sessionToken.trim()),n}async function Ne(e,t){let n=i=>{if(!i||typeof i!="object")return null;let u=i,a={...u.siteSettings??{},...String(u.accountId??"").trim()&&!u.siteSettings?.accountId?{accountId:String(u.accountId).trim()}:{},...String(u.siteId??"").trim()&&!u.siteSettings?.siteId?{siteId:String(u.siteId).trim()}:{},...u.siteSettings?.subscriber===true||u.subscriber===true?{subscriber:true}:{}},c={...String(u.apiBase??"").trim()?{apiBase:String(u.apiBase).trim()}:{},...String(u.runtimeToken??u.nonce??"").trim()?{runtimeToken:String(u.runtimeToken??u.nonce).trim()}:{},...String(u.uploadUrl??"").trim()?{uploadUrl:String(u.uploadUrl).trim()}:{},...Object.keys(a).length>0?{siteSettings:a}:{},...u.subscriptionType?{subscriptionType:u.subscriptionType}:{}};return Object.keys(c).length>0?c:null},r=await k(t.configPath).catch(()=>null),o=n(r?.wpsuite);if(o)return o;let s=n(e.wpsuite);return s||null}async function _e(e,t){return await Ne(e,t)}function V(e){let t={...e,status:"queued"};return delete t.startedAt,delete t.endedAt,delete t.exitCode,delete t.error,delete t.stopRequestedAt,delete t.stopRequestedByUserId,delete t.stopRequestedByLogin,delete t.stopMode,delete t.stoppedStep,t}async function He(e,t){let n=await w(F(e.runtimeDir),null),r=n&&n.details&&typeof n.details.phase=="string"?n.details.phase.trim():"";if(r)return r;let o=n&&typeof n.currentStep=="string"?n.currentStep.trim():"";if(o)return o;let s=await Y(e).catch(()=>"");if(s){let i=await w(p.join(s,"current-crawl-event.json"),null),u=i&&typeof i.currentStep=="string"?i.currentStep.trim():"";if(u)return u}return t}function $e(e,t){if((e.command==="publish"||e.command==="crawl")&&t==="rewrite-text")return "rewrite-text"}async function Ke(e){let t=p.join(e.runtimeDir,"queue.json"),n=p.join(e.runtimeDir,"current-run.json"),r=await D(e.runtimeDir,async()=>{let o=await w(n,null);if(!o||o.status!=="running"&&o.status!=="queued")return null;let s=await w(t,[]),i=Array.isArray(s)?s.filter(a=>a?.id!==o.id):[],u=V(o);return await S(t,[u,...i]),await S(n,null),u});r&&(await O(e.runtimeDir,r.id),await A(e.runtimeDir,{eventType:"job-recovered",status:"queued",actorSource:"queue-runner",jobId:r.id,command:r.command,message:"Recovered stale current-run entry back into queue."}));}async function Ge(e,t,n){try{if((n.shouldEnforceSubscriptionOnJobExecution?.(e)??n.enforceSubscriptionOnJobExecution)&&n.assertActiveSubscriptionForIdentity){let u=await _e(e,t);await n.assertActiveSubscriptionForIdentity(u);}let o=ze(e),s=e.resumeFromStep==="rewrite-text"?["--resume-rewrite"]:e.crawlMode==="incremental"?["--crawl-mode","incremental"]:[],i=e.deploymentProfile?["--profile",e.deploymentProfile]:[];if(e.command==="publish")return await b(t,"running",{currentJobId:e.id,currentJobCommand:e.command,currentStep:e.resumeFromStep==="rewrite-text"?"rewrite-text":"crawl"}),await C(t.exporterDir,t.runtimeDir,"crawl",s,t.configPath,o,e.id),await b(t,"running",{currentJobId:e.id,currentJobCommand:e.command,currentStep:"deploy"}),await C(t.exporterDir,t.runtimeDir,"deploy",i,t.configPath,o,e.id),await b(t,"running",{currentJobId:e.id,currentJobCommand:e.command,currentStep:"invalidate"}),await C(t.exporterDir,t.runtimeDir,"invalidate",i,t.configPath,o,e.id),{exitCode:0};if(e.command==="crawl")return await b(t,"running",{currentJobId:e.id,currentJobCommand:e.command,currentStep:e.resumeFromStep==="rewrite-text"?"rewrite-text":"crawl"}),await C(t.exporterDir,t.runtimeDir,"crawl",s,t.configPath,o,e.id),{exitCode:0};if(e.command==="deploy")return await b(t,"running",{currentJobId:e.id,currentJobCommand:e.command,currentStep:"deploy"}),await C(t.exporterDir,t.runtimeDir,"deploy",i,t.configPath,o,e.id),{exitCode:0};if(e.command==="invalidate")return await b(t,"running",{currentJobId:e.id,currentJobCommand:e.command,currentStep:"invalidate"}),await C(t.exporterDir,t.runtimeDir,"invalidate",i,t.configPath,o,e.id),{exitCode:0};if(e.command==="retry-timeouts")return await b(t,"running",{currentJobId:e.id,currentJobCommand:e.command,currentStep:"retry-timeouts"}),await C(t.exporterDir,t.runtimeDir,"crawl",["--retry-timeouts"],t.configPath,o,e.id),{exitCode:0};if(e.command==="url"){let u=(e.url||"").trim();return u?(await b(t,"running",{currentJobId:e.id,currentJobCommand:e.command,currentStep:"url"}),await C(t.exporterDir,t.runtimeDir,"crawl",["--url",u],t.configPath,o,e.id),{exitCode:0}):{exitCode:2,error:"Missing url for command 'url'"}}return {exitCode:2,error:`Unsupported command: ${e.command}`}}catch(r){return r instanceof I?{exitCode:130,error:"Job stop requested.",stopped:true,stopRequest:r.request,stoppedStep:r.step}:{exitCode:1,error:r instanceof Error?r.message:String(r)}}}function X(e){return async function(n=process.argv.slice(2)){let r=Re(n),o=p.join(r.runtimeDir,"export.lock"),s=p.join(r.runtimeDir,"last-run.json");await q(r.runtimeDir),await b(r,"starting",{message:"queue-runner starting"});try{await We(o);}catch(i){if((i&&typeof i=="object"&&"code"in i?String(i.code||""):"")!=="EEXIST")throw i;console.log("[queue-runner] lock active, skipping"),await b(r,"lock-active",{message:"lock active, skipped this cron tick"});return}try{await Ke(r);let i=await Ue(r,e),u=0;for(let a=0;a<r.maxJobs;a++){let c=await Ze(r,e);if(c==="none"||(u+=1,c==="stopped"))break}if(u===0)await q(r.runtimeDir),await b(r,"idle",{processedJobs:u,schedulerEnqueued:i,message:"no queued jobs"});else {await q(r.runtimeDir);let a=await w(s,null),c=String(a?.status||"").trim();await b(r,c==="success"?"job-success":c==="stopped"?"job-stopped":"job-failed",{processedJobs:u,schedulerEnqueued:i,lastJobId:a?.id,lastJobCommand:a?.command,lastJobStatus:a?.status,lastJobExitCode:a?.exitCode,lastJobError:a?.error,...c==="stopped"?{currentStep:a?.stoppedStep,stopRequestedAt:a?.stopRequestedAt,stopRequestedByLogin:a?.stopRequestedByLogin,stopRequestedMode:a?.stopMode,lastStoppedStep:a?.stoppedStep,message:a?.stopMode==="requeue"?`Job stopped during ${a?.stoppedStep||a?.command||"active step"} and requeued.`:`Job stopped during ${a?.stoppedStep||a?.command||"active step"} and left out of queue.`}:{}});}}catch(i){let u=i instanceof Error?i.message:String(i);throw await b(r,"error",{message:u}),await A(r.runtimeDir,{eventType:"queue-runner-error",status:"failed",actorSource:"queue-runner",message:"Unhandled queue-runner error.",details:{error:u}}),i}finally{await Be(o);}}}async function Ye(e,t,n){let r=p.join(e.runtimeDir,"queue.json"),o=p.join(e.runtimeDir,"current-run.json");await D(e.runtimeDir,async()=>{let s=await w(r,[]),i=Array.isArray(s)?s.filter(c=>c?.id!==t.id):[],u=V(t),a=$e(t,n);a?u.resumeFromStep=a:delete u.resumeFromStep,await S(r,[u,...i]),await S(o,null);});}async function Ze(e,t){let n=p.join(e.runtimeDir,"queue.json"),r=p.join(e.runtimeDir,"current-run.json"),o=p.join(e.runtimeDir,"last-run.json"),s=new Date().toISOString(),i=await D(e.runtimeDir,async()=>{let d=await w(n,[]);if(!Array.isArray(d)||d.length===0)return null;let l={...d[0],status:"running",startedAt:s};return await S(n,d.slice(1)),await S(r,l),l});if(!i)return "none";await q(e.runtimeDir),await A(e.runtimeDir,{eventType:"job-run-started",status:"running",actorSource:"queue-runner",jobId:i.id,command:i.command,message:"Job execution started.",details:{createdAt:i.createdAt||"",startedAt:s,createdBy:i.createdBy??null,deploymentProfile:i.deploymentProfile||"",queuedWithTempAwsCreds:!!i.awsTempCreds}}),await b(e,"running",{currentJobId:i.id,currentJobCommand:i.command,currentStep:i.command});let u=await Ge(i,e,t),a=new Date().toISOString();if(u.stopped){let d=await He(e,u.stoppedStep||i.command),l=u.stopRequest?.mode==="requeue"?"requeue":"stop",m={...i,status:"stopped",endedAt:a,exitCode:u.exitCode,...u.error?{error:u.error}:{},stopRequestedAt:u.stopRequest?.requestedAt||"",stopRequestedByUserId:typeof u.stopRequest?.requestedByUserId=="number"?u.stopRequest.requestedByUserId:null,stopRequestedByLogin:u.stopRequest?.requestedByLogin||"",stopMode:l,stoppedStep:d};l==="requeue"?await Ye(e,i,d):await S(r,null);try{let h=await H(m,e);m.logArchiveDir=h.archiveDir,m.logArchiveCreatedAt=h.archiveCreatedAt,m.logArchiveFileCount=h.archivedFiles.length;}catch(h){m.logArchiveError=h instanceof Error?h.message:String(h);}return await S(o,m),await O(e.runtimeDir,i.id),await q(e.runtimeDir),await A(e.runtimeDir,{eventType:"job-run-stopped",status:"stopped",actorSource:"queue-runner",jobId:i.id,command:i.command,message:l==="requeue"?"Job stop requested and requeued.":"Job stop requested and removed from active execution without requeue.",details:{startedAt:i.startedAt||"",endedAt:a,deploymentProfile:i.deploymentProfile||"",stopMode:l,stopRequestedAt:u.stopRequest?.requestedAt||"",stopRequestedByLogin:u.stopRequest?.requestedByLogin||"",stopRequestedByUserId:typeof u.stopRequest?.requestedByUserId=="number"?u.stopRequest.requestedByUserId:null,stoppedStep:d,logArchiveKey:m.logArchiveError||!m.logArchiveDir?"":p.basename(m.logArchiveDir),logArchiveDir:m.logArchiveDir||"",logArchiveCreatedAt:m.logArchiveCreatedAt||"",logArchiveFileCount:m.logArchiveFileCount??0,logArchiveError:m.logArchiveError||""}}),"stopped"}let c={...i,status:u.exitCode===0?"success":"failed",endedAt:a,exitCode:u.exitCode,...u.error?{error:u.error}:{}};await S(r,null),await O(e.runtimeDir,i.id);try{let d=await H(c,e);c.logArchiveDir=d.archiveDir,c.logArchiveCreatedAt=d.archiveCreatedAt,c.logArchiveFileCount=d.archivedFiles.length;}catch(d){c.logArchiveError=d instanceof Error?d.message:String(d);}await S(o,c);let g=i.startedAt&&c.endedAt?Math.max(0,Math.round((new Date(c.endedAt).getTime()-new Date(i.startedAt).getTime())/1e3)):void 0;return await A(e.runtimeDir,{eventType:"job-run-finished",status:c.status==="success"?"success":"failed",actorSource:"queue-runner",jobId:c.id,command:c.command,message:c.status==="success"?"Job execution finished successfully.":"Job execution finished with failure.",details:{startedAt:i.startedAt||"",endedAt:c.endedAt||"",durationSec:g,deploymentProfile:c.deploymentProfile||"",exitCode:c.exitCode??null,error:c.error||"",logArchiveKey:c.logArchiveError||!c.logArchiveDir?"":p.basename(c.logArchiveDir),logArchiveDir:c.logArchiveDir||"",logArchiveCreatedAt:c.logArchiveCreatedAt||"",logArchiveFileCount:c.logArchiveFileCount??0,logArchiveError:c.logArchiveError||""}}),"processed"}async function Xe(e){if(!e)throw new Error("Missing remote WPSuite publisher state. Refresh the runtime config before running subscription-gated jobs.");if(e.subscriptionType!=="PROFESSIONAL"&&e.subscriptionType!=="AGENCY")throw new Error("This job requires an active WPSuite publisher subscription in the remote site configuration.")}var et={allowSchedulerAutoEnqueue:true,enforceSubscriptionOnJobExecution:false,shouldEnforceSubscriptionOnJobExecution:e=>e.enqueueSource==="scheduler"||e.createdBy===0,assertActiveSubscriptionForIdentity:Xe},ee=X(et),tt=ee,St=ee;process.argv[1]&&import.meta.url===pathToFileURL(process.argv[1]).href&&tt().catch(e=>{console.error(e),process.exit(1);});export{St as default,tt as main,ee as runQueueRunner};
|
|
1
|
+
import {pathToFileURL}from'url';import f from'fs/promises';import {existsSync,createReadStream,createWriteStream}from'fs';import g from'path';import {spawn}from'child_process';import {randomUUID}from'crypto';import {pipeline}from'stream/promises';import {createGzip}from'zlib';import ne from'http';import ie from'https';function U(e){let t=e.trim();return t==="."?".":t.replace(/\/$/,"")}function oe(e){let t=String(e??"").trim();if(!t)return "";let n=t;if(/^https?:\/\//i.test(n))try{n=new URL(n).pathname;}catch{return ""}if(n=n.split(/[?#]/,1)[0]?.replace(/\\/g,"/").trim()??"",!n)return "";let r=n.endsWith("/"),o=n.replace(/^\/+/,"").split("/").map(i=>i.replace(/[^A-Za-z0-9._-]/g,"")).filter(i=>i.length>0&&i!=="."&&i!=="..");if(o.length===0)return "";let s=`/${o.join("/")}`;return r&&g.extname(s)===""&&(s+="/"),s==="/"?"":s}function x(e){return !e||typeof e!="object"?{}:Object.fromEntries(Object.entries(e).map(([t,n])=>[t.trim(),String(n??"")]).filter(([t])=>t.length>0))}function se(e){if(!e||typeof e!="object")return {};let t={};for(let[n,r]of Object.entries(e)){let o=n.trim();if(!o||!r||typeof r!="object")continue;let s=r,i={};if(typeof s.targetOrigin=="string"){let a=U(s.targetOrigin);a&&(i.targetOrigin=a);}let u=x(s.extraReplacements);if(Object.keys(u).length>0&&(i.extraReplacements=u),s.s3&&typeof s.s3=="object"){let a={},c=s.s3;typeof c.bucket=="string"&&(a.bucket=c.bucket.trim()),typeof c.prefix=="string"&&(a.prefix=c.prefix.trim()),typeof c.region=="string"&&(a.region=c.region.trim()),typeof c.htmlCacheControl=="string"&&(a.htmlCacheControl=c.htmlCacheControl.trim()),typeof c.assetCacheControl=="string"&&(a.assetCacheControl=c.assetCacheControl.trim()),Object.keys(a).length>0&&(i.s3=a);}if(s.cloudFront&&typeof s.cloudFront=="object"){let a={},c=s.cloudFront;typeof c.distributionId=="string"&&(a.distributionId=c.distributionId.trim()),Array.isArray(c.invalidationPaths)&&(a.invalidationPaths=c.invalidationPaths.map(p=>String(p??"").trim()).filter(p=>p.length>0)),Object.keys(a).length>0&&(i.cloudFront=a);}t[o]=i;}return t}function W(e){return e==="PROFESSIONAL"||e==="AGENCY"?e:void 0}function ue(e,t){if(!e||typeof e!="object")return null;let n=e,r=n.command;if(r!=="publish"&&r!=="crawl"&&r!=="deploy"&&r!=="invalidate"&&r!=="retry-timeouts"&&r!=="url")return null;let o=Number.parseInt(String(n.intervalMinutes??"0"),10);if(!Number.isFinite(o)||o<1)return null;let s=String(n.id??`${r}-${t+1}`).trim();if(!s)return null;let i=String(n.deploymentProfile??"").trim(),u=String(n.url??"").trim();return {id:s,enabled:n.enabled!==false,command:r,intervalMinutes:o,...r==="publish"||r==="crawl"?{crawlMode:n.crawlMode==="incremental"?"incremental":"full"}:{},...(r==="publish"||r==="deploy"||r==="invalidate")&&i?{deploymentProfile:i}:{},...u?{url:u}:{}}}function B(e){let t=e&&typeof e=="object"?e:{},n=Array.isArray(t.rules)?t.rules.map((r,o)=>ue(r,o)).filter(r=>!!r):[];return {enabled:t.enabled===true,timezone:typeof t.timezone=="string"&&t.timezone.trim()!==""?t.timezone.trim():"UTC",rules:n}}function ae(e){if(!e||typeof e!="object")return;let t=e,n={};for(let o of ["accountId","siteId"]){let s=t[o];typeof s=="string"&&s.trim()!==""&&(n[o]=s.trim());}let r=Number(t.lastUpdate??0);return Number.isFinite(r)&&r>0&&(n.lastUpdate=Math.floor(r)),t.subscriber===true&&(n.subscriber=true),Object.keys(n).length>0?n:void 0}function T(e){let t=e&&typeof e=="object"?e:{},n=String(t.accountId??"").trim(),r=String(t.siteId??"").trim(),o=t.subscriber===true,s=ae(t.siteSettings),i={...s??{},...n?{accountId:s?.accountId??n}:{},...r?{siteId:s?.siteId??r}:{},...s?.subscriber===true||o?{subscriber:true}:{}},u={},a=String(t.apiBase??"").trim();a&&(u.apiBase=a);let c=String(t.runtimeToken??t.nonce??"").trim();c&&(u.runtimeToken=c);let p=String(t.uploadUrl??"").trim();p&&(u.uploadUrl=p),Object.keys(i).length>0&&(u.siteSettings=i);let d=W(t.subscriptionType);return d&&(u.subscriptionType=d),u}function ce(e){try{let t=new URL(e);globalThis.location=t;}catch{}}function Q(e){return typeof e=="string"?e:e instanceof URL?e.toString():e.url}function le(e,t){let n=new Headers(e instanceof Request?e.headers:void 0);if(t?.headers)for(let[r,o]of new Headers(t.headers).entries())n.set(r,o);return n}async function z(e,t,n=5){let r=new URL(Q(e)),o=String(t?.method??(e instanceof Request?e.method:"GET")).toUpperCase(),s=r.protocol==="http:"?ne:ie,i=le(e,t);return await new Promise((u,a)=>{let c=s.request(r,{method:o,headers:Object.fromEntries(i.entries()),...r.protocol==="https:"?{rejectUnauthorized:false}:{}},p=>{let d=[];p.on("data",l=>{d.push(Buffer.isBuffer(l)?l:Buffer.from(l));}),p.on("error",a),p.on("end",()=>{let l=p.statusCode??0,m=p.headers.location;if(n>0&&m&&[301,302,303,307,308].includes(l)){u(z(new URL(m,r),{method:l===303?"GET":o},n-1));return}let h=new Headers;for(let[P,y]of Object.entries(p.headers))Array.isArray(y)?h.set(P,y.join(", ")):typeof y=="string"&&h.set(P,y);u(new Response(Buffer.concat(d),{status:l,statusText:p.statusMessage??"",headers:h}));});});c.on("error",a),c.end();})}function de(e){let t=T(e.wpsuite),n={...t.siteSettings??{},...t.siteSettings?.subscriber===true||t.subscriptionType==="PROFESSIONAL"||t.subscriptionType==="AGENCY"?{subscriber:true}:{}},r=String(n.accountId??"").trim(),o=String(n.siteId??"").trim(),s=String(t.uploadUrl??"").trim();if(e.wpsuite={...t.apiBase?{apiBase:t.apiBase}:{},...t.runtimeToken?{runtimeToken:t.runtimeToken}:{},...s?{uploadUrl:s}:{},...Object.keys(n).length>0?{siteSettings:n}:{},...t.subscriptionType?{subscriptionType:t.subscriptionType}:{}},!r||!o||!s)return false;ce(e.sourceOrigin);let i=globalThis,a={...i.WpSuite??{},siteSettings:n,uploadUrl:s};return t.apiBase&&(a.apiBase=t.apiBase),i.WpSuite=a,true}async function ge(e){if(!de(e))return null;let t=String(e.wpsuite?.uploadUrl??"").trim(),n=globalThis.fetch;try{e.ignoreHttpsErrors&&typeof n=="function"&&t.startsWith("https://")&&(globalThis.fetch=(async(s,i)=>Q(s).startsWith(t)?z(s,i):n(s,i)));let{getConfig:r}=await import('@smart-cloud/wpsuite-core'),o=await r("publisher");return o&&typeof o=="object"?o:null}catch{return null}finally{typeof n=="function"&&(globalThis.fetch=n);}}function pe(e,t){let n=se(t?.deploymentProfiles),r=String(t?.defaultDeploymentProfile??"").trim(),o=n[r]?r:"",s=W(t?.subscriptionType),i=T(e.wpsuite);return {...e,scheduler:B(t?.scheduler),deploymentProfiles:n,defaultDeploymentProfile:o,...s?{subscriptionType:s}:{},wpsuite:{...i,...i.siteSettings||s?{siteSettings:{...i.siteSettings??{},...i.siteSettings?.subscriber===true||s==="PROFESSIONAL"||s==="AGENCY"?{subscriber:true}:{}}}:{},...s?{subscriptionType:s}:{}}}}function J(e,t){let r=String(e||"").replace(/\\/g,"/").trim().replace(/^\/+|\/+$/g,"");if(!r)return t;let o=r.split("/").map(s=>s.trim()).filter(s=>s.length>0&&s!=="."&&s!=="..");return o.length>0?o.join("/"):t}function me(){let e=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"";return e.trim()?g.resolve(e):""}function L(e,t,n){let r=String(t||"").trim();return r&&g.isAbsolute(r)?g.resolve(r):g.resolve(e,J(r,n))}async function k(e){let t=String(e??"").trim()||process.env.PUBLISHER_CONFIG||"publisher.config.json",n=await f.readFile(t,"utf8"),r=JSON.parse(n);r.sourceOrigin=r.sourceOrigin.replace(/\/$/,""),r.targetOrigin=U(r.targetOrigin),r.ignoreHttpsErrors??=false,r.outputDir=String(r.outputDir||"export").trim()||"export",r.urlRewriteMode||=r.targetOrigin==="."?"relative":"absolute",r.noJavaScriptRenderPathPrefixes||=[],r.seedPaths||=[],r.generated404RequestPath=oe(r.generated404RequestPath),r.sitemapPaths||=["/sitemap_index.xml","/sitemap.xml"],r.allowedAssetHosts||=[],r.assetPathPrefixes||=["/wp-content/","/wp-includes/","/static/","/assets/","/build/","/_next/","/docs/","/sitemap","/robots.txt","/llms.txt"],r.blockedPathPrefixes||=[],r.blockedSearchFragments||=[],r.concurrency||=1,r.maxPages||=0,r.extraReplacements=x(r.extraReplacements),r.postCrawlCopyMap=x(r.postCrawlCopyMap),r.logDir=String(r.logDir||"logs").trim()||"logs",r.verbose??=false,r.logLevel||=r.verbose?"debug":"info",r.s3SyncMode||="sdk-upload-delete",r.readiness||={waitForSelector:null,waitForFunction:null,timeoutMs:1500,fallbackWaitMs:1500},r.readiness.timeoutMs??=1500,r.readiness.fallbackWaitMs??=1500,r.viewport||={width:1440,height:1200},r.navigationTimeoutMs||=3e4,r.assetDownloadConcurrency=Number(r.assetDownloadConcurrency)>0?Number(r.assetDownloadConcurrency):r.concurrency,r.rewriteConcurrency=Number(r.rewriteConcurrency)>0?Number(r.rewriteConcurrency):r.assetDownloadConcurrency,r.wpsuite=T(r.wpsuite),r.scheduler=B(void 0),r.deploymentProfiles={},r.defaultDeploymentProfile="",r.deploymentTargetOverride=String(r.deploymentTargetOverride??"").trim();let o=pe(r,await ge(r)),s=me(),i=s?g.resolve(s,".."):"";return i?(o.outputDir=L(i,o.outputDir,"export"),o.logDir=L(i,o.logDir,"logs")):(g.isAbsolute(o.outputDir)||(o.outputDir=J(o.outputDir,"export")),g.isAbsolute(o.logDir)||(o.logDir=J(o.logDir,"logs"))),o}var I=class extends Error{request;step;constructor(t,n){super(`Stop requested during ${n}.`),this.name="StopRequestedError",this.request=t,this.step=n;}},Pe="queue-mutation.lock",ve=5e3,Ce=3e4;function Re(e){let t=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"",n=process.env.STATIC_PUBLISHER_EXPORTER_DIR||process.cwd(),r=process.env.PUBLISHER_CONFIG||"",o=1;for(let u=0;u<e.length;u++){let a=e[u];a==="--runtime-dir"?t=e[++u]||"":a.startsWith("--runtime-dir=")?t=a.slice(14):a==="--exporter-dir"?n=e[++u]||n:a.startsWith("--exporter-dir=")?n=a.slice(15):a==="--config"?r=e[++u]||"":a.startsWith("--config=")?r=a.slice(9):a==="--max-jobs"?o=Number.parseInt(e[++u]||"1",10):a.startsWith("--max-jobs=")&&(o=Number.parseInt(a.slice(11),10));}if(!t)throw new Error("Missing runtime dir. Use --runtime-dir or STATIC_PUBLISHER_RUNTIME_DIR.");let s=g.resolve(t),i=r?g.resolve(r):g.join(s,"config.json");return {runtimeDir:s,exporterDir:g.resolve(n),configPath:i,maxJobs:Number.isFinite(o)&&o>0?o:1}}async function w(e,t){try{let n=await f.readFile(e,"utf8");return JSON.parse(n)}catch(n){if((n&&typeof n=="object"&&"code"in n?String(n.code||""):"")!=="ENOENT"){let o=n instanceof Error?n.message:String(n);console.warn(`[queue-runner] failed to read JSON ${e}: ${o}`);}return t}}async function S(e,t){await f.mkdir(g.dirname(e),{recursive:true}),await f.writeFile(e,JSON.stringify(t,null,2),"utf8");}function G(e){return g.join(e,Pe)}async function Ae(e){await new Promise(t=>setTimeout(t,e));}async function qe(e){let t=G(e),n=Date.now()+ve;for(;;)try{await f.mkdir(g.dirname(t),{recursive:!0}),await f.writeFile(t,JSON.stringify({pid:process.pid,createdAt:new Date().toISOString()},null,2),{encoding:"utf8",flag:"wx"});return}catch(r){if((r&&typeof r=="object"&&"code"in r?String(r.code||""):"")!=="EEXIST")throw r;let s=await f.stat(t).catch(()=>null);if(s&&Date.now()-s.mtimeMs>Ce){await f.unlink(t).catch(()=>{});continue}if(Date.now()>=n)throw new Error("Timed out acquiring queue mutation lock.",{cause:r});await Ae(50);}}async function Ie(e){await f.unlink(G(e)).catch(()=>{});}async function D(e,t){await qe(e);try{return await t()}finally{await Ie(e);}}function De(e){return g.join(e,"queue-runner-heartbeat.json")}function F(e){return g.join(e,"current-progress.json")}function N(e){return g.join(e,"scheduler-state.json")}function xe(e,t){let r=String(e||"").replace(/\\/g,"/").trim().replace(/^\/+|\/+$/g,"");if(!r)return t;let o=r.split("/").map(s=>s.trim()).filter(s=>s.length>0&&s!=="."&&s!=="..");return o.length>0?o.join("/"):t}async function Y(e){let t=await w(e.configPath||"",null),n=g.resolve(e.runtimeDir,".."),o=(typeof t?.logDir=="string"?t.logDir:"").trim();return o&&g.isAbsolute(o)?g.resolve(o):g.resolve(n,xe(o,"logs"))}function E(e,t){return String(e||"").trim().replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||t}function Je(e){let t=e?new Date(e):new Date;return (Number.isNaN(t.getTime())?new Date:t).toISOString().replace(/[-:]/g,"").replace(/\.\d{3}Z$/,"Z")}function Te(e){return [Je(e.endedAt||e.startedAt),E(e.command||"job","job"),E(e.id||"job","job"),E(e.status||"finished","finished")].join("-")}function ke(e){return e.endsWith(".log.jsonl")||e.endsWith(".errors.jsonl")||e.endsWith(".rejected.jsonl")?true:["current-crawl-event.json","rejected.jsonl","ignored.jsonl","skipped-http.jsonl","errors.jsonl","timings.jsonl","rejected.json","ignored.json","skipped-http.json","errors.json","timings.json"].includes(e)}function Ee(e){return e==="errors.json"||e==="errors.jsonl"||e.endsWith(".errors.jsonl")?"errors":e==="ignored.json"||e==="ignored.jsonl"?"ignored":e==="rejected.json"||e==="rejected.jsonl"||e.endsWith(".rejected.jsonl")?"rejected":e==="skipped-http.json"||e==="skipped-http.jsonl"?"skipped-http":e==="timings.json"||e==="timings.jsonl"?"timings":e==="current-progress.json"?"current-progress":e==="current-crawl-event.json"?"current-crawl-event":e.endsWith(".log.jsonl")?e.replace(/\.log\.jsonl$/i,"-log"):e.replace(/\.[^.]+$/u,"")||"artifact"}function je(e){return e.endsWith(".gz")?"application/gzip":e.endsWith(".jsonl")?"application/x-ndjson":e.endsWith(".json")?"application/json":"text/plain"}async function _(e,t,n){let r=`${n}.gz`,o=g.join(t,r);await pipeline(createReadStream(e),createGzip({level:9}),createWriteStream(o));let[s,i]=await Promise.all([f.stat(e),f.stat(o)]);return {role:Ee(n),originalFileName:n,storedFileName:r,compressed:true,compression:"gzip",contentType:je(r),originalSize:s.size,storedSize:i.size}}async function H(e,t){let n=await Y(t),r=new Date().toISOString(),o=Te(e),s=g.join(n,"archive",o),i=[],u=[];await f.mkdir(s,{recursive:true});try{let p=await f.readdir(n,{withFileTypes:!0});for(let d of p){if(!d.isFile()||!ke(d.name))continue;let l=await _(g.join(n,d.name),s,d.name);u.push(l),i.push(l.storedFileName);}}catch(p){if((p&&typeof p=="object"&&"code"in p?String(p.code||""):"")!=="ENOENT")throw p}let a=F(t.runtimeDir);if(existsSync(a)){let p=await _(a,s,"current-progress.json");u.push(p),i.push(p.storedFileName);}let c=[...i,"job.json"];return await S(g.join(s,"job.json"),{manifestVersion:1,archivedAt:r,archiveKey:o,archiveDir:s,logDir:n,runtimeDir:t.runtimeDir,exporterDir:t.exporterDir,configPath:t.configPath||"",archivedFiles:c,artifacts:u,job:e}),{archiveKey:o,archiveDir:s,archiveCreatedAt:r,archivedFiles:c,artifacts:u}}function Oe(e){return g.join(e,"audit-events.jsonl")}function j(e){return g.join(e,"stop-request.json")}async function Z(e){try{let t=await f.readFile(j(e),"utf8"),n=JSON.parse(t);return n&&typeof n=="object"?n:null}catch{return null}}async function $(e,t){let n=await Z(e);if(!n)return null;let r=String(n.targetJobId||"").trim();return r&&r!==t?null:n}async function O(e,t){if(!t){await f.unlink(j(e)).catch(()=>{});return}let n=await Z(e);if(!n)return;let r=String(n.targetJobId||"").trim();(!r||r===t)&&await f.unlink(j(e)).catch(()=>{});}async function A(e,t){try{let n={occurredAt:t.occurredAt||new Date().toISOString(),status:t.status||"info",actorSource:t.actorSource||"queue-runner",...t};await f.mkdir(e,{recursive:!0}),await f.appendFile(Oe(e),`${JSON.stringify(n)}
|
|
2
|
+
`,"utf8");}catch{}}async function b(e,t,n){let r={checkedAt:new Date().toISOString(),status:t,pid:process.pid,nodePath:process.execPath,nodeVersion:process.version,runtimeDir:e.runtimeDir,exporterDir:e.exporterDir,...n??{}};try{await S(De(e.runtimeDir),r);}catch{}}async function q(e){try{await f.unlink(F(e));}catch{}}function Fe(e,t){let n=e.command;if(n!=="publish"&&n!=="crawl"&&n!=="deploy"&&n!=="invalidate"&&n!=="retry-timeouts"&&n!=="url")return null;let r=Number.parseInt(String(e.intervalMinutes??"0"),10);if(!Number.isFinite(r)||r<1)return null;let o=(e.id||`${n}-${t+1}`).trim();if(!o)return null;let s=e.enabled!==false,i=typeof e.url=="string"?e.url.trim():"",u=typeof e.deploymentProfile=="string"?e.deploymentProfile.trim():"",a=(n==="publish"||n==="crawl")&&e.crawlMode==="incremental"?"incremental":"full";return n==="url"&&!i?null:{id:o,enabled:s,command:n,intervalMinutes:r,...n==="publish"||n==="crawl"?{crawlMode:a}:{},...(n==="publish"||n==="deploy"||n==="invalidate")&&u?{deploymentProfile:u}:{},...i?{url:i}:{}}}async function Me(e){let t=await k(e.configPath).catch(()=>null),n=t?.scheduler,r=Array.isArray(n?.rules)?n.rules.map((o,s)=>Fe(o,s)).filter(o=>!!o):[];return {enabled:!!n?.enabled,timezone:typeof n?.timezone=="string"&&n.timezone.trim()?n.timezone.trim():"UTC",rules:r,wpsuite:t?.wpsuite}}function Le(e,t){let n=(t.url||"").trim(),r=t.crawlMode||"full",o=(t.deploymentProfile||"").trim();return e.some(s=>s.command===t.command&&(s.url||"").trim()===n&&(s.crawlMode||"full")===r&&(s.deploymentProfile||"").trim()===o&&(s.status===void 0||s.status==="queued"||s.status==="running"))}async function Ue(e,t){if(!t.allowSchedulerAutoEnqueue)return 0;let n=await Me(e);if(!n.enabled||n.rules.length===0)return 0;if(t.assertActiveSubscriptionForIdentity)try{await t.assertActiveSubscriptionForIdentity(n.wpsuite??null);}catch(a){let c=a instanceof Error?a.message:String(a);return console.warn(`[queue-runner] scheduler auto-enqueue skipped: ${c}`),0}let r=g.join(e.runtimeDir,"queue.json"),o=g.join(e.runtimeDir,"current-run.json"),s=Date.now(),i=0,u=[];await D(e.runtimeDir,async()=>{let a=await w(r,[]),c=await w(o,null),p=await w(N(e.runtimeDir),{lastEnqueuedBucketByRuleId:{}}),d=[...a];c&&c.status==="running"&&d.unshift(c);for(let l of n.rules){if(!l.enabled)continue;let m=l.intervalMinutes*60*1e3,h=Math.floor(s/m),P=p.lastEnqueuedBucketByRuleId[l.id]??-1;if(h<=P||Le(d,{command:l.command,url:l.url,crawlMode:l.crawlMode,deploymentProfile:l.deploymentProfile}))continue;let y={id:randomUUID(),command:l.command,...(l.command==="publish"||l.command==="crawl")&&l.crawlMode?{crawlMode:l.crawlMode}:{},...(l.command==="publish"||l.command==="deploy"||l.command==="invalidate")&&l.deploymentProfile?{deploymentProfile:l.deploymentProfile}:{},...l.url?{url:l.url}:{},enqueueSource:"scheduler",...n.wpsuite?{wpsuite:n.wpsuite}:{},status:"queued",createdAt:new Date().toISOString(),createdBy:0};a.push(y),d.push(y),u.push({job:y,rule:l}),p.lastEnqueuedBucketByRuleId[l.id]=h,i+=1;}i>0&&(await S(r,a),await S(N(e.runtimeDir),p));});for(let a of u)await A(e.runtimeDir,{eventType:"job-created",status:"queued",actorSource:"queue-runner-scheduler",jobId:a.job.id,command:a.job.command,message:"Scheduler auto-enqueued a job.",details:{ruleId:a.rule.id,intervalMinutes:a.rule.intervalMinutes,timezone:n.timezone,deploymentProfile:a.rule.deploymentProfile||"",url:a.rule.url||""}});return i}async function We(e){let t={pid:process.pid,startedAt:new Date().toISOString()};await f.writeFile(e,JSON.stringify(t,null,2),{encoding:"utf8",flag:"wx"});}async function Be(e){try{await f.unlink(e);}catch{}}function Qe(e,t){let n=[g.join(e,"dist",`${t}.js`),g.join(e,`${t}.js`)];for(let r of n)if(existsSync(r))return r;throw new Error(`Cannot find ${t}.js in ${g.join(e,"dist")} or ${e}`)}async function C(e,t,n,r,o,s,i){if(i){let c=await $(t,i);if(c)throw new I(c,n)}let u=Qe(e,n),a={...process.env,...s??{}};return a.STATIC_PUBLISHER_RUNTIME_DIR=t,o&&(a.PUBLISHER_CONFIG=o),await new Promise((c,p)=>{let d=null,l=null,m=null,h=false,P=spawn(process.execPath,[u,...r],{cwd:e,env:a,stdio:"inherit"}),y=()=>{l&&clearInterval(l),m&&clearTimeout(m);},te=async()=>{if(!(!i||d||h)){h=true;try{let R=await $(t,i);if(!R)return;d=R,P.kill("SIGTERM"),m=setTimeout(()=>{P.kill("SIGKILL");},1e4);}finally{h=false;}}};i&&(l=setInterval(()=>{te();},1e3)),P.on("error",R=>{y(),p(R);}),P.on("close",(R,M)=>{if(y(),d){p(new I(d,n));return}R===0?c():p(new Error(`${n} exited with code ${R??-1}${M?` (signal ${M})`:""}`));});}),0}function ze(e){let t=e.awsTempCreds;if(!t)return {};let n={};return typeof t.accessKeyId=="string"&&t.accessKeyId.trim()!==""&&(n.AWS_ACCESS_KEY_ID=t.accessKeyId.trim()),typeof t.secretAccessKey=="string"&&t.secretAccessKey.trim()!==""&&(n.AWS_SECRET_ACCESS_KEY=t.secretAccessKey.trim()),typeof t.sessionToken=="string"&&t.sessionToken.trim()!==""&&(n.AWS_SESSION_TOKEN=t.sessionToken.trim()),n}async function Ne(e,t){let n=i=>{if(!i||typeof i!="object")return null;let u=i,a={...u.siteSettings??{},...String(u.accountId??"").trim()&&!u.siteSettings?.accountId?{accountId:String(u.accountId).trim()}:{},...String(u.siteId??"").trim()&&!u.siteSettings?.siteId?{siteId:String(u.siteId).trim()}:{},...u.siteSettings?.subscriber===true||u.subscriber===true?{subscriber:true}:{}},c={...String(u.apiBase??"").trim()?{apiBase:String(u.apiBase).trim()}:{},...String(u.runtimeToken??u.nonce??"").trim()?{runtimeToken:String(u.runtimeToken??u.nonce).trim()}:{},...String(u.uploadUrl??"").trim()?{uploadUrl:String(u.uploadUrl).trim()}:{},...Object.keys(a).length>0?{siteSettings:a}:{},...u.subscriptionType?{subscriptionType:u.subscriptionType}:{}};return Object.keys(c).length>0?c:null},r=await k(t.configPath).catch(()=>null),o=n(r?.wpsuite);if(o)return o;let s=n(e.wpsuite);return s||null}async function _e(e,t){return await Ne(e,t)}function V(e){let t={...e,status:"queued"};return delete t.startedAt,delete t.endedAt,delete t.exitCode,delete t.error,delete t.stopRequestedAt,delete t.stopRequestedByUserId,delete t.stopRequestedByLogin,delete t.stopMode,delete t.stoppedStep,t}async function He(e,t){let n=await w(F(e.runtimeDir),null),r=n&&n.details&&typeof n.details.phase=="string"?n.details.phase.trim():"";if(r)return r;let o=n&&typeof n.currentStep=="string"?n.currentStep.trim():"";if(o)return o;let s=await Y(e).catch(()=>"");if(s){let i=await w(g.join(s,"current-crawl-event.json"),null),u=i&&typeof i.currentStep=="string"?i.currentStep.trim():"";if(u)return u}return t}function $e(e,t){if((e.command==="publish"||e.command==="crawl")&&t==="rewrite-text")return "rewrite-text"}async function Ke(e){let t=g.join(e.runtimeDir,"queue.json"),n=g.join(e.runtimeDir,"current-run.json"),r=await D(e.runtimeDir,async()=>{let o=await w(n,null);if(!o||o.status!=="running"&&o.status!=="queued")return null;let s=await w(t,[]),i=Array.isArray(s)?s.filter(a=>a?.id!==o.id):[],u=V(o);return await S(t,[u,...i]),await S(n,null),u});r&&(await O(e.runtimeDir,r.id),await A(e.runtimeDir,{eventType:"job-recovered",status:"queued",actorSource:"queue-runner",jobId:r.id,command:r.command,message:"Recovered stale current-run entry back into queue."}));}async function Ge(e,t,n){try{if((n.shouldEnforceSubscriptionOnJobExecution?.(e)??n.enforceSubscriptionOnJobExecution)&&n.assertActiveSubscriptionForIdentity){let u=await _e(e,t);await n.assertActiveSubscriptionForIdentity(u);}let o=ze(e),s=e.resumeFromStep==="rewrite-text"?["--resume-rewrite"]:e.crawlMode==="incremental"?["--crawl-mode","incremental"]:[],i=e.deploymentProfile?["--profile",e.deploymentProfile]:[];if(e.command==="publish")return await b(t,"running",{currentJobId:e.id,currentJobCommand:e.command,currentStep:e.resumeFromStep==="rewrite-text"?"rewrite-text":"crawl"}),await C(t.exporterDir,t.runtimeDir,"crawl",s,t.configPath,o,e.id),await b(t,"running",{currentJobId:e.id,currentJobCommand:e.command,currentStep:"deploy"}),await C(t.exporterDir,t.runtimeDir,"deploy",i,t.configPath,o,e.id),await b(t,"running",{currentJobId:e.id,currentJobCommand:e.command,currentStep:"invalidate"}),await C(t.exporterDir,t.runtimeDir,"invalidate",i,t.configPath,o,e.id),{exitCode:0};if(e.command==="crawl")return await b(t,"running",{currentJobId:e.id,currentJobCommand:e.command,currentStep:e.resumeFromStep==="rewrite-text"?"rewrite-text":"crawl"}),await C(t.exporterDir,t.runtimeDir,"crawl",s,t.configPath,o,e.id),{exitCode:0};if(e.command==="deploy")return await b(t,"running",{currentJobId:e.id,currentJobCommand:e.command,currentStep:"deploy"}),await C(t.exporterDir,t.runtimeDir,"deploy",i,t.configPath,o,e.id),{exitCode:0};if(e.command==="invalidate")return await b(t,"running",{currentJobId:e.id,currentJobCommand:e.command,currentStep:"invalidate"}),await C(t.exporterDir,t.runtimeDir,"invalidate",i,t.configPath,o,e.id),{exitCode:0};if(e.command==="retry-timeouts")return await b(t,"running",{currentJobId:e.id,currentJobCommand:e.command,currentStep:"retry-timeouts"}),await C(t.exporterDir,t.runtimeDir,"crawl",["--retry-timeouts"],t.configPath,o,e.id),{exitCode:0};if(e.command==="url"){let u=(e.url||"").trim();return u?(await b(t,"running",{currentJobId:e.id,currentJobCommand:e.command,currentStep:"url"}),await C(t.exporterDir,t.runtimeDir,"crawl",["--url",u],t.configPath,o,e.id),{exitCode:0}):{exitCode:2,error:"Missing url for command 'url'"}}return {exitCode:2,error:`Unsupported command: ${e.command}`}}catch(r){return r instanceof I?{exitCode:130,error:"Job stop requested.",stopped:true,stopRequest:r.request,stoppedStep:r.step}:{exitCode:1,error:r instanceof Error?r.message:String(r)}}}function X(e){return async function(n=process.argv.slice(2)){let r=Re(n),o=g.join(r.runtimeDir,"export.lock"),s=g.join(r.runtimeDir,"last-run.json");await q(r.runtimeDir),await b(r,"starting",{message:"queue-runner starting"});try{await We(o);}catch(i){if((i&&typeof i=="object"&&"code"in i?String(i.code||""):"")!=="EEXIST")throw i;console.log("[queue-runner] lock active, skipping"),await b(r,"lock-active",{message:"lock active, skipped this cron tick"});return}try{await Ke(r);let i=await Ue(r,e),u=0;for(let a=0;a<r.maxJobs;a++){let c=await Ze(r,e);if(c==="none"||(u+=1,c==="stopped"))break}if(u===0)await q(r.runtimeDir),await b(r,"idle",{processedJobs:u,schedulerEnqueued:i,message:"no queued jobs"});else {await q(r.runtimeDir);let a=await w(s,null),c=String(a?.status||"").trim();await b(r,c==="success"?"job-success":c==="stopped"?"job-stopped":"job-failed",{processedJobs:u,schedulerEnqueued:i,lastJobId:a?.id,lastJobCommand:a?.command,lastJobStatus:a?.status,lastJobExitCode:a?.exitCode,lastJobError:a?.error,...c==="stopped"?{currentStep:a?.stoppedStep,stopRequestedAt:a?.stopRequestedAt,stopRequestedByLogin:a?.stopRequestedByLogin,stopRequestedMode:a?.stopMode,lastStoppedStep:a?.stoppedStep,message:a?.stopMode==="requeue"?`Job stopped during ${a?.stoppedStep||a?.command||"active step"} and requeued.`:`Job stopped during ${a?.stoppedStep||a?.command||"active step"} and left out of queue.`}:{}});}}catch(i){let u=i instanceof Error?i.message:String(i);throw await b(r,"error",{message:u}),await A(r.runtimeDir,{eventType:"queue-runner-error",status:"failed",actorSource:"queue-runner",message:"Unhandled queue-runner error.",details:{error:u}}),i}finally{await Be(o);}}}async function Ye(e,t,n){let r=g.join(e.runtimeDir,"queue.json"),o=g.join(e.runtimeDir,"current-run.json");await D(e.runtimeDir,async()=>{let s=await w(r,[]),i=Array.isArray(s)?s.filter(c=>c?.id!==t.id):[],u=V(t),a=$e(t,n);a?u.resumeFromStep=a:delete u.resumeFromStep,await S(r,[u,...i]),await S(o,null);});}async function Ze(e,t){let n=g.join(e.runtimeDir,"queue.json"),r=g.join(e.runtimeDir,"current-run.json"),o=g.join(e.runtimeDir,"last-run.json"),s=new Date().toISOString(),i=await D(e.runtimeDir,async()=>{let d=await w(n,[]);if(!Array.isArray(d)||d.length===0)return null;let l={...d[0],status:"running",startedAt:s};return await S(n,d.slice(1)),await S(r,l),l});if(!i)return "none";await q(e.runtimeDir),await A(e.runtimeDir,{eventType:"job-run-started",status:"running",actorSource:"queue-runner",jobId:i.id,command:i.command,message:"Job execution started.",details:{createdAt:i.createdAt||"",startedAt:s,createdBy:i.createdBy??null,deploymentProfile:i.deploymentProfile||"",queuedWithTempAwsCreds:!!i.awsTempCreds}}),await b(e,"running",{currentJobId:i.id,currentJobCommand:i.command,currentStep:i.command});let u=await Ge(i,e,t),a=new Date().toISOString();if(u.stopped){let d=await He(e,u.stoppedStep||i.command),l=u.stopRequest?.mode==="requeue"?"requeue":"stop",m={...i,status:"stopped",endedAt:a,exitCode:u.exitCode,...u.error?{error:u.error}:{},stopRequestedAt:u.stopRequest?.requestedAt||"",stopRequestedByUserId:typeof u.stopRequest?.requestedByUserId=="number"?u.stopRequest.requestedByUserId:null,stopRequestedByLogin:u.stopRequest?.requestedByLogin||"",stopMode:l,stoppedStep:d};l==="requeue"?await Ye(e,i,d):await S(r,null);try{let h=await H(m,e);m.logArchiveDir=h.archiveDir,m.logArchiveCreatedAt=h.archiveCreatedAt,m.logArchiveFileCount=h.archivedFiles.length;}catch(h){m.logArchiveError=h instanceof Error?h.message:String(h);}return await S(o,m),await O(e.runtimeDir,i.id),await q(e.runtimeDir),await A(e.runtimeDir,{eventType:"job-run-stopped",status:"stopped",actorSource:"queue-runner",jobId:i.id,command:i.command,message:l==="requeue"?"Job stop requested and requeued.":"Job stop requested and removed from active execution without requeue.",details:{startedAt:i.startedAt||"",endedAt:a,deploymentProfile:i.deploymentProfile||"",stopMode:l,stopRequestedAt:u.stopRequest?.requestedAt||"",stopRequestedByLogin:u.stopRequest?.requestedByLogin||"",stopRequestedByUserId:typeof u.stopRequest?.requestedByUserId=="number"?u.stopRequest.requestedByUserId:null,stoppedStep:d,logArchiveKey:m.logArchiveError||!m.logArchiveDir?"":g.basename(m.logArchiveDir),logArchiveDir:m.logArchiveDir||"",logArchiveCreatedAt:m.logArchiveCreatedAt||"",logArchiveFileCount:m.logArchiveFileCount??0,logArchiveError:m.logArchiveError||""}}),"stopped"}let c={...i,status:u.exitCode===0?"success":"failed",endedAt:a,exitCode:u.exitCode,...u.error?{error:u.error}:{}};await S(r,null),await O(e.runtimeDir,i.id);try{let d=await H(c,e);c.logArchiveDir=d.archiveDir,c.logArchiveCreatedAt=d.archiveCreatedAt,c.logArchiveFileCount=d.archivedFiles.length;}catch(d){c.logArchiveError=d instanceof Error?d.message:String(d);}await S(o,c);let p=i.startedAt&&c.endedAt?Math.max(0,Math.round((new Date(c.endedAt).getTime()-new Date(i.startedAt).getTime())/1e3)):void 0;return await A(e.runtimeDir,{eventType:"job-run-finished",status:c.status==="success"?"success":"failed",actorSource:"queue-runner",jobId:c.id,command:c.command,message:c.status==="success"?"Job execution finished successfully.":"Job execution finished with failure.",details:{startedAt:i.startedAt||"",endedAt:c.endedAt||"",durationSec:p,deploymentProfile:c.deploymentProfile||"",exitCode:c.exitCode??null,error:c.error||"",logArchiveKey:c.logArchiveError||!c.logArchiveDir?"":g.basename(c.logArchiveDir),logArchiveDir:c.logArchiveDir||"",logArchiveCreatedAt:c.logArchiveCreatedAt||"",logArchiveFileCount:c.logArchiveFileCount??0,logArchiveError:c.logArchiveError||""}}),"processed"}var Xe={allowSchedulerAutoEnqueue:false,enforceSubscriptionOnJobExecution:false},ee=X(Xe),et=ee,bt=ee;process.argv[1]&&import.meta.url===pathToFileURL(process.argv[1]).href&&et().catch(e=>{console.error(e),process.exit(1);});export{bt as default,et as main,ee as runQueueRunner};
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@smart-cloud/publisher-exporter",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.33",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "Headless Playwright static publisher for WordPress/Elementor sites with sitemap-only page discovery, strict asset capture, escaped URL rewrite, structured logs, and targeted retry modes.",
|
|
7
7
|
"bin": {
|
|
8
|
-
"publisher-exporter": "
|
|
8
|
+
"publisher-exporter": "dist/cli.js"
|
|
9
9
|
},
|
|
10
10
|
"files": [
|
|
11
11
|
"dist",
|
|
@@ -36,29 +36,37 @@
|
|
|
36
36
|
"queue:drain": "node dist/queue-runner.js --max-jobs=100",
|
|
37
37
|
"publish:site": "npm run build && npm run crawl && npm run deploy && npm run invalidate",
|
|
38
38
|
"install:browsers": "playwright install chromium",
|
|
39
|
-
"release:npm": "WPSUITE_PREMIUM=true npm run build && npm publish --access=public"
|
|
39
|
+
"release:npm": "WPSUITE_PREMIUM=true npm run lint && npm run check && npm run build && npm publish --access=public --registry=https://registry.npmjs.org/"
|
|
40
40
|
},
|
|
41
41
|
"dependencies": {
|
|
42
|
-
"@aws-sdk/client-cloudfront": "^3.
|
|
43
|
-
"@aws-sdk/client-s3": "^3.
|
|
44
|
-
"@aws-sdk/lib-storage": "^3.
|
|
45
|
-
"@smart-cloud/publisher-core": "^1.1.
|
|
46
|
-
"@smart-cloud/wpsuite-core": "^2.3.
|
|
42
|
+
"@aws-sdk/client-cloudfront": "^3.1100.0",
|
|
43
|
+
"@aws-sdk/client-s3": "^3.1100.0",
|
|
44
|
+
"@aws-sdk/lib-storage": "^3.1100.0",
|
|
45
|
+
"@smart-cloud/publisher-core": "^1.1.5",
|
|
46
|
+
"@smart-cloud/wpsuite-core": "^2.3.2",
|
|
47
47
|
"fast-glob": "^3.3.3",
|
|
48
48
|
"mime-types": "^3.0.2",
|
|
49
|
-
"playwright": "^1.
|
|
49
|
+
"playwright": "^1.62.1"
|
|
50
50
|
},
|
|
51
51
|
"devDependencies": {
|
|
52
52
|
"@eslint/js": "^10.0.1",
|
|
53
53
|
"@types/mime-types": "^3.0.1",
|
|
54
|
-
"@types/node": "^
|
|
55
|
-
"@typescript-eslint/eslint-plugin": "^8.
|
|
56
|
-
"@typescript-eslint/parser": "^8.
|
|
57
|
-
"esbuild": "^0.28.
|
|
58
|
-
"eslint": "^10.
|
|
59
|
-
"globals": "^17.
|
|
54
|
+
"@types/node": "^26.1.2",
|
|
55
|
+
"@typescript-eslint/eslint-plugin": "^8.65.0",
|
|
56
|
+
"@typescript-eslint/parser": "^8.65.0",
|
|
57
|
+
"esbuild": "^0.28.1",
|
|
58
|
+
"eslint": "^10.8.0",
|
|
59
|
+
"globals": "^17.8.0",
|
|
60
60
|
"tsup": "^8.5.1",
|
|
61
61
|
"typescript": "^6.0.3",
|
|
62
|
-
"typescript-eslint": "^8.
|
|
62
|
+
"typescript-eslint": "^8.65.0"
|
|
63
|
+
},
|
|
64
|
+
"overrides": {
|
|
65
|
+
"brace-expansion": "^5.0.8",
|
|
66
|
+
"esbuild": "^0.28.1"
|
|
67
|
+
},
|
|
68
|
+
"resolutions": {
|
|
69
|
+
"brace-expansion": "^5.0.8",
|
|
70
|
+
"esbuild": "^0.28.1"
|
|
63
71
|
}
|
|
64
72
|
}
|