@smart-cloud/publisher-exporter 1.1.69 → 1.1.70

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/README.md CHANGED
@@ -220,10 +220,15 @@ deploy worker includes `Content-Type` in its unchanged-object decision. After
220
220
  upgrading from an earlier delegated rewrite implementation, republish affected
221
221
  targets to replace already incorrect object metadata.
222
222
 
223
- Render workers terminate orphaned Playwright Chromium processes and remove
224
- stale `playwright_chromiumdev_profile-*` directories before launching Chromium
225
- and after closing it. If Chromium disconnects during
226
- a page render, the worker starts a clean browser and retries that URL once.
223
+ Each render invocation starts one normal multi-process Chromium instance and
224
+ creates a fresh non-persistent Playwright BrowserContext for every page. Closing
225
+ that context discards the page's cookies, cache, storage, routes, and child
226
+ pages without restarting Chromium; the browser is closed only after the batch.
227
+ Browser profiles and writable browser state are confined to the owned
228
+ `/tmp/wpsuite-publisher-browser` root. Workers reap orphaned Chromium processes
229
+ and clean only that root before launch and after the batch. If Chromium itself
230
+ disconnects during a page render, the worker starts a clean browser and retries
231
+ that URL once.
227
232
  Structured `Remote worker checkpoint.` records include the request, job, task,
228
233
  page, attempt, remaining Lambda time, process memory, `/tmp` and `/dev/shm`
229
234
  space, and the visible Playwright profile count. Lambda `Runtime.ExitError`
