mcp-scraper 0.93.0 → 0.93.2
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/CHANGELOG.md +37 -25
- package/README.md +3 -3
- package/dist/bin/api-server.js +1 -1
- package/dist/bin/mcp-scraper-cli.js +1 -1
- package/dist/bin/mcp-scraper-core.js +1 -1
- package/dist/bin/mcp-scraper-install.js +1 -1
- package/dist/bin/mcp-stdio-server.js +1 -1
- package/dist/bin/paa-harvest.js +1 -1
- package/dist/chunk-2SP57VCG.js +15 -15
- package/dist/{chunk-PMOPJOSJ.js → chunk-5JKBFNYF.js} +1 -1
- package/dist/{chunk-35QGIWR6.js → chunk-5VB3I7UX.js} +4 -4
- package/dist/chunk-73LAMUS5.js +6 -0
- package/dist/{chunk-LBMRUR4E.js → chunk-AFFMCO7R.js} +2 -2
- package/dist/{chunk-4YLZR4OR.js → chunk-CG2FHIBA.js} +1 -1
- package/dist/chunk-DT2FYN6N.js +1 -1
- package/dist/{chunk-XG6GCEUE.js → chunk-EWR7BPPD.js} +1 -1
- package/dist/{chunk-H3SJLJYM.js → chunk-IJF4VXJ7.js} +1 -1
- package/dist/{chunk-IK5BG7MO.js → chunk-KPDNM7E7.js} +1 -1
- package/dist/{chunk-M5VZVMPC.js → chunk-MJ2OICVY.js} +3 -3
- package/dist/{chunk-5KQO27NH.js → chunk-NLKA6SHC.js} +1 -1
- package/dist/chunk-ORB4RHCK.js +4 -4
- package/dist/{chunk-VRVO4OQ3.js → chunk-QWSWHUOK.js} +150 -150
- package/dist/chunk-SH5KB4P7.js +1 -1
- package/dist/chunk-UN6FVDJQ.js +1 -0
- package/dist/{chunk-M5QHXNFZ.js → chunk-VVG7LFFF.js} +3 -3
- package/dist/chunk-WJ4XFLS4.js +15 -15
- package/dist/chunk-XJ6PJWT5.js +1 -0
- package/dist/chunk-Y6MKMSOC.js +1 -1
- package/dist/{extract-bundle-M2XM4BEW.js → extract-bundle-MQOAKQDV.js} +1 -1
- package/dist/{gmail-service-EGATZIBE.js → gmail-service-6V5MFBYH.js} +1 -1
- package/dist/index.cjs +21 -21
- package/dist/index.d.cts +15 -15
- package/dist/index.d.ts +15 -15
- package/dist/index.js +1 -1
- package/dist/{server-JLR2YJ7V.js → server-GRB6VNT6.js} +43 -43
- package/dist/{site-extract-repository-3NFFFPXQ.js → site-extract-repository-2LFDP6FZ.js} +1 -1
- package/dist/{stripe-event-worker-PUYXT5DS.js → stripe-event-worker-IJXA6T37.js} +1 -1
- package/dist/worker-US6CTFYG.js +1 -0
- package/package.json +136 -17
- package/THIRD_PARTY_NOTICES.html +0 -203
- package/dist/chunk-DUJ56SHU.js +0 -1
- package/dist/chunk-RZEZJAID.js +0 -1
- package/dist/chunk-XASDACRP.js +0 -6
- package/dist/worker-UG4OXZWR.js +0 -1
package/dist/chunk-XASDACRP.js
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import{a as Tt}from"./chunk-XG6GCEUE.js";import{l as vt,m as St,w as At}from"./chunk-M5VZVMPC.js";import{a as G,c as Ie,d as ae,e as L,f as se,j as Oe,k as Ot}from"./chunk-DT2FYN6N.js";import{b as Rt,c as Pt,d as V,f as $,g as H,h as U,i as Et,k as B,n as kt,q as It}from"./chunk-ORB4RHCK.js";import{a as Te,b as Ce,g as xe}from"./chunk-RZEZJAID.js";import{a as at,b as st}from"./chunk-SH5KB4P7.js";import{a as _t,b as bt,d as wt}from"./chunk-2SP57VCG.js";import{b as ht,c as yt}from"./chunk-6DTXIZY2.js";import{c as it}from"./chunk-Y6MKMSOC.js";import{Nb as ie,Rb as Ee,Tb as ke,Va as Re,b as Se,g as M,h as lt,hb as ft,ia as pt,j as ut,ja as mt,jb as Pe,la as gt,m as ct,o as dt,oa as Ae}from"./chunk-WJ4XFLS4.js";import{request as br}from"https";import{HttpsProxyAgent as wr}from"https-proxy-agent";var le={source:"https://\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061.com/users/zone/premium_domains",retrievedAt:"2026-09-23T20:14:30.483Z",includedStatuses:["premium","remove_candidate"],domains:["advanceautoparts.com","affitto.it","agoda.cn","albertsons.com","allpeople.com","autozone.com","bestbuy.com","bestwestern.com","billiger.de","bottlerover.com","carousell.com","carousell.com.hk","carousell.com.my","carousell.ph","carousell.sg","carsales.com.au","cdiscount.com","chewy.com","costco.com","cvs.com","despegar.com.mx","dickssportinggoods.com","dynos.es","emaxme.com","familytreenow.com","feuvert.fr","flooranddecor.com","foodlion.com","footlocker.co.uk","footlocker.com","giantfoodstores.com","gopuff.com","gplay.bg","hermes.com","hyatt.com","idealo.de","immobilienscout24.de","ingatlan.com","instacart.com","intersport.fr","joann.com","kroger.com","lazada.co.id","lazada.co.th","lazada.com.my","lazada.com.ph","lazada.sg","lazada.vn","lowes.ca","lowes.com","mcmaster.com","mediamarkt.de","mediamarkt.es","medline.com","mscdirect.com","napaonline.com","nofrills.ca","peoplefinders.com","platt.com","publicdatausa.com","realcanadiansuperstore.ca","realestate.com.au","restaurantguru.com","searchpeoplefree.com","shopee.cl","shopee.co.id","shopee.co.th","shopee.com.br","shopee.com.co","shopee.com.mx","shopee.com.my","shopee.ph","shopee.sg","shopee.tw","shopee.vn","similarweb.com","skyscanner.co.kr","skyscanner.net","stopandshop.com","target.com","temu.com","ticketmaster.com","totalwine.com","tractorsupply.com","walmart.com.mx","wayfair.com","weismarkets.com","wizzair.com","worten.pt"]};var Yr=le.source,Ct=le.retrievedAt,yr=new Set(le.domains);function X(e){let t=new URL(e).hostname.toLowerCase().replace(/\.$/,"");for(let o of yr)if(t===o||t.endsWith(`.${o}`))return"premium";return"standard"}function ue(e){for(let t of["providerProduct","billingTier","billableEvent","unitType","source","policyVersion","effectiveAt"])if(!e[t]?.trim())throw new Error(`Provider rate ${t} is required`);if(!Number.isSafeInteger(e.numeratorUsdNanos)||e.numeratorUsdNanos<0)throw new Error("Provider rate numerator must be a non-negative safe integer");if(!Number.isSafeInteger(e.denominatorUnits)||e.denominatorUnits<1)throw new Error("Provider rate denominator must be a positive safe integer");if(Number.isNaN(Date.parse(e.effectiveAt)))throw new Error("Provider rate effectiveAt must be a date");return e}function ce(e,t){if(ue(e),!Number.isSafeInteger(t)||t<0)throw new Error("Billable units must be a non-negative safe integer");let o=BigInt(e.numeratorUsdNanos)*BigInt(t),r=BigInt(e.denominatorUnits),n=(o*2n+r)/(r*2n);if(n>BigInt(Number.MAX_SAFE_INTEGER))throw new Error("Provider amount exceeds safe integer range");return Number(n)}function xt(e=process.env){let t=e.\u0042\u0052\u0049\u0047\u0048\u0054\u0044\u0041\u0054\u0041_SERP_CONTRACT_USD_PER_1000?.trim(),o=e.\u0042\u0052\u0049\u0047\u0048\u0054\u0044\u0041\u0054\u0041_SERP_RATE_SOURCE?.trim(),r=e.\u0042\u0052\u0049\u0047\u0048\u0054\u0044\u0041\u0054\u0041_SERP_RATE_POLICY_VERSION?.trim(),n=e.\u0042\u0052\u0049\u0047\u0048\u0054\u0044\u0041\u0054\u0041_SERP_RATE_EFFECTIVE_AT?.trim();if(!t&&!o&&!r&&!n)return null;if(!t||!o||!r||!n)throw new Error("\u0042\u0072\u0069\u0067\u0068\u0074 \u0044\u0061\u0074\u0061 SERP contract rate requires amount, source, policy version, and effective date");let a=Number(t);if(!Number.isFinite(a)||a<0)throw new Error("Invalid \u0042\u0072\u0069\u0067\u0068\u0074 \u0044\u0061\u0074\u0061 SERP contract amount");return ue({providerProduct:"\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061_serp_api",billingTier:"payg",billableEvent:"successful_delivery",unitType:"request",numeratorUsdNanos:Math.round(a*1e9),denominatorUnits:1e3,source:o,policyVersion:r,effectiveAt:n})}function _r(e){return ue({providerProduct:"\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061_browser_api",billingTier:e,billableEvent:"transferred_byte",unitType:"byte",numeratorUsdNanos:(e==="premium"?11:8)*1e9,denominatorUnits:1e9,source:`owner_confirmed_payg_2026-09-23;\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061_domain_snapshot_${Ct}`,policyVersion:"\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061-browser-domain-tier-2026-09-23",effectiveAt:"2026-09-23T00:00:00Z"})}function eo(e){return _r(X(e))}function Mt(){return ue({providerProduct:"apify_google_serp_scraperlink",billingTier:"store_pay_per_event",billableEvent:"serp_page",unitType:"page",numeratorUsdNanos:5e8,denominatorUnits:1e3,source:"https://apify.com/scraperlink/google-search-results-serp-scraper",policyVersion:"scraperlink-listing-2026-09-24",effectiveAt:"2026-09-24T00:00:00Z"})}var vr="https://api.\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061.com/request",Sr=8e3,Ar="brd.superproxy.io",Rr="44445",Pr=10*1024*1024;async function Er(e,t){let o=new URL(`http://${t.host}:${t.port}`);o.username=t.username,o.password=t.password;let r=new wr(o);try{return await new Promise((n,a)=>{let i=br(e,{agent:r,headers:{"x-unblock-data-format":"parsed"},rejectUnauthorized:!1,signal:t.signal},s=>{let u=[],l=0;s.on("data",c=>{let p=Buffer.isBuffer(c)?c:Buffer.from(c);if(l+=p.length,l>Pr){i.destroy(new Error("\u0042\u0072\u0069\u0067\u0068\u0074 \u0044\u0061\u0074\u0061 SERP response exceeded the maximum size"));return}u.push(p)}),s.on("end",()=>n({ok:(s.statusCode??500)>=200&&(s.statusCode??500)<300,status:s.statusCode??500,rawText:Buffer.concat(u).toString("utf8"),providerRequestId:typeof s.headers["x-response-id"]=="string"?s.headers["x-response-id"]:typeof s.headers["x-request-id"]=="string"?s.headers["x-request-id"]:null}))});i.on("error",()=>a(new Error("\u0042\u0072\u0069\u0067\u0068\u0074 \u0044\u0061\u0074\u0061 native SERP request failed"))),i.end()})}finally{r.destroy()}}function $t(e=process.env){let t=!!(e.\u0042\u0052\u0049\u0047\u0048\u0054\u0044\u0041\u0054\u0041_SERP_PROXY_USERNAME?.trim()&&e.\u0042\u0052\u0049\u0047\u0048\u0054\u0044\u0041\u0054\u0041_SERP_PROXY_PASSWORD?.trim()),o=!!((e.\u0042\u0052\u0049\u0047\u0048\u0054\u0044\u0041\u0054\u0041_SERP_API_KEY||e.\u0042\u0052\u0049\u0047\u0048\u0054\u0044\u0041\u0054\u0041_API_KEY)?.trim()&&e.\u0042\u0052\u0049\u0047\u0048\u0054\u0044\u0041\u0054\u0041_SERP_ZONE?.trim());return t||o}function m(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)?e:null}function N(e){return Array.isArray(e)?e:[]}function Ne(e){return typeof e=="string"&&e.trim()?e.trim():null}function R(e){return typeof e=="number"&&Number.isFinite(e)?e:typeof e=="string"&&e.trim()&&Number.isFinite(Number(e))?Number(e):null}function g(e,t){for(let o of t){let r=Ne(e[o]);if(r)return r}return null}function K(e){try{return new URL(e).hostname.replace(/^www\./,"")}catch{return""}}function zt(e){return{rawUrl:e,resolvedUrl:e,linkType:"plain",resolutionStatus:"not_needed"}}function kr(e){let t=e;if(typeof t=="string")try{t=JSON.parse(t)}catch{throw new Error("\u0042\u0072\u0069\u0067\u0068\u0074 \u0044\u0061\u0074\u0061 SERP API returned invalid JSON")}let o=m(t);if(!o)throw new Error("\u0042\u0072\u0069\u0067\u0068\u0074 \u0044\u0061\u0074\u0061 SERP API returned an invalid payload");if(typeof o.body=="string")try{let n=JSON.parse(o.body);if(m(n))return m(n)}catch{}let r=m(o.body);return r?m(r.result)??m(r.data)??r:m(o.result)??m(o.data)??o}function J(e,t){for(let r of t){let n=N(e[r]);if(n.length)return n}let o=m(e.results);if(o)for(let r of t){let n=N(o[r]);if(n.length)return n}return[]}function z(e,t){let o=[e,m(e.results)].filter(r=>!!r);for(let r of o)for(let n of t)if(Object.prototype.hasOwnProperty.call(r,n))return{observed:!0,rawShapeValid:Array.isArray(r[n]),rawCount:N(r[n]).length};return{observed:!1,rawShapeValid:!1,rawCount:0}}function Me(e,t){let o=[e,m(e.results)].filter(r=>!!r);for(let r of o)for(let n of t){if(!Object.prototype.hasOwnProperty.call(r,n))continue;let a=m(r[n]);return{observed:!0,rawShapeValid:a!==null,rawCount:a&&Object.keys(a).length>0?1:0}}return{observed:!1,rawShapeValid:!1,rawCount:0}}function Nt(e){return J(e,["organic","organic_results","organicResults"]).flatMap((t,o)=>{let r=m(t);if(!r)return[];let n=g(r,["link","url","href"]),a=g(r,["title","name"]);if(!n||!a)return[];let i=m(r.rating)??m(r.inline_rating);return[{position:Math.max(1,Math.trunc(R(r.global_rank)??R(r.rank)??R(r.position)??o+1)),title:a,url:n,...zt(n),domain:K(n),cite:g(r,["display_link","displayLink","cite"]),snippet:g(r,["description","snippet","text"]),isRedditStyle:K(n)==="reddit.com",inlineRating:i?{value:String(i.value??i.rating??""),count:String(i.count??i.reviews??"")}:null}]}).sort((t,o)=>t.position-o.position)}function Dt(e){return J(e,["snack_pack","local","local_results","local_pack","localPack"]).flatMap((t,o)=>{let r=m(t);if(!r)return[];let n=g(r,["title","name"]);if(!n)return[];let a=N(r.extensions??r.metadata).map(Ne).filter(i=>!!i);return[{position:Math.max(1,Math.trunc(R(r.global_rank)??R(r.rank)??R(r.position)??o+1)),name:n,cid:g(r,["cid"]),rating:g(r,["rating"])??(R(r.rating)!=null?String(R(r.rating)):null),reviewCount:g(r,["reviews_cnt","reviews","review_count","reviewCount"])??(R(r.reviews_cnt)!=null?String(R(r.reviews_cnt)):R(r.reviews)!=null?String(R(r.reviews)):null),metadata:a,websiteUrl:g(r,["website","website_url","link"]),directionsUrl:g(r,["directions","directions_url"])}]})}function Kt(e){let t=m(e);return N(t?.citations??t?.sources??t?.references).flatMap(o=>{let r=m(o);if(!r)return[];let n=g(r,["link","url","href"]);return n?[{text:g(r,["title","text","name"])??K(n),href:n,...zt(n)}]:[]})}function me(e,t=0){if(t>4)return[];if(Array.isArray(e))return e.flatMap(a=>me(a,t+1));let o=m(e);if(!o)return[];let r=g(o,["snippet","text","answer"]),n=me(o.texts??o.list??o.items,t+1);return[...r?[r]:[],...n]}function qt(e,t){if(!t)return{detected:!1,text:null,citations:[]};let o=m(e.ai_overview)??m(e.aiOverview)??m(e.overview);if(!o)return{detected:!1,text:null,citations:[]};let r=g(o,["text","answer","description"])??(me(o.texts).join(`
|
|
2
|
-
|
|
3
|
-
`).slice(0,5e4)||null),n=Kt(o);return{detected:!!(r||n.length),text:r,citations:n}}function Ht(e,t){if(!t)return{detected:!1,text:null,citations:[]};let o=m(e.ai_mode)??m(e.aiMode);if(!o)return{detected:!1,text:null,citations:[]};let r=g(o,["text","answer","description"])??(me(o.texts).join(`
|
|
4
|
-
|
|
5
|
-
`).slice(0,5e4)||null),n=Kt(o);return{detected:!!(r||n.length),text:r,citations:n}}function Ut(e,t){return t?[...J(e,["videos","video_results"]),...J(e,["short_videos","shorts"])].flatMap(o=>{let r=m(o);if(!r)return[];let n=g(r,["link","url"]),a=g(r,["title","name"]);return!n||!a?[]:[{type:"video",title:a,channel:g(r,["channel","source"])??"",platform:K(n),duration:g(r,["duration"])??"",url:n}]}):[]}function Bt(e,t){if(!t)return[];let o=m(e.forums);return[...J(e,["discussions","forums","forum_results"]),...N(o?.items)].flatMap(r=>{let n=m(r);if(!n)return[];let a=g(n,["link","url"]),i=g(n,["title","name"]);return!a||!i?[]:[{title:i,source:g(n,["source"])??K(a),url:a}]})}function Ft(e,t){return t?J(e,["what_people_are_saying","whatPeopleSaying"]).flatMap(o=>{let r=m(o);if(!r)return[];let n=g(r,["link","url"]),a=g(r,["title","name"]);if(!n||!a)return[];let i=g(r,["platform","source"])??K(n),s=i.toLowerCase();return[{type:s.includes("reddit")?"reddit":s.includes("facebook")?"facebook":s.includes("instagram")?"instagram":s.includes("tiktok")?"tiktok":s.includes("youtube")?"youtube":s.includes("news")?"news":"unknown",title:a,url:n,source:i,platform:i,popularComment:g(r,["comment","popular_comment"]),engagement:g(r,["engagement"])??"",date:g(r,["date"])??"",duration:g(r,["duration"]),authorNote:g(r,["author_note"])}]}):[]}var Ir={featuredSnippets:["featured_snippets","featured_snippet","featuredSnippet"],knowledgePanel:["knowledge","knowledge_graph","knowledgeGraph"],topStories:["top_stories","topStories"],news:["news","news_results"],images:["images","image_results"],shopping:["shopping","shopping_results"],relatedSearches:["related","related_searches","relatedSearches"],recipes:["recipes","recipe_results"],jobs:["jobs","job_results"],topAds:["top_ads"],bottomAds:["bottom_ads"],topProducts:["top_pla"],bottomProducts:["bottom_pla"],jackpotProducts:["jackpot_pla"],shortVideos:["short_videos","shorts"],localMap:["snack_pack_map"],flights:["flights"],hotels:["hotels_selection"],popularProducts:["popular_products"],weather:["weather"],currencyExchange:["currency_exchange"],latestPosts:["latest_posts"],perspectives:["perspectives"],navigation:["navigation"],chips:["chips"],spelling:["spelling"]};function de(e,t){for(let o of[e,m(e.results)])if(o){for(let r of t)if(Object.prototype.hasOwnProperty.call(o,r))return{observed:!0,value:o[r]}}return{observed:!1,value:null}}function pe(e,t,o){return e?t==null||Array.isArray(t)&&t.length===0?"observed_absent":Array.isArray(t)?o>0?"observed_present":"incomplete":m(t)?o>0?"observed_present":Object.keys(m(t)).length===0?"observed_absent":"incomplete":"incomplete":"unknown"}function Or(e,t){let o={},r=[["localPack",["snack_pack","local","local_results","local_pack","localPack"],t.localPack],["forums",["discussions","forums","forum_results"],t.forums],["videos",["videos","video_results","short_videos","shorts"],t.videos],["aiOverview",["ai_overview","aiOverview","overview"],t.aiOverview],["whatPeopleSaying",["what_people_are_saying","whatPeopleSaying"],t.whatPeopleSaying],["entityIds",["knowledge","knowledge_graph","knowledgeGraph"],t.entityIds]];for(let[u,l,c]of r){let p=de(e,l);o[u]=pe(p.observed,p.value,c)}let n=de(e,["ai_mode","aiMode"]);o.aiMode=pe(n.observed,n.value,t.aiMode);let a=de(e,["people_also_ask","peopleAlsoAsk","related_questions","paa"]),i=N(a.value).slice(0,30).flatMap(u=>{let l=m(u);if(!l)return[];let c=g(l,["question","title"]);return c?[{question:c.slice(0,1e3),answer:g(l,["answer","snippet","text"])?.slice(0,1e4)??null,url:g(l,["link","url"])??null}]:[]});o.paaPreview=pe(a.observed,a.value,i.length);let s=[];for(let[u,l]of Object.entries(Ir)){let c=de(e,l);if(!c.observed)continue;let p=m(c.value),w=(Array.isArray(c.value)?c.value:p&&(Array.isArray(p.items)||Array.isArray(p.posts))?[...N(p.items),...N(p.posts)]:[c.value]).slice(0,20).flatMap(S=>{let y=m(S);if(!y)return[];let O=g(y,["title","name","heading"]),k=g(y,["link","url","website"]),D=g(y,["description","snippet","text","summary","story"]);return!O&&!k&&!D?[]:[{title:O?.slice(0,1e3)??null,url:k,description:D?.slice(0,1e4)??null,position:R(y.global_rank)??R(y.rank)??R(y.position)??null}]});o[u]=pe(c.observed,c.value,w.length);let A=Object.fromEntries(Object.entries(p??{}).slice(0,30).flatMap(([S,y])=>/^[a-zA-Z0-9_]{1,80}$/.test(S)&&(y===null||["string","number","boolean"].includes(typeof y))?[[S,typeof y=="string"?y.slice(0,2e3):y]]:[]));s.push({name:u,attributes:A,items:w})}return{status:o,paaPreview:i,additional:s}}function Gt(e,t){let o=new Set,r=new Set(t.map(i=>i.cid).filter(i=>!!i)),n=new Set,a=(i,s=0)=>{if(s>6||i==null)return;if(Array.isArray(i)){for(let l of i)a(l,s+1);return}let u=m(i);if(u)for(let[l,c]of Object.entries(u)){let p=l.toLowerCase().replace(/[^a-z]/g,""),_=Ne(c);_&&(p==="kgid"||p==="kgmid"||p==="mid")?o.add(_):_&&p==="cid"?r.add(_):_&&p==="gcid"?n.add(_):typeof c=="object"&&a(c,s+1)}};return a(e),{entities:[],kgIds:[...o],cids:[...r],gcids:[...n]}}function Lt(e,t){let o=e instanceof Error?e.message:String(e);return t.aborted||/timeout|timed out/i.test(o)?"timeout":/captcha|recaptcha|unusual traffic|google\.com\/sorry|blocked/i.test(o)?"captcha":/invalid (?:json|payload)/i.test(o)?"invalid_payload":"provider_error"}function Vt(e){return e==="invalid_payload"?"invalid_payload":e==="captcha"?"serp_readiness":e==="timeout"||e==="provider_error"?"provider_transport":"pagination"}async function De(e,t=process.env,o=fetch,r=Er,n){let a=(t.\u0042\u0052\u0049\u0047\u0048\u0054\u0044\u0041\u0054\u0041_SERP_API_KEY||t.\u0042\u0052\u0049\u0047\u0048\u0054\u0044\u0041\u0054\u0041_API_KEY)?.trim(),i=t.\u0042\u0052\u0049\u0047\u0048\u0054\u0044\u0041\u0054\u0041_SERP_ZONE?.trim(),s=t.\u0042\u0052\u0049\u0047\u0048\u0054\u0044\u0041\u0054\u0041_SERP_PROXY_USERNAME?.trim(),u=t.\u0042\u0052\u0049\u0047\u0048\u0054\u0044\u0041\u0054\u0041_SERP_PROXY_PASSWORD?.trim(),l=!!(s&&u);if(!l&&(!a||!i))throw new Error("Direct SERP API is not configured");let c=Date.now(),p=yt(),_=null,w=e.location?St(e.location):null;if(e.location&&!w?.canonical)throw new G("query_integrity","location_unresolved",`SERP location could not be resolved without changing the query (candidates: ${w?.ambiguousCandidates??0})`);let A=w?.canonical?vt(w.canonical):null,S=AbortSignal.timeout(e.includeAllSerpFeatures?e.pages>=2?68e3:33e3:Sr),y=e.signal?AbortSignal.any([e.signal,S]):S,O=e.pages>=2?2:1,k=[],D=[],$e=0,ze=async d=>{let I=Date.now(),b=l?"\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061_serp_native_proxy":"\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061_serp_rest",T=null,q=null,j=!1,Q=!1,F=null,W=null;if(p?.operationRunId&&(d===1||_))try{T=await V({runId:p.operationRunId,attemptNumber:n?n.attemptNumber+d-1:d,method:b,provider:"\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061",...d===2?{parentAttemptId:_,edgeKind:"next_phase"}:n?{parentAttemptId:n.parentAttemptId,edgeKind:"provider_fallback",retryKind:"provider_fallback"}:{},normalizedFlags:{page:d,device:e.device,hasLocation:!!e.location}}),d===1&&(_=T),q=(await H({attemptId:T,provider:"\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061",providerProduct:"\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061_serp_api",accountScope:p.operationAccountScope??"production-default",method:b,providerStatus:"started"})).id}catch(h){throw console.warn(JSON.stringify({event:"direct_serp_telemetry_start_failed",page:d,message:h instanceof Error?h.message:String(h)})),h}let P=new URLSearchParams({q:e.query,gl:e.gl,hl:e.hl,pws:"0",num:"10",...d===2?{start:"10"}:{}}),ne=it(e.recency);ne&&P.set("tbs",ne),e.device==="mobile"&&P.set("brd_mobile","1"),(e.includeAiOverview||e.includeAllSerpFeatures)&&P.set("brd_ai_overview","2"),A&&P.set("uule",A),l&&P.set("brd_json","1"),$e+=1;let x;try{if(l){let E=t.\u0042\u0052\u0049\u0047\u0048\u0054\u0044\u0041\u0054\u0041_SERP_PROXY_HOST?.trim()||Ar,Y=t.\u0042\u0052\u0049\u0047\u0048\u0054\u0044\u0041\u0054\u0041_SERP_PROXY_PORT?.trim()||Rr;x=await r(`https://www.google.com/search?${P}`,{username:s,password:u,host:E,port:Y,signal:y})}else{let E=await o(vr,{method:"POST",headers:{Authorization:`Bearer ${a}`,"Content-Type":"application/json"},body:JSON.stringify({zone:i,url:`https://www.google.com/search?${P}`,format:"json",data_format:"parsed"}),signal:y});x={ok:E.ok,status:E.status,rawText:await E.text(),providerRequestId:E.headers.get("x-response-id")??E.headers.get("x-request-id")}}if(W=`http_${x.status}`,q&&x.providerRequestId&&await U(q,x.providerRequestId),!x.ok)throw new Error(`\u0042\u0072\u0069\u0067\u0068\u0074 \u0044\u0061\u0074\u0061 SERP API failed with HTTP ${x.status}`);j=!0;let h;try{h=kr(JSON.parse(x.rawText))}catch(E){let Y=E instanceof Error&&E.message!=="Unexpected end of JSON input"?E.message:"\u0042\u0072\u0069\u0067\u0068\u0074 \u0044\u0061\u0074\u0061 SERP API returned invalid JSON";throw new G("invalid_payload","invalid_provider_payload",Y)}let f=Nt(h);return k.push({page:d,attempted:!0,captured:f.length>0,resultCount:f.length,requestOffset:d===2?10:0,providerRequestIdObserved:!!x.providerRequestId,...f.length===0?{failureCode:"empty_page"}:{}}),Q=!0,h}catch(h){F=h;let f=Lt(h,y);if(k.some(Y=>Y.page===d)||k.push({page:d,attempted:!0,captured:!1,resultCount:0,requestOffset:d===2?10:0,providerRequestIdObserved:!1,failureCode:f}),d===2)throw h;let E=h instanceof G?h.stage:Vt(f);throw h instanceof G?h:new G(E,f,h instanceof Error?h.message:String(h))}finally{let h=null;if(q&&j)try{let f=xt(t);f&&await B({receiptId:q,costState:"measured",units:1,unitType:"request",amountUsdNanos:ce(f,1),rateSource:f.source,providerProduct:f.providerProduct,billingTier:f.billingTier,billableEvent:f.billableEvent,measurementSource:"provider_http_delivery",rateNumerator:f.numeratorUsdNanos,rateDenominator:f.denominatorUnits,ratePolicyVersion:f.policyVersion,rateEffectiveAt:f.effectiveAt,providerStatus:W??"delivered",providerDurationMs:Date.now()-I})}catch(f){console.warn(JSON.stringify({event:"direct_serp_receipt_finalize_failed",page:d,message:f instanceof Error?f.message:String(f)})),h=f}if(T&&await $({attemptId:T,status:Q?"succeeded":y.aborted?"timed_out":"failed",errorCode:F?Lt(F,y):null,durationMs:Date.now()-I}).catch(f=>console.warn(JSON.stringify({event:"direct_serp_attempt_finish_failed",page:d,message:f instanceof Error?f.message:String(f)}))),h)throw h}};try{D.push({page:1,payload:await ze(1)})}catch(d){throw d}let Ke=null;if(O===2)try{D.push({page:2,payload:await ze(2)})}catch(d){Ke=d}let sr=Date.now()-c,lr=Date.now(),v=D[0].payload,ur=D.flatMap(({page:d,payload:I})=>Nt(I).map(b=>({...b,position:d===2&&b.position<=10?b.position+10:b.position,sourcePage:d}))).filter((d,I,b)=>b.findIndex(T=>Ie(T.url)===Ie(d.url))===I),Je=e.includeLocalPack||e.includeAllSerpFeatures,ye=Je?Dt(v):[],_e=z(v,["snack_pack","local","local_results","local_pack","localPack"]),cr=L({requested:Je,moduleObserved:_e.observed,rawCount:_e.rawCount,mappedCount:ye.length,rawShapeValid:_e.rawShapeValid}),je=e.includeAiOverview||e.includeAllSerpFeatures,Qe=qt(v,je),We=e.includeForums||e.includeAllSerpFeatures,Ye=Bt(v,We),Xe=e.includeVideos||e.includeAllSerpFeatures,Ze=Ut(v,Xe),et=e.includeWhatPeopleSaying||e.includeAllSerpFeatures,tt=Ft(v,et),be=m(v.forums),we=be&&Array.isArray(be.items)?{observed:!0,rawCount:be.items.length,rawShapeValid:!0}:z(v,["discussions","forums","forum_results"]),ve=z(v,["videos","video_results","short_videos","shorts"]),rt={localPack:cr,forums:L({requested:We,moduleObserved:we.observed,rawCount:we.rawCount,mappedCount:Ye.length,rawShapeValid:we.rawShapeValid}),videos:L({requested:Xe,moduleObserved:ve.observed,rawCount:ve.rawCount,mappedCount:Ze.length,rawShapeValid:ve.rawShapeValid}),aiOverview:L({requested:je,moduleObserved:Me(v,["ai_overview","aiOverview","overview"]).observed,rawCount:Me(v,["ai_overview","aiOverview","overview"]).rawCount,mappedCount:Qe.detected?1:0,rawShapeValid:Me(v,["ai_overview","aiOverview","overview"]).rawShapeValid}),whatPeopleSaying:L({requested:et,moduleObserved:z(v,["what_people_are_saying","whatPeopleSaying"]).observed,rawCount:z(v,["what_people_are_saying","whatPeopleSaying"]).rawCount,mappedCount:tt.length,rawShapeValid:z(v,["what_people_are_saying","whatPeopleSaying"]).rawShapeValid})},dr=ae(O,k),pr=k.find(d=>d.page===1)?.resultCount??0,re=k.find(d=>d.page===2)?.resultCount??0,mr=se({query:e.query,finalQuery:e.query,canonicalLocation:w?.canonical??null,locationResolutionSource:w?.source??"not_requested",locationAmbiguousCandidates:w?.ambiguousCandidates??0,uule:A,outboundProviderMethod:l?"\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061_serp_native_proxy":"\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061_serp_rest"}),oe=Ke?Vt(k.find(d=>d.page===2)?.failureCode??"provider_error"):Object.values(rt).some(d=>d==="incomplete"||d==="unknown")?"optional_feature_parsing":null,gr={pagination:{...dr,providerRequestCount:$e},features:rt,queryIntegrity:mr,failureStage:oe},ot=e.includeAllSerpFeatures?(()=>{let d=D.map(({page:I,payload:b})=>{let T=Dt(b),q=Bt(b,!0),j=Ut(b,!0),Q=Ft(b,!0),F=qt(b,!0),W=Ht(b,!0),P=Gt(b,T),ne=Or(b,{localPack:T.length,forums:q.length,videos:j.length,aiOverview:F.detected?1:0,aiMode:W.detected?1:0,whatPeopleSaying:Q.length,entityIds:P.entities.length+P.kgIds.length+P.cids.length+P.gcids.length});return{page:I,...ne,localPack:T,forums:q,videos:j,whatPeopleSaying:Q,aiOverview:F,aiMode:W,entityIds:P}});return{status:d[0].status,paaPreview:d.flatMap(I=>I.paaPreview),additional:d.flatMap(I=>I.additional),pages:d}})():void 0,fr=new Date().toISOString(),nt=Date.now()-c;return{seed:e.query,location:e.location??null,extractedAt:fr,diagnostics:{phaseTimings:{providerConnectMs:sr,serpParseMs:Date.now()-lr,totalServerMs:nt},pagination:{requestedPages:O,capturedPages:O===2&&re>0?2:1,page2Status:O===2?re>0?"captured":"failed":"not_requested",page1OrganicCount:pr,page2OrganicCount:re,...O===2&&re===0?{failureCode:k.find(d=>d.page===2)?.failureCode==="captcha"?"captcha":k.find(d=>d.page===2)?.failureCode==="timeout"?"timeout":"empty_page"}:{}},completionStatus:"serp_only",problem:null,resultQuality:oe?"partial":"complete",degradedResult:!!oe,degradationReasons:[],retryRecommended:!!oe,serpCompleteness:gr},totalQuestions:0,surface:"web",aiOverview:Qe,aiMode:Ht(v,e.includeAllSerpFeatures),...ot?{fullSerpFeatures:ot}:{},whatPeopleSaying:tt,tree:[],flat:[],videos:Ze,forums:Ye,organicResults:ur,localPack:ye,entityIds:Gt(v,ye),stats:{seed:e.query,totalQuestions:0,maxDepthReached:0,durationMs:nt,errorCount:0}}}var Tr="scraperlink~google-search-results-serp-scraper",Z="https://api.apify.com/v2";var C=class extends Error{constructor(o,r=null,n=!1,a=null){super(o);this.runId=r;this.retrySafe=n;this.terminalStatus=a;this.name="ApifyGoogleRunError"}runId;retrySafe;terminalStatus};function ee(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:null}function te(e){return typeof e=="string"&&e.trim()?e.trim():null}function Cr(e){try{return["http:","https:"].includes(new URL(e).protocol)}catch{return!1}}function xr(e){if(typeof e!="string")return e;try{return JSON.parse(e)}catch{throw new Error("Apify searchResults is not valid JSON")}}function Jt(e,t){if(!Array.isArray(e)||e.length===0)throw new Error("Apify dataset contains no search results");let o=[];for(let[a,i]of e.entries()){let s=ee(i);if(!s)throw new Error("Apify dataset contains an invalid row");let u=xr(s.searchResults??s),l=ee(u),c=Array.isArray(u)?u:Array.isArray(l?.results)?l.results:Array.isArray(l?.organicResults)?l.organicResults:Array.isArray(l?.organic)?l.organic:l&&(l.position!==void 0||l.title!==void 0)?[l]:null;if(!c)throw new Error("Apify dataset search result shape is unsupported");let p=Number(s.page_number??l?.page_number??a+1);if(!Number.isInteger(p)||p<1||p>t)throw new Error("Apify dataset has an unexpected page number");o.push(...c.map(_=>({row:_,page:p})))}let r=o.map(({row:a,page:i},s)=>{let u=ee(a),l=u?.position,c=te(u?.title),p=te(u?.url??u?.link);if(!u||!c||!p||!Cr(p)||l!==void 0&&(!Number.isInteger(l)||l<1))throw new Error(`Apify search result ${s+1} is missing a valid position, URL, or title`);let _=te(u.description??u.snippet),w=typeof l=="number"?l:s%10+1;return{position:i>1&&w<=10?w+(i-1)*10:w,url:p,title:c,description:_}});if(r.length>t*10)throw new Error("Apify returned more results than requested");let n={page1:r.filter(a=>a.position<=10).length,page2:r.filter(a=>a.position>10).length};if(n.page1===0||t===2&&n.page2===0)throw new Error("Apify did not return every requested result page");return{results:r,pageResultCounts:n}}async function ge(e,t,o,r){let n=await o(e,{headers:{Authorization:`Bearer ${t}`},signal:r});if(!n.ok)throw new Error(`Apify API returned HTTP ${n.status}`);return n.json()}function qe(e){let t=ee(ee(e)?.data),o=te(t?.id),r=te(t?.status);if(!o||!r)throw new Error("Apify returned an invalid run receipt");return{id:o,status:r}}async function Mr(e,t=fetch){let o=performance.now(),r=AbortSignal.timeout(9e4),n=e.signal?AbortSignal.any([e.signal,r]):r,a=e.runId,i=!1,s=null;try{if(!/^[A-Za-z0-9]+$/.test(a))throw new Error("Invalid Apify run ID");let u=qe(await ge(`${Z}/actor-runs/${a}?waitForFinish=30`,e.token,t,n));for(;["READY","RUNNING","TIMING-OUT","ABORTING"].includes(u.status);)u=qe(await ge(`${Z}/actor-runs/${a}?waitForFinish=30`,e.token,t,n));if(i=!0,s=u.status,u.status!=="SUCCEEDED")throw new Error(`Apify run ended with status ${u.status}`);let l=e.pages??1,c=await ge(`${Z}/actor-runs/${a}/dataset/items?format=json`,e.token,t,n);return{query:e.query,...Jt(c,l),requestedPages:l,runId:a,elapsedMs:Math.round(performance.now()-o)}}catch(u){throw new C(u instanceof Error?u.message:String(u),a,i,s)}}async function jt(e,t,o=fetch){let r=performance.now(),n=e.query.trim(),a=e.pages??1;if(!n||n.includes(`
|
|
6
|
-
`))throw new Error("Apify search requires one nonempty query");if(a!==1&&a!==2)throw new Error("Apify search supports one or two pages");let i=t.token.trim();if(!i)throw new Error("Apify API token is required");let s=t.maxChargeUsd??.01;if(!Number.isFinite(s)||s<=0)throw new Error("Invalid Apify charge cap");let u=AbortSignal.timeout(9e4),l=e.signal?AbortSignal.any([e.signal,u]):u,c=`${Z}/actors/${Tr}/runs?maxTotalChargeUsd=${s}&restartOnError=false&waitForFinish=30`,p=null,_=!1,w=null;try{let A=await o(c,{method:"POST",headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"},body:JSON.stringify({keyword:n,limit:a===2?"20":"10",page:1,proxy_location:"us",include_merged:!1}),signal:l});if(!A.ok)throw new Error(`Apify run start returned HTTP ${A.status}`);let S=qe(await A.json());if(p=S.id,_=!["READY","RUNNING","TIMING-OUT","ABORTING"].includes(S.status),_&&(w=S.status),S.status!=="SUCCEEDED"&&S.status!=="READY"&&S.status!=="RUNNING")throw new Error(`Apify run ended with status ${S.status}`);if(S.status==="SUCCEEDED"){let O=await ge(`${Z}/actor-runs/${p}/dataset/items?format=json`,i,o,l);return{query:n,...Jt(O,a),requestedPages:a,runId:p,elapsedMs:Math.round(performance.now()-r)}}return{...await Mr({runId:p,query:n,token:i,pages:a,signal:l},o),elapsedMs:Math.round(performance.now()-r)}}catch(A){throw A instanceof C?A:new C(A instanceof Error?A.message:String(A),p,_,w)}}var Qt="apify_google_serp",Wt="apify",Nr="apify_google_serp_scraperlink";async function Yt(e,t,o,r){let n=Mt();await B({receiptId:e,costState:"estimated",units:t,unitType:n.unitType,amountUsdNanos:ce(n,t),rateSource:n.source,providerProduct:n.providerProduct,billingTier:n.billingTier,billableEvent:n.billableEvent,measurementSource:"actor_run_succeeded",rateNumerator:n.numeratorUsdNanos,rateDenominator:n.denominatorUnits,ratePolicyVersion:n.policyVersion,rateEffectiveAt:n.effectiveAt,providerStatus:r,providerDurationMs:o})}async function Xt(e){let t=performance.now(),o=await V({runId:e.operationRunId,attemptNumber:e.attemptNumber,method:Qt,provider:Wt,parentAttemptId:e.parentAttemptId,edgeKind:e.edgeKind,retryKind:e.retryKind,normalizedFlags:{page:1,pages:e.options.pages??1,proxyLocation:"us"}}),r=await H({attemptId:o,provider:Wt,providerProduct:Nr,billingTier:"store_pay_per_event",accountScope:e.accountScope,method:Qt,providerStatus:"before_actor_start"}),n=null,a=null;try{return n=await jt(e.options,{token:e.token},e.fetchImpl),await U(r.id,n.runId),await Yt(r.id,n.requestedPages,n.elapsedMs,"succeeded_estimated"),{...n,attemptId:o}}catch(i){throw a=i,n?Object.assign(new C("Apify cost tracking failed after run completion",n.runId),{attemptId:o}):(i instanceof C&&i.runId&&(await U(r.id,i.runId),i.terminalStatus==="SUCCEEDED"?await Yt(r.id,e.options.pages??1,Math.round(performance.now()-t),"succeeded_dataset_unavailable"):await Et({receiptId:r.id,units:e.options.pages??1,unitType:"page",providerStatus:"run_outcome_or_cost_pending"})),Object.assign(i instanceof Error?i:new Error(String(i)),{attemptId:o}))}finally{await $({attemptId:o,status:a?e.options.signal?.aborted?"timed_out":"failed":"succeeded",errorCode:a?"apify_search_failed":null,durationMs:Math.round(performance.now()-t)})}}function Zt(e){let t=e.results.map(r=>{let n=new URL(r.url).hostname.replace(/^www\./,"");return{position:r.position,title:r.title,url:r.url,rawUrl:r.url,resolvedUrl:r.url,linkType:"plain",resolutionStatus:"not_needed",domain:n,cite:null,snippet:r.description,isRedditStyle:n==="reddit.com",inlineRating:null}}),o=ae(e.requestedPages,[{page:1,attempted:!0,captured:!0,resultCount:e.pageResultCounts.page1,requestOffset:0,providerRequestIdObserved:!0},...e.requestedPages===2?[{page:2,attempted:!0,captured:!0,resultCount:e.pageResultCounts.page2,requestOffset:10,providerRequestIdObserved:!0}]:[]]);return{seed:e.query,location:null,extractedAt:new Date().toISOString(),diagnostics:{phaseTimings:{providerConnectMs:e.elapsedMs,totalServerMs:e.elapsedMs},pagination:{requestedPages:e.requestedPages,capturedPages:e.requestedPages,page2Status:e.requestedPages===2?"captured":"not_requested",page1OrganicCount:e.pageResultCounts.page1,page2OrganicCount:e.pageResultCounts.page2},completionStatus:"serp_only",problem:null,resultQuality:"complete",degradedResult:!1,degradationReasons:[],retryRecommended:!1,serpCompleteness:{pagination:o,features:{localPack:"not_requested",forums:"not_requested",videos:"not_requested",aiOverview:"not_requested",whatPeopleSaying:"not_requested"},queryIntegrity:se({query:e.query,finalQuery:e.query,locationResolutionSource:"not_requested",outboundProviderMethod:"default_search"}),failureStage:null}},totalQuestions:0,surface:"web",aiOverview:{detected:!1,text:null,citations:[],shareUrl:null},aiMode:{detected:!1,text:null,citations:[]},whatPeopleSaying:[],tree:[],flat:[],videos:[],forums:[],organicResults:t,localPack:[],entityIds:{entities:[],kgIds:[],cids:[],gcids:[]},stats:{seed:e.query,totalQuestions:0,maxDepthReached:0,durationMs:e.elapsedMs,errorCount:0}}}var Dr=12e3;async function er(e){if(e.mode==="full")return qr(e);if(!e.token)throw new Error("Apify search is not configured");let t=performance.now(),o;for(let n=1;n<=2;n++){let a=AbortSignal.any([e.signal,AbortSignal.timeout(Dr)]);try{let i=await Xt({options:{query:e.query,pages:e.pages,signal:a},token:e.token,operationRunId:e.operationRunId,accountScope:e.accountScope,attemptNumber:n,...o?{parentAttemptId:o,edgeKind:"same_method_retry",retryKind:"same_method"}:{}});console.info(JSON.stringify({event:"serp_provider_succeeded",provider:"apify",operationRunId:e.operationRunId,attemptNumber:n,durationMs:i.elapsedMs,resultCount:i.results.length,pages:i.requestedPages,runId:i.runId}));let s=Zt(i);return s.stats.durationMs=Math.round(performance.now()-t),s.diagnostics.phaseTimings&&(s.diagnostics.phaseTimings.totalServerMs=s.stats.durationMs),{result:s,mode:"light",deliveryProvider:"apify",deliveredPages:i.requestedPages}}catch(i){o=i&&typeof i=="object"&&"attemptId"in i?String(i.attemptId):void 0;let s=i instanceof C?i:null;if(console.warn(JSON.stringify({event:"serp_provider_failed",provider:"apify",operationRunId:e.operationRunId,attemptNumber:n,runId:s?.runId??null,retrySafe:s?.retrySafe===!0,error:i instanceof Error?i.message:String(i)})),e.signal.aborted||!o||s?.retrySafe!==!0)throw i}}if(!o)throw new Error("Search attempt receipt is missing");let r={query:e.query,gl:"us",hl:"en",device:"desktop",pages:e.pages,includeAllSerpFeatures:!1,includeLocalPack:!1,includeForums:!1,includeVideos:!1,includeAiOverview:!1,includeWhatPeopleSaying:!1,signal:e.signal};console.info(JSON.stringify({event:"serp_provider_fallback",provider:"\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061",operationRunId:e.operationRunId,attemptNumber:3}));try{let n=await De(r,process.env,fetch,void 0,{attemptNumber:3,parentAttemptId:o});if(n.organicResults.length===0)throw new Error("Search returned no organic results");return n.stats.durationMs=Math.round(performance.now()-t),n.diagnostics.phaseTimings&&(n.diagnostics.phaseTimings.totalServerMs=n.stats.durationMs),console.info(JSON.stringify({event:"serp_provider_succeeded",provider:"\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061",operationRunId:e.operationRunId,attemptNumber:3,durationMs:n.stats.durationMs,resultCount:n.organicResults.length,pages:e.pages})),{result:n,mode:"light",deliveryProvider:"\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061",deliveredPages:n.diagnostics.pagination?.capturedPages===2?2:1}}catch(n){throw console.warn(JSON.stringify({event:"serp_provider_failed",provider:"\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061",operationRunId:e.operationRunId,attemptNumber:3,error:n instanceof Error?n.message:String(n)})),n}}async function qr(e){let t=performance.now(),o={query:e.query,gl:"us",hl:"en",device:"desktop",pages:e.pages,includeAllSerpFeatures:!0,includeLocalPack:!0,includeForums:!0,includeVideos:!0,includeAiOverview:!0,includeWhatPeopleSaying:!0,signal:e.signal},r=await De(o);if(r.organicResults.length===0)throw new Error("Full Search returned no organic results");return r.stats.durationMs=Math.round(performance.now()-t),r.diagnostics.phaseTimings&&(r.diagnostics.phaseTimings.totalServerMs=r.stats.durationMs),{result:r,mode:"full",deliveryProvider:"\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061",deliveredPages:r.diagnostics.pagination?.capturedPages===2?2:1}}async function He(e,t,o=3){for(let r=1;r<=o;r++){try{let n=await fetch(e,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(t),signal:AbortSignal.timeout(1e4)});if(n.ok)return;console.warn(`[webhook] attempt ${r} \u2192 ${n.status} from ${e}`)}catch(n){console.warn(`[webhook] attempt ${r} failed:`,n instanceof Error?n.message:n)}r<o&&await new Promise(n=>setTimeout(n,1e3*r*2))}console.error(`[webhook] gave up after ${o} attempts for ${e}`)}function Hr(e){return e instanceof Error?e.message:String(e)}function Ur(e,t){return e instanceof DOMException&&(e.name==="TimeoutError"||e.name==="AbortError")?!0:/timeout|timed out|Timeout \d+ms exceeded|deadline/i.test(t)}function Br(e){return/captcha|recaptcha|unusual traffic|google\.com\/sorry|blocked/i.test(e)}function Fr(e){return/ERR_TUNNEL_CONNECTION_FAILED|ERR_PROXY_CONNECTION_FAILED|ERR_SOCKS_CONNECTION_FAILED|tunnel connection failed|proxy connection failed|transport error: proxy/i.test(e)}function Gr(e){return/proxy unavailable|proxy_unavailable|connection_test_failed|did not return a proxy id|configured fallback/i.test(e)}function Lr(e){return/(?:spending|billing|organization|account).{0,80}(?:cap|limit|blocked|disabled)|(?:quota|capacity).{0,40}(?:reached|exceeded)|https?:\/\/\S*dashboard/i.test(e)}function Vr(e){return/browser (?:has been )?closed|context (?:has been )?closed|target page, context or browser has been closed|session closed|page has been closed/i.test(e)}function Ue(e){let t=Hr(e);return e instanceof ct?{error_code:"request_aborted",error_type:"request_aborted",message:M("request_aborted"),retryable:!0,httpStatus:408,terminalStatus:"cancelled"}:e instanceof ut||Br(t)?{error_code:"captcha_exhausted",error_type:"captcha",message:M("captcha_exhausted"),retryable:!0,httpStatus:503,terminalStatus:"failed"}:Tt(e,t)?{error_code:"vendor_unavailable",error_type:"service_unavailable",message:M("vendor_unavailable"),retryable:!0,httpStatus:503,terminalStatus:"failed"}:e instanceof dt?{error_code:"location_mismatch",error_type:"location_mismatch",message:M("location_mismatch"),retryable:!0,httpStatus:503,terminalStatus:"failed"}:Fr(t)?{error_code:"proxy_tunnel_failed",error_type:"connection",message:M("proxy_tunnel_failed"),retryable:!0,httpStatus:503,terminalStatus:"failed"}:Gr(t)?{error_code:"proxy_unavailable",error_type:"connection",message:M("proxy_unavailable"),retryable:!0,httpStatus:503,terminalStatus:"failed"}:Vr(t)?{error_code:"browser_session_interrupted",error_type:"extraction",message:M("browser_session_interrupted"),retryable:!0,httpStatus:503,terminalStatus:"failed"}:Ur(e,t)?{error_code:"harvest_timeout",error_type:"timeout",message:M("harvest_timeout"),retryable:!0,httpStatus:504,terminalStatus:"failed"}:Lr(t)?{error_code:"service_unavailable",error_type:"service_unavailable",message:Se,retryable:!0,httpStatus:503,terminalStatus:"failed"}:{error_code:"extraction_failed",error_type:"extraction",message:Se,retryable:!1,httpStatus:500,terminalStatus:"failed"}}function Be(e){return JSON.stringify({error_code:e.error_code,error_type:e.error_type,message:e.message,retryable:e.retryable})}function fe(e,t={}){let o=lt({errorCode:e.error_code,errorType:e.error_type,retryable:e.retryable,retryAfterSeconds:t.retryAfterSeconds,chargeStatus:t.chargeStatus,details:t.details});return{error:o.message,...o}}function Fe(e,t={}){let{error:o,...r}=fe(e,t);return r}function ko(e,t={}){let o=Ue(e);return{body:fe(o,t),status:o.httpStatus}}import{createHash as $r}from"crypto";var zr=1e9;function Kr(e){return $r("sha256").update(JSON.stringify(e)).digest("hex")}function he(e){return`harvest:${e}`}async function Mo(e){let t=he(e.jobId);try{return(await Rt({id:t,userId:e.userId,ownerScope:`user:${e.userId}`,tool:e.tool,normalizedFlags:e.normalizedFlags,idempotencyKey:`job:${e.jobId}`,requestFingerprint:Kr(e.normalizedFlags),jobId:e.jobId,requestId:e.requestId??null,deploymentCommit:process.env.VERCEL_GIT_COMMIT_SHA?.trim()||process.env.GIT_COMMIT_SHA?.trim()||null})).id}catch(o){return console.warn(JSON.stringify({event:"operation_run_start_failed",job_id:e.jobId,tool:e.tool,message:o instanceof Error?o.message:String(o)})),null}}async function Le(e,t,o){if(e)try{await Pt({runId:e,status:t,failureClass:o})}catch(r){console.warn(JSON.stringify({event:"operation_run_finish_failed",operation_run_id:e,message:r instanceof Error?r.message:String(r)}))}}async function No(e,t,o,r){if(!(!e||!t))try{await kt({runId:e,billingTable:"billing_debits",billingKey:t,relation:o,amountMc:r})}catch(n){console.warn(JSON.stringify({event:"operation_billing_link_failed",operation_run_id:e,relation:o,message:n instanceof Error?n.message:String(n)}))}}function Ge(e){return e==="timeout"?"timed_out":e==="request_aborted"?"cancelled":e==="browser_session_interrupted"?"interrupted":e==="captcha"||e==="proxy_tunnel_failed"||e==="proxy_unavailable"||e==="location_mismatch"||e==="error"?"failed":"succeeded"}function Jr(e){return e==="\u0062\u0072\u0069\u0067\u0068\u0074_\u0064\u0061\u0074\u0061_browser_api"?"\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061":"\u006b\u0065\u0072\u006e\u0065\u006c"}function tr(e,t,o=0){let r=new Map,n=null;return async a=>{if(e)try{if(a.type==="started"){let s=o+a.attemptNumber;if(s>1&&!n){let p=(await It(e))?.attempts.at(-1);n=p?.id==null?null:String(p.id)}let u=await V({runId:e,attemptNumber:s,method:a.method,provider:a.provider,parentAttemptId:s===1?null:n,edgeKind:s===1?null:o>0&&a.attemptNumber===1?"durable_resume":a.retryKind==="provider_fallback"?"provider_fallback":"same_method_retry",retryKind:s===1?null:o>0&&a.attemptNumber===1?"durable_resume":a.retryKind,retryReason:s===1?null:o>0&&a.attemptNumber===1?"durable_worker_resume":a.retryReason,retryOwner:s===1?null:o>0&&a.attemptNumber===1?"durable_reconciler":"harvest",normalizedFlags:{maxAttempts:a.maxAttempts,maxQuestions:a.maxQuestions,hasLocation:!!a.location,plannedProvider:a.provider,planReason:a.planReason??null,planTimeoutMs:a.planTimeoutMs??null},startedAt:a.startedAt}),l=await H({attemptId:u,provider:a.provider,providerProduct:a.provider==="\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061"?"\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061_browser_api":"\u006b\u0065\u0072\u006e\u0065\u006c_browser",billingTier:a.provider==="\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061"?X("https://www.google.com/search"):null,accountScope:t,method:a.method,providerStatus:"started"});r.set(a.attemptNumber,{attemptId:u,receiptId:l.id,plannedProvider:a.provider,observedProvider:null,providerMismatch:!1,method:a.method,startedAtMs:Date.parse(a.startedAt),billingMode:null}),n=u;return}let i=r.get(a.attemptNumber);if(!i)throw new Error(`Missing operation attempt state for attempt ${a.attemptNumber}`);if(a.type==="provider_session_started"){let s=Jr(a.provider);if(i.observedProvider=s,i.billingMode=a.billingMode??null,s!==i.plannedProvider){i.providerMismatch=!0,await B({receiptId:i.receiptId,costState:"unavailable",providerStatus:"provider_mismatch",errorCode:"provider_mismatch",errorMessage:`Planned ${i.plannedProvider}; observed ${s}`,finalizedAt:a.observedAt});let u=s==="\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061"?"\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061_browser":"\u006b\u0065\u0072\u006e\u0065\u006c_browser",l=await H({attemptId:i.attemptId,provider:s,providerProduct:s==="\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061"?"\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061_browser_api":"\u006b\u0065\u0072\u006e\u0065\u006c_browser",billingTier:s==="\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061"?X("https://www.google.com/search"):null,accountScope:t,method:u,providerStatus:"observed_provider_mismatch"});i.receiptId=l.id,i.method=u}await U(i.receiptId,a.providerSessionId);return}if(await $({attemptId:i.attemptId,status:i.providerMismatch?"failed":Ge(a.outcome),errorCode:i.providerMismatch?"provider_mismatch":Ge(a.outcome)==="succeeded"?null:a.outcome,errorMessage:a.error,durationMs:a.durationMs,endedAt:a.completedAt}),(i.observedProvider??i.plannedProvider)==="\u006b\u0065\u0072\u006e\u0065\u006c"){let s=i.billingMode==="headful",u=i.billingMode==="headless"||i.billingMode==="headful"?wt(a.durationMs,s):null;await B({receiptId:i.receiptId,costState:"estimated",units:a.durationMs/1e3,unitType:"wall_open_second",amountUsdNanos:u==null?null:Math.round(u*zr),providerProduct:"\u006b\u0065\u0072\u006e\u0065\u006c_browser",billingTier:i.billingMode,billableEvent:"provider_active_gb_second",measurementSource:"wall_open_time_proxy",rateSource:u!=null?`\u006b\u0065\u0072\u006e\u0065\u006c_${i.billingMode}_usd_per_second:${s?bt:_t}`:null,providerStatus:i.providerMismatch?"provider_mismatch":a.outcome,providerDurationMs:a.durationMs,errorCode:i.providerMismatch?"provider_mismatch":Ge(a.outcome)==="succeeded"?null:a.outcome,errorMessage:a.error,finalizedAt:a.completedAt})}}catch(i){console.warn(JSON.stringify({event:"operation_attempt_telemetry_failed",operation_run_id:e,attempt_number:a.attemptNumber,message:i instanceof Error?i.message:String(i)}))}}}function rr(e,t,o=null,r="production-default",n=0){let a=tr(o,r,n);return async i=>{if(await a(i),i.type==="started"){await pt({jobId:e,userId:t,attemptNumber:i.attemptNumber,maxAttempts:i.maxAttempts,query:i.query,location:i.location,maxQuestions:i.maxQuestions,startedAt:i.startedAt});return}if(i.type==="provider_session_started"){await mt({jobId:e,attemptNumber:i.attemptNumber,browserProvider:i.provider,providerSessionId:i.providerSessionId,observedAt:i.observedAt});return}await gt({jobId:e,attemptNumber:i.attemptNumber,outcome:i.outcome,\u006b\u0065\u0072\u006e\u0065\u006cSessionId:i.\u006b\u0065\u0072\u006e\u0065\u006cSessionId,questionCount:i.questionCount,durationMs:i.durationMs,error:i.error,willRetry:i.willRetry,\u006b\u0065\u0072\u006e\u0065\u006cDeleteStarted:i.cleanup.\u006b\u0065\u0072\u006e\u0065\u006cDeleteStarted,\u006b\u0065\u0072\u006e\u0065\u006cDeleteSucceeded:i.cleanup.\u006b\u0065\u0072\u006e\u0065\u006cDeleteSucceeded,\u006b\u0065\u0072\u006e\u0065\u006cDeleteError:i.cleanup.\u006b\u0065\u0072\u006e\u0065\u006cDeleteError,browserCloseSucceeded:i.cleanup.browserCloseSucceeded,browserCloseError:i.cleanup.browserCloseError,browserProvider:i.cleanup.provider??null,providerSessionId:i.cleanup.providerSessionId??null,providerLookupStatus:i.cleanup.providerSessionId?"pending":"not_applicable",providerErrorCode:i.cleanup.providerDisconnectObserved?"browser_session_interrupted":null,providerErrorMessage:i.cleanup.providerDisconnectMessage??null,providerReasonSource:i.cleanup.providerDisconnectObserved?"client_runtime":null,providerDisconnectObserved:i.cleanup.providerDisconnectObserved??!1,providerDisconnectMessage:i.cleanup.providerDisconnectMessage??null,debug:i.debug,completedAt:i.completedAt})}}var or=2,Ve=0;function nr(e){if(!e||typeof e!="object")return 0;let t=e;return typeof t.totalQuestions=="number"?t.totalQuestions:Array.isArray(t.flat)?t.flat.length:0}function ir(e){return Te.paa_base+Math.max(1,e)*Te.paa}async function ar(e){Ve++;try{let t=typeof e.options=="string"?JSON.parse(e.options):e.options,o={value:null},r=null,n=t.serpOnly&&!t.serpIdentity,a=he(e.id),i=process.env.APIFY_API_TOKEN?.trim();if(n&&(!$t()||t.mode!=="full"&&!i))throw new Error("Search providers are not configured");let s=await ht({op:t.serpOnly?"serp":"paa",userId:Number(e.user_id),headlessSentOut:o,operationRunId:a,operationAccountScope:"production-default"},()=>n?er({query:t.query??e.query,pages:t.pages===2?2:1,token:i,mode:t.mode,operationRunId:a,accountScope:"production-default",signal:AbortSignal.timeout(at(t.maxQuestions??30,!0,t.mode,t.pages).serverMs)}).then(l=>(r=l,l.result)):At({...t,\u006b\u0065\u0072\u006e\u0065\u006cApiKey:st(),headless:!0,format:"json",outputDir:"/tmp/paa-output-api",onAttemptEvent:rr(e.id,e.user_id,a)}));if(n&&!r)throw new Error("Search provider billing receipt is missing");await ft(e.id,s),await Le(a,"succeeded");let u=await Ae(e.id,e.user_id);if(typeof t.billingHoldMc=="number"&&t.billingDebitKey){let l=t.serpOnly?n?xe(r.deliveredPages,r.deliveryProvider):Ce(o.value):ir(nr(s));await ke(Number(e.user_id),t.billingDebitKey,l,t.serpOnly?"serp_refund":"paa_refund",t.serpOnly?"SERP search settlement":"PAA harvest settlement",t.serpOnly?"serp_search":"paa_harvest")}else if(!t.serpOnly&&typeof t.billingHoldMc=="number"){let l=ir(nr(s)),c=t.billingHoldMc-l;c>0?await ie(e.user_id,c,"paa_refund","overestimate refund"):c<0&&await Ee(e.user_id,-c,"paa",t.query??e.query)}else if(t.serpOnly&&typeof t.billingHoldMc=="number"){let l=n?xe(r.deliveredPages,r.deliveryProvider):Ce(o.value),c=t.billingHoldMc-l;c>0?await ie(e.user_id,c,"serp_refund","headless-mode pricing settle"):c<0&&await Ee(e.user_id,-c,"serp",t.query??e.query)}e.callback_url&&await He(e.callback_url,{job_id:e.id,status:"done",result:Ot(s),attempts:Oe(u)})}catch(t){console.error("[harvest/worker] failed",{jobId:e.id,error:t instanceof Error?t.message:String(t)});let o=Ue(t);await Le(he(e.id),o.error_code==="harvest_timeout"?"timed_out":o.terminalStatus,o.error_code);let r=typeof e.options=="string"?JSON.parse(e.options):e.options,n=typeof r.billingHoldMc=="number"&&r.billingHoldMc>0;await Pe(e.id,Be(o),Fe(o,{chargeStatus:n?"refund_pending":"not_charged"}));let a=await Ae(e.id,e.user_id);try{n&&(r.billingDebitKey?await ke(Number(e.user_id),r.billingDebitKey,0,r.serpOnly?"serp_refund":"paa_refund","failed call",r.serpOnly?"serp_search":"paa_harvest"):await ie(e.user_id,r.billingHoldMc,"refund","failed call"),await Pe(e.id,Be(o),Fe(o,{chargeStatus:"refunded"})))}catch{}e.callback_url&&await He(e.callback_url,{job_id:e.id,status:"failed",...fe(o),attempts:Oe(a)})}finally{Ve--}}async function jr(){let e=await Re();if(!e)return{claimed:!1};let t=Date.now();return await ar(e),{claimed:!0,jobId:e.id,completed:!0,durationMs:Date.now()-t}}async function Xo(e){let t=[];for(let o=0;o<e.maxJobs&&!(Date.now()>=e.deadlineMs);o++){let r=await jr();if(t.push(r),!r.claimed)break}return t}function Zo(){setInterval(async()=>{if(Ve>=or)return;let e=await Re();e&&ar(e)},2e3),console.log(`[worker] started \u2014 polling every 2s, max ${or} concurrent`)}export{X as a,ce as b,_r as c,eo as d,$t as e,er as f,Ue as g,Be as h,fe as i,Fe as j,ko as k,he as l,Mo as m,Le as n,No as o,rr as p,He as q,jr as r,Xo as s,Zo as t};
|
package/dist/worker-UG4OXZWR.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as a,s as b,t as c}from"./chunk-XASDACRP.js";import"./chunk-XG6GCEUE.js";import"./chunk-M5VZVMPC.js";import"./chunk-M5QHXNFZ.js";import"./chunk-DT2FYN6N.js";import"./chunk-ORB4RHCK.js";import"./chunk-RZEZJAID.js";import"./chunk-SH5KB4P7.js";import"./chunk-2SP57VCG.js";import"./chunk-6DTXIZY2.js";import"./chunk-Y6MKMSOC.js";import"./chunk-WJ4XFLS4.js";export{b as drainQueue,c as startWorker,a as tickOnce};
|