@smart-cloud/publisher-exporter 1.1.68 → 1.1.69
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/remote-worker.js +5 -5
- package/package.json +1 -1
package/dist/remote-worker.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {S3Client,HeadObjectCommand,CopyObjectCommand,DeleteObjectsCommand,PutObjectCommand,GetObjectCommand}from'@aws-sdk/client-s3';import {request,chromium}from'playwright';import {createHash}from'crypto';import {lookup}from'dns/promises';import {isIP}from'net';import K from'path';import'fast-glob';import {statfs,readdir,readFile,rm}from'fs/promises';import'os';import'worker_threads';import {DynamoDBClient,UpdateItemCommand}from'@aws-sdk/client-dynamodb';import Oe from'mime-types';import {writeSync}from'fs';var S=1,Re=/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;function j(e,t){let r=String(e??"").trim();if(!Re.test(r))throw new Error(`${t} must match ${Re.source} and be at most 128 characters.`);return r}function U(e){let t=String(e??"").trim().replace(/^\/+|\/+$/g,"");if(!t)return "";let r=t.split("/").filter(Boolean);if(r.some(n=>n==="."||n===".."))throw new Error("S3 prefix contains an unsafe dot path segment.");return `${r.join("/")}/`}function I(e,...t){let r=U(e),n=t.map((o,s)=>{let a=String(o??"").replace(/^\/+|\/+$/g,"");if(!a||a.split("/").some(i=>i==="."||i===".."))throw new Error(`Unsafe S3 key segment at index ${s}.`);return a});return `${r}${n.join("/")}`}function H(e,t,r){return `${I(e,"jobs",j(t,"jobId"),"tasks",j(r,"taskId"))}/`}function L(e){return createHash("sha256").update(e).digest("hex")}function v(e,t){let r=String(e??"").replace(/^\/+/,""),n=U(t);if(!r||r.includes("\0"))throw new Error("S3 object key is empty or invalid.");if(n&&!r.startsWith(n))throw new Error(`S3 object key is outside the configured workspace prefix: ${r}`);if(r.split("/").some(o=>o===".."))throw new Error("S3 object key contains an unsafe parent segment.");return r}function T(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new Error(`${t} must be a JSON object.`);return e}function w(e,t){if(typeof e!="string"||!e.trim())throw new Error(`${t} must be a non-empty string.`);return e.trim()}function E(e,t,r,n){if(!Number.isInteger(e)||Number(e)<r||Number(e)>n)throw new Error(`${t} must be an integer between ${r} and ${n}.`);return Number(e)}function rt(e){return e.hostname.replace(/^\[|\]$/g,"").replace(/\.$/,"").toLowerCase()}function z(e){let t=e.split(".");if(t.length!==4)return null;let r=t.map(n=>Number(n));return r.every((n,o)=>Number.isInteger(n)&&n>=0&&n<=255&&String(n)===t[o])?r:null}function ie(e){let t=e.toLowerCase();if(t.includes("%")||t.split("::").length>2)return null;let r=t,n=r.lastIndexOf(":");if(r.includes(".")&&n>=0){let c=z(r.slice(n+1));if(!c)return null;r=`${r.slice(0,n)}:${((c[0]??0)*256+(c[1]??0)).toString(16)}:${((c[2]??0)*256+(c[3]??0)).toString(16)}`;}let[o,s]=r.split("::"),a=o?o.split(":"):[],i=s?s.split(":"):[],l=r.includes("::"),d=8-a.length-i.length;return l&&d<1||!l&&d!==0||[...a,...i].some(c=>!/^[0-9a-f]{1,4}$/.test(c))?null:[...a.map(c=>Number.parseInt(c,16)),...Array.from({length:d},()=>0),...i.map(c=>Number.parseInt(c,16))]}function be(e){let t=z(e);if(!t)return "an invalid IPv4 address";let[r=0,n=0,o=0,s=0]=t;return r===0?"the unspecified/current-network IPv4 range":r===10||r===172&&n>=16&&n<=31||r===192&&n===168?"an RFC1918 private IPv4 range":r===127?"the IPv4 loopback range":r===169&&n===254?"the IPv4 link-local/metadata range":r===100&&n===100&&o===100&&s===200?"a cloud instance metadata endpoint":r===100&&n>=64&&n<=127?"the shared carrier-grade NAT IPv4 range":r===198&&(n===18||n===19)?"the IPv4 benchmarking range":r>=224&&r<=239?"the IPv4 multicast range":r>=240?"the reserved IPv4 range":null}function nt(e){let t=ie(e);if(!t||t.length!==8)return "an invalid IPv6 address";if(t.every(o=>o===0))return "the unspecified IPv6 address";if(t.slice(0,7).every(o=>o===0)&&t[7]===1)return "the IPv6 loopback address";let r=t[0]??0;if((r&65024)===64512)return "an IPv6 unique-local range";if((r&65472)===65152)return "the IPv6 link-local range";if((r&65280)===65280)return "the IPv6 multicast range";if(t.slice(0,5).every(o=>o===0)&&t[5]===65535){let o=t[6]??0,s=t[7]??0;return be(`${o>>8}.${o&255}.${s>>8}.${s&255}`)}return null}function ae(e){return z(e)?be(e):ie(e)?nt(e):"an invalid IP address"}function V(e,t){let r=w(e,t),n;try{n=new URL(r);}catch{throw new Error(`${t} must be a valid URL.`)}if(n.protocol!=="http:"&&n.protocol!=="https:")throw new Error(`${t} must use HTTP or HTTPS.`);if(n.username||n.password)throw new Error(`${t} must not contain URL credentials.`);let o=rt(n);if(!o)throw new Error(`${t} must contain a hostname.`);if(o==="localhost"||o.endsWith(".localhost"))throw new Error(`${t} must not target localhost.`);if(o==="metadata.google.internal")throw new Error(`${t} must not target a cloud instance metadata endpoint.`);if(z(o)||ie(o)){let s=ae(o);if(s)throw new Error(`${t} must not target ${s}.`)}return n}function ot(e){let t=V(e.sourceOrigin,"sourceOrigin").origin;if(!Array.isArray(e.urls)||e.urls.length<1||e.urls.length>20)throw new Error("Render tasks require between 1 and 20 URLs.");for(let[s,a]of e.urls.entries())if(V(a,`urls[${s}]`).origin!==t)throw new Error(`urls[${s}] is outside sourceOrigin.`);let r=T(e.options,"options");if(typeof r.ignoreHttpsErrors!="boolean")throw new Error("options.ignoreHttpsErrors must be a boolean.");if(typeof r.javaScriptEnabled!="boolean")throw new Error("options.javaScriptEnabled must be a boolean.");let n=T(r.viewport,"options.viewport");E(n.width,"options.viewport.width",320,7680),E(n.height,"options.viewport.height",240,7680),E(r.navigationTimeoutMs,"options.navigationTimeoutMs",1e3,6e5),E(r.autoScrollTimeoutMs,"options.autoScrollTimeoutMs",0,12e4);let o=T(r.readiness,"options.readiness");for(let s of ["waitForSelector","waitForFunction"])if(o[s]!==null&&typeof o[s]!="string")throw new Error(`options.readiness.${s} must be a string or null.`);E(o.timeoutMs,"options.readiness.timeoutMs",0,12e4),E(o.fallbackWaitMs,"options.readiness.fallbackWaitMs",0,12e4);}function st(e){if(!Array.isArray(e.urls)||e.urls.length<1||e.urls.length>20)throw new Error("Asset tasks require between 1 and 20 URLs.");for(let[r,n]of e.urls.entries())V(n,`urls[${r}]`);let t=T(e.options,"options");if(typeof t.ignoreHttpsErrors!="boolean")throw new Error("options.ignoreHttpsErrors must be a boolean.");E(t.timeoutMs,"options.timeoutMs",1e3,12e4);}function it(e){if(w(e.configKey,"configKey"),w(e.assetMapKey,"assetMapKey"),e.previousAssetMapKey!==void 0&&w(e.previousAssetMapKey,"previousAssetMapKey"),!Array.isArray(e.items)||e.items.length<1||e.items.length>500)throw new Error("Rewrite tasks require between 1 and 500 objects.");for(let[t,r]of e.items.entries()){let n=T(r,`items[${t}]`);w(n.inputKey,`items[${t}].inputKey`),w(n.outputKey,`items[${t}].outputKey`),w(n.relativePath,`items[${t}].relativePath`),n.contentType!==void 0&&n.contentType!==null&&w(n.contentType,`items[${t}].contentType`);}}function at(e){if(j(w(e.targetId,"targetId"),"targetId"),!Array.isArray(e.items)||e.items.length>1e3)throw new Error("Deploy copy tasks accept at most 1000 objects.");for(let[r,n]of e.items.entries()){let o=T(n,`items[${r}]`);w(o.sourceKey,`items[${r}].sourceKey`),w(o.targetRelativeKey,`items[${r}].targetRelativeKey`),w(o.sha256,`items[${r}].sha256`),o.normalizedSha256!==void 0&&w(o.normalizedSha256,`items[${r}].normalizedSha256`),E(o.bytes,`items[${r}].bytes`,0,Number.MAX_SAFE_INTEGER),w(o.contentType,`items[${r}].contentType`),w(o.cacheControl,`items[${r}].cacheControl`);}let t=e.deleteRelativeKeys??[];if(!Array.isArray(t)||t.length>1e3)throw new Error("Deploy copy tasks accept at most 1000 deletion keys.");for(let[r,n]of t.entries())w(n,`deleteRelativeKeys[${r}]`);if(e.items.length===0&&t.length===0)throw new Error("Deploy copy tasks require copy or deletion work.")}function ke(e){if(!e||typeof e!="object")throw new Error("Worker event must be a JSON object.");let t=e;if(t.schemaVersion!==S)throw new Error(`Unsupported worker protocol version: ${String(t.schemaVersion)}.`);let r=t.operation;if(r!=="render"&&r!=="asset"&&r!=="rewrite"&&r!=="deploy-copy"&&r!=="health")throw new Error(`Unsupported worker operation: ${String(r)}.`);return j(String(t.jobId??""),"jobId"),j(String(t.taskId??""),"taskId"),r==="render"&&ot(t),r==="asset"&&st(t),r==="rewrite"&&it(t),r==="deploy-copy"&&at(t),e}function ut(e){return e.hostname.replace(/^\[|\]$/g,"").replace(/\.$/,"").toLowerCase()}async function dt(e){return (await lookup(e,{all:true,verbatim:true})).map(t=>t.address)}async function le(e,t,r=dt){let n=V(e,t),o=ut(n);if(isIP(o))return n;let s;try{s=await r(o);}catch{throw new Error(`${t} hostname could not be resolved safely.`)}if(s.length===0)throw new Error(`${t} hostname resolved to no addresses.`);for(let a of s){let i=ae(a);if(i)throw new Error(`${t} hostname resolves to ${i}.`)}return n}async function Ee(e,t=le){let r=null;return await e.route("**/*",async n=>{try{await t(n.request().url(),"render request");}catch(o){r??=o instanceof Error?o:new Error(String(o)),await n.abort("blockedbyclient").catch(()=>{});return}await n.continue();}),await e.routeWebSocket("**/*",async n=>{try{await t(n.url(),"render WebSocket request");}catch(o){r??=o instanceof Error?o:new Error(String(o)),await n.close({code:1008,reason:"Blocked by network policy"});return}await n.close({code:1008,reason:"Only HTTP(S) requests are allowed"}),r??=new Error("render WebSocket request must use HTTP or HTTPS.");}),{getViolation:()=>r}}function mt(e){return e.replace(/&/gi,"&").replace(/"/gi,'"').replace(/'|'/gi,"'").replace(/</gi,"<").replace(/>/gi,">")}function gt(e,t){let r=e.trim();if(!r||r.startsWith("data:")||r.startsWith("blob:")||r.startsWith("javascript:")||r.startsWith("#"))return null;try{let n=new URL(r,t);return n.protocol!=="http:"&&n.protocol!=="https:"||n.username||n.password?null:(n.hash="",n.toString())}catch{return null}}function W(e,t,r){let n=gt(t,r);n&&e.add(n);}function ft(e,t,r){for(let n of t.split(",")){let o=n.trim().split(/\s+/,1)[0];o&&W(e,o,r);}}function ce(e,t,r=""){let n=new Set,o=mt(t).replace(/\\\//g,"/");for(let i of o.matchAll(/\b(?:src|href|poster|data-src|data-href|data-resource-url)\s*=\s*["']([^"']+)["']/gi))W(n,i[1]??"",e);for(let i of o.matchAll(/\b(?:srcset|data-srcset)\s*=\s*["']([^"']+)["']/gi))ft(n,i[1]??"",e);for(let i of o.matchAll(/url\(\s*(?:"([^"]+)"|'([^']+)'|([^)]*?))\s*\)/gi))W(n,i[1]??i[2]??i[3]??"",e);for(let i of o.matchAll(/@import\s+(?:url\()?\s*['"]?([^'"\s;)]+)['"]?\s*\)?/gi))W(n,i[1]??"",e);for(let i of o.matchAll(/<\?xml-stylesheet[^>]+href=["']([^"']+)["'][^>]*\?>/gi))W(n,i[1]??"",e);let s=(()=>{try{return K.extname(new URL(e).pathname).toLowerCase()}catch{return ""}})();if(s===".js"||s===".mjs"||/(?:java|ecma)script/i.test(r))for(let i of o.matchAll(/["']((?:\.\.?\/|\/)?[^"'\s]+\.(?:js|mjs)(?:[?#][^"']*)?)["']/gi))W(n,i[1]??"",e);return [...n].sort()}function xe(e){return e.replace(/"/g,'"').replace(/"/g,'"').replace(/'/g,"'").replace(/'/g,"'").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function C(e){return e.replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(/</g,"<").replace(/>/g,">")}function G(e){return e.replace(/\//g,"\\/")}function Se(e){return e.replace(/\//g,"\\\\/")}function ht(e){try{let t=new URL(e);if(t.protocol!=="http:"&&t.protocol!=="https:")return null;let r=t.pathname==="/"&&!t.search&&!t.hash?"":`${t.pathname}${t.search}${t.hash}`;return `//${t.host}${r}`}catch{return null}}function Pe(e,t,r){if(!t)return;e[t]=r;let n=G(t),o=G(r);e[n]=o;let s=Se(t),a=Se(r);e[s]=a;let i=C(t),l=C(r);e[i]=l;let d=C(n),c=C(o);e[d]=c;let u=C(s),m=C(a);e[u]=m;}function X(e,t,r){Pe(e,t,r);let n=ht(t);n&&n!==t&&Pe(e,n,r);}function Ie(e,t){try{return new URL(e,t==="."?"https://relative.invalid":t).pathname}catch{return e.startsWith("/")?e:`/${e.replace(/^\.\//,"")}`}}function Te(e,t,r){if(!t)return r;let n=K.dirname(K.resolve(t)),o=K.resolve(e,r.replace(/^\/+/,"")),s=K.relative(n,o).replace(/\\/g,"/");return s?(s.startsWith(".")||(s=`./${s}`),s):"."}var wt=["wp-content/","wp-includes/","wp-admin/","wp-json/","_next/"],yt=new Set([".html",".htm"]),ve="WPSuite.io Static Publisher",Rt=ve.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");function bt(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function kt(e){return e.startsWith("//")||e.startsWith("\\/\\/")||e.startsWith("\\\\/\\\\/")}function Et(e,t,r){return kt(t)?e.replace(new RegExp(`(?<!:)${bt(t)}`,"g"),r):e.split(t).join(r)}function St(e,t,r){if(e.wpsuite?.siteSettings?.subscriber===true||e.wpsuite?.subscriptionType==="PROFESSIONAL"||e.wpsuite?.subscriptionType==="AGENCY"||!r)return false;let o=K.extname(r).toLowerCase();return yt.has(o)?/<head\b|<html\b|<!doctype html/i.test(t):false}function Pt(e){if(new RegExp(`<meta\\b(?=[^>]*\\bname=(["'])generator\\1)(?=[^>]*\\bcontent=(["'])${Rt}\\2)[^>]*\\/?>`,"i").test(e))return e;let t=`<meta name="generator" content="${ve}" />`;if(e.match(/(\r?\n)([ \t]*)<\/head>/i))return e.replace(/(\r?\n)([ \t]*)<\/head>/i,`$1$2${t}$1$2</head>`);let n=e.includes(`\r
|
|
1
|
+
import {S3Client,HeadObjectCommand,CopyObjectCommand,DeleteObjectsCommand,PutObjectCommand,GetObjectCommand}from'@aws-sdk/client-s3';import {request,chromium}from'playwright';import {createHash}from'crypto';import {lookup}from'dns/promises';import {isIP}from'net';import K from'path';import'fast-glob';import {statfs,readdir,readFile,rm}from'fs/promises';import'os';import'worker_threads';import {DynamoDBClient,UpdateItemCommand}from'@aws-sdk/client-dynamodb';import Oe from'mime-types';import {writeSync}from'fs';var S=1,Re=/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;function j(e,t){let r=String(e??"").trim();if(!Re.test(r))throw new Error(`${t} must match ${Re.source} and be at most 128 characters.`);return r}function U(e){let t=String(e??"").trim().replace(/^\/+|\/+$/g,"");if(!t)return "";let r=t.split("/").filter(Boolean);if(r.some(n=>n==="."||n===".."))throw new Error("S3 prefix contains an unsafe dot path segment.");return `${r.join("/")}/`}function I(e,...t){let r=U(e),n=t.map((o,s)=>{let i=String(o??"").replace(/^\/+|\/+$/g,"");if(!i||i.split("/").some(a=>a==="."||a===".."))throw new Error(`Unsafe S3 key segment at index ${s}.`);return i});return `${r}${n.join("/")}`}function H(e,t,r){return `${I(e,"jobs",j(t,"jobId"),"tasks",j(r,"taskId"))}/`}function L(e){return createHash("sha256").update(e).digest("hex")}function v(e,t){let r=String(e??"").replace(/^\/+/,""),n=U(t);if(!r||r.includes("\0"))throw new Error("S3 object key is empty or invalid.");if(n&&!r.startsWith(n))throw new Error(`S3 object key is outside the configured workspace prefix: ${r}`);if(r.split("/").some(o=>o===".."))throw new Error("S3 object key contains an unsafe parent segment.");return r}function T(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new Error(`${t} must be a JSON object.`);return e}function w(e,t){if(typeof e!="string"||!e.trim())throw new Error(`${t} must be a non-empty string.`);return e.trim()}function E(e,t,r,n){if(!Number.isInteger(e)||Number(e)<r||Number(e)>n)throw new Error(`${t} must be an integer between ${r} and ${n}.`);return Number(e)}function rt(e){return e.hostname.replace(/^\[|\]$/g,"").replace(/\.$/,"").toLowerCase()}function z(e){let t=e.split(".");if(t.length!==4)return null;let r=t.map(n=>Number(n));return r.every((n,o)=>Number.isInteger(n)&&n>=0&&n<=255&&String(n)===t[o])?r:null}function ie(e){let t=e.toLowerCase();if(t.includes("%")||t.split("::").length>2)return null;let r=t,n=r.lastIndexOf(":");if(r.includes(".")&&n>=0){let c=z(r.slice(n+1));if(!c)return null;r=`${r.slice(0,n)}:${((c[0]??0)*256+(c[1]??0)).toString(16)}:${((c[2]??0)*256+(c[3]??0)).toString(16)}`;}let[o,s]=r.split("::"),i=o?o.split(":"):[],a=s?s.split(":"):[],l=r.includes("::"),u=8-i.length-a.length;return l&&u<1||!l&&u!==0||[...i,...a].some(c=>!/^[0-9a-f]{1,4}$/.test(c))?null:[...i.map(c=>Number.parseInt(c,16)),...Array.from({length:u},()=>0),...a.map(c=>Number.parseInt(c,16))]}function be(e){let t=z(e);if(!t)return "an invalid IPv4 address";let[r=0,n=0,o=0,s=0]=t;return r===0?"the unspecified/current-network IPv4 range":r===10||r===172&&n>=16&&n<=31||r===192&&n===168?"an RFC1918 private IPv4 range":r===127?"the IPv4 loopback range":r===169&&n===254?"the IPv4 link-local/metadata range":r===100&&n===100&&o===100&&s===200?"a cloud instance metadata endpoint":r===100&&n>=64&&n<=127?"the shared carrier-grade NAT IPv4 range":r===198&&(n===18||n===19)?"the IPv4 benchmarking range":r>=224&&r<=239?"the IPv4 multicast range":r>=240?"the reserved IPv4 range":null}function nt(e){let t=ie(e);if(!t||t.length!==8)return "an invalid IPv6 address";if(t.every(o=>o===0))return "the unspecified IPv6 address";if(t.slice(0,7).every(o=>o===0)&&t[7]===1)return "the IPv6 loopback address";let r=t[0]??0;if((r&65024)===64512)return "an IPv6 unique-local range";if((r&65472)===65152)return "the IPv6 link-local range";if((r&65280)===65280)return "the IPv6 multicast range";if(t.slice(0,5).every(o=>o===0)&&t[5]===65535){let o=t[6]??0,s=t[7]??0;return be(`${o>>8}.${o&255}.${s>>8}.${s&255}`)}return null}function ae(e){return z(e)?be(e):ie(e)?nt(e):"an invalid IP address"}function V(e,t){let r=w(e,t),n;try{n=new URL(r);}catch{throw new Error(`${t} must be a valid URL.`)}if(n.protocol!=="http:"&&n.protocol!=="https:")throw new Error(`${t} must use HTTP or HTTPS.`);if(n.username||n.password)throw new Error(`${t} must not contain URL credentials.`);let o=rt(n);if(!o)throw new Error(`${t} must contain a hostname.`);if(o==="localhost"||o.endsWith(".localhost"))throw new Error(`${t} must not target localhost.`);if(o==="metadata.google.internal")throw new Error(`${t} must not target a cloud instance metadata endpoint.`);if(z(o)||ie(o)){let s=ae(o);if(s)throw new Error(`${t} must not target ${s}.`)}return n}function ot(e){let t=V(e.sourceOrigin,"sourceOrigin").origin;if(!Array.isArray(e.urls)||e.urls.length<1||e.urls.length>20)throw new Error("Render tasks require between 1 and 20 URLs.");for(let[s,i]of e.urls.entries())if(V(i,`urls[${s}]`).origin!==t)throw new Error(`urls[${s}] is outside sourceOrigin.`);let r=T(e.options,"options");if(typeof r.ignoreHttpsErrors!="boolean")throw new Error("options.ignoreHttpsErrors must be a boolean.");if(typeof r.javaScriptEnabled!="boolean")throw new Error("options.javaScriptEnabled must be a boolean.");let n=T(r.viewport,"options.viewport");E(n.width,"options.viewport.width",320,7680),E(n.height,"options.viewport.height",240,7680),E(r.navigationTimeoutMs,"options.navigationTimeoutMs",1e3,6e5),E(r.autoScrollTimeoutMs,"options.autoScrollTimeoutMs",0,12e4);let o=T(r.readiness,"options.readiness");for(let s of ["waitForSelector","waitForFunction"])if(o[s]!==null&&typeof o[s]!="string")throw new Error(`options.readiness.${s} must be a string or null.`);E(o.timeoutMs,"options.readiness.timeoutMs",0,12e4),E(o.fallbackWaitMs,"options.readiness.fallbackWaitMs",0,12e4);}function st(e){if(!Array.isArray(e.urls)||e.urls.length<1||e.urls.length>20)throw new Error("Asset tasks require between 1 and 20 URLs.");for(let[r,n]of e.urls.entries())V(n,`urls[${r}]`);let t=T(e.options,"options");if(typeof t.ignoreHttpsErrors!="boolean")throw new Error("options.ignoreHttpsErrors must be a boolean.");E(t.timeoutMs,"options.timeoutMs",1e3,12e4);}function it(e){if(w(e.configKey,"configKey"),w(e.assetMapKey,"assetMapKey"),e.previousAssetMapKey!==void 0&&w(e.previousAssetMapKey,"previousAssetMapKey"),!Array.isArray(e.items)||e.items.length<1||e.items.length>500)throw new Error("Rewrite tasks require between 1 and 500 objects.");for(let[t,r]of e.items.entries()){let n=T(r,`items[${t}]`);w(n.inputKey,`items[${t}].inputKey`),w(n.outputKey,`items[${t}].outputKey`),w(n.relativePath,`items[${t}].relativePath`),n.contentType!==void 0&&n.contentType!==null&&w(n.contentType,`items[${t}].contentType`);}}function at(e){if(j(w(e.targetId,"targetId"),"targetId"),!Array.isArray(e.items)||e.items.length>1e3)throw new Error("Deploy copy tasks accept at most 1000 objects.");for(let[r,n]of e.items.entries()){let o=T(n,`items[${r}]`);w(o.sourceKey,`items[${r}].sourceKey`),w(o.targetRelativeKey,`items[${r}].targetRelativeKey`),w(o.sha256,`items[${r}].sha256`),o.normalizedSha256!==void 0&&w(o.normalizedSha256,`items[${r}].normalizedSha256`),E(o.bytes,`items[${r}].bytes`,0,Number.MAX_SAFE_INTEGER),w(o.contentType,`items[${r}].contentType`),w(o.cacheControl,`items[${r}].cacheControl`);}let t=e.deleteRelativeKeys??[];if(!Array.isArray(t)||t.length>1e3)throw new Error("Deploy copy tasks accept at most 1000 deletion keys.");for(let[r,n]of t.entries())w(n,`deleteRelativeKeys[${r}]`);if(e.items.length===0&&t.length===0)throw new Error("Deploy copy tasks require copy or deletion work.")}function ke(e){if(!e||typeof e!="object")throw new Error("Worker event must be a JSON object.");let t=e;if(t.schemaVersion!==S)throw new Error(`Unsupported worker protocol version: ${String(t.schemaVersion)}.`);let r=t.operation;if(r!=="render"&&r!=="asset"&&r!=="rewrite"&&r!=="deploy-copy"&&r!=="health")throw new Error(`Unsupported worker operation: ${String(r)}.`);return j(String(t.jobId??""),"jobId"),j(String(t.taskId??""),"taskId"),r==="render"&&ot(t),r==="asset"&&st(t),r==="rewrite"&&it(t),r==="deploy-copy"&&at(t),e}function ut(e){return e.hostname.replace(/^\[|\]$/g,"").replace(/\.$/,"").toLowerCase()}async function dt(e){return (await lookup(e,{all:true,verbatim:true})).map(t=>t.address)}async function le(e,t,r=dt){let n=V(e,t),o=ut(n);if(isIP(o))return n;let s;try{s=await r(o);}catch{throw new Error(`${t} hostname could not be resolved safely.`)}if(s.length===0)throw new Error(`${t} hostname resolved to no addresses.`);for(let i of s){let a=ae(i);if(a)throw new Error(`${t} hostname resolves to ${a}.`)}return n}async function Ee(e,t=le){let r=null;return await e.route("**/*",async n=>{try{await t(n.request().url(),"render request");}catch(o){r??=o instanceof Error?o:new Error(String(o)),await n.abort("blockedbyclient").catch(()=>{});return}await n.continue();}),await e.routeWebSocket("**/*",async n=>{try{await t(n.url(),"render WebSocket request");}catch(o){r??=o instanceof Error?o:new Error(String(o)),await n.close({code:1008,reason:"Blocked by network policy"});return}await n.close({code:1008,reason:"Only HTTP(S) requests are allowed"}),r??=new Error("render WebSocket request must use HTTP or HTTPS.");}),{getViolation:()=>r}}function mt(e){return e.replace(/&/gi,"&").replace(/"/gi,'"').replace(/'|'/gi,"'").replace(/</gi,"<").replace(/>/gi,">")}function gt(e,t){let r=e.trim();if(!r||r.startsWith("data:")||r.startsWith("blob:")||r.startsWith("javascript:")||r.startsWith("#"))return null;try{let n=new URL(r,t);return n.protocol!=="http:"&&n.protocol!=="https:"||n.username||n.password?null:(n.hash="",n.toString())}catch{return null}}function W(e,t,r){let n=gt(t,r);n&&e.add(n);}function ft(e,t,r){for(let n of t.split(",")){let o=n.trim().split(/\s+/,1)[0];o&&W(e,o,r);}}function ce(e,t,r=""){let n=new Set,o=mt(t).replace(/\\\//g,"/");for(let a of o.matchAll(/\b(?:src|href|poster|data-src|data-href|data-resource-url)\s*=\s*["']([^"']+)["']/gi))W(n,a[1]??"",e);for(let a of o.matchAll(/\b(?:srcset|data-srcset)\s*=\s*["']([^"']+)["']/gi))ft(n,a[1]??"",e);for(let a of o.matchAll(/url\(\s*(?:"([^"]+)"|'([^']+)'|([^)]*?))\s*\)/gi))W(n,a[1]??a[2]??a[3]??"",e);for(let a of o.matchAll(/@import\s+(?:url\()?\s*['"]?([^'"\s;)]+)['"]?\s*\)?/gi))W(n,a[1]??"",e);for(let a of o.matchAll(/<\?xml-stylesheet[^>]+href=["']([^"']+)["'][^>]*\?>/gi))W(n,a[1]??"",e);let s=(()=>{try{return K.extname(new URL(e).pathname).toLowerCase()}catch{return ""}})();if(s===".js"||s===".mjs"||/(?:java|ecma)script/i.test(r))for(let a of o.matchAll(/["']((?:\.\.?\/|\/)?[^"'\s]+\.(?:js|mjs)(?:[?#][^"']*)?)["']/gi))W(n,a[1]??"",e);return [...n].sort()}function xe(e){return e.replace(/"/g,'"').replace(/"/g,'"').replace(/'/g,"'").replace(/'/g,"'").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function C(e){return e.replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(/</g,"<").replace(/>/g,">")}function G(e){return e.replace(/\//g,"\\/")}function Se(e){return e.replace(/\//g,"\\\\/")}function ht(e){try{let t=new URL(e);if(t.protocol!=="http:"&&t.protocol!=="https:")return null;let r=t.pathname==="/"&&!t.search&&!t.hash?"":`${t.pathname}${t.search}${t.hash}`;return `//${t.host}${r}`}catch{return null}}function Pe(e,t,r){if(!t)return;e[t]=r;let n=G(t),o=G(r);e[n]=o;let s=Se(t),i=Se(r);e[s]=i;let a=C(t),l=C(r);e[a]=l;let u=C(n),c=C(o);e[u]=c;let d=C(s),m=C(i);e[d]=m;}function X(e,t,r){Pe(e,t,r);let n=ht(t);n&&n!==t&&Pe(e,n,r);}function Ie(e,t){try{return new URL(e,t==="."?"https://relative.invalid":t).pathname}catch{return e.startsWith("/")?e:`/${e.replace(/^\.\//,"")}`}}function Te(e,t,r){if(!t)return r;let n=K.dirname(K.resolve(t)),o=K.resolve(e,r.replace(/^\/+/,"")),s=K.relative(n,o).replace(/\\/g,"/");return s?(s.startsWith(".")||(s=`./${s}`),s):"."}var wt=["wp-content/","wp-includes/","wp-admin/","wp-json/","_next/"],yt=new Set([".html",".htm"]),ve="WPSuite.io Static Publisher",Rt=ve.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");function bt(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function kt(e){return e.startsWith("//")||e.startsWith("\\/\\/")||e.startsWith("\\\\/\\\\/")}function Et(e,t,r){return kt(t)?e.replace(new RegExp(`(?<!:)${bt(t)}`,"g"),r):e.split(t).join(r)}function St(e,t,r){if(e.wpsuite?.siteSettings?.subscriber===true||e.wpsuite?.subscriptionType==="PROFESSIONAL"||e.wpsuite?.subscriptionType==="AGENCY"||!r)return false;let o=K.extname(r).toLowerCase();return yt.has(o)?/<head\b|<html\b|<!doctype html/i.test(t):false}function Pt(e){if(new RegExp(`<meta\\b(?=[^>]*\\bname=(["'])generator\\1)(?=[^>]*\\bcontent=(["'])${Rt}\\2)[^>]*\\/?>`,"i").test(e))return e;let t=`<meta name="generator" content="${ve}" />`;if(e.match(/(\r?\n)([ \t]*)<\/head>/i))return e.replace(/(\r?\n)([ \t]*)<\/head>/i,`$1$2${t}$1$2</head>`);let n=e.includes(`\r
|
|
2
2
|
`)?`\r
|
|
3
3
|
`:`
|
|
4
|
-
`;return e.replace(/<head\b[^>]*>/i,o=>`${o}${n} ${t}`)}function xt(e){let t=xe(e).trim();return t.startsWith("{")||t.startsWith("[")||t.includes("\\/")||/"@context"|"@type"/.test(t)}function It(e,t){let r=[...new Set(t)].filter(s=>s.includes("/")&&!/\\+\//.test(s)).map(s=>[s,G(s)]).filter(([s,
|
|
5
|
-
`);}catch{}}function qe(){
|
|
6
|
-
`,"application/json; charset=utf-8")}async function nr(e){try{let t=await re(e);return t.response??t}catch(t){if(t.name==="NoSuchKey"||t.$metadata?.httpStatusCode===404)return null;throw t}}function te(e){return [...new Set(e)].filter(t=>{try{let r=new URL(t);return (r.protocol==="http:"||r.protocol==="https:")&&!r.username&&!r.password}catch{return false}}).sort()}async function or(e,t,r,n){let o
|
|
7
|
-
`,1)[0]}:{}},i.outcome==="failed"?"warn":"info"),!l||s===2)return i;await g("render.page-retry-with-fresh-browser",a,{nextAttempt:s+1},"warn"),await Xe(a);}if(o)return o;throw new Error(`Remote render did not produce a result for ${r}.`)}function ar(e,t){let r=t.toLowerCase();if(r.startsWith("text/")||r.includes("javascript")||r.includes("json")||r.includes("xml")||r.includes("svg"))return true;try{return /\.(?:css|js|mjs|json|xml|xsl|svg|txt|map|html?)$/i.test(new URL(e).pathname)}catch{return false}}async function lr(e,t,r){let n=t;for(let o=0;o<=5;o+=1){await le(n,"asset request");let s=await e.get(n,{timeout:r,failOnStatusCode:false,maxRedirects:0}),a=s.status();if(a<300||a>=400)return s;let i=s.headers().location;if(!i)return s;if(o===5)throw await s.dispose(),new Error("Asset request exceeded five redirects.");n=new URL(i,n).toString(),await s.dispose();}throw new Error("Asset redirect handling failed.")}async function cr(e,t,r){if(!Array.isArray(e.urls)||e.urls.length<1||e.urls.length>20)throw new Error("Asset tasks require between 1 and 20 URLs.");let n=await request.newContext({ignoreHTTPSErrors:e.options.ignoreHttpsErrors,userAgent:"WPSuiteStaticPublisher/remote-asset-worker-v1",..._?{proxy:{server:_}}:{}}),o=[],s=async i=>{o.push(i);let l=o.filter(d=>d.outcome==="failed"||d.outcome==="deferred").length;await r.updated(o.length-l,l);};try{for(let i=0;i<e.urls.length;i+=1){let l=e.urls[i],d=t.getRemainingTimeInMillis?.();if(d!==void 0&&d<3e4){await s({requestedUrl:l,finalUrl:null,outcome:"deferred",httpStatus:null,contentType:null,cacheControl:null,lastModified:null,object:null,discoveredAssets:[],error:"Worker stopped accepting assets because less than 30 seconds remained."});continue}let c=null;try{c=await lr(n,l,e.options.timeoutMs);let u=c.status(),m=c.headers(),p=c.url()||l;if(u<200||u>=300){await s({requestedUrl:l,finalUrl:p,outcome:"http-error",httpStatus:u,contentType:m["content-type"]??null,cacheControl:m["cache-control"]??null,lastModified:m["last-modified"]??null,object:null,discoveredAssets:[],error:`Asset returned HTTP ${u}.`});continue}let y=await c.body(),R=Y(m["content-type"],p,"application/octet-stream"),M=await ne(I(H(k,e.jobId,e.taskId),"assets",`${String(i).padStart(4,"0")}-${L(l).slice(0,24)}.bin`),y,R);await s({requestedUrl:l,finalUrl:p,outcome:"fetched",httpStatus:u,contentType:R,cacheControl:m["cache-control"]??null,lastModified:m["last-modified"]??null,object:M,discoveredAssets:ar(p,R)?ce(p,new TextDecoder("utf8").decode(y),R):[]});}catch(u){await s({requestedUrl:l,finalUrl:c?.url()??null,outcome:"failed",httpStatus:c?.status()??null,contentType:c?.headers()["content-type"]??null,cacheControl:c?.headers()["cache-control"]??null,lastModified:c?.headers()["last-modified"]??null,object:null,discoveredAssets:[],error:u instanceof Error?u.message:String(u)});}finally{await c?.dispose().catch(()=>{});}}}finally{await n.dispose();}let a=o.filter(i=>i.outcome==="failed"||i.outcome==="deferred").length;return {response:{schemaVersion:S,operation:"asset",jobId:e.jobId,taskId:e.taskId,status:a>0?"partial":"succeeded",completedItems:o.length-a,failedItems:a,exporterVersion:O},detail:{assets:o}}}async function ur(e,t,r){if(!Array.isArray(e.urls)||e.urls.length<1||e.urls.length>20)throw new Error("Render tasks require between 1 and 20 URLs.");let n=new URL(e.sourceOrigin).origin,o=[];for(let a=0;a<e.urls.length;a+=1){let i=e.urls[a];if(!i)continue;let l=t.getRemainingTimeInMillis?.();if(l!==void 0&&l<6e4){o.push({requestedUrl:i,finalUrl:null,outcome:"deferred",httpStatus:null,contentType:null,html:null,discoveredPages:[],discoveredAssets:[],networkUrls:[],cookies:[],error:"Worker stopped accepting URLs because less than 60 seconds remained."}),await r.updated(o.filter(u=>u.outcome!=="failed"&&u.outcome!=="deferred").length,o.filter(u=>u.outcome==="failed"||u.outcome==="deferred").length);continue}let d=new URL(i);if(d.origin!==n)throw new Error(`Primary render URL is outside sourceOrigin: ${i}`);o.push(await ir(e,t,d.toString(),a));let c=o.filter(u=>u.outcome==="failed"||u.outcome==="deferred").length;await r.updated(o.length-c,c);}let s=o.filter(a=>a.outcome==="failed"||a.outcome==="deferred").length;return {response:{schemaVersion:S,operation:"render",jobId:e.jobId,taskId:e.taskId,status:s>0?"partial":"succeeded",completedItems:o.length-s,failedItems:s,exporterVersion:O},detail:{pages:o}}}async function dr(e,t){if(!Array.isArray(e.items)||e.items.length<1||e.items.length>500)throw new Error("Rewrite tasks require between 1 and 500 objects.");let n={...await re(e.configKey),outputDir:"/workspace"},o=await re(e.assetMapKey),s=e.previousAssetMapKey?await re(e.previousAssetMapKey):{},a=[];for(let i of e.items){let l=v(i.inputKey,k),d=v(i.outputKey,k),c=await Ze(l),u=c.body,m=`/workspace/${i.relativePath.replace(/^\/+/,"")}`,p=We(u,n,o,m,s),y=Y(i.contentType||c.contentType,i.relativePath,"text/plain; charset=utf-8"),R=await ne(d,p,y);a.push({inputKey:l,outputKey:d,changed:p!==u,output:R}),await t.updated(a.length,0);}return {response:{schemaVersion:S,operation:"rewrite",jobId:e.jobId,taskId:e.taskId,status:"succeeded",completedItems:a.length,failedItems:0,exporterVersion:O},detail:{objects:a}}}function pr(e,t){return `${e}/${t.split("/").map(r=>encodeURIComponent(r)).join("/")}`}async function mr(e,t){if(!Array.isArray(e.items)||e.items.length>1e3)throw new Error("Deploy copy tasks accept at most 1000 objects.");let r=Gt.find(c=>c.id===e.targetId);if(!r)throw new Error(`Unknown deployment target: ${e.targetId}`);let n=He.get(r.region);n||(n=new S3Client({region:r.region}),He.set(r.region,n));let o=[];for(let c of e.items){let u=v(c.sourceKey,k),m=I(r.prefix,c.targetRelativeKey);try{let p=await n.send(new HeadObjectCommand({Bucket:r.bucketName,Key:m})).catch(h=>{if((h&&typeof h=="object"&&"$metadata"in h?Number(h.$metadata?.httpStatusCode):0)===404||h?.name==="NotFound")return null;throw h}),y=String(p?.CacheControl??"").replace(/\s+/g,"")===c.cacheControl.replace(/\s+/g,""),R=me(p?.ContentType)===me(c.contentType),M=p?.Metadata?.["wpsuite-sha256"]===c.sha256,D=!!c.normalizedSha256&&p?.Metadata?.["wpsuite-normalized-sha256"]===c.normalizedSha256;if(y&&R&&(M||D)){o.push({sourceKey:u,targetKey:m,status:"skipped"}),await t.updated(o.filter(h=>h.status!=="failed").length,o.filter(h=>h.status==="failed").length);continue}let q=await n.send(new CopyObjectCommand({Bucket:r.bucketName,Key:m,CopySource:pr($,u),MetadataDirective:"REPLACE",ContentType:c.contentType,CacheControl:c.cacheControl,Metadata:{"wpsuite-sha256":c.sha256,...c.normalizedSha256?{"wpsuite-normalized-sha256":c.normalizedSha256}:{}}}));o.push({sourceKey:u,targetKey:m,status:"copied",...q.CopyObjectResult?.ETag?{etag:q.CopyObjectResult.ETag}:{}}),await t.updated(o.filter(h=>h.status!=="failed").length,o.filter(h=>h.status==="failed").length);}catch(p){o.push({sourceKey:u,targetKey:m,status:"failed",error:p instanceof Error?p.message:String(p)}),await t.updated(o.filter(y=>y.status!=="failed").length,o.filter(y=>y.status==="failed").length);}}let a=(e.deleteRelativeKeys??[]).map(c=>I(r.prefix,c)),i=[],l=[];if(a.length>0){let c=await n.send(new DeleteObjectsCommand({Bucket:r.bucketName,Delete:{Objects:a.map(u=>({Key:u})),Quiet:false}}));i.push(...(c.Deleted??[]).flatMap(u=>u.Key?[u.Key]:[])),l.push(...(c.Errors??[]).map(u=>({key:u.Key??"",error:u.Message??u.Code??"S3 deletion failed"}))),await t.updated(o.filter(u=>u.status!=="failed").length+i.length,o.filter(u=>u.status==="failed").length+l.length);}let d=o.filter(c=>c.status==="failed").length+l.length;return {response:{schemaVersion:S,operation:"deploy-copy",jobId:e.jobId,taskId:e.taskId,status:d>0?"partial":"succeeded",completedItems:o.filter(c=>c.status!=="failed").length+i.length,failedItems:d,exporterVersion:O},detail:{objects:o,deletedKeys:i,deleteErrors:l,targetId:r.id}}}async function ze(e,t,r){if(e.operation==="health")return {response:{schemaVersion:S,operation:"health",jobId:e.jobId,taskId:e.taskId,status:"succeeded",completedItems:1,failedItems:0,exporterVersion:O},detail:{allowedOperation:ee,workspaceBucket:$,workspacePrefix:k,proxyConfigured:!!_}};if(ee&&ee!==e.operation)throw new Error(`Function is configured for ${ee}, not ${e.operation}.`);if(!r)throw new Error("Remote worker progress reporter is required.");return e.operation==="render"?await ur(e,t,r):e.operation==="asset"?await cr(e,t,r):e.operation==="rewrite"?await dr(e,r):await mr(e,r)}async function cn(e,t={}){let r=ke(e),n={requestId:t.awsRequestId,jobId:r.jobId,taskId:r.taskId,operation:r.operation,remainingTimeMs:t.getRemainingTimeInMillis?.()};Q(n),await g("invocation.started",n,{exporterVersion:O});try{if(r.operation==="health"){let i=(await ze(r,t)).response;return await g("invocation.completed",{...n,remainingTimeMs:t.getRemainingTimeInMillis?.()},{status:i.status}),i}fe();let o=I(H(k,r.jobId,r.taskId),"result.json"),s=await nr(o),a=new Z(r,t.awsRequestId);if(s)return await a.completed(s),await g("invocation.completed-from-existing-result",{...n,remainingTimeMs:t.getRemainingTimeInMillis?.()},{status:s.status}),s;await a.started();try{let i=await ze(r,t,a),l={...i.response,resultKey:o};return await rr(o,{schemaVersion:S,response:l,detail:i.detail,completedAt:new Date().toISOString(),requestId:t.awsRequestId??null}),await a.completed(l),await g("invocation.completed",{...n,remainingTimeMs:t.getRemainingTimeInMillis?.()},{status:l.status,completedItems:l.completedItems,failedItems:l.failedItems}),l}catch(i){throw await a.failed(),i}}catch(o){throw await g("invocation.failed",{...n,remainingTimeMs:t.getRemainingTimeInMillis?.()},{errorName:o instanceof Error?o.name:"UnknownError",error:o instanceof Error?o.message:String(o)},"error"),o}finally{await g("invocation.cleanup-started",{...n,remainingTimeMs:t.getRemainingTimeInMillis?.()}),r.operation==="render"&&await Xe({...n,remainingTimeMs:t.getRemainingTimeInMillis?.()}),await g("invocation.cleanup-finished",{...n,remainingTimeMs:t.getRemainingTimeInMillis?.()}),Fe();}}export{cn as handler};
|
|
4
|
+
`;return e.replace(/<head\b[^>]*>/i,o=>`${o}${n} ${t}`)}function xt(e){let t=xe(e).trim();return t.startsWith("{")||t.startsWith("[")||t.includes("\\/")||/"@context"|"@type"/.test(t)}function It(e,t){let r=[...new Set(t)].filter(s=>s.includes("/")&&!/\\+\//.test(s)).map(s=>[s,G(s)]).filter(([s,i])=>s!==i).sort((s,i)=>i[0].length-s[0].length);if(!r.length)return e;let n=s=>{let i=s;for(let[a,l]of r)i=i.split(a).join(l);return i},o=e.replace(/(<script\b[^>]*\btype=["']application\/(?:ld\+)?json["'][^>]*>)([\s\S]*?)(<\/script>)/gi,(s,i,a,l)=>`${i}${n(a)}${l}`);return o=o.replace(/(<meta\b[^>]*\bcontent=(['"]))([\s\S]*?)(\2[^>]*>)/gi,(s,i,a,l,u)=>xt(l)?`${i}${n(l)}${u}`:s),o}function Tt(e,t){if(!t)return null;let r=K.dirname(K.resolve(t)),n=K.resolve(e.outputDir),o=K.relative(r,n).replace(/\\/g,"/");return o?(o.startsWith(".")||(o=`./${o}`),o.endsWith("/")?o:`${o}/`):"./"}function vt(e,t,r){let n=Tt(t,r);if(!n)return e;let o=e;for(let s of wt){let i=s.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),a=new RegExp(`(?:\\.{1,}/)+${i}`,"g"),l=new RegExp(`(?<!\\.)/${i}`,"g");o=o.replace(a,`${n}${s}`).replace(l,`${n}${s}`);let u=s.replace(/\//g,"\\/"),c=n.replace(/\//g,"\\/"),d=u.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),m=new RegExp(`(?:\\.{1,}\\\\/)+${d}`,"g"),p=new RegExp(`(?:\\.{1,}(?:\\\\/|\\\\))+${d}`,"g"),y=new RegExp(`(?<![\\.\\\\])\\/${d}`,"g");o=o.replace(m,`${c}${u}`).replace(p,`${c}${u}`).replace(y,`${c}${u}`);}return o}function de(e,t,r){if(e.urlRewriteMode==="absolute")return t;let n=(()=>{try{return new URL(t,e.targetOrigin==="."?"https://relative.invalid":e.targetOrigin)}catch{return null}})(),o=n?n.pathname:Ie(t,e.targetOrigin),s=n?`${n.search}${n.hash}`:"";return e.urlRewriteMode==="root-relative"?`${o}${s}`:`${Te(e.outputDir,r,o)}${s}`}function ue(e,t,r,n,o){X(e,r,de(t,n,o));}function Wt(e,t,r,n,o){if(!r||r===n)return;X(e,r,n);let s=de(t,r,o),i=de(t,n,o);X(e,s,i);}function We(e,t,r,n,o={}){let s=e,i={};ue(i,t,t.sourceOrigin,t.targetOrigin,n);for(let[l,u]of Object.entries(t.extraReplacements))ue(i,t,l,u,n);for(let[l,u]of Object.entries(r))ue(i,t,l,u,n);for(let[l,u]of Object.entries(o)){let c=r[l];!c||c===u||Wt(i,t,u,c,n);}let a=Object.entries(i).sort((l,u)=>u[0].length-l[0].length);for(let[l,u]of a)s=Et(s,l,u);return t.urlRewriteMode!=="absolute"&&(s=vt(s,t,n)),s=It(s,a.map(([,l])=>l)),St(t,s,n)&&(s=Pt(s)),s}var pe=String(process.env.PUBLISHER_PROGRESS_TABLE??"").trim(),Ce=Number(process.env.PUBLISHER_PROGRESS_RETENTION_SECONDS??604800),Ot=Number.isFinite(Ce)?Math.max(86400,Ce):604800,$e=pe?new DynamoDBClient({}):null;function Mt(e){return e.operation==="render"||e.operation==="asset"?e.urls.length:e.operation==="rewrite"?e.items.length:e.items.length+(e.deleteRelativeKeys?.length??0)}async function At(e){if(!(!$e||!pe))try{let t=Math.floor(Date.now()/1e3)+Ot;await $e.send(new UpdateItemCommand({TableName:pe,Key:{jobId:{S:e.jobId},taskId:{S:e.taskId}},UpdateExpression:"SET #operation = :operation, #status = :status, completedItems = :completedItems, failedItems = :failedItems, totalItems = :totalItems, #sequence = :sequence, updatedAt = :updatedAt, expiresAt = :expiresAt"+(e.requestId?", requestId = :requestId":""),ConditionExpression:"attribute_not_exists(#sequence) OR #sequence < :sequence",ExpressionAttributeNames:{"#operation":"operation","#status":"status","#sequence":"sequence"},ExpressionAttributeValues:{":operation":{S:e.operation},":status":{S:e.status},":completedItems":{N:String(e.completedItems)},":failedItems":{N:String(e.failedItems)},":totalItems":{N:String(e.totalItems)},":sequence":{N:String(e.sequence)},":updatedAt":{S:e.updatedAt},":expiresAt":{N:String(t)},...e.requestId?{":requestId":{S:e.requestId}}:{}}}));}catch(t){if(t.name==="ConditionalCheckFailedException")return;console.warn(JSON.stringify({message:"Remote worker progress status could not be written.",jobId:e.jobId,taskId:e.taskId,error:t instanceof Error?t.message:String(t)}));}}var Z=class{#t;#o;#e;#s;#i;#a=-1;#l=0;#n=0;#c=0;constructor(t,r,n=At){this.#t=t,this.#o=r??null,this.#e=Mt(t),this.#s=Math.max(1,Math.ceil(this.#e/20)),this.#i=n;}async started(){await this.#r("running",0,0,0);}async updated(t,r){this.#n=t,this.#c=r;let n=t+r,o=Date.now();n<this.#e&&n-this.#a<this.#s&&o-this.#l<5e3||await this.#r("running",t,r,n+1);}async completed(t){await this.#r(t.status,t.completedItems,t.failedItems,this.#e+2);}async failed(){let t=Math.min(this.#e-this.#n,Math.max(1,this.#c));await this.#r("failed",this.#n,t,this.#e+3);}async#r(t,r,n,o){this.#a=r+n,this.#l=Date.now(),await this.#i({jobId:this.#t.jobId,taskId:this.#t.taskId,operation:this.#t.operation,status:t,completedItems:r,failedItems:n,totalItems:this.#e,sequence:o,updatedAt:new Date().toISOString(),requestId:this.#o});}};var jt=/^[!#$%&'*+.^_`|~0-9A-Za-z-]+\/[!#$%&'*+.^_`|~0-9A-Za-z-]+(?:\s*;.*)?$/u;function Vt(e){try{return new URL(e).pathname}catch{return e}}function Y(e,t,r){let n=String(e??"").trim();if(jt.test(n))return n;let o=Oe.lookup(Vt(t));return o?Oe.contentType(o)||o:r}function me(e){return String(e??"").split(";").map(t=>t.trim().toLowerCase()).filter(Boolean).join(";")}var Ve="playwright_chromiumdev_profile-";function P(e){return Math.round(e/1024/1024*100)/100}async function Me(e){try{let t=await statfs(e),r=t.blocks*t.bsize,n=t.bavail*t.bsize;return {path:e,totalMiB:P(r),availableMiB:P(n),usedMiB:P(r-n)}}catch(t){return {path:e,totalMiB:null,availableMiB:null,usedMiB:null,error:t instanceof Error?t.message:String(t)}}}async function Ue(e){try{return (await readdir(e,{withFileTypes:!0})).filter(t=>t.isDirectory()&&t.name.startsWith(Ve)).map(t=>t.name).sort()}catch(t){if(t.code==="ENOENT")return [];throw t}}async function Le(e=process.env.TMPDIR?.trim()||"/tmp"){let t=process.memoryUsage(),[r,n,o]=await Promise.all([Me(e),Me("/dev/shm"),Ue(e)]);return {processMemoryMiB:{rss:P(t.rss),heapUsed:P(t.heapUsed),heapTotal:P(t.heapTotal),external:P(t.external),arrayBuffers:P(t.arrayBuffers)},tempStorage:r,sharedMemory:n,playwrightProfiles:{count:o.length,names:o.slice(0,20)}}}async function Ke(e=process.env.TMPDIR?.trim()||"/tmp"){let t=await Ue(e);for(let r of t)await rm(K.join(e,r),{recursive:true,force:true});return t}async function _e(e="/proc",t=r=>process.kill(r,"SIGKILL")){let r;try{r=await readdir(e,{withFileTypes:!0});}catch(o){if(o.code==="ENOENT")return [];throw o}let n=[];for(let o of r){if(!o.isDirectory()||!/^\d+$/.test(o.name))continue;let s=Number(o.name);if(!Number.isSafeInteger(s)||s<1||s===process.pid)continue;let i;try{i=await readFile(K.join(e,o.name,"cmdline"),"utf8");}catch(a){if(["ENOENT","EACCES","EPERM"].includes(String(a.code)))continue;throw a}if(!(!i.includes("chrome-headless-shell")||!i.includes("--user-data-dir=")||!i.includes(Ve)||!i.includes("--remote-debugging-pipe")))try{t(s),n.push(s);}catch(a){if(["ESRCH","EPERM"].includes(String(a.code)))continue;throw a}}return n.sort((o,s)=>o-s)}var _={},Ne=false;function Nt(e){if(e)try{let t=new URL(e);return t.username="",t.password="",t.search="",t.hash="",t.toString()}catch{return}}function Be(e){return {...e,...e.url?{url:Nt(e.url)}:{}}}function De(e){return e instanceof Error?{errorName:e.name,errorMessage:e.message,...e.stack?{errorStack:e.stack}:{}}:{error:String(e)}}function ge(e,t={}){try{writeSync(2,`${JSON.stringify({level:"ERROR",message:"Remote worker runtime diagnostic.",event:e,..._,...t,timestamp:new Date().toISOString()})}
|
|
5
|
+
`);}catch{}}function qe(){Ne||(Ne=true,process.on("uncaughtExceptionMonitor",(e,t)=>{ge("runtime.uncaught-exception",{origin:t,...De(e)});}),process.on("exit",e=>{ge("runtime.process-exit",{exitCode:e});}));}async function g(e,t,r={},n="info"){try{_=Be(t);let o=null;try{o=await Le();}catch(i){r={...r,resourceSnapshotError:i instanceof Error?i.message:String(i)};}let s=JSON.stringify({message:"Remote worker checkpoint.",event:e,..._,...r,...o?{resources:o}:{}});console[n](s);}catch(o){ge("checkpoint.write-failed",{checkpointEvent:e,...De(o)});}}function Q(e){_=Be(e);}function Fe(){_={};}var $=String(process.env.PUBLISHER_WORKSPACE_BUCKET??"").trim(),k=U(process.env.PUBLISHER_WORKSPACE_PREFIX??""),ee=String(process.env.PUBLISHER_ALLOWED_OPERATION??"").trim(),O=String(process.env.PUBLISHER_EXPORTER_VERSION??"unknown").trim(),N=String(process.env.PUBLISHER_PROXY_URL??"").trim(),Gt=Xt(process.env.PUBLISHER_ALLOWED_TARGETS??"[]"),Ge=new S3Client({}),He=new Map,b=null,B=false;qe();function Xt(e){try{let t=JSON.parse(e);return Array.isArray(t)?t.filter(r=>{if(!r||typeof r!="object")return !1;let n=r;return ["id","bucketName","prefix","region"].every(o=>typeof n[o]=="string")}).map(r=>({...r,prefix:U(r.prefix)})):[]}catch{return []}}function fe(){if(!$)throw new Error("PUBLISHER_WORKSPACE_BUCKET is required.")}async function he(e,t){try{let r=await _e();r.length>0&&await g(`browser.stale-processes-killed.${t}`,e,{killedProcesses:r.length,killedProcessIds:r},"warn");let n=await Ke();n.length>0&&await g(`browser.profiles-removed.${t}`,e,{removedProfiles:n.length,removedProfileNames:n.slice(0,20)});}catch(r){if(await g(`browser.profile-cleanup-failed.${t}`,e,{error:r instanceof Error?r.message:String(r)},"error"),t==="before-launch")throw r}}async function Zt(e){if(b){let r=await b.catch(()=>null);if(r?.isConnected())return r}await g("browser.launch-preparing",e),await he(e,"before-launch"),await g("browser.launch-started",e);let t=chromium.launch({headless:true,args:["--no-sandbox","--disable-setuid-sandbox","--disable-dev-shm-usage","--no-zygote","--single-process","--disable-gpu"],...N?{proxy:{server:N}}:{}});b=t;try{let r=await t;return r.once("disconnected",()=>{b===t&&(b=null);let n=B;Q(e),g("browser.disconnected",e,{expected:n},n?"info":"error");}),await g("browser.launch-succeeded",e),r}catch(r){throw b===t&&(b=null),await g("browser.launch-failed",e,{error:r instanceof Error?r.message:String(r)},"error"),r}}async function Xe(e){let t=b;if(b=null,t){let r=await t.catch(()=>null);r&&(B=true,await r.close().catch(async n=>{await g("browser.close-failed",e,{error:n instanceof Error?n.message:String(n)},"warn");}),B=false);}await he(e,"after-close");}async function Yt(e,t){let r;for(let n=1;n<=2;n+=1){let o=await Zt({...t,attempt:n}),s=null;try{s=await o.newContext({viewport:e.options.viewport,ignoreHTTPSErrors:e.options.ignoreHttpsErrors,javaScriptEnabled:e.options.javaScriptEnabled,serviceWorkers:"block",userAgent:"WPSuiteStaticPublisher/remote-worker-v1"}),e.options.javaScriptEnabled&&await Qt(s);let i=await Ee(s);return {context:s,page:await s.newPage(),networkPolicyViolation:i.getViolation}}catch(i){r=i,await s?.close().catch(()=>{}),b=null,B=true,await o.close().catch(()=>{}),B=false,await he({...t,attempt:n},"after-close");}}throw r instanceof Error?r:new Error(`Unable to create a Chromium page: ${String(r)}`)}async function Qt(e){await e.addInitScript(()=>{Object.defineProperty(window,"__WPSUITE_STATIC_EXPORT__",{value:true,writable:false,configurable:true});let t=r=>{if(r==null||String(r)==="")return true;try{let n=new URL(String(r),window.location.href),o=new URL(window.location.href);return n.hash="",o.hash="",n.href===o.href}catch{return false}};try{let r=window.location.assign.bind(window.location),n=window.location.replace.bind(window.location);Object.defineProperty(window.location,"assign",{configurable:!0,value:o=>{if(!t(o))return r(o)}}),Object.defineProperty(window.location,"replace",{configurable:!0,value:o=>{if(!t(o))return n(o)}}),Object.defineProperty(window.location,"reload",{configurable:!0,value:()=>{}});}catch{}});}async function er(e,t){await e.evaluate(async r=>{await new Promise(n=>{let o=0,s=700,i=Date.now(),a=()=>{window.clearInterval(l),window.scrollTo(0,0),n();},l=window.setInterval(()=>{if(Date.now()-i>=r){a();return}window.scrollBy(0,s),o+=s;let u=Math.max(document.body?.scrollHeight||0,document.documentElement?.scrollHeight||0);o>=u+window.innerHeight&&a();},120);});},t);}async function Ze(e){fe();let t=v(e,k),r=await Ge.send(new GetObjectCommand({Bucket:$,Key:t}));if(!r.Body)throw new Error(`S3 object has no body: ${t}`);return {body:await r.Body.transformToString("utf8"),contentType:r.ContentType?.trim()||null}}async function tr(e){return (await Ze(e)).body}async function re(e){return JSON.parse(await tr(e))}async function ne(e,t,r){fe();let n=v(e,k),o=typeof t=="string"?Buffer.from(t,"utf8"):t,s=await Ge.send(new PutObjectCommand({Bucket:$,Key:n,Body:o,ContentType:r,Metadata:{sha256:L(o)}}));return {bucket:$,key:n,sha256:L(o),bytes:o.byteLength,contentType:r,...s.ETag?{etag:s.ETag}:{},...s.VersionId?{versionId:s.VersionId}:{}}}async function rr(e,t){return await ne(e,`${JSON.stringify(t,null,2)}
|
|
6
|
+
`,"application/json; charset=utf-8")}async function nr(e){try{let t=await re(e);return t.response??t}catch(t){if(t.name==="NoSuchKey"||t.$metadata?.httpStatusCode===404)return null;throw t}}function te(e){return [...new Set(e)].filter(t=>{try{let r=new URL(t);return (r.protocol==="http:"||r.protocol==="https:")&&!r.username&&!r.password}catch{return false}}).sort()}async function or(e,t,r,n){let o,s=null,i,a=new Set;try{let l=await Yt(e,n);o=l.context,s=l.page,i=l.networkPolicyViolation,s.on("request",f=>a.add(f.url()));let u=await s.goto(t,{waitUntil:"domcontentloaded",timeout:e.options.navigationTimeoutMs});e.options.readiness.waitForSelector&&await s.waitForSelector(e.options.readiness.waitForSelector,{timeout:e.options.readiness.timeoutMs}).catch(()=>{}),e.options.javaScriptEnabled&&e.options.readiness.waitForFunction&&await s.waitForFunction(e.options.readiness.waitForFunction,void 0,{timeout:e.options.readiness.timeoutMs}).catch(()=>{}),e.options.javaScriptEnabled?await er(s,e.options.autoScrollTimeoutMs):await s.waitForLoadState("load",{timeout:e.options.readiness.timeoutMs}).catch(()=>{}),e.options.readiness.fallbackWaitMs>0&&await s.waitForTimeout(e.options.readiness.fallbackWaitMs);let c=i?.();if(c)throw c;let d=await s.evaluate(()=>{let f=(x,Ye)=>{let oe=[];for(let Qe of document.querySelectorAll(x))for(let we of Ye){let se=Qe.getAttribute(we);if(se)if(we.includes("srcset"))for(let et of se.split(",")){let ye=et.trim().split(/\s+/,1)[0];ye&&oe.push(ye);}else oe.push(se);}return oe},A=x=>{try{return new URL(x,document.baseURI).href}catch{return null}};return {links:f("a[href]",["href"]).map(A).filter(x=>x!==null),assets:f("img,script,link,source,video,audio,iframe,[data-src],[data-href],[data-resource-url]",["src","href","srcset","data-src","data-srcset","data-href","data-resource-url","poster"]).map(A).filter(x=>x!==null)}});await s.evaluate(()=>{document.querySelectorAll("#wpsuite-consent-root").forEach(f=>f.remove()),document.documentElement.classList.remove("wpsuite-consent-scroll-locked"),document.body.classList.remove("wpsuite-consent-scroll-locked");});let m=await s.content(),p=i();if(p)throw p;let y=new URL(t),R=te(d.links).filter(f=>{let A=new URL(f);return A.hash="",A.origin===y.origin}),M=I(H(k,e.jobId,e.taskId),"pages",`${String(r).padStart(4,"0")}-${L(t).slice(0,24)}.html`),D=Y(u?.headers()["content-type"],s.url()||t,"text/html; charset=utf-8"),q=await ne(M,m,D),h=(await o.cookies()).map(f=>({name:f.name,domain:f.domain,path:f.path,expires:f.expires,httpOnly:f.httpOnly,secure:f.secure,sameSite:f.sameSite,..."partitionKey"in f?{partitioned:!0}:{}})),F=u?.status()??null;return {requestedUrl:t,finalUrl:s?.url()||null,outcome:F!==null&&F>=400?"http-error":"rendered",httpStatus:F,contentType:D,html:q,discoveredPages:R,discoveredAssets:te([...d.assets,...ce(s.url()||t,m,u?.headers()["content-type"]??"text/html")]),networkUrls:te([...a]),cookies:h}}catch(l){return {requestedUrl:t,finalUrl:s?.url()||null,outcome:"failed",httpStatus:null,contentType:null,html:null,discoveredPages:[],discoveredAssets:[],networkUrls:te([...a]),cookies:[],error:l instanceof Error?l.message:String(l)}}}function sr(e){return e.outcome==="failed"&&typeof e.error=="string"&&/(?:target page, context or browser has been closed|browser closed|connection closed)/i.test(e.error)}async function ir(e,t,r,n){let o=null;for(let s=1;s<=2;s+=1){let i={requestId:t.awsRequestId,jobId:e.jobId,taskId:e.taskId,operation:e.operation,pageIndex:n,url:r,attempt:s,remainingTimeMs:t.getRemainingTimeInMillis?.()};Q(i),await g("render.page-started",i);let a=await or(e,r,n,i);await Xe(i),o=a;let l=sr(a);if(await g(l?"render.page-browser-closed":"render.page-finished",{...i,remainingTimeMs:t.getRemainingTimeInMillis?.()},{outcome:a.outcome,httpStatus:a.httpStatus,...a.error?{error:a.error.split(`
|
|
7
|
+
`,1)[0]}:{}},a.outcome==="failed"?"warn":"info"),!l||s===2)return a;await g("render.page-retry-with-fresh-browser",i,{nextAttempt:s+1},"warn");}if(o)return o;throw new Error(`Remote render did not produce a result for ${r}.`)}function ar(e,t){let r=t.toLowerCase();if(r.startsWith("text/")||r.includes("javascript")||r.includes("json")||r.includes("xml")||r.includes("svg"))return true;try{return /\.(?:css|js|mjs|json|xml|xsl|svg|txt|map|html?)$/i.test(new URL(e).pathname)}catch{return false}}async function lr(e,t,r){let n=t;for(let o=0;o<=5;o+=1){await le(n,"asset request");let s=await e.get(n,{timeout:r,failOnStatusCode:false,maxRedirects:0}),i=s.status();if(i<300||i>=400)return s;let a=s.headers().location;if(!a)return s;if(o===5)throw await s.dispose(),new Error("Asset request exceeded five redirects.");n=new URL(a,n).toString(),await s.dispose();}throw new Error("Asset redirect handling failed.")}async function cr(e,t,r){if(!Array.isArray(e.urls)||e.urls.length<1||e.urls.length>20)throw new Error("Asset tasks require between 1 and 20 URLs.");let n=await request.newContext({ignoreHTTPSErrors:e.options.ignoreHttpsErrors,userAgent:"WPSuiteStaticPublisher/remote-asset-worker-v1",...N?{proxy:{server:N}}:{}}),o=[],s=async a=>{o.push(a);let l=o.filter(u=>u.outcome==="failed"||u.outcome==="deferred").length;await r.updated(o.length-l,l);};try{for(let a=0;a<e.urls.length;a+=1){let l=e.urls[a],u=t.getRemainingTimeInMillis?.();if(u!==void 0&&u<3e4){await s({requestedUrl:l,finalUrl:null,outcome:"deferred",httpStatus:null,contentType:null,cacheControl:null,lastModified:null,object:null,discoveredAssets:[],error:"Worker stopped accepting assets because less than 30 seconds remained."});continue}let c=null;try{c=await lr(n,l,e.options.timeoutMs);let d=c.status(),m=c.headers(),p=c.url()||l;if(d<200||d>=300){await s({requestedUrl:l,finalUrl:p,outcome:"http-error",httpStatus:d,contentType:m["content-type"]??null,cacheControl:m["cache-control"]??null,lastModified:m["last-modified"]??null,object:null,discoveredAssets:[],error:`Asset returned HTTP ${d}.`});continue}let y=await c.body(),R=Y(m["content-type"],p,"application/octet-stream"),M=await ne(I(H(k,e.jobId,e.taskId),"assets",`${String(a).padStart(4,"0")}-${L(l).slice(0,24)}.bin`),y,R);await s({requestedUrl:l,finalUrl:p,outcome:"fetched",httpStatus:d,contentType:R,cacheControl:m["cache-control"]??null,lastModified:m["last-modified"]??null,object:M,discoveredAssets:ar(p,R)?ce(p,new TextDecoder("utf8").decode(y),R):[]});}catch(d){await s({requestedUrl:l,finalUrl:c?.url()??null,outcome:"failed",httpStatus:c?.status()??null,contentType:c?.headers()["content-type"]??null,cacheControl:c?.headers()["cache-control"]??null,lastModified:c?.headers()["last-modified"]??null,object:null,discoveredAssets:[],error:d instanceof Error?d.message:String(d)});}finally{await c?.dispose().catch(()=>{});}}}finally{await n.dispose();}let i=o.filter(a=>a.outcome==="failed"||a.outcome==="deferred").length;return {response:{schemaVersion:S,operation:"asset",jobId:e.jobId,taskId:e.taskId,status:i>0?"partial":"succeeded",completedItems:o.length-i,failedItems:i,exporterVersion:O},detail:{assets:o}}}async function ur(e,t,r){if(!Array.isArray(e.urls)||e.urls.length<1||e.urls.length>20)throw new Error("Render tasks require between 1 and 20 URLs.");let n=new URL(e.sourceOrigin).origin,o=[];for(let i=0;i<e.urls.length;i+=1){let a=e.urls[i];if(!a)continue;let l=t.getRemainingTimeInMillis?.();if(l!==void 0&&l<6e4){o.push({requestedUrl:a,finalUrl:null,outcome:"deferred",httpStatus:null,contentType:null,html:null,discoveredPages:[],discoveredAssets:[],networkUrls:[],cookies:[],error:"Worker stopped accepting URLs because less than 60 seconds remained."}),await r.updated(o.filter(d=>d.outcome!=="failed"&&d.outcome!=="deferred").length,o.filter(d=>d.outcome==="failed"||d.outcome==="deferred").length);continue}let u=new URL(a);if(u.origin!==n)throw new Error(`Primary render URL is outside sourceOrigin: ${a}`);o.push(await ir(e,t,u.toString(),i));let c=o.filter(d=>d.outcome==="failed"||d.outcome==="deferred").length;await r.updated(o.length-c,c);}let s=o.filter(i=>i.outcome==="failed"||i.outcome==="deferred").length;return {response:{schemaVersion:S,operation:"render",jobId:e.jobId,taskId:e.taskId,status:s>0?"partial":"succeeded",completedItems:o.length-s,failedItems:s,exporterVersion:O},detail:{pages:o}}}async function dr(e,t){if(!Array.isArray(e.items)||e.items.length<1||e.items.length>500)throw new Error("Rewrite tasks require between 1 and 500 objects.");let n={...await re(e.configKey),outputDir:"/workspace"},o=await re(e.assetMapKey),s=e.previousAssetMapKey?await re(e.previousAssetMapKey):{},i=[];for(let a of e.items){let l=v(a.inputKey,k),u=v(a.outputKey,k),c=await Ze(l),d=c.body,m=`/workspace/${a.relativePath.replace(/^\/+/,"")}`,p=We(d,n,o,m,s),y=Y(a.contentType||c.contentType,a.relativePath,"text/plain; charset=utf-8"),R=await ne(u,p,y);i.push({inputKey:l,outputKey:u,changed:p!==d,output:R}),await t.updated(i.length,0);}return {response:{schemaVersion:S,operation:"rewrite",jobId:e.jobId,taskId:e.taskId,status:"succeeded",completedItems:i.length,failedItems:0,exporterVersion:O},detail:{objects:i}}}function pr(e,t){return `${e}/${t.split("/").map(r=>encodeURIComponent(r)).join("/")}`}async function mr(e,t){if(!Array.isArray(e.items)||e.items.length>1e3)throw new Error("Deploy copy tasks accept at most 1000 objects.");let r=Gt.find(c=>c.id===e.targetId);if(!r)throw new Error(`Unknown deployment target: ${e.targetId}`);let n=He.get(r.region);n||(n=new S3Client({region:r.region}),He.set(r.region,n));let o=[];for(let c of e.items){let d=v(c.sourceKey,k),m=I(r.prefix,c.targetRelativeKey);try{let p=await n.send(new HeadObjectCommand({Bucket:r.bucketName,Key:m})).catch(h=>{if((h&&typeof h=="object"&&"$metadata"in h?Number(h.$metadata?.httpStatusCode):0)===404||h?.name==="NotFound")return null;throw h}),y=String(p?.CacheControl??"").replace(/\s+/g,"")===c.cacheControl.replace(/\s+/g,""),R=me(p?.ContentType)===me(c.contentType),M=p?.Metadata?.["wpsuite-sha256"]===c.sha256,D=!!c.normalizedSha256&&p?.Metadata?.["wpsuite-normalized-sha256"]===c.normalizedSha256;if(y&&R&&(M||D)){o.push({sourceKey:d,targetKey:m,status:"skipped"}),await t.updated(o.filter(h=>h.status!=="failed").length,o.filter(h=>h.status==="failed").length);continue}let q=await n.send(new CopyObjectCommand({Bucket:r.bucketName,Key:m,CopySource:pr($,d),MetadataDirective:"REPLACE",ContentType:c.contentType,CacheControl:c.cacheControl,Metadata:{"wpsuite-sha256":c.sha256,...c.normalizedSha256?{"wpsuite-normalized-sha256":c.normalizedSha256}:{}}}));o.push({sourceKey:d,targetKey:m,status:"copied",...q.CopyObjectResult?.ETag?{etag:q.CopyObjectResult.ETag}:{}}),await t.updated(o.filter(h=>h.status!=="failed").length,o.filter(h=>h.status==="failed").length);}catch(p){o.push({sourceKey:d,targetKey:m,status:"failed",error:p instanceof Error?p.message:String(p)}),await t.updated(o.filter(y=>y.status!=="failed").length,o.filter(y=>y.status==="failed").length);}}let i=(e.deleteRelativeKeys??[]).map(c=>I(r.prefix,c)),a=[],l=[];if(i.length>0){let c=await n.send(new DeleteObjectsCommand({Bucket:r.bucketName,Delete:{Objects:i.map(d=>({Key:d})),Quiet:false}}));a.push(...(c.Deleted??[]).flatMap(d=>d.Key?[d.Key]:[])),l.push(...(c.Errors??[]).map(d=>({key:d.Key??"",error:d.Message??d.Code??"S3 deletion failed"}))),await t.updated(o.filter(d=>d.status!=="failed").length+a.length,o.filter(d=>d.status==="failed").length+l.length);}let u=o.filter(c=>c.status==="failed").length+l.length;return {response:{schemaVersion:S,operation:"deploy-copy",jobId:e.jobId,taskId:e.taskId,status:u>0?"partial":"succeeded",completedItems:o.filter(c=>c.status!=="failed").length+a.length,failedItems:u,exporterVersion:O},detail:{objects:o,deletedKeys:a,deleteErrors:l,targetId:r.id}}}async function ze(e,t,r){if(e.operation==="health")return {response:{schemaVersion:S,operation:"health",jobId:e.jobId,taskId:e.taskId,status:"succeeded",completedItems:1,failedItems:0,exporterVersion:O},detail:{allowedOperation:ee,workspaceBucket:$,workspacePrefix:k,proxyConfigured:!!N}};if(ee&&ee!==e.operation)throw new Error(`Function is configured for ${ee}, not ${e.operation}.`);if(!r)throw new Error("Remote worker progress reporter is required.");return e.operation==="render"?await ur(e,t,r):e.operation==="asset"?await cr(e,t,r):e.operation==="rewrite"?await dr(e,r):await mr(e,r)}async function cn(e,t={}){let r=ke(e),n=setInterval(()=>{},1e3),o={requestId:t.awsRequestId,jobId:r.jobId,taskId:r.taskId,operation:r.operation,remainingTimeMs:t.getRemainingTimeInMillis?.()};Q(o),await g("invocation.started",o,{exporterVersion:O});try{if(r.operation==="health"){let l=(await ze(r,t)).response;return await g("invocation.completed",{...o,remainingTimeMs:t.getRemainingTimeInMillis?.()},{status:l.status}),l}fe();let s=I(H(k,r.jobId,r.taskId),"result.json"),i=await nr(s),a=new Z(r,t.awsRequestId);if(i)return await a.completed(i),await g("invocation.completed-from-existing-result",{...o,remainingTimeMs:t.getRemainingTimeInMillis?.()},{status:i.status}),i;await a.started();try{let l=await ze(r,t,a),u={...l.response,resultKey:s};return await rr(s,{schemaVersion:S,response:u,detail:l.detail,completedAt:new Date().toISOString(),requestId:t.awsRequestId??null}),await a.completed(u),await g("invocation.completed",{...o,remainingTimeMs:t.getRemainingTimeInMillis?.()},{status:u.status,completedItems:u.completedItems,failedItems:u.failedItems}),u}catch(l){throw await a.failed(),l}}catch(s){throw await g("invocation.failed",{...o,remainingTimeMs:t.getRemainingTimeInMillis?.()},{errorName:s instanceof Error?s.name:"UnknownError",error:s instanceof Error?s.message:String(s)},"error"),s}finally{await g("invocation.cleanup-started",{...o,remainingTimeMs:t.getRemainingTimeInMillis?.()}),r.operation==="render"&&await Xe({...o,remainingTimeMs:t.getRemainingTimeInMillis?.()}),await g("invocation.cleanup-finished",{...o,remainingTimeMs:t.getRemainingTimeInMillis?.()}),clearInterval(n),Fe();}}export{cn as handler};
|
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.69",
|
|
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.",
|