@searchos/bot-proxy 1.0.8 → 1.0.10

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.
@@ -0,0 +1 @@
1
+ import{b as P,c as S,d as $}from"./chunk-BVZHYMX6.js";var A=/^\/(?:robots\.txt|llms\.txt|sitemap[^\/]*\.(?:xml|xsl))$/i,L=/mobile|android|iphone|phone|tablet|webos|ipad/i;async function H(e,n){let{projectId:t,cloudfrontDomain:l,renderDomain:s,botLogEndpoint:i,aiRender:w=!0,ocr:g=!0,aiPathPrefixes:b=[]}=n,o=n.siteDomain.replace(/^https?:\/\//,"").replace(/\/+$/,""),T=l.replace(/\/$/,""),a=new URL(e.url),r=a.pathname;if(e.headers.get("x-prerender-host")){if(A.test(r)||r===`/${t}.txt`){let{NextResponse:h}=await import("next/server");return h.next()}return null}if(r===`/${t}.txt`)return new Response(t,{status:200,headers:{"Content-Type":"text/plain","Cache-Control":"public, max-age=3600"}});if(A.test(r)){try{let h=await fetch(`${s}/static${r}`,{headers:{"X-Signature":t,"X-Original-Host":o}});if(h.ok)return new Response(h.body,{status:200,headers:{"Content-Type":h.headers.get("Content-Type")||"text/plain","Cache-Control":"public, max-age=3600"}})}catch{}return null}let c=e.headers.get("user-agent")||"",m=P(c);if(!m)return null;let D=L.test(c)?"mobile":"desktop",j=S(a.search),y=j?`${r}?${j}`:r,d=`https://${o}${y}`,u=v(e);try{if(m.isAi&&w){let f=await $(y,"ai"),I=await fetch(`${T}/v2/${o}/${f}.html`,{headers:{Accept:"text/html"}});if(I.ok){let p=await I.text();if(p&&p.length>100)return x(i,u,t,o,r,a.search,c,"hit_ai"),_(s,t,d,g,b),R(p,"HIT-AI",m.name)}let E=await $(y,"desktop"),O=await fetch(`${T}/v2/${o}/${E}.html`,{headers:{Accept:"text/html"}});if(O.ok){let p=await O.text();if(p&&p.length>100)return x(i,u,t,o,r,a.search,c,"hit_desktop_fallback"),_(s,t,d,g,b),R(p,"HIT-DESKTOP",m.name)}return x(i,u,t,o,r,a.search,c,"miss_ai"),_(s,t,d,g,b),C(s,t,d),null}let h=await $(y,D),k=await fetch(`${T}/v2/${o}/${h}.html`,{headers:{Accept:"text/html"}});if(k.ok){let f=await k.text();if(f&&f.length>100)return x(i,u,t,o,r,a.search,c,"hit"),C(s,t,d),R(f,"HIT",m.name)}}catch{}return x(i,u,t,o,r,a.search,c,"miss"),C(s,t,d),null}function R(e,n,t){return new Response(e,{headers:{"Content-Type":"text/html; charset=utf-8","X-Cache":n,"X-Bot":t}})}function v(e){let n=e.headers,t=n.get("x-forwarded-for")||"";return n.get("cf-connecting-ip")||n.get("x-real-ip")||t.split(",")[0].trim()||""}function x(e,n,t,l,s,i,w,g){fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({project_id:t,url:`https://${l}${s}${i}`,domain:l,path:s,user_agent:w,phase:g,client_ip:n})}).catch(()=>{})}function C(e,n,t){fetch(`${e}/v2/cache`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({items:[{url:t,project_id:n}]})}).catch(()=>{})}function _(e,n,t,l,s){let i={items:[{url:t,project_id:n}],ocr:l};s.length>0&&(i.path_prefixes=s),fetch(`${e}/v2/cache/ai`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)}).catch(()=>{})}export{H as a};
@@ -0,0 +1 @@
1
+ import{a as P,b as j,c as S,d as h}from"./chunk-BVZHYMX6.js";var K=/^\/(?:robots\.txt|llms\.txt|sitemap[^\/]*\.(?:xml|xsl))$/i,L=/mobile|android|iphone|phone|tablet|webos|ipad/i,N=604800;async function G(e,t,s,i){let{projectId:n,siteDomain:o,renderDomain:a,botLogEndpoint:p,aiRender:k=!0,ocr:m=!0,aiPathPrefixes:y=[]}=i,A=new URL(e.url),r=A.pathname,g=o.replace(/^https?:\/\//,"").replace(/\/+$/,"");if(e.method==="POST"){if(r==="/__update-edge-cache")return D(e,t);if(r==="/__purge-edge-cache")return J(e,t);if(r==="/__read-edge-cache")return W(e,t)}if(e.headers.get("x-prerender-host"))return null;if(r===`/${n}.txt`)try{let l=await fetch(`${a}${r}`,{redirect:"manual"});return new Response(l.body,{status:l.status,headers:{"Content-Type":"text/plain","Cache-Control":"public, max-age=3600"}})}catch{return new Response("",{status:404})}if(K.test(r))try{let l=await fetch(`${a}/static${r}`,{redirect:"manual",headers:{"X-Signature":n,"X-Original-Host":g}});return new Response(l.body,{status:l.status,headers:{"Content-Type":l.headers.get("Content-Type")||"text/plain","Cache-Control":"public, max-age=3600"}})}catch{return null}let d=e.headers.get("user-agent")||"",c=j(d);if(!c||!t.V2_CACHE)return null;let I=L.test(d)?"mobile":"desktop",H=S(A.search),$=H?`${r}?${H}`:r,f=`https://${g}${$}`,C=P.has(c.name)?"ai-user":c.isAi?"ai-crawl":"standard",w=U(e),_=l=>s.waitUntil(l().catch(T=>console.error("[bot-proxy]",T)));try{if(c.isAi&&k){let v=await h($,"ai"),V=await t.V2_CACHE.get(v);if(V)return _(async()=>{console.log(`[BOT] ${c.name} | ${C} | hit_ai | ${r}`),await E(p,w,n,g,r,d,"hit_ai"),await R(a,n,f,m,y)}),b(V,"HIT-AI",c.name);let B=await h($,"desktop"),O=await t.V2_CACHE.get(B);return O?(_(async()=>{console.log(`[BOT] ${c.name} | ${C} | hit_desktop_fallback | ${r}`),await E(p,w,n,g,r,d,"hit_desktop_fallback"),await R(a,n,f,m,y)}),b(O,"HIT-DESKTOP",c.name)):(_(async()=>{console.log(`[BOT] ${c.name} | ${C} | miss_ai | ${r}`),await E(p,w,n,g,r,d,"miss_ai"),await Promise.all([R(a,n,f,m,y),x(a,n,f)])}),null)}let l=await h($,I),T=await t.V2_CACHE.get(l);return T?(_(async()=>{console.log(`[BOT] ${c.name} | ${C} | hit | ${r}`),await E(p,w,n,g,r,d,"hit"),await x(a,n,f)}),b(T,"HIT",c.name)):(_(async()=>{console.log(`[BOT] ${c.name} | ${C} | miss | ${r}`),await E(p,w,n,g,r,d,"miss"),await x(a,n,f)}),null)}catch(l){return console.error("[bot-proxy]",l),null}}function b(e,t,s){return new Response(e,{headers:{"Content-Type":"text/html; charset=utf-8","X-Cache":t,"X-Bot":s}})}function U(e){let t=e.headers;return t.get("cf-connecting-ip")||t.get("x-real-ip")||(t.get("x-forwarded-for")||"").split(",")[0].trim()||""}async function E(e,t,s,i,n,o,a){await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({project_id:s,url:`https://${i}${n}`,domain:i,path:n,user_agent:o,phase:a,client_ip:t})})}async function x(e,t,s){await fetch(`${e}/v2/cache/kv`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({items:[{url:s,project_id:t}]})})}function u(e,t=200){return new Response(JSON.stringify(e),{status:t,headers:{"Content-Type":"application/json"}})}async function D(e,t){try{let{entries:s=[]}=await e.json();if(!t.V2_CACHE)return u({success:!1,error:"V2_CACHE \uBC14\uC778\uB529 \uC5C6\uC74C"},500);if(!s.length)return u({success:!1,error:"entries \uD544\uC218"},400);let i=0;for(let n of s){let{url:o,html:a,variant:p="",device:k="desktop"}=n||{};if(!o||!a)continue;let m=p.startsWith("v2_")?p.substring(3):k,y=await h(o,m);await t.V2_CACHE.put(y,a,{expirationTtl:N}),i++}return u({success:!0,updated:i})}catch(s){return u({success:!1,error:s.message},500)}}async function J(e,t){try{let{urls:s=[],variant:i=""}=await e.json();if(!t.V2_CACHE)return u({success:!1,error:"V2_CACHE \uBC14\uC778\uB529 \uC5C6\uC74C"},500);if(!s.length)return u({success:!1,error:"urls \uD544\uC218"},400);let n=i.startsWith("v2_")?i.substring(3):"desktop",o=0;for(let a of s){let p=await h(a,n);await t.V2_CACHE.delete(p),o++}return u({success:!0,deleted:o})}catch(s){return u({success:!1,error:s.message},500)}}async function W(e,t){try{let{url:s,variant:i=""}=await e.json();if(!t.V2_CACHE)return u({success:!1,error:"V2_CACHE \uBC14\uC778\uB529 \uC5C6\uC74C"},500);if(!s)return u({success:!1,error:"url \uD544\uC218"},400);let n=i.startsWith("v2_")?i.substring(3):"desktop",o=await h(s,n),a=await t.V2_CACHE.get(o);return u({success:!0,html:a??null})}catch(s){return u({success:!1,error:s.message},500)}}async function R(e,t,s,i,n){let o={items:[{url:s,project_id:t}],ocr:i};n.length>0&&(o.path_prefixes=n),await fetch(`${e}/v2/cache/kv/ai`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)})}export{G as a};
@@ -1 +1 @@
1
- "use strict";var J=Object.create;var T=Object.defineProperty;var X=Object.getOwnPropertyDescriptor;var Q=Object.getOwnPropertyNames;var F=Object.getPrototypeOf,Y=Object.prototype.hasOwnProperty;var Z=(t,s)=>{for(var e in s)T(t,e,{get:s[e],enumerable:!0})},N=(t,s,e,n)=>{if(s&&typeof s=="object"||typeof s=="function")for(let r of Q(s))!Y.call(t,r)&&r!==e&&T(t,r,{get:()=>s[r],enumerable:!(n=X(s,r))||n.enumerable});return t};var q=(t,s,e)=>(e=t!=null?J(F(t)):{},N(s||!t||!t.__esModule?T(e,"default",{value:t,enumerable:!0}):e,t)),tt=t=>N(T({},"__esModule",{value:!0}),t);var dt={};Z(dt,{cloudflareProxy:()=>D});module.exports=tt(dt);var A=["chatgpt-user","claude-user","perplexity-user","gemini-user","gemini-deep-research","mistralai-user","grok-user"],j=["gptbot","oai-searchbot","claudebot","claude-searchbot","google-extended","google-cloudvertexbot","perplexitybot","meta-externalagent","applebot-extended","amazonbot","cohere-ai","bytespider","deepseekbot","grokbot","ccbot","diffbot","ai2bot","petalbot"],K=["googlebot","googlebot-image","googlebot-video","googlebot-news","googleother","mediapartners-google","adsbot-google","google-inspectiontool","bingbot","bingpreview","naverbot","yeti","daumoa","baiduspider","yandexbot","duckduckbot","applebot"],U=["facebookexternalhit","linkedinbot","twitterbot","slackbot","discordbot","telegrambot","whatsapp","pinterestbot","redditbot"],v=["ahrefsbot","semrushbot","mj12bot","dotbot","dataforseobot"],et=["uptimerobot","lighthouse","chrome-lighthouse"],P=new Set([...A,...j]),R=new Set(A),st=[...A,...j,...K,...U,...v,...et];function L(t){let s=t.toLowerCase();for(let e of st)if(s.includes(e)){let n;return R.has(e)?n="ai-user":P.has(e)?n="ai-crawl":K.includes(e)?n="search":U.includes(e)?n="sns":v.includes(e)?n="seo":n="monitoring",{name:e,isAi:P.has(e),category:n}}return null}var nt=new Set(["utm_source","utm_medium","utm_campaign","utm_term","utm_content","fbclid","fb_action_ids","fb_action_types","fb_source","fb_ref","gclid","gclsrc","dclid","gbraid","wbraid","msclkid","hsa_cam","hsa_grp","hsa_mt","hsa_src","hsa_ad","hsa_acc","hsa_net","hsa_ver","hsa_la","hsa_ol","hsa_kw","_hsenc","_hsmi","_ga","_gl","_bhlid","mc_cid","mc_eid","oly_anon_id","oly_enc_id","ttclid","yclid","irclickid"]);function E(t){if(!t||(t.startsWith("?")&&(t=t.substring(1)),!t))return"";let s=[];for(let e of t.split("&")){if(!e)continue;let n=e.indexOf("="),r=n===-1?e:e.substring(0,n);nt.has(r.toLowerCase())||s.push(e)}return s.join("&")}function W(t){return encodeURIComponent(t).replace(/[!'()*]/g,s=>"%"+s.charCodeAt(0).toString(16).toUpperCase())}function rt(t){if(!t)return"/";let s,e,n=t.slice(0,8).toLowerCase();if(n.startsWith("http://")||n.startsWith("https://"))try{let o=new URL(t);s=o.pathname,e=o.search.startsWith("?")?o.search.substring(1):o.search}catch{s=t,e=""}else{let o=t.indexOf("?");o===-1?(s=t,e=""):(s=t.substring(0,o),e=t.substring(o+1))}s||(s="/");let r=s.split("/").map(o=>{if(!o)return o;try{return W(decodeURIComponent(o))}catch{return W(o)}}).join("/"),i=E(e);return i?`${r}?${i}`:r}async function ot(t){if(typeof process<"u"&&process.versions?.node){let{createHash:n}=await import("crypto");return n("md5").update(t,"utf8").digest("hex")}let s=new TextEncoder().encode(t),e=await crypto.subtle.digest("MD5",s);return Array.from(new Uint8Array(e),n=>n.toString(16).padStart(2,"0")).join("")}async function h(t,s){let e=rt(t);return`${await ot(e)}_${s}`}var at=/^\/(?:robots\.txt|llms\.txt|sitemap[^\/]*\.(?:xml|xsl))$/i,it=/mobile|android|iphone|phone|tablet|webos|ipad/i,ct=604800;async function D(t,s,e,n){let{projectId:r,siteDomain:i,renderDomain:o,botLogEndpoint:p,aiRender:k=!0,ocr:m=!0,aiPathPrefixes:_=[]}=n,H=new URL(t.url),a=H.pathname,d=i.replace(/^https?:\/\//,"").replace(/\/+$/,"");if(t.method==="POST"){if(a==="/__update-edge-cache")return lt(t,s);if(a==="/__purge-edge-cache")return ut(t,s);if(a==="/__read-edge-cache")return pt(t,s)}if(t.headers.get("x-prerender-host"))return null;if(a===`/${r}.txt`)try{let l=await fetch(`${o}${a}`,{redirect:"manual"});return new Response(l.body,{status:l.status,headers:{"Content-Type":"text/plain","Cache-Control":"public, max-age=3600"}})}catch{return new Response("",{status:404})}if(at.test(a))try{let l=await fetch(`${o}/static${a}`,{redirect:"manual",headers:{"X-Signature":r,"X-Original-Host":d}});return new Response(l.body,{status:l.status,headers:{"Content-Type":l.headers.get("Content-Type")||"text/plain","Cache-Control":"public, max-age=3600"}})}catch{return null}let g=t.headers.get("user-agent")||"",c=L(g);if(!c||!s.V2_CACHE)return null;let M=it.test(g)?"mobile":"desktop",I=E(H.search),w=I?`${a}?${I}`:a,f=`https://${d}${w}`,y=R.has(c.name)?"ai-user":c.isAi?"ai-crawl":"standard",b=l=>e.waitUntil(l().catch(x=>console.error("[bot-proxy]",x)));try{if(c.isAi&&k){let z=await h(w,"ai"),B=await s.V2_CACHE.get(z);if(B)return b(async()=>{console.log(`[BOT] ${c.name} | ${y} | hit_ai | ${a}`),await C(p,r,d,a,g,"hit_ai"),await O(o,r,f,m,_)}),S(B,"HIT-AI",c.name);let G=await h(w,"desktop"),V=await s.V2_CACHE.get(G);return V?(b(async()=>{console.log(`[BOT] ${c.name} | ${y} | hit_desktop_fallback | ${a}`),await C(p,r,d,a,g,"hit_desktop_fallback"),await O(o,r,f,m,_)}),S(V,"HIT-DESKTOP",c.name)):(b(async()=>{console.log(`[BOT] ${c.name} | ${y} | miss_ai | ${a}`),await C(p,r,d,a,g,"miss_ai"),await Promise.all([O(o,r,f,m,_),$(o,r,f)])}),null)}let l=await h(w,M),x=await s.V2_CACHE.get(l);return x?(b(async()=>{console.log(`[BOT] ${c.name} | ${y} | hit | ${a}`),await C(p,r,d,a,g,"hit"),await $(o,r,f)}),S(x,"HIT",c.name)):(b(async()=>{console.log(`[BOT] ${c.name} | ${y} | miss | ${a}`),await C(p,r,d,a,g,"miss"),await $(o,r,f)}),null)}catch(l){return console.error("[bot-proxy]",l),null}}function S(t,s,e){return new Response(t,{headers:{"Content-Type":"text/html; charset=utf-8","X-Cache":s,"X-Bot":e}})}async function C(t,s,e,n,r,i){await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({project_id:s,url:`https://${e}${n}`,domain:e,path:n,user_agent:r,phase:i})})}async function $(t,s,e){await fetch(`${t}/v2/cache/kv`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({items:[{url:e,project_id:s}]})})}function u(t,s=200){return new Response(JSON.stringify(t),{status:s,headers:{"Content-Type":"application/json"}})}async function lt(t,s){try{let{entries:e=[]}=await t.json();if(!s.V2_CACHE)return u({success:!1,error:"V2_CACHE \uBC14\uC778\uB529 \uC5C6\uC74C"},500);if(!e.length)return u({success:!1,error:"entries \uD544\uC218"},400);let n=0;for(let r of e){let{url:i,html:o,variant:p="",device:k="desktop"}=r||{};if(!i||!o)continue;let m=p.startsWith("v2_")?p.substring(3):k,_=await h(i,m);await s.V2_CACHE.put(_,o,{expirationTtl:ct}),n++}return u({success:!0,updated:n})}catch(e){return u({success:!1,error:e.message},500)}}async function ut(t,s){try{let{urls:e=[],variant:n=""}=await t.json();if(!s.V2_CACHE)return u({success:!1,error:"V2_CACHE \uBC14\uC778\uB529 \uC5C6\uC74C"},500);if(!e.length)return u({success:!1,error:"urls \uD544\uC218"},400);let r=n.startsWith("v2_")?n.substring(3):"desktop",i=0;for(let o of e){let p=await h(o,r);await s.V2_CACHE.delete(p),i++}return u({success:!0,deleted:i})}catch(e){return u({success:!1,error:e.message},500)}}async function pt(t,s){try{let{url:e,variant:n=""}=await t.json();if(!s.V2_CACHE)return u({success:!1,error:"V2_CACHE \uBC14\uC778\uB529 \uC5C6\uC74C"},500);if(!e)return u({success:!1,error:"url \uD544\uC218"},400);let r=n.startsWith("v2_")?n.substring(3):"desktop",i=await h(e,r),o=await s.V2_CACHE.get(i);return u({success:!0,html:o??null})}catch(e){return u({success:!1,error:e.message},500)}}async function O(t,s,e,n,r){let i={items:[{url:e,project_id:s}],ocr:n};r.length>0&&(i.path_prefixes=r),await fetch(`${t}/v2/cache/kv/ai`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)})}0&&(module.exports={cloudflareProxy});
1
+ "use strict";var X=Object.create;var E=Object.defineProperty;var Q=Object.getOwnPropertyDescriptor;var F=Object.getOwnPropertyNames;var Y=Object.getPrototypeOf,Z=Object.prototype.hasOwnProperty;var q=(t,e)=>{for(var n in e)E(t,n,{get:e[n],enumerable:!0})},P=(t,e,n,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of F(e))!Z.call(t,r)&&r!==n&&E(t,r,{get:()=>e[r],enumerable:!(s=Q(e,r))||s.enumerable});return t};var tt=(t,e,n)=>(n=t!=null?X(Y(t)):{},P(e||!t||!t.__esModule?E(n,"default",{value:t,enumerable:!0}):n,t)),et=t=>P(E({},"__esModule",{value:!0}),t);var ht={};q(ht,{cloudflareProxy:()=>M});module.exports=et(ht);var R=["chatgpt-user","claude-user","perplexity-user","gemini-user","gemini-deep-research","mistralai-user","grok-user"],K=["gptbot","oai-searchbot","claudebot","claude-searchbot","google-extended","google-cloudvertexbot","perplexitybot","meta-externalagent","applebot-extended","amazonbot","cohere-ai","bytespider","deepseekbot","grokbot","ccbot","diffbot","ai2bot","petalbot"],U=["googlebot","googlebot-image","googlebot-video","googlebot-news","googleother","mediapartners-google","adsbot-google","google-inspectiontool","bingbot","bingpreview","naverbot","yeti","daumoa","baiduspider","yandexbot","duckduckbot","applebot"],v=["facebookexternalhit","linkedinbot","twitterbot","slackbot","discordbot","telegrambot","whatsapp","pinterestbot","redditbot"],L=["ahrefsbot","semrushbot","mj12bot","dotbot","dataforseobot"],nt=["uptimerobot","lighthouse","chrome-lighthouse"],j=new Set([...R,...K]),S=new Set(R),st=[...R,...K,...U,...v,...L,...nt];function W(t){let e=t.toLowerCase();for(let n of st)if(e.includes(n)){let s;return S.has(n)?s="ai-user":j.has(n)?s="ai-crawl":U.includes(n)?s="search":v.includes(n)?s="sns":L.includes(n)?s="seo":s="monitoring",{name:n,isAi:j.has(n),category:s}}return null}var rt=new Set(["utm_source","utm_medium","utm_campaign","utm_term","utm_content","fbclid","fb_action_ids","fb_action_types","fb_source","fb_ref","gclid","gclsrc","dclid","gbraid","wbraid","msclkid","hsa_cam","hsa_grp","hsa_mt","hsa_src","hsa_ad","hsa_acc","hsa_net","hsa_ver","hsa_la","hsa_ol","hsa_kw","_hsenc","_hsmi","_ga","_gl","_bhlid","mc_cid","mc_eid","oly_anon_id","oly_enc_id","ttclid","yclid","irclickid"]);function k(t){if(!t||(t.startsWith("?")&&(t=t.substring(1)),!t))return"";let e=[];for(let n of t.split("&")){if(!n)continue;let s=n.indexOf("="),r=s===-1?n:n.substring(0,s);rt.has(r.toLowerCase())||e.push(n)}return e.join("&")}function D(t){return encodeURIComponent(t).replace(/[!'()*]/g,e=>"%"+e.charCodeAt(0).toString(16).toUpperCase())}function ot(t){if(!t)return"/";let e,n,s=t.slice(0,8).toLowerCase();if(s.startsWith("http://")||s.startsWith("https://"))try{let o=new URL(t);e=o.pathname,n=o.search.startsWith("?")?o.search.substring(1):o.search}catch{e=t,n=""}else{let o=t.indexOf("?");o===-1?(e=t,n=""):(e=t.substring(0,o),n=t.substring(o+1))}e||(e="/");let r=e.split("/").map(o=>{if(!o)return o;try{return D(decodeURIComponent(o))}catch{return D(o)}}).join("/"),i=k(n);return i?`${r}?${i}`:r}async function at(t){if(typeof process<"u"&&process.versions?.node){let{createHash:s}=await import("crypto");return s("md5").update(t,"utf8").digest("hex")}let e=new TextEncoder().encode(t),n=await crypto.subtle.digest("MD5",e);return Array.from(new Uint8Array(n),s=>s.toString(16).padStart(2,"0")).join("")}async function h(t,e){let n=ot(t);return`${await at(n)}_${e}`}var it=/^\/(?:robots\.txt|llms\.txt|sitemap[^\/]*\.(?:xml|xsl))$/i,ct=/mobile|android|iphone|phone|tablet|webos|ipad/i,lt=604800;async function M(t,e,n,s){let{projectId:r,siteDomain:i,renderDomain:o,botLogEndpoint:p,aiRender:A=!0,ocr:m=!0,aiPathPrefixes:_=[]}=s,H=new URL(t.url),a=H.pathname,g=i.replace(/^https?:\/\//,"").replace(/\/+$/,"");if(t.method==="POST"){if(a==="/__update-edge-cache")return pt(t,e);if(a==="/__purge-edge-cache")return gt(t,e);if(a==="/__read-edge-cache")return dt(t,e)}if(t.headers.get("x-prerender-host"))return null;if(a===`/${r}.txt`)try{let l=await fetch(`${o}${a}`,{redirect:"manual"});return new Response(l.body,{status:l.status,headers:{"Content-Type":"text/plain","Cache-Control":"public, max-age=3600"}})}catch{return new Response("",{status:404})}if(it.test(a))try{let l=await fetch(`${o}/static${a}`,{redirect:"manual",headers:{"X-Signature":r,"X-Original-Host":g}});return new Response(l.body,{status:l.status,headers:{"Content-Type":l.headers.get("Content-Type")||"text/plain","Cache-Control":"public, max-age=3600"}})}catch{return null}let d=t.headers.get("user-agent")||"",c=W(d);if(!c||!e.V2_CACHE)return null;let z=ct.test(d)?"mobile":"desktop",B=k(H.search),x=B?`${a}?${B}`:a,f=`https://${g}${x}`,y=S.has(c.name)?"ai-user":c.isAi?"ai-crawl":"standard",b=ut(t),C=l=>n.waitUntil(l().catch(T=>console.error("[bot-proxy]",T)));try{if(c.isAi&&A){let G=await h(x,"ai"),V=await e.V2_CACHE.get(G);if(V)return C(async()=>{console.log(`[BOT] ${c.name} | ${y} | hit_ai | ${a}`),await w(p,b,r,g,a,d,"hit_ai"),await I(o,r,f,m,_)}),$(V,"HIT-AI",c.name);let J=await h(x,"desktop"),N=await e.V2_CACHE.get(J);return N?(C(async()=>{console.log(`[BOT] ${c.name} | ${y} | hit_desktop_fallback | ${a}`),await w(p,b,r,g,a,d,"hit_desktop_fallback"),await I(o,r,f,m,_)}),$(N,"HIT-DESKTOP",c.name)):(C(async()=>{console.log(`[BOT] ${c.name} | ${y} | miss_ai | ${a}`),await w(p,b,r,g,a,d,"miss_ai"),await Promise.all([I(o,r,f,m,_),O(o,r,f)])}),null)}let l=await h(x,z),T=await e.V2_CACHE.get(l);return T?(C(async()=>{console.log(`[BOT] ${c.name} | ${y} | hit | ${a}`),await w(p,b,r,g,a,d,"hit"),await O(o,r,f)}),$(T,"HIT",c.name)):(C(async()=>{console.log(`[BOT] ${c.name} | ${y} | miss | ${a}`),await w(p,b,r,g,a,d,"miss"),await O(o,r,f)}),null)}catch(l){return console.error("[bot-proxy]",l),null}}function $(t,e,n){return new Response(t,{headers:{"Content-Type":"text/html; charset=utf-8","X-Cache":e,"X-Bot":n}})}function ut(t){let e=t.headers;return e.get("cf-connecting-ip")||e.get("x-real-ip")||(e.get("x-forwarded-for")||"").split(",")[0].trim()||""}async function w(t,e,n,s,r,i,o){await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({project_id:n,url:`https://${s}${r}`,domain:s,path:r,user_agent:i,phase:o,client_ip:e})})}async function O(t,e,n){await fetch(`${t}/v2/cache/kv`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({items:[{url:n,project_id:e}]})})}function u(t,e=200){return new Response(JSON.stringify(t),{status:e,headers:{"Content-Type":"application/json"}})}async function pt(t,e){try{let{entries:n=[]}=await t.json();if(!e.V2_CACHE)return u({success:!1,error:"V2_CACHE \uBC14\uC778\uB529 \uC5C6\uC74C"},500);if(!n.length)return u({success:!1,error:"entries \uD544\uC218"},400);let s=0;for(let r of n){let{url:i,html:o,variant:p="",device:A="desktop"}=r||{};if(!i||!o)continue;let m=p.startsWith("v2_")?p.substring(3):A,_=await h(i,m);await e.V2_CACHE.put(_,o,{expirationTtl:lt}),s++}return u({success:!0,updated:s})}catch(n){return u({success:!1,error:n.message},500)}}async function gt(t,e){try{let{urls:n=[],variant:s=""}=await t.json();if(!e.V2_CACHE)return u({success:!1,error:"V2_CACHE \uBC14\uC778\uB529 \uC5C6\uC74C"},500);if(!n.length)return u({success:!1,error:"urls \uD544\uC218"},400);let r=s.startsWith("v2_")?s.substring(3):"desktop",i=0;for(let o of n){let p=await h(o,r);await e.V2_CACHE.delete(p),i++}return u({success:!0,deleted:i})}catch(n){return u({success:!1,error:n.message},500)}}async function dt(t,e){try{let{url:n,variant:s=""}=await t.json();if(!e.V2_CACHE)return u({success:!1,error:"V2_CACHE \uBC14\uC778\uB529 \uC5C6\uC74C"},500);if(!n)return u({success:!1,error:"url \uD544\uC218"},400);let r=s.startsWith("v2_")?s.substring(3):"desktop",i=await h(n,r),o=await e.V2_CACHE.get(i);return u({success:!0,html:o??null})}catch(n){return u({success:!1,error:n.message},500)}}async function I(t,e,n,s,r){let i={items:[{url:n,project_id:e}],ocr:s};r.length>0&&(i.path_prefixes=r),await fetch(`${t}/v2/cache/kv/ai`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)})}0&&(module.exports={cloudflareProxy});
@@ -1 +1 @@
1
- import{a as o}from"./chunk-JXQQEZ5V.js";import"./chunk-BVZHYMX6.js";export{o as cloudflareProxy};
1
+ import{a as o}from"./chunk-WERE2ZTC.js";import"./chunk-BVZHYMX6.js";export{o as cloudflareProxy};
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";var tt=Object.create;var I=Object.defineProperty;var et=Object.getOwnPropertyDescriptor;var nt=Object.getOwnPropertyNames;var st=Object.getPrototypeOf,rt=Object.prototype.hasOwnProperty;var ot=(e,n)=>{for(var t in n)I(e,t,{get:n[t],enumerable:!0})},W=(e,n,t,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let s of nt(n))!rt.call(e,s)&&s!==t&&I(e,s,{get:()=>n[s],enumerable:!(r=et(n,s))||r.enumerable});return e};var X=(e,n,t)=>(t=e!=null?tt(st(e)):{},W(n||!e||!e.__esModule?I(t,"default",{value:e,enumerable:!0}):t,e)),at=e=>W(I({},"__esModule",{value:!0}),e);var xt={};ot(xt,{cloudflareProxy:()=>q,nextjsProxy:()=>Z});module.exports=at(xt);var H=["chatgpt-user","claude-user","perplexity-user","gemini-user","gemini-deep-research","mistralai-user","grok-user"],M=["gptbot","oai-searchbot","claudebot","claude-searchbot","google-extended","google-cloudvertexbot","perplexitybot","meta-externalagent","applebot-extended","amazonbot","cohere-ai","bytespider","deepseekbot","grokbot","ccbot","diffbot","ai2bot","petalbot"],F=["googlebot","googlebot-image","googlebot-video","googlebot-news","googleother","mediapartners-google","adsbot-google","google-inspectiontool","bingbot","bingpreview","naverbot","yeti","daumoa","baiduspider","yandexbot","duckduckbot","applebot"],Q=["facebookexternalhit","linkedinbot","twitterbot","slackbot","discordbot","telegrambot","whatsapp","pinterestbot","redditbot"],z=["ahrefsbot","semrushbot","mj12bot","dotbot","dataforseobot"],it=["uptimerobot","lighthouse","chrome-lighthouse"],J=new Set([...H,...M]),N=new Set(H),ct=[...H,...M,...F,...Q,...z,...it];function P(e){let n=e.toLowerCase();for(let t of ct)if(n.includes(t)){let r;return N.has(t)?r="ai-user":J.has(t)?r="ai-crawl":F.includes(t)?r="search":Q.includes(t)?r="sns":z.includes(t)?r="seo":r="monitoring",{name:t,isAi:J.has(t),category:r}}return null}var lt=new Set(["utm_source","utm_medium","utm_campaign","utm_term","utm_content","fbclid","fb_action_ids","fb_action_types","fb_source","fb_ref","gclid","gclsrc","dclid","gbraid","wbraid","msclkid","hsa_cam","hsa_grp","hsa_mt","hsa_src","hsa_ad","hsa_acc","hsa_net","hsa_ver","hsa_la","hsa_ol","hsa_kw","_hsenc","_hsmi","_ga","_gl","_bhlid","mc_cid","mc_eid","oly_anon_id","oly_enc_id","ttclid","yclid","irclickid"]);function k(e){if(!e||(e.startsWith("?")&&(e=e.substring(1)),!e))return"";let n=[];for(let t of e.split("&")){if(!t)continue;let r=t.indexOf("="),s=r===-1?t:t.substring(0,r);lt.has(s.toLowerCase())||n.push(t)}return n.join("&")}function G(e){return encodeURIComponent(e).replace(/[!'()*]/g,n=>"%"+n.charCodeAt(0).toString(16).toUpperCase())}function pt(e){if(!e)return"/";let n,t,r=e.slice(0,8).toLowerCase();if(r.startsWith("http://")||r.startsWith("https://"))try{let o=new URL(e);n=o.pathname,t=o.search.startsWith("?")?o.search.substring(1):o.search}catch{n=e,t=""}else{let o=e.indexOf("?");o===-1?(n=e,t=""):(n=e.substring(0,o),t=e.substring(o+1))}n||(n="/");let s=n.split("/").map(o=>{if(!o)return o;try{return G(decodeURIComponent(o))}catch{return G(o)}}).join("/"),i=k(t);return i?`${s}?${i}`:s}async function ut(e){if(typeof process<"u"&&process.versions?.node){let{createHash:r}=await import("crypto");return r("md5").update(e,"utf8").digest("hex")}let n=new TextEncoder().encode(e),t=await crypto.subtle.digest("MD5",n);return Array.from(new Uint8Array(t),r=>r.toString(16).padStart(2,"0")).join("")}async function _(e,n){let t=pt(e);return`${await ut(t)}_${n}`}var Y=/^\/(?:robots\.txt|llms\.txt|sitemap[^\/]*\.(?:xml|xsl))$/i,dt=/mobile|android|iphone|phone|tablet|webos|ipad/i;async function Z(e,n){let{projectId:t,cloudfrontDomain:r,renderDomain:s,botLogEndpoint:i,aiRender:o=!0,ocr:l=!0,aiPathPrefixes:b=[]}=n,p=n.siteDomain.replace(/^https?:\/\//,"").replace(/\/+$/,""),w=r.replace(/\/$/,""),x=new URL(e.url),a=x.pathname;if(e.headers.get("x-prerender-host")){if(Y.test(a)||a===`/${t}.txt`){let{NextResponse:h}=await import("next/server");return h.next()}return null}if(a===`/${t}.txt`)return new Response(t,{status:200,headers:{"Content-Type":"text/plain","Cache-Control":"public, max-age=3600"}});if(Y.test(a)){try{let h=await fetch(`${s}/static${a}`,{headers:{"X-Signature":t,"X-Original-Host":p}});if(h.ok)return new Response(h.body,{status:200,headers:{"Content-Type":h.headers.get("Content-Type")||"text/plain","Cache-Control":"public, max-age=3600"}})}catch{}return null}let u=e.headers.get("user-agent")||"",g=P(u);if(!g)return null;let d=dt.test(u)?"mobile":"desktop",O=k(x.search),$=O?`${a}?${O}`:a,y=`https://${p}${$}`,f=gt(e);try{if(g.isAi&&o){let c=await _($,"ai"),E=await fetch(`${w}/v2/${p}/${c}.html`,{headers:{Accept:"text/html"}});if(E.ok){let C=await E.text();if(C&&C.length>100)return A(i,f,t,p,a,x.search,u,"hit_ai"),L(s,t,y,l,b),B(C,"HIT-AI",g.name)}let j=await _($,"desktop"),R=await fetch(`${w}/v2/${p}/${j}.html`,{headers:{Accept:"text/html"}});if(R.ok){let C=await R.text();if(C&&C.length>100)return A(i,f,t,p,a,x.search,u,"hit_desktop_fallback"),L(s,t,y,l,b),B(C,"HIT-DESKTOP",g.name)}return A(i,f,t,p,a,x.search,u,"miss_ai"),L(s,t,y,l,b),K(s,t,y),null}let h=await _($,d),T=await fetch(`${w}/v2/${p}/${h}.html`,{headers:{Accept:"text/html"}});if(T.ok){let c=await T.text();if(c&&c.length>100)return A(i,f,t,p,a,x.search,u,"hit"),K(s,t,y),B(c,"HIT",g.name)}}catch{}return A(i,f,t,p,a,x.search,u,"miss"),K(s,t,y),null}function B(e,n,t){return new Response(e,{headers:{"Content-Type":"text/html; charset=utf-8","X-Cache":n,"X-Bot":t}})}function gt(e){let n=e.headers,t=n.get("x-forwarded-for")||"";return n.get("cf-connecting-ip")||n.get("x-real-ip")||t.split(",")[0].trim()||""}function A(e,n,t,r,s,i,o,l){let b={"Content-Type":"application/json"};n&&(b["X-Forwarded-For"]=n),fetch(e,{method:"POST",headers:b,body:JSON.stringify({project_id:t,url:`https://${r}${s}${i}`,domain:r,path:s,user_agent:o,phase:l})}).catch(()=>{})}function K(e,n,t){fetch(`${e}/v2/cache`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({items:[{url:t,project_id:n}]})}).catch(()=>{})}function L(e,n,t,r,s){let i={items:[{url:t,project_id:n}],ocr:r};s.length>0&&(i.path_prefixes=s),fetch(`${e}/v2/cache/ai`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)}).catch(()=>{})}var ht=/^\/(?:robots\.txt|llms\.txt|sitemap[^\/]*\.(?:xml|xsl))$/i,ft=/mobile|android|iphone|phone|tablet|webos|ipad/i,mt=604800;async function q(e,n,t,r){let{projectId:s,siteDomain:i,renderDomain:o,botLogEndpoint:l,aiRender:b=!0,ocr:p=!0,aiPathPrefixes:w=[]}=r,x=new URL(e.url),a=x.pathname,u=i.replace(/^https?:\/\//,"").replace(/\/+$/,"");if(e.method==="POST"){if(a==="/__update-edge-cache")return yt(e,n);if(a==="/__purge-edge-cache")return _t(e,n);if(a==="/__read-edge-cache")return bt(e,n)}if(e.headers.get("x-prerender-host"))return null;if(a===`/${s}.txt`)try{let c=await fetch(`${o}${a}`,{redirect:"manual"});return new Response(c.body,{status:c.status,headers:{"Content-Type":"text/plain","Cache-Control":"public, max-age=3600"}})}catch{return new Response("",{status:404})}if(ht.test(a))try{let c=await fetch(`${o}/static${a}`,{redirect:"manual",headers:{"X-Signature":s,"X-Original-Host":u}});return new Response(c.body,{status:c.status,headers:{"Content-Type":c.headers.get("Content-Type")||"text/plain","Cache-Control":"public, max-age=3600"}})}catch{return null}let g=e.headers.get("user-agent")||"",d=P(g);if(!d||!n.V2_CACHE)return null;let O=ft.test(g)?"mobile":"desktop",$=k(x.search),y=$?`${a}?${$}`:a,f=`https://${u}${y}`,h=N.has(d.name)?"ai-user":d.isAi?"ai-crawl":"standard",T=c=>t.waitUntil(c().catch(E=>console.error("[bot-proxy]",E)));try{if(d.isAi&&b){let j=await _(y,"ai"),R=await n.V2_CACHE.get(j);if(R)return T(async()=>{console.log(`[BOT] ${d.name} | ${h} | hit_ai | ${a}`),await S(l,s,u,a,g,"hit_ai"),await U(o,s,f,p,w)}),V(R,"HIT-AI",d.name);let C=await _(y,"desktop"),D=await n.V2_CACHE.get(C);return D?(T(async()=>{console.log(`[BOT] ${d.name} | ${h} | hit_desktop_fallback | ${a}`),await S(l,s,u,a,g,"hit_desktop_fallback"),await U(o,s,f,p,w)}),V(D,"HIT-DESKTOP",d.name)):(T(async()=>{console.log(`[BOT] ${d.name} | ${h} | miss_ai | ${a}`),await S(l,s,u,a,g,"miss_ai"),await Promise.all([U(o,s,f,p,w),v(o,s,f)])}),null)}let c=await _(y,O),E=await n.V2_CACHE.get(c);return E?(T(async()=>{console.log(`[BOT] ${d.name} | ${h} | hit | ${a}`),await S(l,s,u,a,g,"hit"),await v(o,s,f)}),V(E,"HIT",d.name)):(T(async()=>{console.log(`[BOT] ${d.name} | ${h} | miss | ${a}`),await S(l,s,u,a,g,"miss"),await v(o,s,f)}),null)}catch(c){return console.error("[bot-proxy]",c),null}}function V(e,n,t){return new Response(e,{headers:{"Content-Type":"text/html; charset=utf-8","X-Cache":n,"X-Bot":t}})}async function S(e,n,t,r,s,i){await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({project_id:n,url:`https://${t}${r}`,domain:t,path:r,user_agent:s,phase:i})})}async function v(e,n,t){await fetch(`${e}/v2/cache/kv`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({items:[{url:t,project_id:n}]})})}function m(e,n=200){return new Response(JSON.stringify(e),{status:n,headers:{"Content-Type":"application/json"}})}async function yt(e,n){try{let{entries:t=[]}=await e.json();if(!n.V2_CACHE)return m({success:!1,error:"V2_CACHE \uBC14\uC778\uB529 \uC5C6\uC74C"},500);if(!t.length)return m({success:!1,error:"entries \uD544\uC218"},400);let r=0;for(let s of t){let{url:i,html:o,variant:l="",device:b="desktop"}=s||{};if(!i||!o)continue;let p=l.startsWith("v2_")?l.substring(3):b,w=await _(i,p);await n.V2_CACHE.put(w,o,{expirationTtl:mt}),r++}return m({success:!0,updated:r})}catch(t){return m({success:!1,error:t.message},500)}}async function _t(e,n){try{let{urls:t=[],variant:r=""}=await e.json();if(!n.V2_CACHE)return m({success:!1,error:"V2_CACHE \uBC14\uC778\uB529 \uC5C6\uC74C"},500);if(!t.length)return m({success:!1,error:"urls \uD544\uC218"},400);let s=r.startsWith("v2_")?r.substring(3):"desktop",i=0;for(let o of t){let l=await _(o,s);await n.V2_CACHE.delete(l),i++}return m({success:!0,deleted:i})}catch(t){return m({success:!1,error:t.message},500)}}async function bt(e,n){try{let{url:t,variant:r=""}=await e.json();if(!n.V2_CACHE)return m({success:!1,error:"V2_CACHE \uBC14\uC778\uB529 \uC5C6\uC74C"},500);if(!t)return m({success:!1,error:"url \uD544\uC218"},400);let s=r.startsWith("v2_")?r.substring(3):"desktop",i=await _(t,s),o=await n.V2_CACHE.get(i);return m({success:!0,html:o??null})}catch(t){return m({success:!1,error:t.message},500)}}async function U(e,n,t,r,s){let i={items:[{url:t,project_id:n}],ocr:r};s.length>0&&(i.path_prefixes=s),await fetch(`${e}/v2/cache/kv/ai`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)})}0&&(module.exports={cloudflareProxy,nextjsProxy});
1
+ "use strict";var et=Object.create;var P=Object.defineProperty;var nt=Object.getOwnPropertyDescriptor;var st=Object.getOwnPropertyNames;var rt=Object.getPrototypeOf,ot=Object.prototype.hasOwnProperty;var at=(e,n)=>{for(var t in n)P(e,t,{get:n[t],enumerable:!0})},W=(e,n,t,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let s of st(n))!ot.call(e,s)&&s!==t&&P(e,s,{get:()=>n[s],enumerable:!(r=nt(n,s))||r.enumerable});return e};var X=(e,n,t)=>(t=e!=null?et(rt(e)):{},W(n||!e||!e.__esModule?P(t,"default",{value:e,enumerable:!0}):t,e)),it=e=>W(P({},"__esModule",{value:!0}),e);var Ct={};at(Ct,{cloudflareProxy:()=>q,nextjsProxy:()=>Z});module.exports=it(Ct);var H=["chatgpt-user","claude-user","perplexity-user","gemini-user","gemini-deep-research","mistralai-user","grok-user"],M=["gptbot","oai-searchbot","claudebot","claude-searchbot","google-extended","google-cloudvertexbot","perplexitybot","meta-externalagent","applebot-extended","amazonbot","cohere-ai","bytespider","deepseekbot","grokbot","ccbot","diffbot","ai2bot","petalbot"],Q=["googlebot","googlebot-image","googlebot-video","googlebot-news","googleother","mediapartners-google","adsbot-google","google-inspectiontool","bingbot","bingpreview","naverbot","yeti","daumoa","baiduspider","yandexbot","duckduckbot","applebot"],z=["facebookexternalhit","linkedinbot","twitterbot","slackbot","discordbot","telegrambot","whatsapp","pinterestbot","redditbot"],G=["ahrefsbot","semrushbot","mj12bot","dotbot","dataforseobot"],ct=["uptimerobot","lighthouse","chrome-lighthouse"],J=new Set([...H,...M]),N=new Set(H),lt=[...H,...M,...Q,...z,...G,...ct];function j(e){let n=e.toLowerCase();for(let t of lt)if(n.includes(t)){let r;return N.has(t)?r="ai-user":J.has(t)?r="ai-crawl":Q.includes(t)?r="search":z.includes(t)?r="sns":G.includes(t)?r="seo":r="monitoring",{name:t,isAi:J.has(t),category:r}}return null}var pt=new Set(["utm_source","utm_medium","utm_campaign","utm_term","utm_content","fbclid","fb_action_ids","fb_action_types","fb_source","fb_ref","gclid","gclsrc","dclid","gbraid","wbraid","msclkid","hsa_cam","hsa_grp","hsa_mt","hsa_src","hsa_ad","hsa_acc","hsa_net","hsa_ver","hsa_la","hsa_ol","hsa_kw","_hsenc","_hsmi","_ga","_gl","_bhlid","mc_cid","mc_eid","oly_anon_id","oly_enc_id","ttclid","yclid","irclickid"]);function R(e){if(!e||(e.startsWith("?")&&(e=e.substring(1)),!e))return"";let n=[];for(let t of e.split("&")){if(!t)continue;let r=t.indexOf("="),s=r===-1?t:t.substring(0,r);pt.has(s.toLowerCase())||n.push(t)}return n.join("&")}function F(e){return encodeURIComponent(e).replace(/[!'()*]/g,n=>"%"+n.charCodeAt(0).toString(16).toUpperCase())}function ut(e){if(!e)return"/";let n,t,r=e.slice(0,8).toLowerCase();if(r.startsWith("http://")||r.startsWith("https://"))try{let o=new URL(e);n=o.pathname,t=o.search.startsWith("?")?o.search.substring(1):o.search}catch{n=e,t=""}else{let o=e.indexOf("?");o===-1?(n=e,t=""):(n=e.substring(0,o),t=e.substring(o+1))}n||(n="/");let s=n.split("/").map(o=>{if(!o)return o;try{return F(decodeURIComponent(o))}catch{return F(o)}}).join("/"),i=R(t);return i?`${s}?${i}`:s}async function gt(e){if(typeof process<"u"&&process.versions?.node){let{createHash:r}=await import("crypto");return r("md5").update(e,"utf8").digest("hex")}let n=new TextEncoder().encode(e),t=await crypto.subtle.digest("MD5",n);return Array.from(new Uint8Array(t),r=>r.toString(16).padStart(2,"0")).join("")}async function b(e,n){let t=ut(e);return`${await gt(t)}_${n}`}var Y=/^\/(?:robots\.txt|llms\.txt|sitemap[^\/]*\.(?:xml|xsl))$/i,dt=/mobile|android|iphone|phone|tablet|webos|ipad/i;async function Z(e,n){let{projectId:t,cloudfrontDomain:r,renderDomain:s,botLogEndpoint:i,aiRender:o=!0,ocr:c=!0,aiPathPrefixes:$=[]}=n,l=n.siteDomain.replace(/^https?:\/\//,"").replace(/\/+$/,""),C=r.replace(/\/$/,""),x=new URL(e.url),a=x.pathname;if(e.headers.get("x-prerender-host")){if(Y.test(a)||a===`/${t}.txt`){let{NextResponse:h}=await import("next/server");return h.next()}return null}if(a===`/${t}.txt`)return new Response(t,{status:200,headers:{"Content-Type":"text/plain","Cache-Control":"public, max-age=3600"}});if(Y.test(a)){try{let h=await fetch(`${s}/static${a}`,{headers:{"X-Signature":t,"X-Original-Host":l}});if(h.ok)return new Response(h.body,{status:200,headers:{"Content-Type":h.headers.get("Content-Type")||"text/plain","Cache-Control":"public, max-age=3600"}})}catch{}return null}let p=e.headers.get("user-agent")||"",d=j(p);if(!d)return null;let g=dt.test(p)?"mobile":"desktop",O=R(x.search),E=O?`${a}?${O}`:a,y=`https://${l}${E}`,f=ht(e);try{if(d.isAi&&o){let _=await b(E,"ai"),u=await fetch(`${C}/v2/${l}/${_}.html`,{headers:{Accept:"text/html"}});if(u.ok){let w=await u.text();if(w&&w.length>100)return A(i,f,t,l,a,x.search,p,"hit_ai"),L(s,t,y,c,$),B(w,"HIT-AI",d.name)}let k=await b(E,"desktop"),I=await fetch(`${C}/v2/${l}/${k}.html`,{headers:{Accept:"text/html"}});if(I.ok){let w=await I.text();if(w&&w.length>100)return A(i,f,t,l,a,x.search,p,"hit_desktop_fallback"),L(s,t,y,c,$),B(w,"HIT-DESKTOP",d.name)}return A(i,f,t,l,a,x.search,p,"miss_ai"),L(s,t,y,c,$),K(s,t,y),null}let h=await b(E,g),T=await fetch(`${C}/v2/${l}/${h}.html`,{headers:{Accept:"text/html"}});if(T.ok){let _=await T.text();if(_&&_.length>100)return A(i,f,t,l,a,x.search,p,"hit"),K(s,t,y),B(_,"HIT",d.name)}}catch{}return A(i,f,t,l,a,x.search,p,"miss"),K(s,t,y),null}function B(e,n,t){return new Response(e,{headers:{"Content-Type":"text/html; charset=utf-8","X-Cache":n,"X-Bot":t}})}function ht(e){let n=e.headers,t=n.get("x-forwarded-for")||"";return n.get("cf-connecting-ip")||n.get("x-real-ip")||t.split(",")[0].trim()||""}function A(e,n,t,r,s,i,o,c){fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({project_id:t,url:`https://${r}${s}${i}`,domain:r,path:s,user_agent:o,phase:c,client_ip:n})}).catch(()=>{})}function K(e,n,t){fetch(`${e}/v2/cache`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({items:[{url:t,project_id:n}]})}).catch(()=>{})}function L(e,n,t,r,s){let i={items:[{url:t,project_id:n}],ocr:r};s.length>0&&(i.path_prefixes=s),fetch(`${e}/v2/cache/ai`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)}).catch(()=>{})}var ft=/^\/(?:robots\.txt|llms\.txt|sitemap[^\/]*\.(?:xml|xsl))$/i,mt=/mobile|android|iphone|phone|tablet|webos|ipad/i,yt=604800;async function q(e,n,t,r){let{projectId:s,siteDomain:i,renderDomain:o,botLogEndpoint:c,aiRender:$=!0,ocr:l=!0,aiPathPrefixes:C=[]}=r,x=new URL(e.url),a=x.pathname,p=i.replace(/^https?:\/\//,"").replace(/\/+$/,"");if(e.method==="POST"){if(a==="/__update-edge-cache")return bt(e,n);if(a==="/__purge-edge-cache")return xt(e,n);if(a==="/__read-edge-cache")return wt(e,n)}if(e.headers.get("x-prerender-host"))return null;if(a===`/${s}.txt`)try{let u=await fetch(`${o}${a}`,{redirect:"manual"});return new Response(u.body,{status:u.status,headers:{"Content-Type":"text/plain","Cache-Control":"public, max-age=3600"}})}catch{return new Response("",{status:404})}if(ft.test(a))try{let u=await fetch(`${o}/static${a}`,{redirect:"manual",headers:{"X-Signature":s,"X-Original-Host":p}});return new Response(u.body,{status:u.status,headers:{"Content-Type":u.headers.get("Content-Type")||"text/plain","Cache-Control":"public, max-age=3600"}})}catch{return null}let d=e.headers.get("user-agent")||"",g=j(d);if(!g||!n.V2_CACHE)return null;let O=mt.test(d)?"mobile":"desktop",E=R(x.search),y=E?`${a}?${E}`:a,f=`https://${p}${y}`,h=N.has(g.name)?"ai-user":g.isAi?"ai-crawl":"standard",T=_t(e),_=u=>t.waitUntil(u().catch(k=>console.error("[bot-proxy]",k)));try{if(g.isAi&&$){let I=await b(y,"ai"),w=await n.V2_CACHE.get(I);if(w)return _(async()=>{console.log(`[BOT] ${g.name} | ${h} | hit_ai | ${a}`),await S(c,T,s,p,a,d,"hit_ai"),await U(o,s,f,l,C)}),V(w,"HIT-AI",g.name);let tt=await b(y,"desktop"),D=await n.V2_CACHE.get(tt);return D?(_(async()=>{console.log(`[BOT] ${g.name} | ${h} | hit_desktop_fallback | ${a}`),await S(c,T,s,p,a,d,"hit_desktop_fallback"),await U(o,s,f,l,C)}),V(D,"HIT-DESKTOP",g.name)):(_(async()=>{console.log(`[BOT] ${g.name} | ${h} | miss_ai | ${a}`),await S(c,T,s,p,a,d,"miss_ai"),await Promise.all([U(o,s,f,l,C),v(o,s,f)])}),null)}let u=await b(y,O),k=await n.V2_CACHE.get(u);return k?(_(async()=>{console.log(`[BOT] ${g.name} | ${h} | hit | ${a}`),await S(c,T,s,p,a,d,"hit"),await v(o,s,f)}),V(k,"HIT",g.name)):(_(async()=>{console.log(`[BOT] ${g.name} | ${h} | miss | ${a}`),await S(c,T,s,p,a,d,"miss"),await v(o,s,f)}),null)}catch(u){return console.error("[bot-proxy]",u),null}}function V(e,n,t){return new Response(e,{headers:{"Content-Type":"text/html; charset=utf-8","X-Cache":n,"X-Bot":t}})}function _t(e){let n=e.headers;return n.get("cf-connecting-ip")||n.get("x-real-ip")||(n.get("x-forwarded-for")||"").split(",")[0].trim()||""}async function S(e,n,t,r,s,i,o){await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({project_id:t,url:`https://${r}${s}`,domain:r,path:s,user_agent:i,phase:o,client_ip:n})})}async function v(e,n,t){await fetch(`${e}/v2/cache/kv`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({items:[{url:t,project_id:n}]})})}function m(e,n=200){return new Response(JSON.stringify(e),{status:n,headers:{"Content-Type":"application/json"}})}async function bt(e,n){try{let{entries:t=[]}=await e.json();if(!n.V2_CACHE)return m({success:!1,error:"V2_CACHE \uBC14\uC778\uB529 \uC5C6\uC74C"},500);if(!t.length)return m({success:!1,error:"entries \uD544\uC218"},400);let r=0;for(let s of t){let{url:i,html:o,variant:c="",device:$="desktop"}=s||{};if(!i||!o)continue;let l=c.startsWith("v2_")?c.substring(3):$,C=await b(i,l);await n.V2_CACHE.put(C,o,{expirationTtl:yt}),r++}return m({success:!0,updated:r})}catch(t){return m({success:!1,error:t.message},500)}}async function xt(e,n){try{let{urls:t=[],variant:r=""}=await e.json();if(!n.V2_CACHE)return m({success:!1,error:"V2_CACHE \uBC14\uC778\uB529 \uC5C6\uC74C"},500);if(!t.length)return m({success:!1,error:"urls \uD544\uC218"},400);let s=r.startsWith("v2_")?r.substring(3):"desktop",i=0;for(let o of t){let c=await b(o,s);await n.V2_CACHE.delete(c),i++}return m({success:!0,deleted:i})}catch(t){return m({success:!1,error:t.message},500)}}async function wt(e,n){try{let{url:t,variant:r=""}=await e.json();if(!n.V2_CACHE)return m({success:!1,error:"V2_CACHE \uBC14\uC778\uB529 \uC5C6\uC74C"},500);if(!t)return m({success:!1,error:"url \uD544\uC218"},400);let s=r.startsWith("v2_")?r.substring(3):"desktop",i=await b(t,s),o=await n.V2_CACHE.get(i);return m({success:!0,html:o??null})}catch(t){return m({success:!1,error:t.message},500)}}async function U(e,n,t,r,s){let i={items:[{url:t,project_id:n}],ocr:r};s.length>0&&(i.path_prefixes=s),await fetch(`${e}/v2/cache/kv/ai`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)})}0&&(module.exports={cloudflareProxy,nextjsProxy});
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import{a as o}from"./chunk-JXQQEZ5V.js";import{a as r}from"./chunk-3FWDO7FS.js";import"./chunk-BVZHYMX6.js";export{o as cloudflareProxy,r as nextjsProxy};
1
+ import{a as o}from"./chunk-WERE2ZTC.js";import{a as r}from"./chunk-NYRQ66HM.js";import"./chunk-BVZHYMX6.js";export{o as cloudflareProxy,r as nextjsProxy};
package/dist/nextjs.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";var F=Object.create;var w=Object.defineProperty;var G=Object.getOwnPropertyDescriptor;var J=Object.getOwnPropertyNames;var Q=Object.getPrototypeOf,V=Object.prototype.hasOwnProperty;var Y=(e,o)=>{for(var t in o)w(e,t,{get:o[t],enumerable:!0})},j=(e,o,t,n)=>{if(o&&typeof o=="object"||typeof o=="function")for(let s of J(o))!V.call(e,s)&&s!==t&&w(e,s,{get:()=>o[s],enumerable:!(n=G(o,s))||n.enumerable});return e};var B=(e,o,t)=>(t=e!=null?F(Q(e)):{},j(o||!e||!e.__esModule?w(t,"default",{value:e,enumerable:!0}):t,e)),Z=e=>j(w({},"__esModule",{value:!0}),e);var at={};Y(at,{nextjsProxy:()=>M});module.exports=Z(at);var R=["chatgpt-user","claude-user","perplexity-user","gemini-user","gemini-deep-research","mistralai-user","grok-user"],L=["gptbot","oai-searchbot","claudebot","claude-searchbot","google-extended","google-cloudvertexbot","perplexitybot","meta-externalagent","applebot-extended","amazonbot","cohere-ai","bytespider","deepseekbot","grokbot","ccbot","diffbot","ai2bot","petalbot"],P=["googlebot","googlebot-image","googlebot-video","googlebot-news","googleother","mediapartners-google","adsbot-google","google-inspectiontool","bingbot","bingpreview","naverbot","yeti","daumoa","baiduspider","yandexbot","duckduckbot","applebot"],v=["facebookexternalhit","linkedinbot","twitterbot","slackbot","discordbot","telegrambot","whatsapp","pinterestbot","redditbot"],U=["ahrefsbot","semrushbot","mj12bot","dotbot","dataforseobot"],q=["uptimerobot","lighthouse","chrome-lighthouse"],K=new Set([...R,...L]),tt=new Set(R),et=[...R,...L,...P,...v,...U,...q];function D(e){let o=e.toLowerCase();for(let t of et)if(o.includes(t)){let n;return tt.has(t)?n="ai-user":K.has(t)?n="ai-crawl":P.includes(t)?n="search":v.includes(t)?n="sns":U.includes(t)?n="seo":n="monitoring",{name:t,isAi:K.has(t),category:n}}return null}var ot=new Set(["utm_source","utm_medium","utm_campaign","utm_term","utm_content","fbclid","fb_action_ids","fb_action_types","fb_source","fb_ref","gclid","gclsrc","dclid","gbraid","wbraid","msclkid","hsa_cam","hsa_grp","hsa_mt","hsa_src","hsa_ad","hsa_acc","hsa_net","hsa_ver","hsa_la","hsa_ol","hsa_kw","_hsenc","_hsmi","_ga","_gl","_bhlid","mc_cid","mc_eid","oly_anon_id","oly_enc_id","ttclid","yclid","irclickid"]);function T(e){if(!e||(e.startsWith("?")&&(e=e.substring(1)),!e))return"";let o=[];for(let t of e.split("&")){if(!t)continue;let n=t.indexOf("="),s=n===-1?t:t.substring(0,n);ot.has(s.toLowerCase())||o.push(t)}return o.join("&")}function H(e){return encodeURIComponent(e).replace(/[!'()*]/g,o=>"%"+o.charCodeAt(0).toString(16).toUpperCase())}function nt(e){if(!e)return"/";let o,t,n=e.slice(0,8).toLowerCase();if(n.startsWith("http://")||n.startsWith("https://"))try{let r=new URL(e);o=r.pathname,t=r.search.startsWith("?")?r.search.substring(1):r.search}catch{o=e,t=""}else{let r=e.indexOf("?");r===-1?(o=e,t=""):(o=e.substring(0,r),t=e.substring(r+1))}o||(o="/");let s=o.split("/").map(r=>{if(!r)return r;try{return H(decodeURIComponent(r))}catch{return H(r)}}).join("/"),i=T(t);return i?`${s}?${i}`:s}async function st(e){if(typeof process<"u"&&process.versions?.node){let{createHash:n}=await import("crypto");return n("md5").update(e,"utf8").digest("hex")}let o=new TextEncoder().encode(e),t=await crypto.subtle.digest("MD5",o);return Array.from(new Uint8Array(t),n=>n.toString(16).padStart(2,"0")).join("")}async function S(e,o){let t=nt(e);return`${await st(t)}_${o}`}var W=/^\/(?:robots\.txt|llms\.txt|sitemap[^\/]*\.(?:xml|xsl))$/i,rt=/mobile|android|iphone|phone|tablet|webos|ipad/i;async function M(e,o){let{projectId:t,cloudfrontDomain:n,renderDomain:s,botLogEndpoint:i,aiRender:r=!0,ocr:m=!0,aiPathPrefixes:h=[]}=o,c=o.siteDomain.replace(/^https?:\/\//,"").replace(/\/+$/,""),C=n.replace(/\/$/,""),p=new URL(e.url),a=p.pathname;if(e.headers.get("x-prerender-host")){if(W.test(a)||a===`/${t}.txt`){let{NextResponse:d}=await import("next/server");return d.next()}return null}if(a===`/${t}.txt`)return new Response(t,{status:200,headers:{"Content-Type":"text/plain","Cache-Control":"public, max-age=3600"}});if(W.test(a)){try{let d=await fetch(`${s}/static${a}`,{headers:{"X-Signature":t,"X-Original-Host":c}});if(d.ok)return new Response(d.body,{status:200,headers:{"Content-Type":d.headers.get("Content-Type")||"text/plain","Cache-Control":"public, max-age=3600"}})}catch{}return null}let l=e.headers.get("user-agent")||"",f=D(l);if(!f)return null;let X=rt.test(l)?"mobile":"desktop",O=T(p.search),y=O?`${a}?${O}`:a,u=`https://${c}${y}`,b=it(e);try{if(f.isAi&&r){let x=await S(y,"ai"),A=await fetch(`${C}/v2/${c}/${x}.html`,{headers:{Accept:"text/html"}});if(A.ok){let g=await A.text();if(g&&g.length>100)return _(i,b,t,c,a,p.search,l,"hit_ai"),I(s,t,u,m,h),$(g,"HIT-AI",f.name)}let z=await S(y,"desktop"),N=await fetch(`${C}/v2/${c}/${z}.html`,{headers:{Accept:"text/html"}});if(N.ok){let g=await N.text();if(g&&g.length>100)return _(i,b,t,c,a,p.search,l,"hit_desktop_fallback"),I(s,t,u,m,h),$(g,"HIT-DESKTOP",f.name)}return _(i,b,t,c,a,p.search,l,"miss_ai"),I(s,t,u,m,h),k(s,t,u),null}let d=await S(y,X),E=await fetch(`${C}/v2/${c}/${d}.html`,{headers:{Accept:"text/html"}});if(E.ok){let x=await E.text();if(x&&x.length>100)return _(i,b,t,c,a,p.search,l,"hit"),k(s,t,u),$(x,"HIT",f.name)}}catch{}return _(i,b,t,c,a,p.search,l,"miss"),k(s,t,u),null}function $(e,o,t){return new Response(e,{headers:{"Content-Type":"text/html; charset=utf-8","X-Cache":o,"X-Bot":t}})}function it(e){let o=e.headers,t=o.get("x-forwarded-for")||"";return o.get("cf-connecting-ip")||o.get("x-real-ip")||t.split(",")[0].trim()||""}function _(e,o,t,n,s,i,r,m){let h={"Content-Type":"application/json"};o&&(h["X-Forwarded-For"]=o),fetch(e,{method:"POST",headers:h,body:JSON.stringify({project_id:t,url:`https://${n}${s}${i}`,domain:n,path:s,user_agent:r,phase:m})}).catch(()=>{})}function k(e,o,t){fetch(`${e}/v2/cache`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({items:[{url:t,project_id:o}]})}).catch(()=>{})}function I(e,o,t,n,s){let i={items:[{url:t,project_id:o}],ocr:n};s.length>0&&(i.path_prefixes=s),fetch(`${e}/v2/cache/ai`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)}).catch(()=>{})}0&&(module.exports={nextjsProxy});
1
+ "use strict";var G=Object.create;var y=Object.defineProperty;var J=Object.getOwnPropertyDescriptor;var Q=Object.getOwnPropertyNames;var F=Object.getPrototypeOf,V=Object.prototype.hasOwnProperty;var Y=(e,o)=>{for(var t in o)y(e,t,{get:o[t],enumerable:!0})},j=(e,o,t,n)=>{if(o&&typeof o=="object"||typeof o=="function")for(let s of Q(o))!V.call(e,s)&&s!==t&&y(e,s,{get:()=>o[s],enumerable:!(n=J(o,s))||n.enumerable});return e};var B=(e,o,t)=>(t=e!=null?G(F(e)):{},j(o||!e||!e.__esModule?y(t,"default",{value:e,enumerable:!0}):t,e)),Z=e=>j(y({},"__esModule",{value:!0}),e);var at={};Y(at,{nextjsProxy:()=>M});module.exports=Z(at);var R=["chatgpt-user","claude-user","perplexity-user","gemini-user","gemini-deep-research","mistralai-user","grok-user"],L=["gptbot","oai-searchbot","claudebot","claude-searchbot","google-extended","google-cloudvertexbot","perplexitybot","meta-externalagent","applebot-extended","amazonbot","cohere-ai","bytespider","deepseekbot","grokbot","ccbot","diffbot","ai2bot","petalbot"],P=["googlebot","googlebot-image","googlebot-video","googlebot-news","googleother","mediapartners-google","adsbot-google","google-inspectiontool","bingbot","bingpreview","naverbot","yeti","daumoa","baiduspider","yandexbot","duckduckbot","applebot"],v=["facebookexternalhit","linkedinbot","twitterbot","slackbot","discordbot","telegrambot","whatsapp","pinterestbot","redditbot"],U=["ahrefsbot","semrushbot","mj12bot","dotbot","dataforseobot"],q=["uptimerobot","lighthouse","chrome-lighthouse"],K=new Set([...R,...L]),tt=new Set(R),et=[...R,...L,...P,...v,...U,...q];function D(e){let o=e.toLowerCase();for(let t of et)if(o.includes(t)){let n;return tt.has(t)?n="ai-user":K.has(t)?n="ai-crawl":P.includes(t)?n="search":v.includes(t)?n="sns":U.includes(t)?n="seo":n="monitoring",{name:t,isAi:K.has(t),category:n}}return null}var ot=new Set(["utm_source","utm_medium","utm_campaign","utm_term","utm_content","fbclid","fb_action_ids","fb_action_types","fb_source","fb_ref","gclid","gclsrc","dclid","gbraid","wbraid","msclkid","hsa_cam","hsa_grp","hsa_mt","hsa_src","hsa_ad","hsa_acc","hsa_net","hsa_ver","hsa_la","hsa_ol","hsa_kw","_hsenc","_hsmi","_ga","_gl","_bhlid","mc_cid","mc_eid","oly_anon_id","oly_enc_id","ttclid","yclid","irclickid"]);function w(e){if(!e||(e.startsWith("?")&&(e=e.substring(1)),!e))return"";let o=[];for(let t of e.split("&")){if(!t)continue;let n=t.indexOf("="),s=n===-1?t:t.substring(0,n);ot.has(s.toLowerCase())||o.push(t)}return o.join("&")}function H(e){return encodeURIComponent(e).replace(/[!'()*]/g,o=>"%"+o.charCodeAt(0).toString(16).toUpperCase())}function nt(e){if(!e)return"/";let o,t,n=e.slice(0,8).toLowerCase();if(n.startsWith("http://")||n.startsWith("https://"))try{let r=new URL(e);o=r.pathname,t=r.search.startsWith("?")?r.search.substring(1):r.search}catch{o=e,t=""}else{let r=e.indexOf("?");r===-1?(o=e,t=""):(o=e.substring(0,r),t=e.substring(r+1))}o||(o="/");let s=o.split("/").map(r=>{if(!r)return r;try{return H(decodeURIComponent(r))}catch{return H(r)}}).join("/"),i=w(t);return i?`${s}?${i}`:s}async function st(e){if(typeof process<"u"&&process.versions?.node){let{createHash:n}=await import("crypto");return n("md5").update(e,"utf8").digest("hex")}let o=new TextEncoder().encode(e),t=await crypto.subtle.digest("MD5",o);return Array.from(new Uint8Array(t),n=>n.toString(16).padStart(2,"0")).join("")}async function T(e,o){let t=nt(e);return`${await st(t)}_${o}`}var W=/^\/(?:robots\.txt|llms\.txt|sitemap[^\/]*\.(?:xml|xsl))$/i,rt=/mobile|android|iphone|phone|tablet|webos|ipad/i;async function M(e,o){let{projectId:t,cloudfrontDomain:n,renderDomain:s,botLogEndpoint:i,aiRender:r=!0,ocr:u=!0,aiPathPrefixes:S=[]}=o,c=o.siteDomain.replace(/^https?:\/\//,"").replace(/\/+$/,""),C=n.replace(/\/$/,""),p=new URL(e.url),a=p.pathname;if(e.headers.get("x-prerender-host")){if(W.test(a)||a===`/${t}.txt`){let{NextResponse:d}=await import("next/server");return d.next()}return null}if(a===`/${t}.txt`)return new Response(t,{status:200,headers:{"Content-Type":"text/plain","Cache-Control":"public, max-age=3600"}});if(W.test(a)){try{let d=await fetch(`${s}/static${a}`,{headers:{"X-Signature":t,"X-Original-Host":c}});if(d.ok)return new Response(d.body,{status:200,headers:{"Content-Type":d.headers.get("Content-Type")||"text/plain","Cache-Control":"public, max-age=3600"}})}catch{}return null}let l=e.headers.get("user-agent")||"",m=D(l);if(!m)return null;let z=rt.test(l)?"mobile":"desktop",O=w(p.search),_=O?`${a}?${O}`:a,h=`https://${c}${_}`,f=it(e);try{if(m.isAi&&r){let b=await T(_,"ai"),A=await fetch(`${C}/v2/${c}/${b}.html`,{headers:{Accept:"text/html"}});if(A.ok){let g=await A.text();if(g&&g.length>100)return x(i,f,t,c,a,p.search,l,"hit_ai"),I(s,t,h,u,S),$(g,"HIT-AI",m.name)}let X=await T(_,"desktop"),N=await fetch(`${C}/v2/${c}/${X}.html`,{headers:{Accept:"text/html"}});if(N.ok){let g=await N.text();if(g&&g.length>100)return x(i,f,t,c,a,p.search,l,"hit_desktop_fallback"),I(s,t,h,u,S),$(g,"HIT-DESKTOP",m.name)}return x(i,f,t,c,a,p.search,l,"miss_ai"),I(s,t,h,u,S),k(s,t,h),null}let d=await T(_,z),E=await fetch(`${C}/v2/${c}/${d}.html`,{headers:{Accept:"text/html"}});if(E.ok){let b=await E.text();if(b&&b.length>100)return x(i,f,t,c,a,p.search,l,"hit"),k(s,t,h),$(b,"HIT",m.name)}}catch{}return x(i,f,t,c,a,p.search,l,"miss"),k(s,t,h),null}function $(e,o,t){return new Response(e,{headers:{"Content-Type":"text/html; charset=utf-8","X-Cache":o,"X-Bot":t}})}function it(e){let o=e.headers,t=o.get("x-forwarded-for")||"";return o.get("cf-connecting-ip")||o.get("x-real-ip")||t.split(",")[0].trim()||""}function x(e,o,t,n,s,i,r,u){fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({project_id:t,url:`https://${n}${s}${i}`,domain:n,path:s,user_agent:r,phase:u,client_ip:o})}).catch(()=>{})}function k(e,o,t){fetch(`${e}/v2/cache`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({items:[{url:t,project_id:o}]})}).catch(()=>{})}function I(e,o,t,n,s){let i={items:[{url:t,project_id:o}],ocr:n};s.length>0&&(i.path_prefixes=s),fetch(`${e}/v2/cache/ai`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)}).catch(()=>{})}0&&(module.exports={nextjsProxy});
package/dist/nextjs.js CHANGED
@@ -1 +1 @@
1
- import{a as o}from"./chunk-3FWDO7FS.js";import"./chunk-BVZHYMX6.js";export{o as nextjsProxy};
1
+ import{a as o}from"./chunk-NYRQ66HM.js";import"./chunk-BVZHYMX6.js";export{o as nextjsProxy};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@searchos/bot-proxy",
3
- "version": "1.0.8",
3
+ "version": "1.0.10",
4
4
  "description": "SearchOS 봇 프록시 — Next.js, Cloudflare Worker용 봇 감지 + 캐시 프록시",
5
5
  "type": "module",
6
6
  "exports": {
@@ -1 +0,0 @@
1
- import{b as I,c as S,d as w}from"./chunk-BVZHYMX6.js";var A=/^\/(?:robots\.txt|llms\.txt|sitemap[^\/]*\.(?:xml|xsl))$/i,L=/mobile|android|iphone|phone|tablet|webos|ipad/i;async function B(n,e){let{projectId:t,cloudfrontDomain:l,renderDomain:r,botLogEndpoint:o,aiRender:b=!0,ocr:m=!0,aiPathPrefixes:d=[]}=e,i=e.siteDomain.replace(/^https?:\/\//,"").replace(/\/+$/,""),R=l.replace(/\/$/,""),a=new URL(n.url),s=a.pathname;if(n.headers.get("x-prerender-host")){if(A.test(s)||s===`/${t}.txt`){let{NextResponse:h}=await import("next/server");return h.next()}return null}if(s===`/${t}.txt`)return new Response(t,{status:200,headers:{"Content-Type":"text/plain","Cache-Control":"public, max-age=3600"}});if(A.test(s)){try{let h=await fetch(`${r}/static${s}`,{headers:{"X-Signature":t,"X-Original-Host":i}});if(h.ok)return new Response(h.body,{status:200,headers:{"Content-Type":h.headers.get("Content-Type")||"text/plain","Cache-Control":"public, max-age=3600"}})}catch{}return null}let c=n.headers.get("user-agent")||"",u=I(c);if(!u)return null;let D=L.test(c)?"mobile":"desktop",j=S(a.search),$=j?`${s}?${j}`:s,g=`https://${i}${$}`,f=v(n);try{if(u.isAi&&b){let x=await w($,"ai"),O=await fetch(`${R}/v2/${i}/${x}.html`,{headers:{Accept:"text/html"}});if(O.ok){let p=await O.text();if(p&&p.length>100)return y(o,f,t,i,s,a.search,c,"hit_ai"),_(r,t,g,m,d),T(p,"HIT-AI",u.name)}let E=await w($,"desktop"),P=await fetch(`${R}/v2/${i}/${E}.html`,{headers:{Accept:"text/html"}});if(P.ok){let p=await P.text();if(p&&p.length>100)return y(o,f,t,i,s,a.search,c,"hit_desktop_fallback"),_(r,t,g,m,d),T(p,"HIT-DESKTOP",u.name)}return y(o,f,t,i,s,a.search,c,"miss_ai"),_(r,t,g,m,d),C(r,t,g),null}let h=await w($,D),k=await fetch(`${R}/v2/${i}/${h}.html`,{headers:{Accept:"text/html"}});if(k.ok){let x=await k.text();if(x&&x.length>100)return y(o,f,t,i,s,a.search,c,"hit"),C(r,t,g),T(x,"HIT",u.name)}}catch{}return y(o,f,t,i,s,a.search,c,"miss"),C(r,t,g),null}function T(n,e,t){return new Response(n,{headers:{"Content-Type":"text/html; charset=utf-8","X-Cache":e,"X-Bot":t}})}function v(n){let e=n.headers,t=e.get("x-forwarded-for")||"";return e.get("cf-connecting-ip")||e.get("x-real-ip")||t.split(",")[0].trim()||""}function y(n,e,t,l,r,o,b,m){let d={"Content-Type":"application/json"};e&&(d["X-Forwarded-For"]=e),fetch(n,{method:"POST",headers:d,body:JSON.stringify({project_id:t,url:`https://${l}${r}${o}`,domain:l,path:r,user_agent:b,phase:m})}).catch(()=>{})}function C(n,e,t){fetch(`${n}/v2/cache`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({items:[{url:t,project_id:e}]})}).catch(()=>{})}function _(n,e,t,l,r){let o={items:[{url:t,project_id:e}],ocr:l};r.length>0&&(o.path_prefixes=r),fetch(`${n}/v2/cache/ai`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)}).catch(()=>{})}export{B as a};
@@ -1 +0,0 @@
1
- import{a as O,b as P,c as j,d as h}from"./chunk-BVZHYMX6.js";var B=/^\/(?:robots\.txt|llms\.txt|sitemap[^\/]*\.(?:xml|xsl))$/i,K=/mobile|android|iphone|phone|tablet|webos|ipad/i,L=604800;async function Q(n,t,e,a){let{projectId:s,siteDomain:i,renderDomain:o,botLogEndpoint:p,aiRender:T=!0,ocr:m=!0,aiPathPrefixes:y=[]}=a,H=new URL(n.url),r=H.pathname,d=i.replace(/^https?:\/\//,"").replace(/\/+$/,"");if(n.method==="POST"){if(r==="/__update-edge-cache")return N(n,t);if(r==="/__purge-edge-cache")return U(n,t);if(r==="/__read-edge-cache")return D(n,t)}if(n.headers.get("x-prerender-host"))return null;if(r===`/${s}.txt`)try{let l=await fetch(`${o}${r}`,{redirect:"manual"});return new Response(l.body,{status:l.status,headers:{"Content-Type":"text/plain","Cache-Control":"public, max-age=3600"}})}catch{return new Response("",{status:404})}if(B.test(r))try{let l=await fetch(`${o}/static${r}`,{redirect:"manual",headers:{"X-Signature":s,"X-Original-Host":d}});return new Response(l.body,{status:l.status,headers:{"Content-Type":l.headers.get("Content-Type")||"text/plain","Cache-Control":"public, max-age=3600"}})}catch{return null}let g=n.headers.get("user-agent")||"",c=P(g);if(!c||!t.V2_CACHE)return null;let S=K.test(g)?"mobile":"desktop",R=j(H.search),E=R?`${r}?${R}`:r,f=`https://${d}${E}`,C=O.has(c.name)?"ai-user":c.isAi?"ai-crawl":"standard",w=l=>e.waitUntil(l().catch($=>console.error("[bot-proxy]",$)));try{if(c.isAi&&T){let I=await h(E,"ai"),x=await t.V2_CACHE.get(I);if(x)return w(async()=>{console.log(`[BOT] ${c.name} | ${C} | hit_ai | ${r}`),await _(p,s,d,r,g,"hit_ai"),await A(o,s,f,m,y)}),k(x,"HIT-AI",c.name);let v=await h(E,"desktop"),V=await t.V2_CACHE.get(v);return V?(w(async()=>{console.log(`[BOT] ${c.name} | ${C} | hit_desktop_fallback | ${r}`),await _(p,s,d,r,g,"hit_desktop_fallback"),await A(o,s,f,m,y)}),k(V,"HIT-DESKTOP",c.name)):(w(async()=>{console.log(`[BOT] ${c.name} | ${C} | miss_ai | ${r}`),await _(p,s,d,r,g,"miss_ai"),await Promise.all([A(o,s,f,m,y),b(o,s,f)])}),null)}let l=await h(E,S),$=await t.V2_CACHE.get(l);return $?(w(async()=>{console.log(`[BOT] ${c.name} | ${C} | hit | ${r}`),await _(p,s,d,r,g,"hit"),await b(o,s,f)}),k($,"HIT",c.name)):(w(async()=>{console.log(`[BOT] ${c.name} | ${C} | miss | ${r}`),await _(p,s,d,r,g,"miss"),await b(o,s,f)}),null)}catch(l){return console.error("[bot-proxy]",l),null}}function k(n,t,e){return new Response(n,{headers:{"Content-Type":"text/html; charset=utf-8","X-Cache":t,"X-Bot":e}})}async function _(n,t,e,a,s,i){await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({project_id:t,url:`https://${e}${a}`,domain:e,path:a,user_agent:s,phase:i})})}async function b(n,t,e){await fetch(`${n}/v2/cache/kv`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({items:[{url:e,project_id:t}]})})}function u(n,t=200){return new Response(JSON.stringify(n),{status:t,headers:{"Content-Type":"application/json"}})}async function N(n,t){try{let{entries:e=[]}=await n.json();if(!t.V2_CACHE)return u({success:!1,error:"V2_CACHE \uBC14\uC778\uB529 \uC5C6\uC74C"},500);if(!e.length)return u({success:!1,error:"entries \uD544\uC218"},400);let a=0;for(let s of e){let{url:i,html:o,variant:p="",device:T="desktop"}=s||{};if(!i||!o)continue;let m=p.startsWith("v2_")?p.substring(3):T,y=await h(i,m);await t.V2_CACHE.put(y,o,{expirationTtl:L}),a++}return u({success:!0,updated:a})}catch(e){return u({success:!1,error:e.message},500)}}async function U(n,t){try{let{urls:e=[],variant:a=""}=await n.json();if(!t.V2_CACHE)return u({success:!1,error:"V2_CACHE \uBC14\uC778\uB529 \uC5C6\uC74C"},500);if(!e.length)return u({success:!1,error:"urls \uD544\uC218"},400);let s=a.startsWith("v2_")?a.substring(3):"desktop",i=0;for(let o of e){let p=await h(o,s);await t.V2_CACHE.delete(p),i++}return u({success:!0,deleted:i})}catch(e){return u({success:!1,error:e.message},500)}}async function D(n,t){try{let{url:e,variant:a=""}=await n.json();if(!t.V2_CACHE)return u({success:!1,error:"V2_CACHE \uBC14\uC778\uB529 \uC5C6\uC74C"},500);if(!e)return u({success:!1,error:"url \uD544\uC218"},400);let s=a.startsWith("v2_")?a.substring(3):"desktop",i=await h(e,s),o=await t.V2_CACHE.get(i);return u({success:!0,html:o??null})}catch(e){return u({success:!1,error:e.message},500)}}async function A(n,t,e,a,s){let i={items:[{url:e,project_id:t}],ocr:a};s.length>0&&(i.path_prefixes=s),await fetch(`${n}/v2/cache/kv/ai`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)})}export{Q as a};