@searchos/bot-proxy 1.0.6 → 1.0.7

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
+ var i=["chatgpt-user","claude-user","perplexity-user","gemini-user","gemini-deep-research","mistralai-user","grok-user"],d=["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"],g=["googlebot","googlebot-image","googlebot-video","googlebot-news","googleother","mediapartners-google","adsbot-google","google-inspectiontool","bingbot","bingpreview","naverbot","yeti","daumoa","baiduspider","yandexbot","duckduckbot","applebot"],l=["facebookexternalhit","linkedinbot","twitterbot","slackbot","discordbot","telegrambot","whatsapp","pinterestbot","redditbot"],p=["ahrefsbot","semrushbot","mj12bot","dotbot","dataforseobot"],_=["uptimerobot","lighthouse","chrome-lighthouse"],c=new Set([...i,...d]),h=new Set(i),m=[...i,...d,...g,...l,...p,..._];function S(t){let o=t.toLowerCase();for(let e of m)if(o.includes(e)){let s;return h.has(e)?s="ai-user":c.has(e)?s="ai-crawl":g.includes(e)?s="search":l.includes(e)?s="sns":p.includes(e)?s="seo":s="monitoring",{name:e,isAi:c.has(e),category:s}}return null}var f=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 u(t){if(!t||(t.startsWith("?")&&(t=t.substring(1)),!t))return"";let o=[];for(let e of t.split("&")){if(!e)continue;let s=e.indexOf("="),r=s===-1?e:e.substring(0,s);f.has(r.toLowerCase())||o.push(e)}return o.join("&")}function b(t){return encodeURIComponent(t).replace(/[!'()*]/g,o=>"%"+o.charCodeAt(0).toString(16).toUpperCase())}function x(t){if(!t)return"/";let o,e,s=t.slice(0,8).toLowerCase();if(s.startsWith("http://")||s.startsWith("https://"))try{let n=new URL(t);o=n.pathname,e=n.search.startsWith("?")?n.search.substring(1):n.search}catch{o=t,e=""}else{let n=t.indexOf("?");n===-1?(o=t,e=""):(o=t.substring(0,n),e=t.substring(n+1))}o||(o="/");let r=o.split("/").map(n=>{if(!n)return n;try{return b(decodeURIComponent(n))}catch{return b(n)}}).join("/"),a=u(e);return a?`${r}?${a}`:r}async function y(t){if(typeof process<"u"&&process.versions?.node){let{createHash:s}=await import("crypto");return s("md5").update(t,"utf8").digest("hex")}let o=new TextEncoder().encode(t),e=await crypto.subtle.digest("MD5",o);return Array.from(new Uint8Array(e),s=>s.toString(16).padStart(2,"0")).join("")}async function C(t,o){let e=x(t);return`${await y(e)}_${o}`}export{h as a,S as b,u as c,C as d};
@@ -0,0 +1 @@
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};
@@ -0,0 +1 @@
1
+ import{b as k,c as I,d as x}from"./chunk-BVZHYMX6.js";var S=/^\/(?:robots\.txt|llms\.txt|sitemap[^\/]*\.(?:xml|xsl))$/i,E=/mobile|android|iphone|phone|tablet|webos|ipad/i;async function K(s,r){let{projectId:t,cloudfrontDomain:l,renderDomain:e,botLogEndpoint:a,aiRender:y=!0,ocr:$=!0,aiPathPrefixes:b=[]}=r,o=r.siteDomain.replace(/^https?:\/\//,"").replace(/\/+$/,""),w=l.replace(/\/$/,""),c=new URL(s.url),n=c.pathname;if(s.headers.get("x-prerender-host")){if(S.test(n)||n===`/${t}.txt`){let{NextResponse:i}=await import("next/server");return i.next()}return null}if(n===`/${t}.txt`)try{let i=await fetch(`${e}${n}`,{redirect:"manual"});return new Response(i.body,{status:i.status,headers:{"Content-Type":"text/plain","Cache-Control":"public, max-age=3600"}})}catch{return null}if(S.test(n))try{let i=await fetch(`${e}/static${n}`,{headers:{"X-Signature":t,"X-Original-Host":o}});return new Response(i.body,{status:i.status,headers:{"Content-Type":i.headers.get("Content-Type")||"text/plain","Cache-Control":"public, max-age=3600"}})}catch{return null}let h=s.headers.get("user-agent")||"",d=k(h);if(!d)return null;let A=E.test(h)?"mobile":"desktop",_=I(c.search),f=_?`${n}?${_}`:n,u=`https://${o}${f}`;try{if(d.isAi&&y){let m=await x(f,"ai"),O=await fetch(`${w}/v2/${o}/${m}.html`,{headers:{Accept:"text/html"}});if(O.ok){let p=await O.text();if(p&&p.length>100)return g(a,t,o,n,c.search,h,"hit_ai"),C(e,t,u,$,b),T(p,"HIT-AI",d.name)}let D=await x(f,"desktop"),P=await fetch(`${w}/v2/${o}/${D}.html`,{headers:{Accept:"text/html"}});if(P.ok){let p=await P.text();if(p&&p.length>100)return g(a,t,o,n,c.search,h,"hit_desktop_fallback"),C(e,t,u,$,b),T(p,"HIT-DESKTOP",d.name)}return g(a,t,o,n,c.search,h,"miss_ai"),C(e,t,u,$,b),R(e,t,u),null}let i=await x(f,A),j=await fetch(`${w}/v2/${o}/${i}.html`,{headers:{Accept:"text/html"}});if(j.ok){let m=await j.text();if(m&&m.length>100)return g(a,t,o,n,c.search,h,"hit"),R(e,t,u),T(m,"HIT",d.name)}}catch{}return g(a,t,o,n,c.search,h,"miss"),R(e,t,u),null}function T(s,r,t){return new Response(s,{headers:{"Content-Type":"text/html; charset=utf-8","X-Cache":r,"X-Bot":t}})}function g(s,r,t,l,e,a,y){fetch(s,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({project_id:r,url:`https://${t}${l}${e}`,domain:t,path:l,user_agent:a,phase:y})}).catch(()=>{})}function R(s,r,t){fetch(`${s}/v2/cache`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({items:[{url:t,project_id:r}]})}).catch(()=>{})}function C(s,r,t,l,e){let a={items:[{url:t,project_id:r}],ocr:l};e.length>0&&(a.path_prefixes=e),fetch(`${s}/v2/cache/ai`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)}).catch(()=>{})}export{K as a};
@@ -1 +1 @@
1
- "use strict";var E=Object.defineProperty;var D=Object.getOwnPropertyDescriptor;var W=Object.getOwnPropertyNames;var J=Object.prototype.hasOwnProperty;var M=(t,n)=>{for(var e in n)E(t,e,{get:n[e],enumerable:!0})},X=(t,n,e,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let o of W(n))!J.call(t,o)&&o!==e&&E(t,o,{get:()=>n[o],enumerable:!(r=D(n,o))||r.enumerable});return t};var z=t=>X(E({},"__esModule",{value:!0}),t);var ot={};M(ot,{cloudflareProxy:()=>j});module.exports=z(ot);var T=["chatgpt-user","claude-user","perplexity-user","gemini-user","gemini-deep-research","mistralai-user","grok-user"],B=["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"],N=["ahrefsbot","semrushbot","mj12bot","dotbot","dataforseobot"],G=["uptimerobot","lighthouse","chrome-lighthouse"],I=new Set([...T,...B]),O=new Set(T),F=[...T,...B,...P,...V,...N,...G];function U(t){let n=t.toLowerCase();for(let e of F)if(n.includes(e)){let r;return O.has(e)?r="ai-user":I.has(e)?r="ai-crawl":P.includes(e)?r="search":V.includes(e)?r="sns":N.includes(e)?r="seo":r="monitoring",{name:e,isAi:I.has(e),category:r}}return null}async function q(t){if(typeof process<"u"&&process.versions?.node){let{createHash:r}=require("crypto");return r("md5").update(t,"utf8").digest("hex")}let n=new TextEncoder().encode(t),e=await crypto.subtle.digest("MD5",n);return Array.from(new Uint8Array(e),r=>r.toString(16).padStart(2,"0")).join("")}function Q(t){if(!t)return"/";if(t.startsWith("http://")||t.startsWith("https://"))try{t=new URL(t).pathname}catch{}let n=t.indexOf("?");return n!==-1&&(t=t.substring(0,n)),t?t.split("/").map(e=>{if(!e)return e;try{return encodeURIComponent(decodeURIComponent(e))}catch{return encodeURIComponent(e)}}).join("/"):"/"}async function h(t,n){let e=Q(t);return`${await q(e)}_${n}`}var Y=/^\/(?:robots\.txt|llms\.txt|sitemap[^\/]*\.(?:xml|xsl))$/i,Z=/mobile|android|iphone|phone|tablet|webos|ipad/i,tt=604800;async function j(t,n,e,r){let{projectId:o,siteDomain:i,renderDomain:a,botLogEndpoint:c,aiRender:m=!0,ocr:y=!0,aiPathPrefixes:b=[]}=r,s=new URL(t.url).pathname,d=i.replace(/^https?:\/\//,"").replace(/\/+$/,"");if(t.method==="POST"){if(s==="/__update-edge-cache")return et(t,n);if(s==="/__purge-edge-cache")return nt(t,n);if(s==="/__read-edge-cache")return rt(t,n)}if(t.headers.get("x-prerender-host"))return null;if(s===`/${o}.txt`)try{let u=await fetch(`${a}${s}`,{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(Y.test(s))try{let u=await fetch(`${a}/static${s}`,{redirect:"manual",headers:{"X-Signature":o,"X-Original-Host":d}});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 g=t.headers.get("user-agent")||"",l=U(g);if(!l||!n.V2_CACHE)return null;let K=Z.test(g)?"mobile":"desktop",f=`https://${d}${s}`,w=O.has(l.name)?"ai-user":l.isAi?"ai-crawl":"standard",C=u=>e.waitUntil(u().catch(x=>console.error("[bot-proxy]",x)));try{if(l.isAi&&m){let L=await h(s,"ai"),$=await n.V2_CACHE.get(L);if($)return C(async()=>{console.log(`[BOT] ${l.name} | ${w} | hit_ai | ${s}`),await _(c,o,d,s,g,"hit_ai"),await A(a,o,f,y,b)}),R($,"HIT-AI",l.name);let v=await h(s,"desktop"),H=await n.V2_CACHE.get(v);return H?(C(async()=>{console.log(`[BOT] ${l.name} | ${w} | hit_desktop_fallback | ${s}`),await _(c,o,d,s,g,"hit_desktop_fallback"),await A(a,o,f,y,b)}),R(H,"HIT-DESKTOP",l.name)):(C(async()=>{console.log(`[BOT] ${l.name} | ${w} | miss_ai | ${s}`),await _(c,o,d,s,g,"miss_ai"),await Promise.all([A(a,o,f,y,b),k(a,o,f)])}),null)}let u=await h(s,K),x=await n.V2_CACHE.get(u);return x?(C(async()=>{console.log(`[BOT] ${l.name} | ${w} | hit | ${s}`),await _(c,o,d,s,g,"hit"),await k(a,o,f)}),R(x,"HIT",l.name)):(C(async()=>{console.log(`[BOT] ${l.name} | ${w} | miss | ${s}`),await _(c,o,d,s,g,"miss"),await k(a,o,f)}),null)}catch(u){return console.error("[bot-proxy]",u),null}}function R(t,n,e){return new Response(t,{headers:{"Content-Type":"text/html; charset=utf-8","X-Cache":n,"X-Bot":e}})}async function _(t,n,e,r,o,i){await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({project_id:n,url:`https://${e}${r}`,domain:e,path:r,user_agent:o,phase:i})})}async function k(t,n,e){await fetch(`${t}/v2/cache/kv`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({items:[{url:e,project_id:n}]})})}function p(t,n=200){return new Response(JSON.stringify(t),{status:n,headers:{"Content-Type":"application/json"}})}async function et(t,n){try{let{entries:e=[]}=await t.json();if(!n.V2_CACHE)return p({success:!1,error:"V2_CACHE \uBC14\uC778\uB529 \uC5C6\uC74C"},500);if(!e.length)return p({success:!1,error:"entries \uD544\uC218"},400);let r=0;for(let o of e){let{url:i,html:a,variant:c="",device:m="desktop"}=o||{};if(!i||!a)continue;let y=c.startsWith("v2_")?c.substring(3):m,b=new URL(i).pathname||"/",S=await h(b,y);await n.V2_CACHE.put(S,a,{expirationTtl:tt}),r++}return p({success:!0,updated:r})}catch(e){return p({success:!1,error:e.message},500)}}async function nt(t,n){try{let{urls:e=[],variant:r=""}=await t.json();if(!n.V2_CACHE)return p({success:!1,error:"V2_CACHE \uBC14\uC778\uB529 \uC5C6\uC74C"},500);if(!e.length)return p({success:!1,error:"urls \uD544\uC218"},400);let o=r.startsWith("v2_")?r.substring(3):"desktop",i=0;for(let a of e){let c=new URL(a).pathname||"/",m=await h(c,o);await n.V2_CACHE.delete(m),i++}return p({success:!0,deleted:i})}catch(e){return p({success:!1,error:e.message},500)}}async function rt(t,n){try{let{url:e,variant:r=""}=await t.json();if(!n.V2_CACHE)return p({success:!1,error:"V2_CACHE \uBC14\uC778\uB529 \uC5C6\uC74C"},500);if(!e)return p({success:!1,error:"url \uD544\uC218"},400);let o=r.startsWith("v2_")?r.substring(3):"desktop",i=new URL(e).pathname||"/",a=await h(i,o),c=await n.V2_CACHE.get(a);return p({success:!0,html:c??null})}catch(e){return p({success:!1,error:e.message},500)}}async function A(t,n,e,r,o){let i={items:[{url:e,project_id:n}],ocr:r};o.length>0&&(i.path_prefixes=o),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 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 +1 @@
1
- import{a as o}from"./chunk-MKJTG6WJ.js";import"./chunk-62QI7OUQ.js";export{o as cloudflareProxy};
1
+ import{a as o}from"./chunk-JXQQEZ5V.js";import"./chunk-BVZHYMX6.js";export{o as cloudflareProxy};
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";var F=Object.create;var k=Object.defineProperty;var Q=Object.getOwnPropertyDescriptor;var Y=Object.getOwnPropertyNames;var Z=Object.getPrototypeOf,q=Object.prototype.hasOwnProperty;var tt=(e,n)=>{for(var t in n)k(e,t,{get:n[t],enumerable:!0})},K=(e,n,t,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let s of Y(n))!q.call(e,s)&&s!==t&&k(e,s,{get:()=>n[s],enumerable:!(r=Q(n,s))||r.enumerable});return e};var et=(e,n,t)=>(t=e!=null?F(Z(e)):{},K(n||!e||!e.__esModule?k(t,"default",{value:e,enumerable:!0}):t,e)),nt=e=>K(k({},"__esModule",{value:!0}),e);var gt={};tt(gt,{cloudflareProxy:()=>z,nextjsProxy:()=>M});module.exports=nt(gt);var S=["chatgpt-user","claude-user","perplexity-user","gemini-user","gemini-deep-research","mistralai-user","grok-user"],U=["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"],D=["googlebot","googlebot-image","googlebot-video","googlebot-news","googleother","mediapartners-google","adsbot-google","google-inspectiontool","bingbot","bingpreview","naverbot","yeti","daumoa","baiduspider","yandexbot","duckduckbot","applebot"],X=["facebookexternalhit","linkedinbot","twitterbot","slackbot","discordbot","telegrambot","whatsapp","pinterestbot","redditbot"],J=["ahrefsbot","semrushbot","mj12bot","dotbot","dataforseobot"],st=["uptimerobot","lighthouse","chrome-lighthouse"],v=new Set([...S,...U]),P=new Set(S),rt=[...S,...U,...D,...X,...J,...st];function A(e){let n=e.toLowerCase();for(let t of rt)if(n.includes(t)){let r;return P.has(t)?r="ai-user":v.has(t)?r="ai-crawl":D.includes(t)?r="search":X.includes(t)?r="sns":J.includes(t)?r="seo":r="monitoring",{name:t,isAi:v.has(t),category:r}}return null}async function ot(e){if(typeof process<"u"&&process.versions?.node){let{createHash:r}=require("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("")}function at(e){if(!e)return"/";if(e.startsWith("http://")||e.startsWith("https://"))try{e=new URL(e).pathname}catch{}let n=e.indexOf("?");return n!==-1&&(e=e.substring(0,n)),e?e.split("/").map(t=>{if(!t)return t;try{return encodeURIComponent(decodeURIComponent(t))}catch{return encodeURIComponent(t)}}).join("/"):"/"}async function y(e,n){let t=at(e);return`${await ot(t)}_${n}`}var W=/^\/(?:robots\.txt|llms\.txt|sitemap[^\/]*\.(?:xml|xsl))$/i,it=/mobile|android|iphone|phone|tablet|webos|ipad/i;async function M(e,n){let{projectId:t,cloudfrontDomain:r,renderDomain:s,botLogEndpoint:a,aiRender:i=!0,ocr:l=!0,aiPathPrefixes:b=[]}=n,p=n.siteDomain.replace(/^https?:\/\//,"").replace(/\/+$/,""),w=r.replace(/\/$/,""),C=new URL(e.url),o=C.pathname;if(e.headers.get("x-prerender-host")){if(W.test(o)||o===`/${t}.txt`){let{NextResponse:c}=await import("next/server");return c.next()}return null}if(o===`/${t}.txt`)try{let c=await fetch(`${s}${o}`,{redirect:"manual"});return new Response(c.body,{status:c.status,headers:{"Content-Type":"text/plain","Cache-Control":"public, max-age=3600"}})}catch{return null}if(W.test(o))try{let c=await fetch(`${s}/static${o}`,{headers:{"X-Signature":t,"X-Original-Host":p}});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 u=e.headers.get("user-agent")||"",g=A(u);if(!g)return null;let h=it.test(u)?"mobile":"desktop",_=`https://${p}${o}`;try{if(g.isAi&&i){let m=await y(o,"ai"),d=await fetch(`${w}/v2/${p}/${m}.html`,{headers:{Accept:"text/html"}});if(d.ok){let x=await d.text();if(x&&x.length>100)return $(a,t,p,o,C.search,u,"hit_ai"),H(s,t,_,l,b),j(x,"HIT-AI",g.name)}let E=await y(o,"desktop"),O=await fetch(`${w}/v2/${p}/${E}.html`,{headers:{Accept:"text/html"}});if(O.ok){let x=await O.text();if(x&&x.length>100)return $(a,t,p,o,C.search,u,"hit_desktop_fallback"),H(s,t,_,l,b),j(x,"HIT-DESKTOP",g.name)}return $(a,t,p,o,C.search,u,"miss_ai"),H(s,t,_,l,b),I(s,t,_),null}let c=await y(o,h),T=await fetch(`${w}/v2/${p}/${c}.html`,{headers:{Accept:"text/html"}});if(T.ok){let m=await T.text();if(m&&m.length>100)return $(a,t,p,o,C.search,u,"hit"),I(s,t,_),j(m,"HIT",g.name)}}catch{}return $(a,t,p,o,C.search,u,"miss"),I(s,t,_),null}function j(e,n,t){return new Response(e,{headers:{"Content-Type":"text/html; charset=utf-8","X-Cache":n,"X-Bot":t}})}function $(e,n,t,r,s,a,i){fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({project_id:n,url:`https://${t}${r}${s}`,domain:t,path:r,user_agent:a,phase:i})}).catch(()=>{})}function I(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 H(e,n,t,r,s){let a={items:[{url:t,project_id:n}],ocr:r};s.length>0&&(a.path_prefixes=s),fetch(`${e}/v2/cache/ai`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)}).catch(()=>{})}var ct=/^\/(?:robots\.txt|llms\.txt|sitemap[^\/]*\.(?:xml|xsl))$/i,lt=/mobile|android|iphone|phone|tablet|webos|ipad/i,pt=604800;async function z(e,n,t,r){let{projectId:s,siteDomain:a,renderDomain:i,botLogEndpoint:l,aiRender:b=!0,ocr:p=!0,aiPathPrefixes:w=[]}=r,o=new URL(e.url).pathname,u=a.replace(/^https?:\/\//,"").replace(/\/+$/,"");if(e.method==="POST"){if(o==="/__update-edge-cache")return ut(e,n);if(o==="/__purge-edge-cache")return dt(e,n);if(o==="/__read-edge-cache")return ht(e,n)}if(e.headers.get("x-prerender-host"))return null;if(o===`/${s}.txt`)try{let d=await fetch(`${i}${o}`,{redirect:"manual"});return new Response(d.body,{status:d.status,headers:{"Content-Type":"text/plain","Cache-Control":"public, max-age=3600"}})}catch{return new Response("",{status:404})}if(ct.test(o))try{let d=await fetch(`${i}/static${o}`,{redirect:"manual",headers:{"X-Signature":s,"X-Original-Host":u}});return new Response(d.body,{status:d.status,headers:{"Content-Type":d.headers.get("Content-Type")||"text/plain","Cache-Control":"public, max-age=3600"}})}catch{return null}let g=e.headers.get("user-agent")||"",h=A(g);if(!h||!n.V2_CACHE)return null;let _=lt.test(g)?"mobile":"desktop",c=`https://${u}${o}`,T=P.has(h.name)?"ai-user":h.isAi?"ai-crawl":"standard",m=d=>t.waitUntil(d().catch(E=>console.error("[bot-proxy]",E)));try{if(h.isAi&&b){let O=await y(o,"ai"),x=await n.V2_CACHE.get(O);if(x)return m(async()=>{console.log(`[BOT] ${h.name} | ${T} | hit_ai | ${o}`),await R(l,s,u,o,g,"hit_ai"),await L(i,s,c,p,w)}),N(x,"HIT-AI",h.name);let G=await y(o,"desktop"),V=await n.V2_CACHE.get(G);return V?(m(async()=>{console.log(`[BOT] ${h.name} | ${T} | hit_desktop_fallback | ${o}`),await R(l,s,u,o,g,"hit_desktop_fallback"),await L(i,s,c,p,w)}),N(V,"HIT-DESKTOP",h.name)):(m(async()=>{console.log(`[BOT] ${h.name} | ${T} | miss_ai | ${o}`),await R(l,s,u,o,g,"miss_ai"),await Promise.all([L(i,s,c,p,w),B(i,s,c)])}),null)}let d=await y(o,_),E=await n.V2_CACHE.get(d);return E?(m(async()=>{console.log(`[BOT] ${h.name} | ${T} | hit | ${o}`),await R(l,s,u,o,g,"hit"),await B(i,s,c)}),N(E,"HIT",h.name)):(m(async()=>{console.log(`[BOT] ${h.name} | ${T} | miss | ${o}`),await R(l,s,u,o,g,"miss"),await B(i,s,c)}),null)}catch(d){return console.error("[bot-proxy]",d),null}}function N(e,n,t){return new Response(e,{headers:{"Content-Type":"text/html; charset=utf-8","X-Cache":n,"X-Bot":t}})}async function R(e,n,t,r,s,a){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:a})})}async function B(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 f(e,n=200){return new Response(JSON.stringify(e),{status:n,headers:{"Content-Type":"application/json"}})}async function ut(e,n){try{let{entries:t=[]}=await e.json();if(!n.V2_CACHE)return f({success:!1,error:"V2_CACHE \uBC14\uC778\uB529 \uC5C6\uC74C"},500);if(!t.length)return f({success:!1,error:"entries \uD544\uC218"},400);let r=0;for(let s of t){let{url:a,html:i,variant:l="",device:b="desktop"}=s||{};if(!a||!i)continue;let p=l.startsWith("v2_")?l.substring(3):b,w=new URL(a).pathname||"/",C=await y(w,p);await n.V2_CACHE.put(C,i,{expirationTtl:pt}),r++}return f({success:!0,updated:r})}catch(t){return f({success:!1,error:t.message},500)}}async function dt(e,n){try{let{urls:t=[],variant:r=""}=await e.json();if(!n.V2_CACHE)return f({success:!1,error:"V2_CACHE \uBC14\uC778\uB529 \uC5C6\uC74C"},500);if(!t.length)return f({success:!1,error:"urls \uD544\uC218"},400);let s=r.startsWith("v2_")?r.substring(3):"desktop",a=0;for(let i of t){let l=new URL(i).pathname||"/",b=await y(l,s);await n.V2_CACHE.delete(b),a++}return f({success:!0,deleted:a})}catch(t){return f({success:!1,error:t.message},500)}}async function ht(e,n){try{let{url:t,variant:r=""}=await e.json();if(!n.V2_CACHE)return f({success:!1,error:"V2_CACHE \uBC14\uC778\uB529 \uC5C6\uC74C"},500);if(!t)return f({success:!1,error:"url \uD544\uC218"},400);let s=r.startsWith("v2_")?r.substring(3):"desktop",a=new URL(t).pathname||"/",i=await y(a,s),l=await n.V2_CACHE.get(i);return f({success:!0,html:l??null})}catch(t){return f({success:!1,error:t.message},500)}}async function L(e,n,t,r,s){let a={items:[{url:t,project_id:n}],ocr:r};s.length>0&&(a.path_prefixes=s),await fetch(`${e}/v2/cache/kv/ai`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)})}0&&(module.exports={cloudflareProxy,nextjsProxy});
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})},D=(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 W=(e,n,t)=>(t=e!=null?tt(st(e)):{},D(n||!e||!e.__esModule?I(t,"default",{value:e,enumerable:!0}):t,e)),at=e=>D(I({},"__esModule",{value:!0}),e);var bt={};ot(bt,{cloudflareProxy:()=>Z,nextjsProxy:()=>Y});module.exports=at(bt);var j=["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"],M=["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"],X=new Set([...j,...J]),H=new Set(j),ct=[...j,...J,...M,...Q,...z,...it];function P(e){let n=e.toLowerCase();for(let t of ct)if(n.includes(t)){let r;return H.has(t)?r="ai-user":X.has(t)?r="ai-crawl":M.includes(t)?r="search":Q.includes(t)?r="sns":z.includes(t)?r="seo":r="monitoring",{name:t,isAi:X.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 F=/^\/(?:robots\.txt|llms\.txt|sitemap[^\/]*\.(?:xml|xsl))$/i,dt=/mobile|android|iphone|phone|tablet|webos|ipad/i;async function Y(e,n){let{projectId:t,cloudfrontDomain:r,renderDomain:s,botLogEndpoint:i,aiRender:o=!0,ocr:d=!0,aiPathPrefixes:T=[]}=n,l=n.siteDomain.replace(/^https?:\/\//,"").replace(/\/+$/,""),w=r.replace(/\/$/,""),b=new URL(e.url),a=b.pathname;if(e.headers.get("x-prerender-host")){if(F.test(a)||a===`/${t}.txt`){let{NextResponse:c}=await import("next/server");return c.next()}return null}if(a===`/${t}.txt`)try{let c=await fetch(`${s}${a}`,{redirect:"manual"});return new Response(c.body,{status:c.status,headers:{"Content-Type":"text/plain","Cache-Control":"public, max-age=3600"}})}catch{return null}if(F.test(a))try{let c=await fetch(`${s}/static${a}`,{headers:{"X-Signature":t,"X-Original-Host":l}});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 p=e.headers.get("user-agent")||"",g=P(p);if(!g)return null;let h=dt.test(p)?"mobile":"desktop",S=k(b.search),$=S?`${a}?${S}`:a,f=`https://${l}${$}`;try{if(g.isAi&&o){let y=await _($,"ai"),u=await fetch(`${w}/v2/${l}/${y}.html`,{headers:{Accept:"text/html"}});if(u.ok){let x=await u.text();if(x&&x.length>100)return R(i,t,l,a,b.search,p,"hit_ai"),K(s,t,f,d,T),N(x,"HIT-AI",g.name)}let E=await _($,"desktop"),O=await fetch(`${w}/v2/${l}/${E}.html`,{headers:{Accept:"text/html"}});if(O.ok){let x=await O.text();if(x&&x.length>100)return R(i,t,l,a,b.search,p,"hit_desktop_fallback"),K(s,t,f,d,T),N(x,"HIT-DESKTOP",g.name)}return R(i,t,l,a,b.search,p,"miss_ai"),K(s,t,f,d,T),B(s,t,f),null}let c=await _($,h),C=await fetch(`${w}/v2/${l}/${c}.html`,{headers:{Accept:"text/html"}});if(C.ok){let y=await C.text();if(y&&y.length>100)return R(i,t,l,a,b.search,p,"hit"),B(s,t,f),N(y,"HIT",g.name)}}catch{}return R(i,t,l,a,b.search,p,"miss"),B(s,t,f),null}function N(e,n,t){return new Response(e,{headers:{"Content-Type":"text/html; charset=utf-8","X-Cache":n,"X-Bot":t}})}function R(e,n,t,r,s,i,o){fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({project_id:n,url:`https://${t}${r}${s}`,domain:t,path:r,user_agent:i,phase:o})}).catch(()=>{})}function B(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 K(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,gt=/mobile|android|iphone|phone|tablet|webos|ipad/i,mt=604800;async function Z(e,n,t,r){let{projectId:s,siteDomain:i,renderDomain:o,botLogEndpoint:d,aiRender:T=!0,ocr:l=!0,aiPathPrefixes:w=[]}=r,b=new URL(e.url),a=b.pathname,p=i.replace(/^https?:\/\//,"").replace(/\/+$/,"");if(e.method==="POST"){if(a==="/__update-edge-cache")return ft(e,n);if(a==="/__purge-edge-cache")return yt(e,n);if(a==="/__read-edge-cache")return _t(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(ht.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 g=e.headers.get("user-agent")||"",h=P(g);if(!h||!n.V2_CACHE)return null;let S=gt.test(g)?"mobile":"desktop",$=k(b.search),f=$?`${a}?${$}`:a,c=`https://${p}${f}`,C=H.has(h.name)?"ai-user":h.isAi?"ai-crawl":"standard",y=u=>t.waitUntil(u().catch(E=>console.error("[bot-proxy]",E)));try{if(h.isAi&&T){let O=await _(f,"ai"),x=await n.V2_CACHE.get(O);if(x)return y(async()=>{console.log(`[BOT] ${h.name} | ${C} | hit_ai | ${a}`),await A(d,s,p,a,g,"hit_ai"),await v(o,s,c,l,w)}),L(x,"HIT-AI",h.name);let q=await _(f,"desktop"),U=await n.V2_CACHE.get(q);return U?(y(async()=>{console.log(`[BOT] ${h.name} | ${C} | hit_desktop_fallback | ${a}`),await A(d,s,p,a,g,"hit_desktop_fallback"),await v(o,s,c,l,w)}),L(U,"HIT-DESKTOP",h.name)):(y(async()=>{console.log(`[BOT] ${h.name} | ${C} | miss_ai | ${a}`),await A(d,s,p,a,g,"miss_ai"),await Promise.all([v(o,s,c,l,w),V(o,s,c)])}),null)}let u=await _(f,S),E=await n.V2_CACHE.get(u);return E?(y(async()=>{console.log(`[BOT] ${h.name} | ${C} | hit | ${a}`),await A(d,s,p,a,g,"hit"),await V(o,s,c)}),L(E,"HIT",h.name)):(y(async()=>{console.log(`[BOT] ${h.name} | ${C} | miss | ${a}`),await A(d,s,p,a,g,"miss"),await V(o,s,c)}),null)}catch(u){return console.error("[bot-proxy]",u),null}}function L(e,n,t){return new Response(e,{headers:{"Content-Type":"text/html; charset=utf-8","X-Cache":n,"X-Bot":t}})}async function A(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 ft(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:d="",device:T="desktop"}=s||{};if(!i||!o)continue;let l=d.startsWith("v2_")?d.substring(3):T,w=await _(i,l);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 yt(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 d=await _(o,s);await n.V2_CACHE.delete(d),i++}return m({success:!0,deleted:i})}catch(t){return m({success:!1,error:t.message},500)}}async function _t(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 v(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-MKJTG6WJ.js";import{a as r}from"./chunk-N5GEUXIH.js";import"./chunk-62QI7OUQ.js";export{o as cloudflareProxy,r as nextjsProxy};
1
+ import{a as o}from"./chunk-JXQQEZ5V.js";import{a as r}from"./chunk-RMNMMVLT.js";import"./chunk-BVZHYMX6.js";export{o as cloudflareProxy,r as nextjsProxy};
package/dist/nextjs.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";var D=Object.create;var f=Object.defineProperty;var H=Object.getOwnPropertyDescriptor;var M=Object.getOwnPropertyNames;var X=Object.getPrototypeOf,z=Object.prototype.hasOwnProperty;var J=(e,o)=>{for(var t in o)f(e,t,{get:o[t],enumerable:!0})},I=(e,o,t,n)=>{if(o&&typeof o=="object"||typeof o=="function")for(let r of M(o))!z.call(e,r)&&r!==t&&f(e,r,{get:()=>o[r],enumerable:!(n=H(o,r))||n.enumerable});return e};var W=(e,o,t)=>(t=e!=null?D(X(e)):{},I(o||!e||!e.__esModule?f(t,"default",{value:e,enumerable:!0}):t,e)),G=e=>I(f({},"__esModule",{value:!0}),e);var tt={};J(tt,{nextjsProxy:()=>L});module.exports=G(tt);var _=["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"],A=["facebookexternalhit","linkedinbot","twitterbot","slackbot","discordbot","telegrambot","whatsapp","pinterestbot","redditbot"],B=["ahrefsbot","semrushbot","mj12bot","dotbot","dataforseobot"],q=["uptimerobot","lighthouse","chrome-lighthouse"],N=new Set([..._,...j]),F=new Set(_),V=[..._,...j,...k,...A,...B,...q];function P(e){let o=e.toLowerCase();for(let t of V)if(o.includes(t)){let n;return F.has(t)?n="ai-user":N.has(t)?n="ai-crawl":k.includes(t)?n="search":A.includes(t)?n="sns":B.includes(t)?n="seo":n="monitoring",{name:t,isAi:N.has(t),category:n}}return null}async function Q(e){if(typeof process<"u"&&process.versions?.node){let{createHash:n}=require("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("")}function Y(e){if(!e)return"/";if(e.startsWith("http://")||e.startsWith("https://"))try{e=new URL(e).pathname}catch{}let o=e.indexOf("?");return o!==-1&&(e=e.substring(0,o)),e?e.split("/").map(t=>{if(!t)return t;try{return encodeURIComponent(decodeURIComponent(t))}catch{return encodeURIComponent(t)}}).join("/"):"/"}async function b(e,o){let t=Y(e);return`${await Q(t)}_${o}`}var K=/^\/(?:robots\.txt|llms\.txt|sitemap[^\/]*\.(?:xml|xsl))$/i,Z=/mobile|android|iphone|phone|tablet|webos|ipad/i;async function L(e,o){let{projectId:t,cloudfrontDomain:n,renderDomain:r,botLogEndpoint:i,aiRender:x=!0,ocr:y=!0,aiPathPrefixes:T=[]}=o,a=o.siteDomain.replace(/^https?:\/\//,"").replace(/\/+$/,""),w=n.replace(/\/$/,""),d=new URL(e.url),s=d.pathname;if(e.headers.get("x-prerender-host")){if(K.test(s)||s===`/${t}.txt`){let{NextResponse:c}=await import("next/server");return c.next()}return null}if(s===`/${t}.txt`)try{let c=await fetch(`${r}${s}`,{redirect:"manual"});return new Response(c.body,{status:c.status,headers:{"Content-Type":"text/plain","Cache-Control":"public, max-age=3600"}})}catch{return null}if(K.test(s))try{let c=await fetch(`${r}/static${s}`,{headers:{"X-Signature":t,"X-Original-Host":a}});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 l=e.headers.get("user-agent")||"",g=P(l);if(!g)return null;let v=Z.test(l)?"mobile":"desktop",h=`https://${a}${s}`;try{if(g.isAi&&x){let u=await b(s,"ai"),R=await fetch(`${w}/v2/${a}/${u}.html`,{headers:{Accept:"text/html"}});if(R.ok){let p=await R.text();if(p&&p.length>100)return m(i,t,a,s,d.search,l,"hit_ai"),$(r,t,h,y,T),O(p,"HIT-AI",g.name)}let U=await b(s,"desktop"),E=await fetch(`${w}/v2/${a}/${U}.html`,{headers:{Accept:"text/html"}});if(E.ok){let p=await E.text();if(p&&p.length>100)return m(i,t,a,s,d.search,l,"hit_desktop_fallback"),$(r,t,h,y,T),O(p,"HIT-DESKTOP",g.name)}return m(i,t,a,s,d.search,l,"miss_ai"),$(r,t,h,y,T),S(r,t,h),null}let c=await b(s,v),C=await fetch(`${w}/v2/${a}/${c}.html`,{headers:{Accept:"text/html"}});if(C.ok){let u=await C.text();if(u&&u.length>100)return m(i,t,a,s,d.search,l,"hit"),S(r,t,h),O(u,"HIT",g.name)}}catch{}return m(i,t,a,s,d.search,l,"miss"),S(r,t,h),null}function O(e,o,t){return new Response(e,{headers:{"Content-Type":"text/html; charset=utf-8","X-Cache":o,"X-Bot":t}})}function m(e,o,t,n,r,i,x){fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({project_id:o,url:`https://${t}${n}${r}`,domain:t,path:n,user_agent:i,phase:x})}).catch(()=>{})}function S(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 $(e,o,t,n,r){let i={items:[{url:t,project_id:o}],ocr:n};r.length>0&&(i.path_prefixes=r),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 X=Object.create;var x=Object.defineProperty;var G=Object.getOwnPropertyDescriptor;var J=Object.getOwnPropertyNames;var Q=Object.getPrototypeOf,F=Object.prototype.hasOwnProperty;var V=(e,o)=>{for(var t in o)x(e,t,{get:o[t],enumerable:!0})},N=(e,o,t,n)=>{if(o&&typeof o=="object"||typeof o=="function")for(let s of J(o))!F.call(e,s)&&s!==t&&x(e,s,{get:()=>o[s],enumerable:!(n=G(o,s))||n.enumerable});return e};var j=(e,o,t)=>(t=e!=null?X(Q(e)):{},N(o||!e||!e.__esModule?x(t,"default",{value:e,enumerable:!0}):t,e)),Y=e=>N(x({},"__esModule",{value:!0}),e);var rt={};V(rt,{nextjsProxy:()=>W});module.exports=Y(rt);var $=["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"],L=["googlebot","googlebot-image","googlebot-video","googlebot-news","googleother","mediapartners-google","adsbot-google","google-inspectiontool","bingbot","bingpreview","naverbot","yeti","daumoa","baiduspider","yandexbot","duckduckbot","applebot"],P=["facebookexternalhit","linkedinbot","twitterbot","slackbot","discordbot","telegrambot","whatsapp","pinterestbot","redditbot"],v=["ahrefsbot","semrushbot","mj12bot","dotbot","dataforseobot"],Z=["uptimerobot","lighthouse","chrome-lighthouse"],B=new Set([...$,...K]),q=new Set($),tt=[...$,...K,...L,...P,...v,...Z];function U(e){let o=e.toLowerCase();for(let t of tt)if(o.includes(t)){let n;return q.has(t)?n="ai-user":B.has(t)?n="ai-crawl":L.includes(t)?n="search":P.includes(t)?n="sns":v.includes(t)?n="seo":n="monitoring",{name:t,isAi:B.has(t),category:n}}return null}var et=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){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);et.has(s.toLowerCase())||o.push(t)}return o.join("&")}function D(e){return encodeURIComponent(e).replace(/[!'()*]/g,o=>"%"+o.charCodeAt(0).toString(16).toUpperCase())}function ot(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 D(decodeURIComponent(r))}catch{return D(r)}}).join("/"),i=_(t);return i?`${s}?${i}`:s}async function nt(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 y(e,o){let t=ot(e);return`${await nt(t)}_${o}`}var H=/^\/(?:robots\.txt|llms\.txt|sitemap[^\/]*\.(?:xml|xsl))$/i,st=/mobile|android|iphone|phone|tablet|webos|ipad/i;async function W(e,o){let{projectId:t,cloudfrontDomain:n,renderDomain:s,botLogEndpoint:i,aiRender:r=!0,ocr:w=!0,aiPathPrefixes:T=[]}=o,c=o.siteDomain.replace(/^https?:\/\//,"").replace(/\/+$/,""),S=n.replace(/\/$/,""),l=new URL(e.url),a=l.pathname;if(e.headers.get("x-prerender-host")){if(H.test(a)||a===`/${t}.txt`){let{NextResponse:p}=await import("next/server");return p.next()}return null}if(a===`/${t}.txt`)try{let p=await fetch(`${s}${a}`,{redirect:"manual"});return new Response(p.body,{status:p.status,headers:{"Content-Type":"text/plain","Cache-Control":"public, max-age=3600"}})}catch{return null}if(H.test(a))try{let p=await fetch(`${s}/static${a}`,{headers:{"X-Signature":t,"X-Original-Host":c}});return new Response(p.body,{status:p.status,headers:{"Content-Type":p.headers.get("Content-Type")||"text/plain","Cache-Control":"public, max-age=3600"}})}catch{return null}let h=e.headers.get("user-agent")||"",u=U(h);if(!u)return null;let M=st.test(h)?"mobile":"desktop",O=_(l.search),b=O?`${a}?${O}`:a,g=`https://${c}${b}`;try{if(u.isAi&&r){let m=await y(b,"ai"),E=await fetch(`${S}/v2/${c}/${m}.html`,{headers:{Accept:"text/html"}});if(E.ok){let d=await E.text();if(d&&d.length>100)return f(i,t,c,a,l.search,h,"hit_ai"),k(s,t,g,w,T),C(d,"HIT-AI",u.name)}let z=await y(b,"desktop"),A=await fetch(`${S}/v2/${c}/${z}.html`,{headers:{Accept:"text/html"}});if(A.ok){let d=await A.text();if(d&&d.length>100)return f(i,t,c,a,l.search,h,"hit_desktop_fallback"),k(s,t,g,w,T),C(d,"HIT-DESKTOP",u.name)}return f(i,t,c,a,l.search,h,"miss_ai"),k(s,t,g,w,T),R(s,t,g),null}let p=await y(b,M),I=await fetch(`${S}/v2/${c}/${p}.html`,{headers:{Accept:"text/html"}});if(I.ok){let m=await I.text();if(m&&m.length>100)return f(i,t,c,a,l.search,h,"hit"),R(s,t,g),C(m,"HIT",u.name)}}catch{}return f(i,t,c,a,l.search,h,"miss"),R(s,t,g),null}function C(e,o,t){return new Response(e,{headers:{"Content-Type":"text/html; charset=utf-8","X-Cache":o,"X-Bot":t}})}function f(e,o,t,n,s,i,r){fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({project_id:o,url:`https://${t}${n}${s}`,domain:t,path:n,user_agent:i,phase:r})}).catch(()=>{})}function R(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 k(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-N5GEUXIH.js";import"./chunk-62QI7OUQ.js";export{o as nextjsProxy};
1
+ import{a as o}from"./chunk-RMNMMVLT.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.6",
3
+ "version": "1.0.7",
4
4
  "description": "SearchOS 봇 프록시 — Next.js, Cloudflare Worker용 봇 감지 + 캐시 프록시",
5
5
  "type": "module",
6
6
  "exports": {
@@ -27,6 +27,12 @@
27
27
  "dist"
28
28
  ],
29
29
  "scripts": {
30
+ "gen:tracking": "node scripts/gen-tracking-params.js",
31
+ "gen:fixtures": "node scripts/copy-fixtures.js",
32
+ "prebuild": "npm run gen:tracking",
33
+ "pretest": "npm run gen:tracking",
34
+ "test": "vitest run",
35
+ "test:watch": "vitest",
30
36
  "build": "tsup src/index.ts src/nextjs.ts src/cloudflare.ts --format esm,cjs --dts --clean --minify",
31
37
  "prepublishOnly": "npm run build"
32
38
  },
@@ -35,7 +41,8 @@
35
41
  "@types/node": "^22.0.0",
36
42
  "next": "^16.2.3",
37
43
  "tsup": "^8.0.0",
38
- "typescript": "^5.0.0"
44
+ "typescript": "^5.0.0",
45
+ "vitest": "^1.6.1"
39
46
  },
40
47
  "peerDependencies": {
41
48
  "next": ">=14.0.0"
@@ -1 +0,0 @@
1
- var d=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(r,t)=>(typeof require<"u"?require:r)[t]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var n=["chatgpt-user","claude-user","perplexity-user","gemini-user","gemini-deep-research","mistralai-user","grok-user"],i=["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"],a=["googlebot","googlebot-image","googlebot-video","googlebot-news","googleother","mediapartners-google","adsbot-google","google-inspectiontool","bingbot","bingpreview","naverbot","yeti","daumoa","baiduspider","yandexbot","duckduckbot","applebot"],c=["facebookexternalhit","linkedinbot","twitterbot","slackbot","discordbot","telegrambot","whatsapp","pinterestbot","redditbot"],g=["ahrefsbot","semrushbot","mj12bot","dotbot","dataforseobot"],l=["uptimerobot","lighthouse","chrome-lighthouse"],s=new Set([...n,...i]),u=new Set(n),b=[...n,...i,...a,...c,...g,...l];function m(e){let r=e.toLowerCase();for(let t of b)if(r.includes(t)){let o;return u.has(t)?o="ai-user":s.has(t)?o="ai-crawl":a.includes(t)?o="search":c.includes(t)?o="sns":g.includes(t)?o="seo":o="monitoring",{name:t,isAi:s.has(t),category:o}}return null}async function p(e){if(typeof process<"u"&&process.versions?.node){let{createHash:o}=d("crypto");return o("md5").update(e,"utf8").digest("hex")}let r=new TextEncoder().encode(e),t=await crypto.subtle.digest("MD5",r);return Array.from(new Uint8Array(t),o=>o.toString(16).padStart(2,"0")).join("")}function f(e){if(!e)return"/";if(e.startsWith("http://")||e.startsWith("https://"))try{e=new URL(e).pathname}catch{}let r=e.indexOf("?");return r!==-1&&(e=e.substring(0,r)),e?e.split("/").map(t=>{if(!t)return t;try{return encodeURIComponent(decodeURIComponent(t))}catch{return encodeURIComponent(t)}}).join("/"):"/"}async function y(e,r){let t=f(e);return`${await p(t)}_${r}`}export{u as a,m as b,y as c};
@@ -1 +0,0 @@
1
- import{a as x,b as V,c as g}from"./chunk-62QI7OUQ.js";var S=/^\/(?:robots\.txt|llms\.txt|sitemap[^\/]*\.(?:xml|xsl))$/i,L=/mobile|android|iphone|phone|tablet|webos|ipad/i,U=604800;async function D(s,t,e,a){let{projectId:n,siteDomain:i,renderDomain:o,botLogEndpoint:c,aiRender:m=!0,ocr:y=!0,aiPathPrefixes:C=[]}=a,r=new URL(s.url).pathname,h=i.replace(/^https?:\/\//,"").replace(/\/+$/,"");if(s.method==="POST"){if(r==="/__update-edge-cache")return I(s,t);if(r==="/__purge-edge-cache")return v(s,t);if(r==="/__read-edge-cache")return B(s,t)}if(s.headers.get("x-prerender-host"))return null;if(r===`/${n}.txt`)try{let u=await fetch(`${o}${r}`,{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(S.test(r))try{let u=await fetch(`${o}/static${r}`,{redirect:"manual",headers:{"X-Signature":n,"X-Original-Host":h}});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=s.headers.get("user-agent")||"",l=V(d);if(!l||!t.V2_CACHE)return null;let O=L.test(d)?"mobile":"desktop",f=`https://${h}${r}`,w=x.has(l.name)?"ai-user":l.isAi?"ai-crawl":"standard",_=u=>e.waitUntil(u().catch(T=>console.error("[bot-proxy]",T)));try{if(l.isAi&&m){let P=await g(r,"ai"),A=await t.V2_CACHE.get(P);if(A)return _(async()=>{console.log(`[BOT] ${l.name} | ${w} | hit_ai | ${r}`),await E(c,n,h,r,d,"hit_ai"),await b(o,n,f,y,C)}),$(A,"HIT-AI",l.name);let j=await g(r,"desktop"),H=await t.V2_CACHE.get(j);return H?(_(async()=>{console.log(`[BOT] ${l.name} | ${w} | hit_desktop_fallback | ${r}`),await E(c,n,h,r,d,"hit_desktop_fallback"),await b(o,n,f,y,C)}),$(H,"HIT-DESKTOP",l.name)):(_(async()=>{console.log(`[BOT] ${l.name} | ${w} | miss_ai | ${r}`),await E(c,n,h,r,d,"miss_ai"),await Promise.all([b(o,n,f,y,C),R(o,n,f)])}),null)}let u=await g(r,O),T=await t.V2_CACHE.get(u);return T?(_(async()=>{console.log(`[BOT] ${l.name} | ${w} | hit | ${r}`),await E(c,n,h,r,d,"hit"),await R(o,n,f)}),$(T,"HIT",l.name)):(_(async()=>{console.log(`[BOT] ${l.name} | ${w} | miss | ${r}`),await E(c,n,h,r,d,"miss"),await R(o,n,f)}),null)}catch(u){return console.error("[bot-proxy]",u),null}}function $(s,t,e){return new Response(s,{headers:{"Content-Type":"text/html; charset=utf-8","X-Cache":t,"X-Bot":e}})}async function E(s,t,e,a,n,i){await fetch(s,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({project_id:t,url:`https://${e}${a}`,domain:e,path:a,user_agent:n,phase:i})})}async function R(s,t,e){await fetch(`${s}/v2/cache/kv`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({items:[{url:e,project_id:t}]})})}function p(s,t=200){return new Response(JSON.stringify(s),{status:t,headers:{"Content-Type":"application/json"}})}async function I(s,t){try{let{entries:e=[]}=await s.json();if(!t.V2_CACHE)return p({success:!1,error:"V2_CACHE \uBC14\uC778\uB529 \uC5C6\uC74C"},500);if(!e.length)return p({success:!1,error:"entries \uD544\uC218"},400);let a=0;for(let n of e){let{url:i,html:o,variant:c="",device:m="desktop"}=n||{};if(!i||!o)continue;let y=c.startsWith("v2_")?c.substring(3):m,C=new URL(i).pathname||"/",k=await g(C,y);await t.V2_CACHE.put(k,o,{expirationTtl:U}),a++}return p({success:!0,updated:a})}catch(e){return p({success:!1,error:e.message},500)}}async function v(s,t){try{let{urls:e=[],variant:a=""}=await s.json();if(!t.V2_CACHE)return p({success:!1,error:"V2_CACHE \uBC14\uC778\uB529 \uC5C6\uC74C"},500);if(!e.length)return p({success:!1,error:"urls \uD544\uC218"},400);let n=a.startsWith("v2_")?a.substring(3):"desktop",i=0;for(let o of e){let c=new URL(o).pathname||"/",m=await g(c,n);await t.V2_CACHE.delete(m),i++}return p({success:!0,deleted:i})}catch(e){return p({success:!1,error:e.message},500)}}async function B(s,t){try{let{url:e,variant:a=""}=await s.json();if(!t.V2_CACHE)return p({success:!1,error:"V2_CACHE \uBC14\uC778\uB529 \uC5C6\uC74C"},500);if(!e)return p({success:!1,error:"url \uD544\uC218"},400);let n=a.startsWith("v2_")?a.substring(3):"desktop",i=new URL(e).pathname||"/",o=await g(i,n),c=await t.V2_CACHE.get(o);return p({success:!0,html:c??null})}catch(e){return p({success:!1,error:e.message},500)}}async function b(s,t,e,a,n){let i={items:[{url:e,project_id:t}],ocr:a};n.length>0&&(i.path_prefixes=n),await fetch(`${s}/v2/cache/kv/ai`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)})}export{D as a};
@@ -1 +0,0 @@
1
- import{b as O,c as f}from"./chunk-62QI7OUQ.js";var P=/^\/(?:robots\.txt|llms\.txt|sitemap[^\/]*\.(?:xml|xsl))$/i,S=/mobile|android|iphone|phone|tablet|webos|ipad/i;async function E(s,r){let{projectId:t,cloudfrontDomain:p,renderDomain:n,botLogEndpoint:a,aiRender:x=!0,ocr:y=!0,aiPathPrefixes:$=[]}=r,o=r.siteDomain.replace(/^https?:\/\//,"").replace(/\/+$/,""),b=p.replace(/\/$/,""),l=new URL(s.url),e=l.pathname;if(s.headers.get("x-prerender-host")){if(P.test(e)||e===`/${t}.txt`){let{NextResponse:i}=await import("next/server");return i.next()}return null}if(e===`/${t}.txt`)try{let i=await fetch(`${n}${e}`,{redirect:"manual"});return new Response(i.body,{status:i.status,headers:{"Content-Type":"text/plain","Cache-Control":"public, max-age=3600"}})}catch{return null}if(P.test(e))try{let i=await fetch(`${n}/static${e}`,{headers:{"X-Signature":t,"X-Original-Host":o}});return new Response(i.body,{status:i.status,headers:{"Content-Type":i.headers.get("Content-Type")||"text/plain","Cache-Control":"public, max-age=3600"}})}catch{return null}let c=s.headers.get("user-agent")||"",u=O(c);if(!u)return null;let k=S.test(c)?"mobile":"desktop",d=`https://${o}${e}`;try{if(u.isAi&&x){let m=await f(e,"ai"),_=await fetch(`${b}/v2/${o}/${m}.html`,{headers:{Accept:"text/html"}});if(_.ok){let h=await _.text();if(h&&h.length>100)return g(a,t,o,e,l.search,c,"hit_ai"),R(n,t,d,y,$),w(h,"HIT-AI",u.name)}let I=await f(e,"desktop"),j=await fetch(`${b}/v2/${o}/${I}.html`,{headers:{Accept:"text/html"}});if(j.ok){let h=await j.text();if(h&&h.length>100)return g(a,t,o,e,l.search,c,"hit_desktop_fallback"),R(n,t,d,y,$),w(h,"HIT-DESKTOP",u.name)}return g(a,t,o,e,l.search,c,"miss_ai"),R(n,t,d,y,$),T(n,t,d),null}let i=await f(e,k),C=await fetch(`${b}/v2/${o}/${i}.html`,{headers:{Accept:"text/html"}});if(C.ok){let m=await C.text();if(m&&m.length>100)return g(a,t,o,e,l.search,c,"hit"),T(n,t,d),w(m,"HIT",u.name)}}catch{}return g(a,t,o,e,l.search,c,"miss"),T(n,t,d),null}function w(s,r,t){return new Response(s,{headers:{"Content-Type":"text/html; charset=utf-8","X-Cache":r,"X-Bot":t}})}function g(s,r,t,p,n,a,x){fetch(s,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({project_id:r,url:`https://${t}${p}${n}`,domain:t,path:p,user_agent:a,phase:x})}).catch(()=>{})}function T(s,r,t){fetch(`${s}/v2/cache`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({items:[{url:t,project_id:r}]})}).catch(()=>{})}function R(s,r,t,p,n){let a={items:[{url:t,project_id:r}],ocr:p};n.length>0&&(a.path_prefixes=n),fetch(`${s}/v2/cache/ai`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)}).catch(()=>{})}export{E as a};