@@ -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 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(/&amp;/gi,"&").replace(/&quot;/gi,'"').replace(/&#39;|&apos;/gi,"'").replace(/&lt;/gi,"<").replace(/&gt;/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(/&quot;/g,'"').replace(/&#34;/g,'"').replace(/&apos;/g,"'").replace(/&#39;/g,"'").replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">")}function C(e){return e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&#39;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}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
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 E from'path';import'fast-glob';import {statfs,readdir,readFile,rm,mkdir}from'fs/promises';import'os';import'worker_threads';import {DynamoDBClient,UpdateItemCommand}from'@aws-sdk/client-dynamodb';import je from'mime-types';import {setTimeout}from'timers/promises';import {writeSync}from'fs';var P=1,ke=/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;function V(e,t){let r=String(e??"").trim();if(!ke.test(r))throw new Error(`${t} must match ${ke.source} and be at most 128 characters.`);return r}function L(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 T(e,...t){let r=L(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 z(e,t,r){return `${T(e,"jobs",V(t,"jobId"),"tasks",V(r,"taskId"))}/`}function _(e){return createHash("sha256").update(e).digest("hex")}function W(e,t){let r=String(e??"").replace(/^\/+/,""),n=L(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 v(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 S(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 st(e){return e.hostname.replace(/^\[|\]$/g,"").replace(/\.$/,"").toLowerCase()}function G(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 ae(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 l=G(r.slice(n+1));if(!l)return null;r=`${r.slice(0,n)}:${((l[0]??0)*256+(l[1]??0)).toString(16)}:${((l[2]??0)*256+(l[3]??0)).toString(16)}`;}let[o,s]=r.split("::"),a=o?o.split(":"):[],i=s?s.split(":"):[],c=r.includes("::"),u=8-a.length-i.length;return c&&u<1||!c&&u!==0||[...a,...i].some(l=>!/^[0-9a-f]{1,4}$/.test(l))?null:[...a.map(l=>Number.parseInt(l,16)),...Array.from({length:u},()=>0),...i.map(l=>Number.parseInt(l,16))]}function Se(e){let t=G(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 it(e){let t=ae(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 Se(`${o>>8}.${o&255}.${s>>8}.${s&255}`)}return null}function ce(e){return G(e)?Se(e):ae(e)?it(e):"an invalid IP address"}function U(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=st(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(G(o)||ae(o)){let s=ce(o);if(s)throw new Error(`${t} must not target ${s}.`)}return n}function at(e){let t=U(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(U(a,`urls[${s}]`).origin!==t)throw new Error(`urls[${s}] is outside sourceOrigin.`);let r=v(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=v(r.viewport,"options.viewport");S(n.width,"options.viewport.width",320,7680),S(n.height,"options.viewport.height",240,7680),S(r.navigationTimeoutMs,"options.navigationTimeoutMs",1e3,6e5),S(r.autoScrollTimeoutMs,"options.autoScrollTimeoutMs",0,12e4);let o=v(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.`);S(o.timeoutMs,"options.readiness.timeoutMs",0,12e4),S(o.fallbackWaitMs,"options.readiness.fallbackWaitMs",0,12e4);}function ct(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())U(n,`urls[${r}]`);let t=v(e.options,"options");if(typeof t.ignoreHttpsErrors!="boolean")throw new Error("options.ignoreHttpsErrors must be a boolean.");S(t.timeoutMs,"options.timeoutMs",1e3,12e4);}function lt(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=v(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 ut(e){if(V(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=v(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`),S(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 Pe(e){if(!e||typeof e!="object")throw new Error("Worker event must be a JSON object.");let t=e;if(t.schemaVersion!==P)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 V(String(t.jobId??""),"jobId"),V(String(t.taskId??""),"taskId"),r==="render"&&at(t),r==="asset"&&ct(t),r==="rewrite"&&lt(t),r==="deploy-copy"&&ut(t),e}function mt(e){return e.hostname.replace(/^\[|\]$/g,"").replace(/\.$/,"").toLowerCase()}async function gt(e){return (await lookup(e,{all:true,verbatim:true})).map(t=>t.address)}async function le(e,t,r=gt){let n=U(e,t),o=mt(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=ce(a);if(i)throw new Error(`${t} hostname resolves to ${i}.`)}return n}async function xe(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 ht(e){return e.replace(/&amp;/gi,"&").replace(/&quot;/gi,'"').replace(/&#39;|&apos;/gi,"'").replace(/&lt;/gi,"<").replace(/&gt;/gi,">")}function wt(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 C(e,t,r){let n=wt(t,r);n&&e.add(n);}function yt(e,t,r){for(let n of t.split(",")){let o=n.trim().split(/\s+/,1)[0];o&&C(e,o,r);}}function ue(e,t,r=""){let n=new Set,o=ht(t).replace(/\\\//g,"/");for(let i of o.matchAll(/\b(?:src|href|poster|data-src|data-href|data-resource-url)\s*=\s*["']([^"']+)["']/gi))C(n,i[1]??"",e);for(let i of o.matchAll(/\b(?:srcset|data-srcset)\s*=\s*["']([^"']+)["']/gi))yt(n,i[1]??"",e);for(let i of o.matchAll(/url\(\s*(?:"([^"]+)"|'([^']+)'|([^)]*?))\s*\)/gi))C(n,i[1]??i[2]??i[3]??"",e);for(let i of o.matchAll(/@import\s+(?:url\()?\s*['"]?([^'"\s;)]+)['"]?\s*\)?/gi))C(n,i[1]??"",e);for(let i of o.matchAll(/<\?xml-stylesheet[^>]+href=["']([^"']+)["'][^>]*\?>/gi))C(n,i[1]??"",e);let s=(()=>{try{return E.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))C(n,i[1]??"",e);return [...n].sort()}function ve(e){return e.replace(/&quot;/g,'"').replace(/&#34;/g,'"').replace(/&apos;/g,"'").replace(/&#39;/g,"'").replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">")}function O(e){return e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&#39;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function X(e){return e.replace(/\//g,"\\/")}function Ie(e){return e.replace(/\//g,"\\\\/")}function Rt(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 Te(e,t,r){if(!t)return;e[t]=r;let n=X(t),o=X(r);e[n]=o;let s=Ie(t),a=Ie(r);e[s]=a;let i=O(t),c=O(r);e[i]=c;let u=O(n),l=O(o);e[u]=l;let d=O(s),m=O(a);e[d]=m;}function Z(e,t,r){Te(e,t,r);let n=Rt(t);n&&n!==t&&Te(e,n,r);}function We(e,t){try{return new URL(e,t==="."?"https://relative.invalid":t).pathname}catch{return e.startsWith("/")?e:`/${e.replace(/^\.\//,"")}`}}function Ce(e,t,r){if(!t)return r;let n=E.dirname(E.resolve(t)),o=E.resolve(e,r.replace(/^\/+/,"")),s=E.relative(n,o).replace(/\\/g,"/");return s?(s.startsWith(".")||(s=`./${s}`),s):"."}var bt=["wp-content/","wp-includes/","wp-admin/","wp-json/","_next/"],Et=new Set([".html",".htm"]),Oe="WPSuite.io Static Publisher",kt=Oe.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");function St(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Pt(e){return e.startsWith("//")||e.startsWith("\\/\\/")||e.startsWith("\\\\/\\\\/")}function xt(e,t,r){return Pt(t)?e.replace(new RegExp(`(?<!:)${St(t)}`,"g"),r):e.split(t).join(r)}function It(e,t,r){if(e.wpsuite?.siteSettings?.subscriber===true||e.wpsuite?.subscriptionType==="PROFESSIONAL"||e.wpsuite?.subscriptionType==="AGENCY"||!r)return false;let o=E.extname(r).toLowerCase();return Et.has(o)?/<head\b|<html\b|<!doctype html/i.test(t):false}function Tt(e){if(new RegExp(`<meta\\b(?=[^>]*\\bname=(["'])generator\\1)(?=[^>]*\\bcontent=(["'])${kt}\\2)[^>]*\\/?>`,"i").test(e))return e;let t=`<meta name="generator" content="${Oe}" />`;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,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};
4
+ `;return e.replace(/<head\b[^>]*>/i,o=>`${o}${n} ${t}`)}function vt(e){let t=ve(e).trim();return t.startsWith("{")||t.startsWith("[")||t.includes("\\/")||/"@context"|"@type"/.test(t)}function Wt(e,t){let r=[...new Set(t)].filter(s=>s.includes("/")&&!/\\+\//.test(s)).map(s=>[s,X(s)]).filter(([s,a])=>s!==a).sort((s,a)=>a[0].length-s[0].length);if(!r.length)return e;let n=s=>{let a=s;for(let[i,c]of r)a=a.split(i).join(c);return a},o=e.replace(/(<script\b[^>]*\btype=["']application\/(?:ld\+)?json["'][^>]*>)([\s\S]*?)(<\/script>)/gi,(s,a,i,c)=>`${a}${n(i)}${c}`);return o=o.replace(/(<meta\b[^>]*\bcontent=(['"]))([\s\S]*?)(\2[^>]*>)/gi,(s,a,i,c,u)=>vt(c)?`${a}${n(c)}${u}`:s),o}function Ct(e,t){if(!t)return null;let r=E.dirname(E.resolve(t)),n=E.resolve(e.outputDir),o=E.relative(r,n).replace(/\\/g,"/");return o?(o.startsWith(".")||(o=`./${o}`),o.endsWith("/")?o:`${o}/`):"./"}function Ot(e,t,r){let n=Ct(t,r);if(!n)return e;let o=e;for(let s of bt){let a=s.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),i=new RegExp(`(?:\\.{1,}/)+${a}`,"g"),c=new RegExp(`(?<!\\.)/${a}`,"g");o=o.replace(i,`${n}${s}`).replace(c,`${n}${s}`);let u=s.replace(/\//g,"\\/"),l=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,`${l}${u}`).replace(p,`${l}${u}`).replace(y,`${l}${u}`);}return o}function pe(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:We(t,e.targetOrigin),s=n?`${n.search}${n.hash}`:"";return e.urlRewriteMode==="root-relative"?`${o}${s}`:`${Ce(e.outputDir,r,o)}${s}`}function de(e,t,r,n,o){Z(e,r,pe(t,n,o));}function $t(e,t,r,n,o){if(!r||r===n)return;Z(e,r,n);let s=pe(t,r,o),a=pe(t,n,o);Z(e,s,a);}function $e(e,t,r,n,o={}){let s=e,a={};de(a,t,t.sourceOrigin,t.targetOrigin,n);for(let[c,u]of Object.entries(t.extraReplacements))de(a,t,c,u,n);for(let[c,u]of Object.entries(r))de(a,t,c,u,n);for(let[c,u]of Object.entries(o)){let l=r[c];!l||l===u||$t(a,t,u,l,n);}let i=Object.entries(a).sort((c,u)=>u[0].length-c[0].length);for(let[c,u]of i)s=xt(s,c,u);return t.urlRewriteMode!=="absolute"&&(s=Ot(s,t,n)),s=Wt(s,i.map(([,c])=>c)),It(t,s,n)&&(s=Tt(s)),s}var me=String(process.env.PUBLISHER_PROGRESS_TABLE??"").trim(),Me=Number(process.env.PUBLISHER_PROGRESS_RETENTION_SECONDS??604800),jt=Number.isFinite(Me)?Math.max(86400,Me):604800,Ae=me?new DynamoDBClient({}):null;function Vt(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 Ut(e){if(!(!Ae||!me))try{let t=Math.floor(Date.now()/1e3)+jt;await Ae.send(new UpdateItemCommand({TableName:me,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 Y=class{#t;#o;#e;#s;#i;#a=-1;#c=0;#n=0;#l=0;constructor(t,r,n=Ut){this.#t=t,this.#o=r??null,this.#e=Vt(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.#l=r;let n=t+r,o=Date.now();n<this.#e&&n-this.#a<this.#s&&o-this.#c<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.#l));await this.#r("failed",this.#n,t,this.#e+3);}async#r(t,r,n,o){this.#a=r+n,this.#c=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 Lt=/^[!#$%&'*+.^_`|~0-9A-Za-z-]+\/[!#$%&'*+.^_`|~0-9A-Za-z-]+(?:\s*;.*)?$/u;function _t(e){try{return new URL(e).pathname}catch{return e}}function Q(e,t,r){let n=String(e??"").trim();if(Lt.test(n))return n;let o=je.lookup(_t(t));return o?je.contentType(o)||o:r}function ge(e){return String(e??"").split(";").map(t=>t.trim().toLowerCase()).filter(Boolean).join(";")}var Le="playwright_chromiumdev_profile-",Ft="/tmp/wpsuite-publisher-browser";function x(e){return Math.round(e/1024/1024*100)/100}async function Ve(e){try{let t=await statfs(e),r=t.blocks*t.bsize,n=t.bavail*t.bsize;return {path:e,totalMiB:x(r),availableMiB:x(n),usedMiB:x(r-n)}}catch(t){return {path:e,totalMiB:null,availableMiB:null,usedMiB:null,error:t instanceof Error?t.message:String(t)}}}async function Ht(e){return (await fe(e)).filter(t=>t.startsWith(Le))}async function fe(e){try{return (await readdir(e,{withFileTypes:!0})).map(t=>t.name).sort()}catch(t){if(t.code==="ENOENT")return [];throw t}}function he(){return E.resolve(process.env.PUBLISHER_BROWSER_TEMP_ROOT?.trim()||Ft)}async function _e(e=he()){let t=Be(e),r=E.join(t,"home"),n=E.join(t,"cache"),o=E.join(t,"config");await Promise.all([t,r,n,o].map(s=>mkdir(s,{recursive:true}))),process.env.TMPDIR=t,process.env.HOME=r,process.env.XDG_CACHE_HOME=n,process.env.XDG_CONFIG_HOME=o;}async function Ke(e=he()){let t=process.memoryUsage(),[r,n,o,s]=await Promise.all([Ve(e),Ve("/dev/shm"),Ht(e),fe(e)]);return {processMemoryMiB:{rss:x(t.rss),heapUsed:x(t.heapUsed),heapTotal:x(t.heapTotal),external:x(t.external),arrayBuffers:x(t.arrayBuffers)},tempStorage:r,sharedMemory:n,playwrightProfiles:{count:o.length,names:o.slice(0,20)},tempEntries:{count:s.length,names:s.slice(0,20)}}}function Be(e){let t=E.resolve(e);if(t===E.parse(t).root)throw new Error(`Refusing to clean filesystem root: ${t}`);if(t==="/tmp"||t==="/var/tmp")throw new Error(`Refusing to clean shared temp root: ${t}`);return t}async function Ne(e=he()){let t=Be(e),r=await fe(t);for(let n of r)await rm(E.join(t,n),{recursive:true,force:true,maxRetries:3,retryDelay:50});return r}function zt(e){let t=e.split("\0",1)[0]??"",r=E.basename(t).toLowerCase();return r.includes("chrome-headless-shell")||r==="chrome_crashpad_handler"||r==="chromium"||r==="chromium-browser"||e.includes(Le)&&/(?:chrome|chromium)/i.test(e)}async function De(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 a;try{a=await readFile(E.join(e,o.name,"cmdline"),"utf8");}catch(i){if(["ENOENT","EACCES","EPERM","ESRCH"].includes(String(i.code)))continue;throw i}if(zt(a))try{t(s),n.push(s);}catch(i){if(["ESRCH","EPERM"].includes(String(i.code)))continue;throw i}}return n.length>0&&await setTimeout(100),n.sort((o,s)=>o-s)}var B={},qe=false;function Jt(e){if(e)try{let t=new URL(e);return t.username="",t.password="",t.search="",t.hash="",t.toString()}catch{return}}function Fe(e){return {...e,...e.url?{url:Jt(e.url)}:{}}}function He(e){return e instanceof Error?{errorName:e.name,errorMessage:e.message,...e.stack?{errorStack:e.stack}:{}}:{error:String(e)}}function we(e,t={}){try{writeSync(2,`${JSON.stringify({level:"ERROR",message:"Remote worker runtime diagnostic.",event:e,...B,...t,timestamp:new Date().toISOString()})}
5
+ `);}catch{}}function ze(){qe||(qe=true,process.on("uncaughtExceptionMonitor",(e,t)=>{we("runtime.uncaught-exception",{origin:t,...He(e)});}),process.on("exit",e=>{we("runtime.process-exit",{exitCode:e});}));}async function g(e,t,r={},n="info"){try{B=Fe(t);let o=null;try{o=await Ke();}catch(a){r={...r,resourceSnapshotError:a instanceof Error?a.message:String(a)};}let s=JSON.stringify({message:"Remote worker checkpoint.",event:e,...B,...r,...o?{resources:o}:{}});console[n](s);}catch(o){we("checkpoint.write-failed",{checkpointEvent:e,...He(o)});}}function ee(e){B=Fe(e);}function Ge(){B={};}var $=String(process.env.PUBLISHER_WORKSPACE_BUCKET??"").trim(),k=L(process.env.PUBLISHER_WORKSPACE_PREFIX??""),te=String(process.env.PUBLISHER_ALLOWED_OPERATION??"").trim(),M=String(process.env.PUBLISHER_EXPORTER_VERSION??"unknown").trim(),N=String(process.env.PUBLISHER_PROXY_URL??"").trim(),nr=or(process.env.PUBLISHER_ALLOWED_TARGETS??"[]"),Ye=new S3Client({}),Je=new Map,b=null,D=false;ze();function or(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:L(r.prefix)})):[]}catch{return []}}function ye(){if(!$)throw new Error("PUBLISHER_WORKSPACE_BUCKET is required.")}async function Re(e,t){try{let r=await De();r.length>0&&await g(`browser.stale-processes-killed.${t}`,e,{killedProcesses:r.length,killedProcessIds:r},"warn");let n=await Ne();n.length>0&&await g(`browser.temp-entries-removed.${t}`,e,{removedEntries:n.length,removedEntryNames:n.slice(0,20)}),await _e();}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 sr(e){if(b){let r=await b.catch(()=>null);if(r?.isConnected())return r}await g("browser.launch-preparing",e),await Re(e,"before-launch"),await g("browser.launch-started",e);let t=chromium.launch({headless:true,args:["--no-sandbox","--disable-setuid-sandbox","--disable-gpu"],...N?{proxy:{server:N}}:{}});b=t;try{let r=await t;return r.once("disconnected",()=>{b===t&&(b=null);let n=D;ee(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 Qe(e){let t=b;if(b=null,t){let r=await t.catch(()=>null);r&&(D=true,await r.close().catch(async n=>{await g("browser.close-failed",e,{error:n instanceof Error?n.message:String(n)},"warn");}),D=false);}await Re(e,"after-close");}async function ir(e,t){let r;for(let n=1;n<=2;n+=1){let o=await sr({...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 ar(s);let a=await xe(s);return {context:s,page:await s.newPage(),networkPolicyViolation:a.getViolation}}catch(a){r=a,await s?.close().catch(()=>{}),b=null,D=true,await o.close().catch(()=>{}),D=false,await Re({...t,attempt:n},"after-close");}}throw r instanceof Error?r:new Error(`Unable to create a Chromium page: ${String(r)}`)}async function ar(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 cr(e,t){await e.evaluate(async r=>{await new Promise(n=>{let o=0,s=700,a=Date.now(),i=()=>{window.clearInterval(c),window.scrollTo(0,0),n();},c=window.setInterval(()=>{if(Date.now()-a>=r){i();return}window.scrollBy(0,s),o+=s;let u=Math.max(document.body?.scrollHeight||0,document.documentElement?.scrollHeight||0);o>=u+window.innerHeight&&i();},120);});},t);}async function et(e){ye();let t=W(e,k),r=await Ye.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 lr(e){return (await et(e)).body}async function ne(e){return JSON.parse(await lr(e))}async function oe(e,t,r){ye();let n=W(e,k),o=typeof t=="string"?Buffer.from(t,"utf8"):t,s=await Ye.send(new PutObjectCommand({Bucket:$,Key:n,Body:o,ContentType:r,Metadata:{sha256:_(o)}}));return {bucket:$,key:n,sha256:_(o),bytes:o.byteLength,contentType:r,...s.ETag?{etag:s.ETag}:{},...s.VersionId?{versionId:s.VersionId}:{}}}async function ur(e,t){return await oe(e,`${JSON.stringify(t,null,2)}
6
+ `,"application/json; charset=utf-8")}async function dr(e){try{let t=await ne(e);return t.response??t}catch(t){if(t.name==="NoSuchKey"||t.$metadata?.httpStatusCode===404)return null;throw t}}function re(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 pr(e,t,r,n){let o=null,s=null,a,i=new Set;try{let c=await ir(e,n);o=c.context,s=c.page,a=c.networkPolicyViolation,s.on("request",f=>i.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 cr(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 l=a?.();if(l)throw l;let d=await s.evaluate(()=>{let f=(I,tt)=>{let se=[];for(let rt of document.querySelectorAll(I))for(let be of tt){let ie=rt.getAttribute(be);if(ie)if(be.includes("srcset"))for(let nt of ie.split(",")){let Ee=nt.trim().split(/\s+/,1)[0];Ee&&se.push(Ee);}else se.push(ie);}return se},j=I=>{try{return new URL(I,document.baseURI).href}catch{return null}};return {links:f("a[href]",["href"]).map(j).filter(I=>I!==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(j).filter(I=>I!==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=a();if(p)throw p;let y=new URL(t),R=re(d.links).filter(f=>{let j=new URL(f);return j.hash="",j.origin===y.origin}),A=T(z(k,e.jobId,e.taskId),"pages",`${String(r).padStart(4,"0")}-${_(t).slice(0,24)}.html`),q=Q(u?.headers()["content-type"],s.url()||t,"text/html; charset=utf-8"),F=await oe(A,m,q),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}:{}})),H=u?.status()??null;return {requestedUrl:t,finalUrl:s?.url()||null,outcome:H!==null&&H>=400?"http-error":"rendered",httpStatus:H,contentType:q,html:F,discoveredPages:R,discoveredAssets:re([...d.assets,...ue(s.url()||t,m,u?.headers()["content-type"]??"text/html")]),networkUrls:re([...i]),cookies:h}}catch(c){return {requestedUrl:t,finalUrl:s?.url()||null,outcome:"failed",httpStatus:null,contentType:null,html:null,discoveredPages:[],discoveredAssets:[],networkUrls:re([...i]),cookies:[],error:c instanceof Error?c.message:String(c)}}finally{await o?.close().catch(()=>{});}}function mr(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 gr(e,t,r,n){let o=null;for(let s=1;s<=2;s+=1){let a={requestId:t.awsRequestId,jobId:e.jobId,taskId:e.taskId,operation:e.operation,pageIndex:n,url:r,attempt:s,remainingTimeMs:t.getRemainingTimeInMillis?.()};ee(a),await g("render.page-started",a);let i=await pr(e,r,n,a);o=i;let c=mr(i);if(c&&await Qe(a),await g(c?"render.page-browser-closed":"render.page-finished",{...a,remainingTimeMs:t.getRemainingTimeInMillis?.()},{outcome:i.outcome,httpStatus:i.httpStatus,...i.error?{error:i.error.split(`
7
+ `,1)[0]}:{}},i.outcome==="failed"?"warn":"info"),!c||s===2)return i;await g("render.page-retry-with-fresh-browser",a,{nextAttempt:s+1},"warn");}if(o)return o;throw new Error(`Remote render did not produce a result for ${r}.`)}function fr(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 hr(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 wr(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 i=>{o.push(i);let c=o.filter(u=>u.outcome==="failed"||u.outcome==="deferred").length;await r.updated(o.length-c,c);};try{for(let i=0;i<e.urls.length;i+=1){let c=e.urls[i],u=t.getRemainingTimeInMillis?.();if(u!==void 0&&u<3e4){await s({requestedUrl:c,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 l=null;try{l=await hr(n,c,e.options.timeoutMs);let d=l.status(),m=l.headers(),p=l.url()||c;if(d<200||d>=300){await s({requestedUrl:c,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 l.body(),R=Q(m["content-type"],p,"application/octet-stream"),A=await oe(T(z(k,e.jobId,e.taskId),"assets",`${String(i).padStart(4,"0")}-${_(c).slice(0,24)}.bin`),y,R);await s({requestedUrl:c,finalUrl:p,outcome:"fetched",httpStatus:d,contentType:R,cacheControl:m["cache-control"]??null,lastModified:m["last-modified"]??null,object:A,discoveredAssets:fr(p,R)?ue(p,new TextDecoder("utf8").decode(y),R):[]});}catch(d){await s({requestedUrl:c,finalUrl:l?.url()??null,outcome:"failed",httpStatus:l?.status()??null,contentType:l?.headers()["content-type"]??null,cacheControl:l?.headers()["cache-control"]??null,lastModified:l?.headers()["last-modified"]??null,object:null,discoveredAssets:[],error:d instanceof Error?d.message:String(d)});}finally{await l?.dispose().catch(()=>{});}}}finally{await n.dispose();}let a=o.filter(i=>i.outcome==="failed"||i.outcome==="deferred").length;return {response:{schemaVersion:P,operation:"asset",jobId:e.jobId,taskId:e.taskId,status:a>0?"partial":"succeeded",completedItems:o.length-a,failedItems:a,exporterVersion:M},detail:{assets:o}}}async function yr(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 c=t.getRemainingTimeInMillis?.();if(c!==void 0&&c<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(d=>d.outcome!=="failed"&&d.outcome!=="deferred").length,o.filter(d=>d.outcome==="failed"||d.outcome==="deferred").length);continue}let u=new URL(i);if(u.origin!==n)throw new Error(`Primary render URL is outside sourceOrigin: ${i}`);o.push(await gr(e,t,u.toString(),a));let l=o.filter(d=>d.outcome==="failed"||d.outcome==="deferred").length;await r.updated(o.length-l,l);}let s=o.filter(a=>a.outcome==="failed"||a.outcome==="deferred").length;return {response:{schemaVersion:P,operation:"render",jobId:e.jobId,taskId:e.taskId,status:s>0?"partial":"succeeded",completedItems:o.length-s,failedItems:s,exporterVersion:M},detail:{pages:o}}}async function Rr(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 ne(e.configKey),outputDir:"/workspace"},o=await ne(e.assetMapKey),s=e.previousAssetMapKey?await ne(e.previousAssetMapKey):{},a=[];for(let i of e.items){let c=W(i.inputKey,k),u=W(i.outputKey,k),l=await et(c),d=l.body,m=`/workspace/${i.relativePath.replace(/^\/+/,"")}`,p=$e(d,n,o,m,s),y=Q(i.contentType||l.contentType,i.relativePath,"text/plain; charset=utf-8"),R=await oe(u,p,y);a.push({inputKey:c,outputKey:u,changed:p!==d,output:R}),await t.updated(a.length,0);}return {response:{schemaVersion:P,operation:"rewrite",jobId:e.jobId,taskId:e.taskId,status:"succeeded",completedItems:a.length,failedItems:0,exporterVersion:M},detail:{objects:a}}}function br(e,t){return `${e}/${t.split("/").map(r=>encodeURIComponent(r)).join("/")}`}async function Er(e,t){if(!Array.isArray(e.items)||e.items.length>1e3)throw new Error("Deploy copy tasks accept at most 1000 objects.");let r=nr.find(l=>l.id===e.targetId);if(!r)throw new Error(`Unknown deployment target: ${e.targetId}`);let n=Je.get(r.region);n||(n=new S3Client({region:r.region}),Je.set(r.region,n));let o=[];for(let l of e.items){let d=W(l.sourceKey,k),m=T(r.prefix,l.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,"")===l.cacheControl.replace(/\s+/g,""),R=ge(p?.ContentType)===ge(l.contentType),A=p?.Metadata?.["wpsuite-sha256"]===l.sha256,q=!!l.normalizedSha256&&p?.Metadata?.["wpsuite-normalized-sha256"]===l.normalizedSha256;if(y&&R&&(A||q)){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 F=await n.send(new CopyObjectCommand({Bucket:r.bucketName,Key:m,CopySource:br($,d),MetadataDirective:"REPLACE",ContentType:l.contentType,CacheControl:l.cacheControl,Metadata:{"wpsuite-sha256":l.sha256,...l.normalizedSha256?{"wpsuite-normalized-sha256":l.normalizedSha256}:{}}}));o.push({sourceKey:d,targetKey:m,status:"copied",...F.CopyObjectResult?.ETag?{etag:F.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 a=(e.deleteRelativeKeys??[]).map(l=>T(r.prefix,l)),i=[],c=[];if(a.length>0){let l=await n.send(new DeleteObjectsCommand({Bucket:r.bucketName,Delete:{Objects:a.map(d=>({Key:d})),Quiet:false}}));i.push(...(l.Deleted??[]).flatMap(d=>d.Key?[d.Key]:[])),c.push(...(l.Errors??[]).map(d=>({key:d.Key??"",error:d.Message??d.Code??"S3 deletion failed"}))),await t.updated(o.filter(d=>d.status!=="failed").length+i.length,o.filter(d=>d.status==="failed").length+c.length);}let u=o.filter(l=>l.status==="failed").length+c.length;return {response:{schemaVersion:P,operation:"deploy-copy",jobId:e.jobId,taskId:e.taskId,status:u>0?"partial":"succeeded",completedItems:o.filter(l=>l.status!=="failed").length+i.length,failedItems:u,exporterVersion:M},detail:{objects:o,deletedKeys:i,deleteErrors:c,targetId:r.id}}}async function Xe(e,t,r){if(e.operation==="health")return {response:{schemaVersion:P,operation:"health",jobId:e.jobId,taskId:e.taskId,status:"succeeded",completedItems:1,failedItems:0,exporterVersion:M},detail:{allowedOperation:te,workspaceBucket:$,workspacePrefix:k,proxyConfigured:!!N}};if(te&&te!==e.operation)throw new Error(`Function is configured for ${te}, not ${e.operation}.`);if(!r)throw new Error("Remote worker progress reporter is required.");return e.operation==="render"?await yr(e,t,r):e.operation==="asset"?await wr(e,t,r):e.operation==="rewrite"?await Rr(e,r):await Er(e,r)}async function yn(e,t={}){let r=Pe(e),n=setInterval(()=>{},1e3),o={requestId:t.awsRequestId,jobId:r.jobId,taskId:r.taskId,operation:r.operation,remainingTimeMs:t.getRemainingTimeInMillis?.()};ee(o),await g("invocation.started",o,{exporterVersion:M});try{if(r.operation==="health"){let c=(await Xe(r,t)).response;return await g("invocation.completed",{...o,remainingTimeMs:t.getRemainingTimeInMillis?.()},{status:c.status}),c}ye();let s=T(z(k,r.jobId,r.taskId),"result.json"),a=await dr(s),i=new Y(r,t.awsRequestId);if(a)return await i.completed(a),await g("invocation.completed-from-existing-result",{...o,remainingTimeMs:t.getRemainingTimeInMillis?.()},{status:a.status}),a;await i.started();try{let c=await Xe(r,t,i),u={...c.response,resultKey:s};return await ur(s,{schemaVersion:P,response:u,detail:c.detail,completedAt:new Date().toISOString(),requestId:t.awsRequestId??null}),await i.completed(u),await g("invocation.completed",{...o,remainingTimeMs:t.getRemainingTimeInMillis?.()},{status:u.status,completedItems:u.completedItems,failedItems:u.failedItems}),u}catch(c){throw await i.failed(),c}}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 Qe({...o,remainingTimeMs:t.getRemainingTimeInMillis?.()}),await g("invocation.cleanup-finished",{...o,remainingTimeMs:t.getRemainingTimeInMillis?.()}),clearInterval(n),Ge();}}export{yn as handler};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@smart-cloud/publisher-exporter",
3
- "version": "1.1.69",
3
+ "version": "1.1.70",
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.",
@@ -26,6 +26,7 @@
26
26
  "build": "tsup --config tsup.config.ts",
27
27
  "build:premium": "node scripts/build-premium.mjs",
28
28
  "verify:premium": "node scripts/verify-premium-build.mjs",
29
+ "verify:browser-lifecycle": "node scripts/verify-browser-lifecycle.mjs",
29
30
  "check": "tsc -p tsconfig.json --noEmit",
30
31
  "lint": "eslint 'src/**/*.ts' --report-unused-disable-directives --max-warnings 0",
31
32
  "test": "node --test tests/*.test.mjs",
@@ -42,7 +43,7 @@
42
43
  "publish:site": "npm run build && npm run crawl && npm run deploy && npm run invalidate",
43
44
  "install:browsers": "playwright install chromium",
44
45
  "prepack": "npm run build:premium && npm run verify:premium",
45
- "release:npm": "npm run lint && npm run check && npm test && npm publish --access=public --registry=https://registry.npmjs.org/"
46
+ "release:npm": "npm run lint && npm run check && npm test && npm run verify:browser-lifecycle && npm run build && npm publish --access=public --registry=https://registry.npmjs.org/"
46
47
  },
47
48
  "dependencies": {
48
49
  "@aws-sdk/client-cloudfront": "^3.1127.0",