@smart-cloud/publisher-exporter 1.1.37 → 1.1.38
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 +1 -1
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 g from'path';import {spawn}from'child_process';import {randomUUID}from'crypto';import {pipeline}from'stream/promises';import {createGzip}from'zlib';import oe from'http';import se from'https';function W(e){let t=e.trim();return t==="."?".":t.replace(/\/$/,"")}function ue(e){let t=String(e??"").trim();if(!t)return "";let r=t;if(/^https?:\/\//i.test(r))try{r=new URL(r).pathname;}catch{return ""}if(r=r.split(/[?#]/,1)[0]?.replace(/\\/g,"/").trim()??"",!r)return "";let i=r.endsWith("/"),n=r.replace(/^\/+/,"").split("/").map(o=>o.replace(/[^A-Za-z0-9._-]/g,"")).filter(o=>o.length>0&&o!=="."&&o!=="..");if(n.length===0)return "";let s=`/${n.join("/")}`;return i&&g.extname(s)===""&&(s+="/"),s==="/"?"":s}function T(e){return !e||typeof e!="object"?{}:Object.fromEntries(Object.entries(e).map(([t,r])=>[t.trim(),String(r??"")]).filter(([t])=>t.length>0))}function ae(e){if(!e||typeof e!="object")return {};let t={};for(let[r,i]of Object.entries(e)){let n=r.trim();if(!n||!i||typeof i!="object")continue;let s=i,o={};if(typeof s.targetOrigin=="string"){let a=W(s.targetOrigin);a&&(o.targetOrigin=a);}let u=T(s.extraReplacements);if(Object.keys(u).length>0&&(o.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&&(o.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(d=>String(d??"").trim()).filter(d=>d.length>0)),Object.keys(a).length>0&&(o.cloudFront=a);}t[n]=o;}return t}function k(e){return e==="PROFESSIONAL"||e==="AGENCY"?e:void 0}function ce(e,t){if(!e||typeof e!="object")return null;let r=e,i=r.command;if(i!=="publish"&&i!=="crawl"&&i!=="deploy"&&i!=="invalidate"&&i!=="retry-timeouts"&&i!=="url")return null;let n=Number.parseInt(String(r.intervalMinutes??"0"),10);if(!Number.isFinite(n)||n<1)return null;let s=String(r.id??`${i}-${t+1}`).trim();if(!s)return null;let o=String(r.deploymentProfile??"").trim(),u=String(r.url??"").trim(),a=Array.isArray(r.postTypes)?[...new Set(r.postTypes.map(d=>String(d??"").trim().toLowerCase().replace(/[^a-z0-9_-]/g,"")).filter(Boolean))]:[],c=Array.isArray(r.listingPaths)?[...new Set(r.listingPaths.map(d=>String(d??"").trim()).filter(Boolean))]:[];return {id:s,enabled:r.enabled!==false,command:i,intervalMinutes:n,...i==="publish"||i==="crawl"?{crawlMode:r.crawlMode==="incremental"?"incremental":"full"}:{},...(i==="publish"||i==="deploy"||i==="invalidate")&&o?{deploymentProfile:o}:{},...u?{url:u}:{},...a.length>0?{postTypes:a}:{},...c.length>0?{listingPaths:c}:{},...typeof r.includePostTypeArchives=="boolean"?{includePostTypeArchives:r.includePostTypeArchives}:{},...typeof r.includeTaxonomyArchives=="boolean"?{includeTaxonomyArchives:r.includeTaxonomyArchives}:{},...typeof r.includeAuthorArchives=="boolean"?{includeAuthorArchives:r.includeAuthorArchives}:{},...typeof r.includeDateArchives=="boolean"?{includeDateArchives:r.includeDateArchives}:{},...typeof r.includePostsPage=="boolean"?{includePostsPage:r.includePostsPage}:{},...typeof r.includeSitemapChain=="boolean"?{includeSitemapChain:r.includeSitemapChain}:{}}}function Q(e){let t=e&&typeof e=="object"?e:{},r=Array.isArray(t.rules)?t.rules.map((i,n)=>ce(i,n)).filter(i=>!!i):[];return {enabled:t.enabled===true,timezone:typeof t.timezone=="string"&&t.timezone.trim()!==""?t.timezone.trim():"UTC",rules:r}}function le(e){if(!e||typeof e!="object")return;let t=e,r={};for(let n of ["accountId","siteId"]){let s=t[n];typeof s=="string"&&s.trim()!==""&&(r[n]=s.trim());}let i=Number(t.lastUpdate??0);return Number.isFinite(i)&&i>0&&(r.lastUpdate=Math.floor(i)),t.subscriber===true&&(r.subscriber=true),Object.keys(r).length>0?r:void 0}function J(e){let t=e&&typeof e=="object"?e:{},r=String(t.accountId??"").trim(),i=String(t.siteId??"").trim(),n=t.subscriber===true,s=le(t.siteSettings),o={...s??{},...r?{accountId:s?.accountId??r}:{},...i?{siteId:s?.siteId??i}:{},...s?.subscriber===true||n?{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 d=String(t.virtualAssetBaseUrl??t.uploadUrl??"").trim();d&&(u.virtualAssetBaseUrl=d),Object.keys(o).length>0&&(u.siteSettings=o);let p=k(t.subscriptionType);return p&&(u.subscriptionType=p),u}function de(e){try{let t=new URL(e);globalThis.location=t;}catch{}}function z(e){return typeof e=="string"?e:e instanceof URL?e.toString():e.url}function pe(e,t){let r=new Headers(e instanceof Request?e.headers:void 0);if(t?.headers)for(let[i,n]of new Headers(t.headers).entries())r.set(i,n);return r}async function N(e,t,r=5){let i=new URL(z(e)),n=String(t?.method??(e instanceof Request?e.method:"GET")).toUpperCase(),s=i.protocol==="http:"?oe:se,o=pe(e,t);return await new Promise((u,a)=>{let c=s.request(i,{method:n,headers:Object.fromEntries(o.entries()),...i.protocol==="https:"?{rejectUnauthorized:false}:{}},d=>{let p=[];d.on("data",l=>{p.push(Buffer.isBuffer(l)?l:Buffer.from(l));}),d.on("error",a),d.on("end",()=>{let l=d.statusCode??0,m=d.headers.location;if(r>0&&m&&[301,302,303,307,308].includes(l)){u(N(new URL(m,i),{method:l===303?"GET":n},r-1));return}let h=new Headers;for(let[P,S]of Object.entries(d.headers))Array.isArray(S)?h.set(P,S.join(", ")):typeof S=="string"&&h.set(P,S);u(new Response(Buffer.concat(p),{status:l,statusText:d.statusMessage??"",headers:h}));});});c.on("error",a),c.end();})}function ge(e){let t=J(e.wpsuite),r={...t.siteSettings??{},...t.siteSettings?.subscriber===true||t.subscriptionType==="PROFESSIONAL"||t.subscriptionType==="AGENCY"?{subscriber:true}:{}},i=String(r.accountId??"").trim(),n=String(r.siteId??"").trim(),s=String(t.virtualAssetBaseUrl??t.uploadUrl??"").trim();if(e.wpsuite={...t.apiBase?{apiBase:t.apiBase}:{},...t.runtimeToken?{runtimeToken:t.runtimeToken}:{},...s?{virtualAssetBaseUrl:s}:{},...Object.keys(r).length>0?{siteSettings:r}:{},...t.subscriptionType?{subscriptionType:t.subscriptionType}:{}},!i||!n||!s)return false;de(e.sourceOrigin);let o=globalThis,a={...o.WpSuite??{},siteSettings:r,uploadUrl:s};return t.apiBase&&(a.apiBase=t.apiBase),o.WpSuite=a,true}async function me(e){let t=String(e.wpsuite?.virtualAssetBaseUrl??e.wpsuite?.uploadUrl??"").trim();if(!ge(e)){let n=e.wpsuite?.siteSettings,s=[String(n?.accountId??"").trim()?"":"accountId",String(n?.siteId??"").trim()?"":"siteId",t?"":"virtualAssetBaseUrl"].filter(Boolean);return {remote:null,diagnostic:{status:"invalid-runtime",virtualAssetBaseUrl:t,subscriptionType:null,error:`Missing WP Suite runtime field(s): ${s.join(", ")}.`,requests:[]}}}let r=globalThis.fetch,i=[];try{typeof r=="function"&&/^https?:\/\//i.test(t)&&(globalThis.fetch=(async(a,c)=>{let d=z(a);if(d.startsWith(t)){let p=(()=>{try{return new URL(d).pathname}catch{return d}})();try{let l=e.ignoreHttpsErrors&&d.startsWith("https://")?await N(a,c):await r(a,c);return i.push({path:p,status:l.status,ok:l.ok,error:null}),l}catch(l){throw i.push({path:p,status:null,ok:!1,error:l instanceof Error?l.message:String(l)}),l}}return r(a,c)}));let{getConfig:n}=await import('@smart-cloud/wpsuite-core'),s=await n("publisher"),o=s&&typeof s=="object"?s:null,u=k(o?.subscriptionType);return {remote:o,diagnostic:{status:o?"loaded":"unavailable",virtualAssetBaseUrl:t,subscriptionType:u??null,error:o?null:"WP Suite publisher config loader returned no configuration.",requests:i}}}catch(n){return {remote:null,diagnostic:{status:"unavailable",virtualAssetBaseUrl:t,subscriptionType:null,error:n instanceof Error?n.message:String(n),requests:i}}}finally{typeof r=="function"&&(globalThis.fetch=r);}}function fe(e,t){let r=ae(t?.deploymentProfiles),i=String(t?.defaultDeploymentProfile??"").trim(),n=r[i]?i:"",s=k(t?.subscriptionType),o=J(e.wpsuite);return {...e,scheduler:Q(t?.scheduler),deploymentProfiles:r,defaultDeploymentProfile:n,...s?{subscriptionType:s}:{},wpsuite:{...o,...o.siteSettings||s?{siteSettings:{...o.siteSettings??{},...o.siteSettings?.subscriber===true||s==="PROFESSIONAL"||s==="AGENCY"?{subscriber:true}:{}}}:{},...s?{subscriptionType:s}:{}}}}function x(e,t){let i=String(e||"").replace(/\\/g,"/").trim().replace(/^\/+|\/+$/g,"");if(!i)return t;let n=i.split("/").map(s=>s.trim()).filter(s=>s.length>0&&s!=="."&&s!=="..");return n.length>0?n.join("/"):t}function he(){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,r){let i=String(t||"").trim();return i&&g.isAbsolute(i)?g.resolve(i):g.resolve(e,x(i,r))}async function E(e,t={}){let r=String(e??"").trim()||process.env.PUBLISHER_CONFIG||"publisher.config.json",i=await f.readFile(r,"utf8"),n=JSON.parse(i);n.sourceOrigin=n.sourceOrigin.replace(/\/$/,""),n.targetOrigin=W(n.targetOrigin),n.ignoreHttpsErrors??=false,n.outputDir=String(n.outputDir||"export").trim()||"export",n.urlRewriteMode||=n.targetOrigin==="."?"relative":"absolute",n.noJavaScriptRenderPathPrefixes||=[],n.seedPaths||=[],n.generated404RequestPath=ue(n.generated404RequestPath),n.sitemapPaths||=["/sitemap_index.xml","/sitemap.xml"],n.allowedAssetHosts||=[],n.assetPathPrefixes||=["/wp-content/","/wp-includes/","/static/","/assets/","/build/","/_next/","/docs/","/sitemap","/robots.txt","/llms.txt"],n.blockedPathPrefixes||=[],n.blockedSearchFragments||=[],n.concurrency||=1,n.maxPages||=0,n.extraReplacements=T(n.extraReplacements),n.postCrawlCopyMap=T(n.postCrawlCopyMap),n.logDir=String(n.logDir||"logs").trim()||"logs",n.verbose??=false,n.logLevel||=n.verbose?"debug":"info",n.s3SyncMode||="sdk-upload-delete",n.readiness||={waitForSelector:null,waitForFunction:null,timeoutMs:1500,fallbackWaitMs:1500},n.readiness.timeoutMs??=1500,n.readiness.fallbackWaitMs??=1500,n.viewport||={width:1440,height:1200},n.navigationTimeoutMs||=3e4,n.assetDownloadConcurrency=Number(n.assetDownloadConcurrency)>0?Number(n.assetDownloadConcurrency):n.concurrency,n.rewriteConcurrency=Number(n.rewriteConcurrency)>0?Number(n.rewriteConcurrency):n.assetDownloadConcurrency,n.wpsuite=J(n.wpsuite),n.scheduler=Q(void 0),n.deploymentProfiles={},n.defaultDeploymentProfile="",n.deploymentTargetOverride=String(n.deploymentTargetOverride??"").trim();let s=await me(n);t.onRemotePublisherConfigDiagnostic?.(s.diagnostic);let o=fe(n,s.remote),u=he(),a=u?g.resolve(u,".."):"";return a?(o.outputDir=L(a,o.outputDir,"export"),o.logDir=L(a,o.logDir,"logs")):(g.isAbsolute(o.outputDir)||(o.outputDir=x(o.outputDir,"export")),g.isAbsolute(o.logDir)||(o.logDir=x(o.logDir,"logs"))),o}var j=new Map;async function _(e){let t=g.resolve(e),r=j.get(t);if(r!==void 0)return r;try{let i=JSON.parse(await f.readFile(t,"utf8")),n=String(i.version??"").trim();return j.set(t,n),n}catch{return j.set(t,""),""}}var D=class extends Error{request;step;constructor(t,r){super(`Stop requested during ${r}.`),this.name="StopRequestedError",this.request=t,this.step=r;}},Ae="queue-mutation.lock",Ce=5e3,Re=3e4;function qe(e){let t=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"",r=process.env.STATIC_PUBLISHER_EXPORTER_DIR||process.cwd(),i=process.env.PUBLISHER_CONFIG||"",n=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"?r=e[++u]||r:a.startsWith("--exporter-dir=")?r=a.slice(15):a==="--config"?i=e[++u]||"":a.startsWith("--config=")?i=a.slice(9):a==="--max-jobs"?n=Number.parseInt(e[++u]||"1",10):a.startsWith("--max-jobs=")&&(n=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),o=i?g.resolve(i):g.join(s,"config.json");return {runtimeDir:s,exporterDir:g.resolve(r),configPath:o,maxJobs:Number.isFinite(n)&&n>0?n:1}}async function w(e,t){try{let r=await f.readFile(e,"utf8");return JSON.parse(r)}catch(r){if((r&&typeof r=="object"&&"code"in r?String(r.code||""):"")!=="ENOENT"){let n=r instanceof Error?r.message:String(r);console.warn(`[queue-runner] failed to read JSON ${e}: ${n}`);}return t}}async function y(e,t){await f.mkdir(g.dirname(e),{recursive:true}),await f.writeFile(e,JSON.stringify(t,null,2),"utf8");}function Y(e){return g.join(e,Ae)}async function De(e){await new Promise(t=>setTimeout(t,e));}async function Ie(e){let t=Y(e),r=Date.now()+Ce;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(i){if((i&&typeof i=="object"&&"code"in i?String(i.code||""):"")!=="EEXIST")throw i;let s=await f.stat(t).catch(()=>null);if(s&&Date.now()-s.mtimeMs>Re){await f.unlink(t).catch(()=>{});continue}if(Date.now()>=r)throw new Error("Timed out acquiring queue mutation lock.",{cause:i});await De(50);}}async function Te(e){await f.unlink(Y(e)).catch(()=>{});}async function I(e,t){await Ie(e);try{return await t()}finally{await Te(e);}}function xe(e){return g.join(e,"queue-runner-heartbeat.json")}function B(e){return g.join(e,"current-progress.json")}function $(e){return g.join(e,"scheduler-state.json")}function ke(e,t){let i=String(e||"").replace(/\\/g,"/").trim().replace(/^\/+|\/+$/g,"");if(!i)return t;let n=i.split("/").map(s=>s.trim()).filter(s=>s.length>0&&s!=="."&&s!=="..");return n.length>0?n.join("/"):t}async function Z(e){let t=await w(e.configPath||"",null),r=g.resolve(e.runtimeDir,".."),n=(typeof t?.logDir=="string"?t.logDir:"").trim();return n&&g.isAbsolute(n)?g.resolve(n):g.resolve(r,ke(n,"logs"))}function O(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 Ee(e){return [Je(e.endedAt||e.startedAt),O(e.command||"job","job"),O(e.id||"job","job"),O(e.status||"finished","finished")].join("-")}function je(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 Oe(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 Fe(e){return e.endsWith(".gz")?"application/gzip":e.endsWith(".jsonl")?"application/x-ndjson":e.endsWith(".json")?"application/json":"text/plain"}async function H(e,t,r){let i=`${r}.gz`,n=g.join(t,i);await pipeline(createReadStream(e),createGzip({level:9}),createWriteStream(n));let[s,o]=await Promise.all([f.stat(e),f.stat(n)]);return {role:Oe(r),originalFileName:r,storedFileName:i,compressed:true,compression:"gzip",contentType:Fe(i),originalSize:s.size,storedSize:o.size}}async function K(e,t){let r=await Z(t),i=new Date().toISOString(),n=Ee(e),s=g.join(r,"archive",n),o=[],u=[];await f.mkdir(s,{recursive:true});try{let d=await f.readdir(r,{withFileTypes:!0});for(let p of d){if(!p.isFile()||!je(p.name))continue;let l=await H(g.join(r,p.name),s,p.name);u.push(l),o.push(l.storedFileName);}}catch(d){if((d&&typeof d=="object"&&"code"in d?String(d.code||""):"")!=="ENOENT")throw d}let a=B(t.runtimeDir);if(existsSync(a)){let d=await H(a,s,"current-progress.json");u.push(d),o.push(d.storedFileName);}let c=[...o,"job.json"];return await y(g.join(s,"job.json"),{manifestVersion:1,archivedAt:i,archiveKey:n,archiveDir:s,logDir:r,runtimeDir:t.runtimeDir,exporterDir:t.exporterDir,configPath:t.configPath||"",archivedFiles:c,artifacts:u,job:e}),{archiveKey:n,archiveDir:s,archiveCreatedAt:i,archivedFiles:c,artifacts:u}}function Me(e){return g.join(e,"audit-events.jsonl")}function F(e){return g.join(e,"stop-request.json")}async function X(e){try{let t=await f.readFile(F(e),"utf8"),r=JSON.parse(t);return r&&typeof r=="object"?r:null}catch{return null}}async function G(e,t){let r=await X(e);if(!r)return null;let i=String(r.targetJobId||"").trim();return i&&i!==t?null:r}async function M(e,t){if(!t){await f.unlink(F(e)).catch(()=>{});return}let r=await X(e);if(!r)return;let i=String(r.targetJobId||"").trim();(!i||i===t)&&await f.unlink(F(e)).catch(()=>{});}async function R(e,t){try{let r={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(Me(e),`${JSON.stringify(r)}
|
|
2
|
-
`,"utf8");}catch{}}async function b(e,t,r){let[i,n]=await Promise.all([_(g.join(e.exporterDir,"package.json")),_(g.join(e.exporterDir,"node_modules","@smart-cloud","wpsuite-core","package.json"))]),s={checkedAt:new Date().toISOString(),status:t,pid:process.pid,nodePath:process.execPath,nodeVersion:process.version,exporterVersion:i,wpsuiteCoreVersion:n,runtimeDir:e.runtimeDir,exporterDir:e.exporterDir,...r??{}};try{await y(xe(e.runtimeDir),s);}catch{}}async function q(e){try{await f.unlink(B(e));}catch{}}function Be(e,t){let r=e.command;if(r!=="publish"&&r!=="crawl"&&r!=="deploy"&&r!=="invalidate"&&r!=="retry-timeouts"&&r!=="url")return null;let i=Number.parseInt(String(e.intervalMinutes??"0"),10);if(!Number.isFinite(i)||i<1)return null;let n=(e.id||`${r}-${t+1}`).trim();if(!n)return null;let s=e.enabled!==false,o=typeof e.url=="string"?e.url.trim():"",u=typeof e.deploymentProfile=="string"?e.deploymentProfile.trim():"",a=Array.isArray(e.postTypes)?[...new Set(e.postTypes.map(p=>String(p).trim()).filter(Boolean))]:[],c=Array.isArray(e.listingPaths)?[...new Set(e.listingPaths.map(p=>String(p).trim()).filter(Boolean))]:[],d=(r==="publish"||r==="crawl")&&e.crawlMode==="incremental"?"incremental":"full";return r==="url"&&!o?null:{id:n,enabled:s,command:r,intervalMinutes:i,...r==="publish"||r==="crawl"?{crawlMode:d}:{},...(r==="publish"||r==="deploy"||r==="invalidate")&&u?{deploymentProfile:u}:{},...o?{url:o}:{},...a.length>0?{postTypes:a}:{},...c.length>0?{listingPaths:c}:{},...typeof e.includePostTypeArchives=="boolean"?{includePostTypeArchives:e.includePostTypeArchives}:{},...typeof e.includeTaxonomyArchives=="boolean"?{includeTaxonomyArchives:e.includeTaxonomyArchives}:{},...typeof e.includeAuthorArchives=="boolean"?{includeAuthorArchives:e.includeAuthorArchives}:{},...typeof e.includeDateArchives=="boolean"?{includeDateArchives:e.includeDateArchives}:{},...typeof e.includePostsPage=="boolean"?{includePostsPage:e.includePostsPage}:{},...typeof e.includeSitemapChain=="boolean"?{includeSitemapChain:e.includeSitemapChain}:{}}}async function Ue(e){let t=await E(e.configPath).catch(()=>null),r=t?.scheduler,i=Array.isArray(r?.rules)?r.rules.map((n,s)=>Be(n,s)).filter(n=>!!n):[];return {enabled:!!r?.enabled,timezone:typeof r?.timezone=="string"&&r.timezone.trim()?r.timezone.trim():"UTC",rules:i,wpsuite:t?.wpsuite}}function Le(e,t){let r=(t.url||"").trim(),i=t.crawlMode||"full",n=(t.deploymentProfile||"").trim();return e.some(s=>s.command===t.command&&(s.url||"").trim()===r&&(s.crawlMode||"full")===i&&(s.deploymentProfile||"").trim()===n&&(s.status===void 0||s.status==="queued"||s.status==="running"))}async function We(e,t){if(!t.allowSchedulerAutoEnqueue)return 0;let r=await Ue(e);if(!r.enabled||r.rules.length===0)return 0;if(t.assertActiveSubscriptionForIdentity)try{await t.assertActiveSubscriptionForIdentity(r.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 i=g.join(e.runtimeDir,"queue.json"),n=g.join(e.runtimeDir,"current-run.json"),s=Date.now(),o=0,u=[];await I(e.runtimeDir,async()=>{let a=await w(i,[]),c=await w(n,null),d=await w($(e.runtimeDir),{lastEnqueuedBucketByRuleId:{}}),p=[...a];c&&c.status==="running"&&p.unshift(c);for(let l of r.rules){if(!l.enabled)continue;let m=l.intervalMinutes*60*1e3,h=Math.floor(s/m),P=d.lastEnqueuedBucketByRuleId[l.id]??-1;if(h<=P||Le(p,{command:l.command,url:l.url,crawlMode:l.crawlMode,deploymentProfile:l.deploymentProfile}))continue;let S={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",...r.wpsuite?{wpsuite:r.wpsuite}:{},status:"queued",createdAt:new Date().toISOString(),createdBy:0};a.push(S),p.push(S),u.push({job:S,rule:l}),d.lastEnqueuedBucketByRuleId[l.id]=h,o+=1;}o>0&&(await y(i,a),await y($(e.runtimeDir),d));});for(let a of u)await R(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:r.timezone,deploymentProfile:a.rule.deploymentProfile||"",url:a.rule.url||""}});return o}async function Qe(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 ze(e){try{await f.unlink(e);}catch{}}function Ne(e,t){let r=[g.join(e,"dist",`${t}.js`),g.join(e,`${t}.js`)];for(let i of r)if(existsSync(i))return i;throw new Error(`Cannot find ${t}.js in ${g.join(e,"dist")} or ${e}`)}async function A(e,t,r,i,n,s,o){if(o){let c=await G(t,o);if(c)throw new D(c,r)}let u=Ne(e,r),a={...process.env,...s??{}};return a.STATIC_PUBLISHER_RUNTIME_DIR=t,n&&(a.PUBLISHER_CONFIG=n),await new Promise((c,d)=>{let p=null,l=null,m=null,h=false,P=spawn(process.execPath,[u,...i],{cwd:e,env:a,stdio:"inherit"}),S=()=>{l&&clearInterval(l),m&&clearTimeout(m);},ne=async()=>{if(!(!o||p||h)){h=true;try{let C=await G(t,o);if(!C)return;p=C,P.kill("SIGTERM"),m=setTimeout(()=>{P.kill("SIGKILL");},1e4);}finally{h=false;}}};o&&(l=setInterval(()=>{ne();},1e3)),P.on("error",C=>{S(),d(C);}),P.on("close",(C,U)=>{if(S(),p){d(new D(p,r));return}C===0?c():d(new Error(`${r} exited with code ${C??-1}${U?` (signal ${U})`:""}`));});}),0}function _e(e){let t=e.awsTempCreds;if(!t)return {};let r={};return typeof t.accessKeyId=="string"&&t.accessKeyId.trim()!==""&&(r.AWS_ACCESS_KEY_ID=t.accessKeyId.trim()),typeof t.secretAccessKey=="string"&&t.secretAccessKey.trim()!==""&&(r.AWS_SECRET_ACCESS_KEY=t.secretAccessKey.trim()),typeof t.sessionToken=="string"&&t.sessionToken.trim()!==""&&(r.AWS_SESSION_TOKEN=t.sessionToken.trim()),r}async function $e(e,t){let r=o=>{if(!o||typeof o!="object")return null;let u=o,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.virtualAssetBaseUrl??u.uploadUrl??"").trim()?{virtualAssetBaseUrl:String(u.virtualAssetBaseUrl??u.uploadUrl).trim()}:{},...Object.keys(a).length>0?{siteSettings:a}:{},...u.subscriptionType?{subscriptionType:u.subscriptionType}:{}};return Object.keys(c).length>0?c:null},i=await E(t.configPath).catch(()=>null),n=r(i?.wpsuite);if(n)return n;let s=r(e.wpsuite);return s||null}async function He(e,t){return await $e(e,t)}function ee(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 Ke(e,t){let r=await w(B(e.runtimeDir),null),i=r&&r.details&&typeof r.details.phase=="string"?r.details.phase.trim():"";if(i)return i;let n=r&&typeof r.currentStep=="string"?r.currentStep.trim():"";if(n)return n;let s=await Z(e).catch(()=>"");if(s){let o=await w(g.join(s,"current-crawl-event.json"),null),u=o&&typeof o.currentStep=="string"?o.currentStep.trim():"";if(u)return u}return t}function Ge(e,t){if((e.command==="publish"||e.command==="crawl")&&t==="rewrite-text")return "rewrite-text"}async function Ve(e){let t=g.join(e.runtimeDir,"queue.json"),r=g.join(e.runtimeDir,"current-run.json"),i=await I(e.runtimeDir,async()=>{let n=await w(r,null);if(!n||n.status!=="running"&&n.status!=="queued")return null;let s=await w(t,[]),o=Array.isArray(s)?s.filter(a=>a?.id!==n.id):[],u=ee(n);return await y(t,[u,...o]),await y(r,null),u});i&&(await M(e.runtimeDir,i.id),await R(e.runtimeDir,{eventType:"job-recovered",status:"queued",actorSource:"queue-runner",jobId:i.id,command:i.command,message:"Recovered stale current-run entry back into queue."}));}async function Ye(e,t,r){try{if((r.shouldEnforceSubscriptionOnJobExecution?.(e)??r.enforceSubscriptionOnJobExecution)&&r.assertActiveSubscriptionForIdentity){let u=await He(e,t);await r.assertActiveSubscriptionForIdentity(u);}let n=_e(e),s=e.resumeFromStep==="rewrite-text"?["--resume-rewrite"]:e.crawlMode==="incremental"?["--crawl-mode","incremental"]:[],o=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 A(t.exporterDir,t.runtimeDir,"crawl",s,t.configPath,n,e.id),await b(t,"running",{currentJobId:e.id,currentJobCommand:e.command,currentStep:"deploy"}),await A(t.exporterDir,t.runtimeDir,"deploy",o,t.configPath,n,e.id),await b(t,"running",{currentJobId:e.id,currentJobCommand:e.command,currentStep:"invalidate"}),await A(t.exporterDir,t.runtimeDir,"invalidate",o,t.configPath,n,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 A(t.exporterDir,t.runtimeDir,"crawl",s,t.configPath,n,e.id),{exitCode:0};if(e.command==="deploy")return await b(t,"running",{currentJobId:e.id,currentJobCommand:e.command,currentStep:"deploy"}),await A(t.exporterDir,t.runtimeDir,"deploy",o,t.configPath,n,e.id),{exitCode:0};if(e.command==="invalidate")return await b(t,"running",{currentJobId:e.id,currentJobCommand:e.command,currentStep:"invalidate"}),await A(t.exporterDir,t.runtimeDir,"invalidate",o,t.configPath,n,e.id),{exitCode:0};if(e.command==="retry-timeouts")return await b(t,"running",{currentJobId:e.id,currentJobCommand:e.command,currentStep:"retry-timeouts"}),await A(t.exporterDir,t.runtimeDir,"crawl",["--retry-timeouts"],t.configPath,n,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 A(t.exporterDir,t.runtimeDir,"crawl",["--url",u],t.configPath,n,e.id),{exitCode:0}):{exitCode:2,error:"Missing url for command 'url'"}}return {exitCode:2,error:`Unsupported command: ${e.command}`}}catch(i){return i instanceof D?{exitCode:130,error:"Job stop requested.",stopped:true,stopRequest:i.request,stoppedStep:i.step}:{exitCode:1,error:i instanceof Error?i.message:String(i)}}}function te(e){return async function(r=process.argv.slice(2)){let i=qe(r),n=g.join(i.runtimeDir,"export.lock"),s=g.join(i.runtimeDir,"last-run.json");await q(i.runtimeDir),await b(i,"starting",{message:"queue-runner starting"});try{await Qe(n);}catch(o){if((o&&typeof o=="object"&&"code"in o?String(o.code||""):"")!=="EEXIST")throw o;console.log("[queue-runner] lock active, skipping"),await b(i,"lock-active",{message:"lock active, skipped this cron tick"});return}try{await Ve(i);let o=await We(i,e),u=0;for(let a=0;a<i.maxJobs;a++){let c=await Xe(i,e);if(c==="none"||(u+=1,c==="stopped"))break}if(u===0)await q(i.runtimeDir),await b(i,"idle",{processedJobs:u,schedulerEnqueued:o,message:"no queued jobs"});else {await q(i.runtimeDir);let a=await w(s,null),c=String(a?.status||"").trim();await b(i,c==="success"?"job-success":c==="stopped"?"job-stopped":"job-failed",{processedJobs:u,schedulerEnqueued:o,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(o){let u=o instanceof Error?o.message:String(o);throw await b(i,"error",{message:u}),await R(i.runtimeDir,{eventType:"queue-runner-error",status:"failed",actorSource:"queue-runner",message:"Unhandled queue-runner error.",details:{error:u}}),o}finally{await ze(n);}}}async function Ze(e,t,r){let i=g.join(e.runtimeDir,"queue.json"),n=g.join(e.runtimeDir,"current-run.json");await I(e.runtimeDir,async()=>{let s=await w(i,[]),o=Array.isArray(s)?s.filter(c=>c?.id!==t.id):[],u=ee(t),a=Ge(t,r);a?u.resumeFromStep=a:delete u.resumeFromStep,await y(i,[u,...o]),await y(n,null);});}async function Xe(e,t){let r=g.join(e.runtimeDir,"queue.json"),i=g.join(e.runtimeDir,"current-run.json"),n=g.join(e.runtimeDir,"last-run.json"),s=new Date().toISOString(),o=await I(e.runtimeDir,async()=>{let p=await w(r,[]);if(!Array.isArray(p)||p.length===0)return null;let l={...p[0],status:"running",startedAt:s};return await y(r,p.slice(1)),await y(i,l),l});if(!o)return "none";await q(e.runtimeDir),await R(e.runtimeDir,{eventType:"job-run-started",status:"running",actorSource:"queue-runner",jobId:o.id,command:o.command,message:"Job execution started.",details:{createdAt:o.createdAt||"",startedAt:s,createdBy:o.createdBy??null,deploymentProfile:o.deploymentProfile||"",queuedWithTempAwsCreds:!!o.awsTempCreds}}),await b(e,"running",{currentJobId:o.id,currentJobCommand:o.command,currentStep:o.command});let u=await Ye(o,e,t),a=new Date().toISOString();if(u.stopped){let p=await Ke(e,u.stoppedStep||o.command),l=u.stopRequest?.mode==="requeue"?"requeue":"stop",m={...o,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:p};l==="requeue"?await Ze(e,o,p):await y(i,null);try{let h=await K(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 y(n,m),await M(e.runtimeDir,o.id),await q(e.runtimeDir),await R(e.runtimeDir,{eventType:"job-run-stopped",status:"stopped",actorSource:"queue-runner",jobId:o.id,command:o.command,message:l==="requeue"?"Job stop requested and requeued.":"Job stop requested and removed from active execution without requeue.",details:{startedAt:o.startedAt||"",endedAt:a,deploymentProfile:o.deploymentProfile||"",stopMode:l,stopRequestedAt:u.stopRequest?.requestedAt||"",stopRequestedByLogin:u.stopRequest?.requestedByLogin||"",stopRequestedByUserId:typeof u.stopRequest?.requestedByUserId=="number"?u.stopRequest.requestedByUserId:null,stoppedStep:p,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={...o,status:u.exitCode===0?"success":"failed",endedAt:a,exitCode:u.exitCode,...u.error?{error:u.error}:{}};await y(i,null),await M(e.runtimeDir,o.id);try{let p=await K(c,e);c.logArchiveDir=p.archiveDir,c.logArchiveCreatedAt=p.archiveCreatedAt,c.logArchiveFileCount=p.archivedFiles.length;}catch(p){c.logArchiveError=p instanceof Error?p.message:String(p);}await y(n,c);let d=o.startedAt&&c.endedAt?Math.max(0,Math.round((new Date(c.endedAt).getTime()-new Date(o.startedAt).getTime())/1e3)):void 0;return await R(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:o.startedAt||"",endedAt:c.endedAt||"",durationSec:d,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"}async function tt(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 rt={allowSchedulerAutoEnqueue:true,enforceSubscriptionOnJobExecution:false,shouldEnforceSubscriptionOnJobExecution:e=>e.enqueueSource==="scheduler"||e.createdBy===0,assertActiveSubscriptionForIdentity:tt},re=te(rt),nt=re,wt=re;process.argv[1]&&import.meta.url===pathToFileURL(process.argv[1]).href&&nt().catch(e=>{console.error(e),process.exit(1);});export{wt as default,nt as main,re 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 se from'http';import ue from'https';function W(e){let t=e.trim();return t==="."?".":t.replace(/\/$/,"")}function ae(e){let t=String(e??"").trim();if(!t)return "";let r=t;if(/^https?:\/\//i.test(r))try{r=new URL(r).pathname;}catch{return ""}if(r=r.split(/[?#]/,1)[0]?.replace(/\\/g,"/").trim()??"",!r)return "";let i=r.endsWith("/"),n=r.replace(/^\/+/,"").split("/").map(o=>o.replace(/[^A-Za-z0-9._-]/g,"")).filter(o=>o.length>0&&o!=="."&&o!=="..");if(n.length===0)return "";let s=`/${n.join("/")}`;return i&&g.extname(s)===""&&(s+="/"),s==="/"?"":s}function T(e){return !e||typeof e!="object"?{}:Object.fromEntries(Object.entries(e).map(([t,r])=>[t.trim(),String(r??"")]).filter(([t])=>t.length>0))}function ce(e){if(!e||typeof e!="object")return {};let t={};for(let[r,i]of Object.entries(e)){let n=r.trim();if(!n||!i||typeof i!="object")continue;let s=i,o={};if(typeof s.targetOrigin=="string"){let a=W(s.targetOrigin);a&&(o.targetOrigin=a);}let u=T(s.extraReplacements);if(Object.keys(u).length>0&&(o.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&&(o.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(d=>String(d??"").trim()).filter(d=>d.length>0)),Object.keys(a).length>0&&(o.cloudFront=a);}t[n]=o;}return t}function k(e){return e==="PROFESSIONAL"||e==="AGENCY"?e:void 0}function le(e,t){if(!e||typeof e!="object")return null;let r=e,i=r.command;if(i!=="publish"&&i!=="crawl"&&i!=="deploy"&&i!=="invalidate"&&i!=="retry-timeouts"&&i!=="url")return null;let n=Number.parseInt(String(r.intervalMinutes??"0"),10);if(!Number.isFinite(n)||n<1)return null;let s=String(r.id??`${i}-${t+1}`).trim();if(!s)return null;let o=String(r.deploymentProfile??"").trim(),u=String(r.url??"").trim(),a=Array.isArray(r.postTypes)?[...new Set(r.postTypes.map(d=>String(d??"").trim().toLowerCase().replace(/[^a-z0-9_-]/g,"")).filter(Boolean))]:[],c=Array.isArray(r.listingPaths)?[...new Set(r.listingPaths.map(d=>String(d??"").trim()).filter(Boolean))]:[];return {id:s,enabled:r.enabled!==false,command:i,intervalMinutes:n,...i==="publish"||i==="crawl"?{crawlMode:r.crawlMode==="incremental"?"incremental":"full"}:{},...(i==="publish"||i==="deploy"||i==="invalidate")&&o?{deploymentProfile:o}:{},...u?{url:u}:{},...a.length>0?{postTypes:a}:{},...c.length>0?{listingPaths:c}:{},...typeof r.includePostTypeArchives=="boolean"?{includePostTypeArchives:r.includePostTypeArchives}:{},...typeof r.includeTaxonomyArchives=="boolean"?{includeTaxonomyArchives:r.includeTaxonomyArchives}:{},...typeof r.includeAuthorArchives=="boolean"?{includeAuthorArchives:r.includeAuthorArchives}:{},...typeof r.includeDateArchives=="boolean"?{includeDateArchives:r.includeDateArchives}:{},...typeof r.includePostsPage=="boolean"?{includePostsPage:r.includePostsPage}:{},...typeof r.includeSitemapChain=="boolean"?{includeSitemapChain:r.includeSitemapChain}:{}}}function Q(e){let t=e&&typeof e=="object"?e:{},r=Array.isArray(t.rules)?t.rules.map((i,n)=>le(i,n)).filter(i=>!!i):[];return {enabled:t.enabled===true,timezone:typeof t.timezone=="string"&&t.timezone.trim()!==""?t.timezone.trim():"UTC",rules:r}}function de(e){if(!e||typeof e!="object")return;let t=e,r={};for(let n of ["accountId","siteId"]){let s=t[n];typeof s=="string"&&s.trim()!==""&&(r[n]=s.trim());}let i=Number(t.lastUpdate??0);return Number.isFinite(i)&&i>0&&(r.lastUpdate=Math.floor(i)),t.subscriber===true&&(r.subscriber=true),Object.keys(r).length>0?r:void 0}function J(e){let t=e&&typeof e=="object"?e:{},r=String(t.accountId??"").trim(),i=String(t.siteId??"").trim(),n=t.subscriber===true,s=de(t.siteSettings),o={...s??{},...r?{accountId:s?.accountId??r}:{},...i?{siteId:s?.siteId??i}:{},...s?.subscriber===true||n?{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 d=String(t.virtualAssetBaseUrl??t.uploadUrl??"").trim();d&&(u.virtualAssetBaseUrl=d),Object.keys(o).length>0&&(u.siteSettings=o);let p=k(t.subscriptionType);return p&&(u.subscriptionType=p),u}function pe(e){try{let t=new URL(e);globalThis.location=t;}catch{}}function z(e){return typeof e=="string"?e:e instanceof URL?e.toString():e.url}function ge(e,t){let r=new Headers(e instanceof Request?e.headers:void 0);if(t?.headers)for(let[i,n]of new Headers(t.headers).entries())r.set(i,n);return r}async function N(e,t,r=5){let i=new URL(z(e)),n=String(t?.method??(e instanceof Request?e.method:"GET")).toUpperCase(),s=i.protocol==="http:"?se:ue,o=ge(e,t);return await new Promise((u,a)=>{let c=s.request(i,{method:n,headers:Object.fromEntries(o.entries()),...i.protocol==="https:"?{rejectUnauthorized:false}:{}},d=>{let p=[];d.on("data",l=>{p.push(Buffer.isBuffer(l)?l:Buffer.from(l));}),d.on("error",a),d.on("end",()=>{let l=d.statusCode??0,m=d.headers.location;if(r>0&&m&&[301,302,303,307,308].includes(l)){u(N(new URL(m,i),{method:l===303?"GET":n},r-1));return}let h=new Headers;for(let[P,S]of Object.entries(d.headers))Array.isArray(S)?h.set(P,S.join(", ")):typeof S=="string"&&h.set(P,S);u(new Response(Buffer.concat(p),{status:l,statusText:d.statusMessage??"",headers:h}));});});c.on("error",a),c.end();})}function me(e){let t=J(e.wpsuite),r={...t.siteSettings??{},...t.siteSettings?.subscriber===true||t.subscriptionType==="PROFESSIONAL"||t.subscriptionType==="AGENCY"?{subscriber:true}:{}},i=String(r.accountId??"").trim(),n=String(r.siteId??"").trim(),s=String(t.virtualAssetBaseUrl??t.uploadUrl??"").trim();if(e.wpsuite={...t.apiBase?{apiBase:t.apiBase}:{},...t.runtimeToken?{runtimeToken:t.runtimeToken}:{},...s?{virtualAssetBaseUrl:s}:{},...Object.keys(r).length>0?{siteSettings:r}:{},...t.subscriptionType?{subscriptionType:t.subscriptionType}:{}},!i||!n||!s)return false;pe(e.sourceOrigin);let o=globalThis,a={...o.WpSuite??{},siteSettings:r,uploadUrl:s};return t.apiBase&&(a.apiBase=t.apiBase),o.WpSuite=a,true}async function fe(e){let t=String(e.wpsuite?.virtualAssetBaseUrl??e.wpsuite?.uploadUrl??"").trim();if(!me(e)){let n=e.wpsuite?.siteSettings,s=[String(n?.accountId??"").trim()?"":"accountId",String(n?.siteId??"").trim()?"":"siteId",t?"":"virtualAssetBaseUrl"].filter(Boolean);return {remote:null,diagnostic:{status:"invalid-runtime",virtualAssetBaseUrl:t,subscriptionType:null,error:`Missing WP Suite runtime field(s): ${s.join(", ")}.`,requests:[]}}}let r=globalThis.fetch,i=[];try{typeof r=="function"&&/^https?:\/\//i.test(t)&&(globalThis.fetch=(async(a,c)=>{let d=z(a);if(d.startsWith(t)){let p=(()=>{try{return new URL(d).pathname}catch{return d}})();try{let l=e.ignoreHttpsErrors&&d.startsWith("https://")?await N(a,c):await r(a,c);return i.push({path:p,status:l.status,ok:l.ok,error:null}),l}catch(l){throw i.push({path:p,status:null,ok:!1,error:l instanceof Error?l.message:String(l)}),l}}return r(a,c)}));let{getConfig:n}=await import('@smart-cloud/wpsuite-core'),s=await n("publisher"),o=s&&typeof s=="object"?s:null,u=k(o?.subscriptionType);return {remote:o,diagnostic:{status:o?"loaded":"unavailable",virtualAssetBaseUrl:t,subscriptionType:u??null,error:o?null:"WP Suite publisher config loader returned no configuration.",requests:i}}}catch(n){return {remote:null,diagnostic:{status:"unavailable",virtualAssetBaseUrl:t,subscriptionType:null,error:n instanceof Error?n.message:String(n),requests:i}}}finally{typeof r=="function"&&(globalThis.fetch=r);}}function he(e,t){let r=ce(t?.deploymentProfiles),i=String(t?.defaultDeploymentProfile??"").trim(),n=r[i]?i:"",s=k(t?.subscriptionType),o=J(e.wpsuite);return {...e,scheduler:Q(t?.scheduler),deploymentProfiles:r,defaultDeploymentProfile:n,...s?{subscriptionType:s}:{},wpsuite:{...o,...o.siteSettings||s?{siteSettings:{...o.siteSettings??{},...o.siteSettings?.subscriber===true||s==="PROFESSIONAL"||s==="AGENCY"?{subscriber:true}:{}}}:{},...s?{subscriptionType:s}:{}}}}function x(e,t){let i=String(e||"").replace(/\\/g,"/").trim().replace(/^\/+|\/+$/g,"");if(!i)return t;let n=i.split("/").map(s=>s.trim()).filter(s=>s.length>0&&s!=="."&&s!=="..");return n.length>0?n.join("/"):t}function be(){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,r){let i=String(t||"").trim();return i&&g.isAbsolute(i)?g.resolve(i):g.resolve(e,x(i,r))}async function E(e,t={}){let r=String(e??"").trim()||process.env.PUBLISHER_CONFIG||"publisher.config.json",i=await f.readFile(r,"utf8"),n=JSON.parse(i);n.sourceOrigin=n.sourceOrigin.replace(/\/$/,""),n.targetOrigin=W(n.targetOrigin),n.ignoreHttpsErrors??=false,n.outputDir=String(n.outputDir||"export").trim()||"export",n.urlRewriteMode||=n.targetOrigin==="."?"relative":"absolute",n.noJavaScriptRenderPathPrefixes||=[],n.seedPaths||=[],n.generated404RequestPath=ae(n.generated404RequestPath),n.sitemapPaths||=["/sitemap_index.xml","/sitemap.xml"],n.allowedAssetHosts||=[],n.assetPathPrefixes||=["/wp-content/","/wp-includes/","/static/","/assets/","/build/","/_next/","/docs/","/sitemap","/robots.txt","/llms.txt"],n.blockedPathPrefixes||=[],n.blockedSearchFragments||=[],n.concurrency||=1,n.maxPages||=0,n.extraReplacements=T(n.extraReplacements),n.postCrawlCopyMap=T(n.postCrawlCopyMap),n.logDir=String(n.logDir||"logs").trim()||"logs",n.verbose??=false,n.logLevel||=n.verbose?"debug":"info",n.s3SyncMode||="sdk-upload-delete",n.readiness||={waitForSelector:null,waitForFunction:null,timeoutMs:1500,fallbackWaitMs:1500},n.readiness.timeoutMs??=1500,n.readiness.fallbackWaitMs??=1500,n.viewport||={width:1440,height:1200},n.navigationTimeoutMs||=3e4,n.assetDownloadConcurrency=Number(n.assetDownloadConcurrency)>0?Number(n.assetDownloadConcurrency):n.concurrency,n.rewriteConcurrency=Number(n.rewriteConcurrency)>0?Number(n.rewriteConcurrency):n.assetDownloadConcurrency,n.wpsuite=J(n.wpsuite),n.scheduler=Q(void 0),n.deploymentProfiles={},n.defaultDeploymentProfile="",n.deploymentTargetOverride=String(n.deploymentTargetOverride??"").trim();let s=await fe(n);t.onRemotePublisherConfigDiagnostic?.(s.diagnostic);let o=he(n,s.remote),u=be(),a=u?g.resolve(u,".."):"";return a?(o.outputDir=L(a,o.outputDir,"export"),o.logDir=L(a,o.logDir,"logs")):(g.isAbsolute(o.outputDir)||(o.outputDir=x(o.outputDir,"export")),g.isAbsolute(o.logDir)||(o.logDir=x(o.logDir,"logs"))),o}function Y(e){let t=String(e.command??"").trim();return (t==="publish"||t==="crawl")&&e.crawlMode==="incremental"||t==="content-sync"}var j=new Map;async function _(e){let t=g.resolve(e),r=j.get(t);if(r!==void 0)return r;try{let i=JSON.parse(await f.readFile(t,"utf8")),n=String(i.version??"").trim();return j.set(t,n),n}catch{return j.set(t,""),""}}var D=class extends Error{request;step;constructor(t,r){super(`Stop requested during ${r}.`),this.name="StopRequestedError",this.request=t,this.step=r;}},Ce="queue-mutation.lock",Re=5e3,qe=3e4;function De(e){let t=process.env.STATIC_PUBLISHER_RUNTIME_DIR||process.env.WPSUITE_STATIC_PUBLISHER_RUNTIME_DIR||"",r=process.env.STATIC_PUBLISHER_EXPORTER_DIR||process.cwd(),i=process.env.PUBLISHER_CONFIG||"",n=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"?r=e[++u]||r:a.startsWith("--exporter-dir=")?r=a.slice(15):a==="--config"?i=e[++u]||"":a.startsWith("--config=")?i=a.slice(9):a==="--max-jobs"?n=Number.parseInt(e[++u]||"1",10):a.startsWith("--max-jobs=")&&(n=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),o=i?g.resolve(i):g.join(s,"config.json");return {runtimeDir:s,exporterDir:g.resolve(r),configPath:o,maxJobs:Number.isFinite(n)&&n>0?n:1}}async function w(e,t){try{let r=await f.readFile(e,"utf8");return JSON.parse(r)}catch(r){if((r&&typeof r=="object"&&"code"in r?String(r.code||""):"")!=="ENOENT"){let n=r instanceof Error?r.message:String(r);console.warn(`[queue-runner] failed to read JSON ${e}: ${n}`);}return t}}async function y(e,t){await f.mkdir(g.dirname(e),{recursive:true}),await f.writeFile(e,JSON.stringify(t,null,2),"utf8");}function Z(e){return g.join(e,Ce)}async function Ie(e){await new Promise(t=>setTimeout(t,e));}async function Te(e){let t=Z(e),r=Date.now()+Re;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(i){if((i&&typeof i=="object"&&"code"in i?String(i.code||""):"")!=="EEXIST")throw i;let s=await f.stat(t).catch(()=>null);if(s&&Date.now()-s.mtimeMs>qe){await f.unlink(t).catch(()=>{});continue}if(Date.now()>=r)throw new Error("Timed out acquiring queue mutation lock.",{cause:i});await Ie(50);}}async function xe(e){await f.unlink(Z(e)).catch(()=>{});}async function I(e,t){await Te(e);try{return await t()}finally{await xe(e);}}function ke(e){return g.join(e,"queue-runner-heartbeat.json")}function B(e){return g.join(e,"current-progress.json")}function $(e){return g.join(e,"scheduler-state.json")}function Je(e,t){let i=String(e||"").replace(/\\/g,"/").trim().replace(/^\/+|\/+$/g,"");if(!i)return t;let n=i.split("/").map(s=>s.trim()).filter(s=>s.length>0&&s!=="."&&s!=="..");return n.length>0?n.join("/"):t}async function X(e){let t=await w(e.configPath||"",null),r=g.resolve(e.runtimeDir,".."),n=(typeof t?.logDir=="string"?t.logDir:"").trim();return n&&g.isAbsolute(n)?g.resolve(n):g.resolve(r,Je(n,"logs"))}function O(e,t){return String(e||"").trim().replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||t}function Ee(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 je(e){return [Ee(e.endedAt||e.startedAt),O(e.command||"job","job"),O(e.id||"job","job"),O(e.status||"finished","finished")].join("-")}function Oe(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 Fe(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 Me(e){return e.endsWith(".gz")?"application/gzip":e.endsWith(".jsonl")?"application/x-ndjson":e.endsWith(".json")?"application/json":"text/plain"}async function H(e,t,r){let i=`${r}.gz`,n=g.join(t,i);await pipeline(createReadStream(e),createGzip({level:9}),createWriteStream(n));let[s,o]=await Promise.all([f.stat(e),f.stat(n)]);return {role:Fe(r),originalFileName:r,storedFileName:i,compressed:true,compression:"gzip",contentType:Me(i),originalSize:s.size,storedSize:o.size}}async function G(e,t){let r=await X(t),i=new Date().toISOString(),n=je(e),s=g.join(r,"archive",n),o=[],u=[];await f.mkdir(s,{recursive:true});try{let d=await f.readdir(r,{withFileTypes:!0});for(let p of d){if(!p.isFile()||!Oe(p.name))continue;let l=await H(g.join(r,p.name),s,p.name);u.push(l),o.push(l.storedFileName);}}catch(d){if((d&&typeof d=="object"&&"code"in d?String(d.code||""):"")!=="ENOENT")throw d}let a=B(t.runtimeDir);if(existsSync(a)){let d=await H(a,s,"current-progress.json");u.push(d),o.push(d.storedFileName);}let c=[...o,"job.json"];return await y(g.join(s,"job.json"),{manifestVersion:1,archivedAt:i,archiveKey:n,archiveDir:s,logDir:r,runtimeDir:t.runtimeDir,exporterDir:t.exporterDir,configPath:t.configPath||"",archivedFiles:c,artifacts:u,job:e}),{archiveKey:n,archiveDir:s,archiveCreatedAt:i,archivedFiles:c,artifacts:u}}function Be(e){return g.join(e,"audit-events.jsonl")}function F(e){return g.join(e,"stop-request.json")}async function ee(e){try{let t=await f.readFile(F(e),"utf8"),r=JSON.parse(t);return r&&typeof r=="object"?r:null}catch{return null}}async function K(e,t){let r=await ee(e);if(!r)return null;let i=String(r.targetJobId||"").trim();return i&&i!==t?null:r}async function M(e,t){if(!t){await f.unlink(F(e)).catch(()=>{});return}let r=await ee(e);if(!r)return;let i=String(r.targetJobId||"").trim();(!i||i===t)&&await f.unlink(F(e)).catch(()=>{});}async function R(e,t){try{let r={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(Be(e),`${JSON.stringify(r)}
|
|
2
|
+
`,"utf8");}catch{}}async function b(e,t,r){let[i,n]=await Promise.all([_(g.join(e.exporterDir,"package.json")),_(g.join(e.exporterDir,"node_modules","@smart-cloud","wpsuite-core","package.json"))]),s={checkedAt:new Date().toISOString(),status:t,pid:process.pid,nodePath:process.execPath,nodeVersion:process.version,exporterVersion:i,wpsuiteCoreVersion:n,runtimeDir:e.runtimeDir,exporterDir:e.exporterDir,...r??{}};try{await y(ke(e.runtimeDir),s);}catch{}}async function q(e){try{await f.unlink(B(e));}catch{}}function Ue(e,t){let r=e.command;if(r!=="publish"&&r!=="crawl"&&r!=="deploy"&&r!=="invalidate"&&r!=="retry-timeouts"&&r!=="url")return null;let i=Number.parseInt(String(e.intervalMinutes??"0"),10);if(!Number.isFinite(i)||i<1)return null;let n=(e.id||`${r}-${t+1}`).trim();if(!n)return null;let s=e.enabled!==false,o=typeof e.url=="string"?e.url.trim():"",u=typeof e.deploymentProfile=="string"?e.deploymentProfile.trim():"",a=Array.isArray(e.postTypes)?[...new Set(e.postTypes.map(p=>String(p).trim()).filter(Boolean))]:[],c=Array.isArray(e.listingPaths)?[...new Set(e.listingPaths.map(p=>String(p).trim()).filter(Boolean))]:[],d=(r==="publish"||r==="crawl")&&e.crawlMode==="incremental"?"incremental":"full";return r==="url"&&!o?null:{id:n,enabled:s,command:r,intervalMinutes:i,...r==="publish"||r==="crawl"?{crawlMode:d}:{},...(r==="publish"||r==="deploy"||r==="invalidate")&&u?{deploymentProfile:u}:{},...o?{url:o}:{},...a.length>0?{postTypes:a}:{},...c.length>0?{listingPaths:c}:{},...typeof e.includePostTypeArchives=="boolean"?{includePostTypeArchives:e.includePostTypeArchives}:{},...typeof e.includeTaxonomyArchives=="boolean"?{includeTaxonomyArchives:e.includeTaxonomyArchives}:{},...typeof e.includeAuthorArchives=="boolean"?{includeAuthorArchives:e.includeAuthorArchives}:{},...typeof e.includeDateArchives=="boolean"?{includeDateArchives:e.includeDateArchives}:{},...typeof e.includePostsPage=="boolean"?{includePostsPage:e.includePostsPage}:{},...typeof e.includeSitemapChain=="boolean"?{includeSitemapChain:e.includeSitemapChain}:{}}}async function Le(e){let t=await E(e.configPath).catch(()=>null),r=t?.scheduler,i=Array.isArray(r?.rules)?r.rules.map((n,s)=>Ue(n,s)).filter(n=>!!n):[];return {enabled:!!r?.enabled,timezone:typeof r?.timezone=="string"&&r.timezone.trim()?r.timezone.trim():"UTC",rules:i,wpsuite:t?.wpsuite}}function We(e,t){let r=(t.url||"").trim(),i=t.crawlMode||"full",n=(t.deploymentProfile||"").trim();return e.some(s=>s.command===t.command&&(s.url||"").trim()===r&&(s.crawlMode||"full")===i&&(s.deploymentProfile||"").trim()===n&&(s.status===void 0||s.status==="queued"||s.status==="running"))}async function Qe(e,t){if(!t.allowSchedulerAutoEnqueue)return 0;let r=await Le(e);if(!r.enabled||r.rules.length===0)return 0;if(t.assertActiveSubscriptionForIdentity)try{await t.assertActiveSubscriptionForIdentity(r.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 i=g.join(e.runtimeDir,"queue.json"),n=g.join(e.runtimeDir,"current-run.json"),s=Date.now(),o=0,u=[];await I(e.runtimeDir,async()=>{let a=await w(i,[]),c=await w(n,null),d=await w($(e.runtimeDir),{lastEnqueuedBucketByRuleId:{}}),p=[...a];c&&c.status==="running"&&p.unshift(c);for(let l of r.rules){if(!l.enabled)continue;let m=l.intervalMinutes*60*1e3,h=Math.floor(s/m),P=d.lastEnqueuedBucketByRuleId[l.id]??-1;if(h<=P||We(p,{command:l.command,url:l.url,crawlMode:l.crawlMode,deploymentProfile:l.deploymentProfile}))continue;let S={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",...r.wpsuite?{wpsuite:r.wpsuite}:{},status:"queued",createdAt:new Date().toISOString(),createdBy:0};a.push(S),p.push(S),u.push({job:S,rule:l}),d.lastEnqueuedBucketByRuleId[l.id]=h,o+=1;}o>0&&(await y(i,a),await y($(e.runtimeDir),d));});for(let a of u)await R(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:r.timezone,deploymentProfile:a.rule.deploymentProfile||"",url:a.rule.url||""}});return o}async function ze(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 Ne(e){try{await f.unlink(e);}catch{}}function _e(e,t){let r=[g.join(e,"dist",`${t}.js`),g.join(e,`${t}.js`)];for(let i of r)if(existsSync(i))return i;throw new Error(`Cannot find ${t}.js in ${g.join(e,"dist")} or ${e}`)}async function A(e,t,r,i,n,s,o){if(o){let c=await K(t,o);if(c)throw new D(c,r)}let u=_e(e,r),a={...process.env,...s??{}};return a.STATIC_PUBLISHER_RUNTIME_DIR=t,n&&(a.PUBLISHER_CONFIG=n),await new Promise((c,d)=>{let p=null,l=null,m=null,h=false,P=spawn(process.execPath,[u,...i],{cwd:e,env:a,stdio:"inherit"}),S=()=>{l&&clearInterval(l),m&&clearTimeout(m);},ie=async()=>{if(!(!o||p||h)){h=true;try{let C=await K(t,o);if(!C)return;p=C,P.kill("SIGTERM"),m=setTimeout(()=>{P.kill("SIGKILL");},1e4);}finally{h=false;}}};o&&(l=setInterval(()=>{ie();},1e3)),P.on("error",C=>{S(),d(C);}),P.on("close",(C,U)=>{if(S(),p){d(new D(p,r));return}C===0?c():d(new Error(`${r} exited with code ${C??-1}${U?` (signal ${U})`:""}`));});}),0}function $e(e){let t=e.awsTempCreds;if(!t)return {};let r={};return typeof t.accessKeyId=="string"&&t.accessKeyId.trim()!==""&&(r.AWS_ACCESS_KEY_ID=t.accessKeyId.trim()),typeof t.secretAccessKey=="string"&&t.secretAccessKey.trim()!==""&&(r.AWS_SECRET_ACCESS_KEY=t.secretAccessKey.trim()),typeof t.sessionToken=="string"&&t.sessionToken.trim()!==""&&(r.AWS_SESSION_TOKEN=t.sessionToken.trim()),r}async function He(e,t){let r=o=>{if(!o||typeof o!="object")return null;let u=o,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.virtualAssetBaseUrl??u.uploadUrl??"").trim()?{virtualAssetBaseUrl:String(u.virtualAssetBaseUrl??u.uploadUrl).trim()}:{},...Object.keys(a).length>0?{siteSettings:a}:{},...u.subscriptionType?{subscriptionType:u.subscriptionType}:{}};return Object.keys(c).length>0?c:null},i=await E(t.configPath).catch(()=>null),n=r(i?.wpsuite);if(n)return n;let s=r(e.wpsuite);return s||null}async function Ge(e,t){return await He(e,t)}function te(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 Ke(e,t){let r=await w(B(e.runtimeDir),null),i=r&&r.details&&typeof r.details.phase=="string"?r.details.phase.trim():"";if(i)return i;let n=r&&typeof r.currentStep=="string"?r.currentStep.trim():"";if(n)return n;let s=await X(e).catch(()=>"");if(s){let o=await w(g.join(s,"current-crawl-event.json"),null),u=o&&typeof o.currentStep=="string"?o.currentStep.trim():"";if(u)return u}return t}function Ve(e,t){if((e.command==="publish"||e.command==="crawl")&&t==="rewrite-text")return "rewrite-text"}async function Ye(e){let t=g.join(e.runtimeDir,"queue.json"),r=g.join(e.runtimeDir,"current-run.json"),i=await I(e.runtimeDir,async()=>{let n=await w(r,null);if(!n||n.status!=="running"&&n.status!=="queued")return null;let s=await w(t,[]),o=Array.isArray(s)?s.filter(a=>a?.id!==n.id):[],u=te(n);return await y(t,[u,...o]),await y(r,null),u});i&&(await M(e.runtimeDir,i.id),await R(e.runtimeDir,{eventType:"job-recovered",status:"queued",actorSource:"queue-runner",jobId:i.id,command:i.command,message:"Recovered stale current-run entry back into queue."}));}async function Ze(e,t,r){try{if((r.shouldEnforceSubscriptionOnJobExecution?.(e)??r.enforceSubscriptionOnJobExecution)&&r.assertActiveSubscriptionForIdentity){let u=await Ge(e,t);await r.assertActiveSubscriptionForIdentity(u);}let n=$e(e),s=e.resumeFromStep==="rewrite-text"?["--resume-rewrite"]:e.crawlMode==="incremental"?["--crawl-mode","incremental"]:[],o=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 A(t.exporterDir,t.runtimeDir,"crawl",s,t.configPath,n,e.id),await b(t,"running",{currentJobId:e.id,currentJobCommand:e.command,currentStep:"deploy"}),await A(t.exporterDir,t.runtimeDir,"deploy",o,t.configPath,n,e.id),await b(t,"running",{currentJobId:e.id,currentJobCommand:e.command,currentStep:"invalidate"}),await A(t.exporterDir,t.runtimeDir,"invalidate",o,t.configPath,n,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 A(t.exporterDir,t.runtimeDir,"crawl",s,t.configPath,n,e.id),{exitCode:0};if(e.command==="deploy")return await b(t,"running",{currentJobId:e.id,currentJobCommand:e.command,currentStep:"deploy"}),await A(t.exporterDir,t.runtimeDir,"deploy",o,t.configPath,n,e.id),{exitCode:0};if(e.command==="invalidate")return await b(t,"running",{currentJobId:e.id,currentJobCommand:e.command,currentStep:"invalidate"}),await A(t.exporterDir,t.runtimeDir,"invalidate",o,t.configPath,n,e.id),{exitCode:0};if(e.command==="retry-timeouts")return await b(t,"running",{currentJobId:e.id,currentJobCommand:e.command,currentStep:"retry-timeouts"}),await A(t.exporterDir,t.runtimeDir,"crawl",["--retry-timeouts"],t.configPath,n,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 A(t.exporterDir,t.runtimeDir,"crawl",["--url",u],t.configPath,n,e.id),{exitCode:0}):{exitCode:2,error:"Missing url for command 'url'"}}return {exitCode:2,error:`Unsupported command: ${e.command}`}}catch(i){return i instanceof D?{exitCode:130,error:"Job stop requested.",stopped:true,stopRequest:i.request,stoppedStep:i.step}:{exitCode:1,error:i instanceof Error?i.message:String(i)}}}function re(e){return async function(r=process.argv.slice(2)){let i=De(r),n=g.join(i.runtimeDir,"export.lock"),s=g.join(i.runtimeDir,"last-run.json");await q(i.runtimeDir),await b(i,"starting",{message:"queue-runner starting"});try{await ze(n);}catch(o){if((o&&typeof o=="object"&&"code"in o?String(o.code||""):"")!=="EEXIST")throw o;console.log("[queue-runner] lock active, skipping"),await b(i,"lock-active",{message:"lock active, skipped this cron tick"});return}try{await Ye(i);let o=await Qe(i,e),u=0;for(let a=0;a<i.maxJobs;a++){let c=await et(i,e);if(c==="none"||(u+=1,c==="stopped"))break}if(u===0)await q(i.runtimeDir),await b(i,"idle",{processedJobs:u,schedulerEnqueued:o,message:"no queued jobs"});else {await q(i.runtimeDir);let a=await w(s,null),c=String(a?.status||"").trim();await b(i,c==="success"?"job-success":c==="stopped"?"job-stopped":"job-failed",{processedJobs:u,schedulerEnqueued:o,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(o){let u=o instanceof Error?o.message:String(o);throw await b(i,"error",{message:u}),await R(i.runtimeDir,{eventType:"queue-runner-error",status:"failed",actorSource:"queue-runner",message:"Unhandled queue-runner error.",details:{error:u}}),o}finally{await Ne(n);}}}async function Xe(e,t,r){let i=g.join(e.runtimeDir,"queue.json"),n=g.join(e.runtimeDir,"current-run.json");await I(e.runtimeDir,async()=>{let s=await w(i,[]),o=Array.isArray(s)?s.filter(c=>c?.id!==t.id):[],u=te(t),a=Ve(t,r);a?u.resumeFromStep=a:delete u.resumeFromStep,await y(i,[u,...o]),await y(n,null);});}async function et(e,t){let r=g.join(e.runtimeDir,"queue.json"),i=g.join(e.runtimeDir,"current-run.json"),n=g.join(e.runtimeDir,"last-run.json"),s=new Date().toISOString(),o=await I(e.runtimeDir,async()=>{let p=await w(r,[]);if(!Array.isArray(p)||p.length===0)return null;let l={...p[0],status:"running",startedAt:s};return await y(r,p.slice(1)),await y(i,l),l});if(!o)return "none";await q(e.runtimeDir),await R(e.runtimeDir,{eventType:"job-run-started",status:"running",actorSource:"queue-runner",jobId:o.id,command:o.command,message:"Job execution started.",details:{createdAt:o.createdAt||"",startedAt:s,createdBy:o.createdBy??null,deploymentProfile:o.deploymentProfile||"",queuedWithTempAwsCreds:!!o.awsTempCreds}}),await b(e,"running",{currentJobId:o.id,currentJobCommand:o.command,currentStep:o.command});let u=await Ze(o,e,t),a=new Date().toISOString();if(u.stopped){let p=await Ke(e,u.stoppedStep||o.command),l=u.stopRequest?.mode==="requeue"?"requeue":"stop",m={...o,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:p};l==="requeue"?await Xe(e,o,p):await y(i,null);try{let h=await G(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 y(n,m),await M(e.runtimeDir,o.id),await q(e.runtimeDir),await R(e.runtimeDir,{eventType:"job-run-stopped",status:"stopped",actorSource:"queue-runner",jobId:o.id,command:o.command,message:l==="requeue"?"Job stop requested and requeued.":"Job stop requested and removed from active execution without requeue.",details:{startedAt:o.startedAt||"",endedAt:a,deploymentProfile:o.deploymentProfile||"",stopMode:l,stopRequestedAt:u.stopRequest?.requestedAt||"",stopRequestedByLogin:u.stopRequest?.requestedByLogin||"",stopRequestedByUserId:typeof u.stopRequest?.requestedByUserId=="number"?u.stopRequest.requestedByUserId:null,stoppedStep:p,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={...o,status:u.exitCode===0?"success":"failed",endedAt:a,exitCode:u.exitCode,...u.error?{error:u.error}:{}};await y(i,null),await M(e.runtimeDir,o.id);try{let p=await G(c,e);c.logArchiveDir=p.archiveDir,c.logArchiveCreatedAt=p.archiveCreatedAt,c.logArchiveFileCount=p.archivedFiles.length;}catch(p){c.logArchiveError=p instanceof Error?p.message:String(p);}await y(n,c);let d=o.startedAt&&c.endedAt?Math.max(0,Math.round((new Date(c.endedAt).getTime()-new Date(o.startedAt).getTime())/1e3)):void 0;return await R(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:o.startedAt||"",endedAt:c.endedAt||"",durationSec:d,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"}async function rt(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 nt={allowSchedulerAutoEnqueue:true,enforceSubscriptionOnJobExecution:false,shouldEnforceSubscriptionOnJobExecution:e=>Y(e)||e.enqueueSource==="scheduler"||e.createdBy===0,assertActiveSubscriptionForIdentity:rt},ne=re(nt),it=ne,Pt=ne;process.argv[1]&&import.meta.url===pathToFileURL(process.argv[1]).href&&it().catch(e=>{console.error(e),process.exit(1);});export{Pt as default,it as main,ne as runQueueRunner};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@smart-cloud/publisher-exporter",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.38",
|
|
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.",
|