Repository navigation
Expand file tree
/
Copy path_worker.js
More file actions
1 lines (1 loc) · 36.9 KB
/
Copy path_worker.js
File metadata and controls
1 lines (1 loc) · 36.9 KB
1
import{connect as Ae}from"cloudflare:sockets";const ht="2026.10.17.2",se=new WeakMap,K=new Map,He={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":"GET, POST, DELETE, OPTIONS","Access-Control-Allow-Headers":"Content-Type","Access-Control-Expose-Headers":"X-ECH-Status, X-ECH-Config-Length","Access-Control-Max-Age":"86400"};function P(A,R=200){return new Response(JSON.stringify(A),{status:R,headers:{...He,"Content-Type":"application/json; charset=utf-8","Cache-Control":"no-store"}})}function jn(A){const R=new Headers(A.headers);for(const[C,k]of Object.entries(He))R.set(C,k);return R.set("Cache-Control","no-store"),new Response(A.body,{status:A.status,headers:R})}async function Bn(A,R=!1){if(!A)return{};const C=se.get(A);if(!R&&C&&Date.now()-C.time<3e4)return{...await C.value};const k=A.get("c","json").then(N=>N||{});se.set(A,{time:Date.now(),value:k});try{return{...await k}}catch(N){throw se.delete(A),N}}var Wn={async fetch(A,R={},C){try{return await $n(R)(A,R,C)}catch{return P({error:"请求处理失败"},502)}}};function pt(A){let R=0,C=0,k=!1;const N=new Set,$=new Error("Free 保护:连接预算已用完");return $.code="FREE_CPU_BUDGET",{enabled:A,get exhausted(){return k},onExhausted(I){N.add(I),k&&I()},consume(I){if(A){if(k)throw $;if(!Number.isSafeInteger(I)||I<0||R+I>384*1024||C>=96){k=!0;for(const _ of N)try{_()}catch{}throw N.clear(),$}R+=I,C++}}}}function $n(A){const R=new TextDecoder;function C(e){const n=atob(e),t=new Uint8Array(n.length);for(let r=0;r<n.length;r++)t[r]=n.charCodeAt(r);return R.decode(t)}let k="351c9981-04b6-4103-aa4b-864aa9c91469",N="",$="",I=[],_=[],Q=!1,q=!1,yt=!1,wt=!1,ee=!0,J="",B="",gt="",be="",Re=!0,Ne=!1,Ie=!1,ce="",Pe=!1,bt="https://223.5.5.5/dns-query",mt="cloudflare-ech.com",xt="",Et=C("aHR0cHM6Ly91cmwudjEubWsvc3Vi"),Ut=!0,Ct=!0,St=!0,Lt=!1,Tt=!1,D=null,M={},vt=0,kt="",v=pt(!1);const F={freeCpu:"no",wk:"",ev:"yes",et:"no",ex:"no",ech:"no",tp:"",customDNS:"https://223.5.5.5/dns-query",customECHDomain:"cloudflare-ech.com",alpn:"",d:"",p:"",yx:"",yxURL:"",s:"",homepage:"",scu:C("aHR0cHM6Ly91cmwudjEubWsvc3Vi"),ena:"no",epd:"yes",epi:"yes",egi:"yes",ae:"",rm:"",qj:"",dkby:"no",yxby:"",ipv4:"yes",ipv6:"yes",ispMobile:"yes",ispUnicom:"yes",ispTelecom:"yes",jk:"no"};function De(e,n=!1){if(e==null||e==="")return n;if(e===!0||e===!1)return e;const t=String(e).trim().toLowerCase();return t==="yes"||t==="true"||t==="1"||t==="on"?!0:t==="no"||t==="false"||t==="0"||t==="off"?!1:n}function At(e,n=!1){return De(e,n)?"yes":"no"}function Ht(e){const n={...F,...e};return["freeCpu","ev","et","ex","ech","ena","epd","epi","egi","ipv4","ipv6","ispMobile","ispUnicom","ispTelecom","jk"].forEach(t=>{n[t]=At(n[t],De(F[t]))}),n.ev==="no"&&n.et==="no"&&n.ex==="no"&&(n.ev="yes"),n.ech==="yes"&&(n.dkby="yes"),n}function Rt(e,...n){if(e){for(const t of n)if(e[t]!==void 0&&e[t]!==null&&e[t]!=="")return e[t]}}function Nt(e={}){const n={freeCpu:["freeCpu","FREE_CPU"],wk:["wk","WK"],ev:["ev","EV"],et:["et","ET"],ex:["ex","EX"],ech:["ech","ECH"],tp:["tp","TP"],customDNS:["customDNS","CUSTOMDNS","CUSTOM_DNS"],customECHDomain:["customECHDomain","CUSTOMECHDOMAIN","CUSTOM_ECH_DOMAIN"],alpn:["alpn","ALPN"],d:["d","D"],p:["p","P"],yx:["yx","YX"],yxURL:["yxURL","YXURL","YX_URL"],s:["s","S"],homepage:["homepage","HOMEPAGE"],scu:["scu","SCU"],ena:["ena","ENA"],epd:["epd","EPD"],epi:["epi","EPI"],egi:["egi","EGI"],ae:["ae","AE"],rm:["rm","RM"],qj:["qj","QJ"],dkby:["dkby","DKBY"],yxby:["yxby","YXBY"],ipv4:["ipv4","IPV4"],ipv6:["ipv6","IPV6"],ispMobile:["ispMobile","ISPMOBILE","ISP_MOBILE"],ispUnicom:["ispUnicom","ISPUNICOM","ISP_UNICOM"],ispTelecom:["ispTelecom","ISPTELECOM","ISP_TELECOM"],jk:["jk","JK"]},t={};for(const[r,o]of Object.entries(n)){const a=Rt(e,...o);a!==void 0&&(t[r]=a)}return t}function ie(e=A){return Ht({...Nt(e),...M})}const Me=["pp.xy.kg"];function Oe(){return{domain:Me[Math.floor(Math.random()*Me.length)],region:"CF",regionCode:"CF",port:443}}let Ve=[{domain:C("UHJveHlJUC5ISy5DTUxpdXNzc3MubmV0"),region:"HK",regionCode:"HK",port:443},{domain:C("UHJveHlJUC5VUy5DTUxpdXNzc3MubmV0"),region:"US",regionCode:"US",port:443},{domain:C("UHJveHlJUC5TRy5DTUxpdXNzc3MubmV0"),region:"SG",regionCode:"SG",port:443},{domain:C("UHJveHlJUC5KUC5DTUxpdXNzc3MubmV0"),region:"JP",regionCode:"JP",port:443},{domain:C("UHJveHlJUC5LUi5DTUxpdXNzc3MubmV0"),region:"KR",regionCode:"KR",port:443},{domain:C("UHJveHlJUC5ERS5DTUxpdXNzc3MubmV0"),region:"DE",regionCode:"DE",port:443},{domain:C("UHJveHlJUC5TRS5DTUxpdXNzc3MubmV0"),region:"SE",regionCode:"SE",port:443},{domain:C("UHJveHlJUC5OTC5DTUxpdXNzc3MubmV0"),region:"NL",regionCode:"NL",port:443},{domain:C("UHJveHlJUC5GSS5DTUxpdXNzc3MubmV0"),region:"FI",regionCode:"FI",port:443},{domain:C("UHJveHlJUC5HQi5DTUxpdXNzc3MubmV0"),region:"GB",regionCode:"GB",port:443},{domain:C("UHJveHlJUC5PcmFjbGUuY21saXVzc3NzLm5ldA=="),region:"Oracle",regionCode:"Oracle",port:443},{domain:C("UHJveHlJUC5EaWdpdGFsT2NlYW4uQ01MaXVzc3NzLm5ldA=="),region:"DigitalOcean",regionCode:"DigitalOcean",port:443},{domain:C("UHJveHlJUC5WdWx0ci5DTUxpdXNzc3MubmV0"),region:"Vultr",regionCode:"Vultr",port:443},{domain:C("UHJveHlJUC5NdWx0YWNvbS5DTUxpdXNzc3MubmV0"),region:"Multacom",regionCode:"Multacom",port:443}];const X=atob("aW52YWxpZCBkYXRh"),It=atob("aW52YWxpZCB1c2Vy"),Pt=atob("Y29tbWFuZCBpcyBub3Qgc3VwcG9ydGVk"),Dt=atob("VURQIHByb3h5IG9ubHkgZW5hYmxlIGZvciBETlMgd2hpY2ggaXMgcG9ydCA1Mw=="),Mt=atob("aW52YWxpZCBhZGRyZXNzVHlwZQ=="),Ot=atob("YWRkcmVzc1ZhbHVlIGlzIGVtcHR5"),Vt=atob("d2ViU29ja2V0LmVhZHlTdGF0ZSBpcyBub3Qgb3Blbg=="),te=atob("SW52YWxpZCBTT0NLUyBhZGRyZXNzIGZvcm1hdA=="),Jt=atob("bm8gYWNjZXB0YWJsZSBtZXRob2Rz"),jt=atob("c29ja3Mgc2VydmVyIG5lZWRzIGF1dGg="),Bt=atob("ZmFpbCB0byBhdXRoIHNvY2tzIHNlcnZlcg=="),Je=atob("ZmFpbCB0byBvcGVuIHNvY2tzIGNvbm5lY3Rpb24="),je=atob("ZmFpbCB0byBvcGVuIHByb3h5IHR1bm5lbA=="),me=atob("aW52YWxpZCBwcm94eSByZXNwb25zZQ=="),Be=atob("c29ja3M1Oi8v"),$e=atob("c29ja3M6Ly8="),Ge=atob("aHR0cDovLw=="),We=atob("aHR0cHM6Ly8="),$t=atob("Q09OTkVDVA=="),Gt=atob("IEhUVFAvMS4x"),Wt=atob("SG9zdDog"),_t=atob("UHJveHktQXV0aG9yaXphdGlvbjogQmFzaWMg"),Ft=atob("UHJveHktQ29ubmVjdGlvbjogS2VlcC1BbGl2ZQ=="),Xt=atob("VXNlci1BZ2VudDogTW96aWxsYS81LjA="),Z=atob("DQo="),Zt=atob("SFRUUC8="),_e="p5",Fe="pt",le="pts";let ne={},j=!1;const xe=1,ue=2,Ee=3,z=64*1024,zt=32*1024,Yt=512,Kt=0,Qt=16*1024,Xe=256*1024,Ze=2,qt=3500,fe=new TextDecoder,re=new Map;function en(e){return/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(e)}function ze(e){return!!(/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(e)||/^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$/.test(e)||/^::1$|^::$|^(?:[0-9a-fA-F]{1,4}:)*::(?:[0-9a-fA-F]{1,4}:)*[0-9a-fA-F]{1,4}$/.test(e))}function tn(e){const n=["","h3","h2","http/1.1","h3,h2","h2,http/1.1","h3,h2,http/1.1"],t=String(e||"").trim();return n.includes(t)?t:""}async function Ye(){if(D)try{const e=JSON.stringify(M);await D.put("c",e);const n=String(Date.now());kt=n;try{await D.put("c_ver",n)}catch{}vt=Date.now()}catch(e){throw e}}function Y(e,n=""){return M[e]!==void 0?M[e]:n}async function Ue(e,n){M[e]=n,await Ye()}async function Ce(e="",n=ee){if(!e||e==="CF"||Ve.length===0)return Oe();const t=Ve.map(o=>({...o,available:!0}));if(n&&e){const o=on(e,t,n);if(o.length>0)return o[0]}return t[0]}function nn(e){return{US:["SG","JP","KR"],SG:["JP","KR","US"],JP:["SG","KR","US"],KR:["JP","SG","US"],DE:["NL","GB","SE","FI"],SE:["DE","NL","FI","GB"],NL:["DE","GB","SE","FI"],FI:["SE","DE","NL","GB"],GB:["DE","NL","SE","FI"]}[e]||[]}function rn(e){const n=nn(e),t=["US","SG","JP","KR","DE","SE","NL","FI","GB"];return[e,...n,...t.filter(r=>r!==e&&!n.includes(r))]}function on(e,n,t=ee){if(!t||!e)return n;const r=rn(e),o=[];for(const a of r){const s=n.filter(u=>u.regionCode===a);o.push(...s)}return o}function oe(e){if(e.includes("[")&&e.includes("]")){const t=e.match(/^\[([^\]]+)\](?::(\d+))?$/);if(t)return{address:t[1],port:t[2]?parseInt(t[2],10):null}}const n=e.lastIndexOf(":");if(n>0){const t=e.substring(0,n),r=e.substring(n+1),o=parseInt(r,10);if(!t.includes(":")&&!isNaN(o)&&o>0&&o<=65535)return{address:t,port:o}}return{address:e,port:null}}async function an(e){const n=new URL(e.url),t=n.searchParams.get("p")||"",r=(n.searchParams.get("wk")||"").toUpperCase(),o=n.searchParams.get("rm")||"",a=o?o.toLowerCase()!=="no":null,s=n.searchParams.get("s")||"";let u=null;if(s)try{u=ot(s)}catch{}let f=J;!f||f===""?r?f=r:B&&B.trim()?f=B.trim().toUpperCase():f="CF":r&&(f=r);const i=new WebSocketPair,[h,l]=Object.values(i);l.accept(),l.binaryType="arraybuffer";let c={socket:null,writer:null,drainUpload:null},d=!1,p=null,g=!1,w=!1;const U=sn(Qt,v.enabled?1024*1024:Xe,v.enabled?128:Xe>>8),x=e.fetcher;function S(){try{c.writer?.releaseLock()}catch{}c.writer=null}function L(){if(!w){w=!0,U.clear(),S();try{c.socket?.close()}catch{}try{l.close(v.exhausted?1e3:1011,v.exhausted?"Free 保护:请重新连接":"连接已结束")}catch{}}}v.onExhausted(L),l.addEventListener("close",L);function H(E){const T=O(E);return T.byteLength?U.sow(T)?(c.drainUpload(),!0):(L(),!1):!0}async function y(){if(!(g||w||!c.writer)){g=!0;try{for(;!(w||!c.writer);){const[E]=U.bundle();if(!E)break;await c.writer.write(E)}}catch{L()}finally{g=!1,!U.empty&&!w&&c.writer&&queueMicrotask(y)}}}c.drainUpload=()=>{!g&&!U.empty&&c.writer&&queueMicrotask(y)};const b=e.headers.get(atob("c2VjLXdlYnNvY2tldC1wcm90b2NvbA=="))||"";return dn(l,b).pipeTo(new WritableStream({async write(E){if(w)return;const T=O(E);if(d)return await tt(T,l,null,x);if(c.socket&&c.writer){if(!H(T))throw new Error("upload queue overflow");return}if(p){if(!H(T))throw new Error("upload queue overflow");return}if(!p){if(Re&&T.byteLength>=24){const W=fn(T,k);if(!W.hasError){p=C("dmxlc3M=");const{addressType:ae,port:ge,hostname:ve,rawIndex:ke,version:Vn,isUDP:Jn}=W;if(Jn)if(ge===53)d=!0;else throw new Error(Dt);const ft=new Uint8Array([Vn[0],0]),dt=T.subarray(ke);if(d)return tt(dt,l,ft,x);await Ke(ae,ve,ge,dt,l,ft,c,t,f,a,u,x);return}}if(Ne&&T.byteLength>=56){const W=await yn(T,k);if(!W.hasError){p=atob("dHJvamFu");const{addressType:ae,port:ge,hostname:ve,rawClientData:ke}=W;await Ke(ae,ve,ge,ke,l,null,c,t,f,a,u,x);return}}throw new Error("Invalid protocol or authentication failed")}}})).catch(E=>{L()}),new Response(null,{status:101,webSocket:h})}async function Ke(e,n,t,r,o,a,s,u="",f="",i=null,h=null,l=null){const c=u||N,d=f||J,p=i!==null?i:ee,g=h||ne,w=h?!0:j,U=O(r);async function x(y,b,m=!1){if(v.exhausted)throw new Error("Free 连接预算已用完");const E=m?await nt(e,y,b,g,l,U):await Le(y,b,l,Ze),T=E.writable.getWriter();return!m&&U.byteLength&&await T.write(U),{remoteSock:E,writer:T}}function S(y,b){if(s.socket===y){try{b?.releaseLock()}catch{}s.socket=null,s.writer=null}}function L(y,b,m){if(v.exhausted){b.abort().catch(()=>{});try{y.close()}catch{}return}try{s.writer&&s.writer!==b&&s.writer.releaseLock()}catch{}s.socket=y,s.writer=b,s.drainUpload?.(),y.closed.catch(()=>{}).finally(()=>{s.socket===y&&G(o)}),et(y,o,a,m).finally(()=>{if(s.socket===y){try{b.releaseLock()}catch{}s.writer=null}})}async function H(){if(!v.exhausted){if(q&&w){G(o);return}if(Q&&w)try{const{remoteSock:y,writer:b}=await x(n,t,!0);L(y,b,null);return}catch{let b,m;if(c&&c.trim()){const E=oe(c);b=E.address,m=E.port||t}else{const E=await Ce(d,p);b=E?E.domain:n,m=E?E.port:t}try{const{remoteSock:E,writer:T}=await x(b,m,!1);L(E,T,null)}catch{G(o)}}else{let y,b;if(c&&c.trim()){const m=oe(c);y=m.address,b=m.port||t}else{const m=await Ce(d,p);y=m?m.domain:n,b=m?m.port:t}try{const{remoteSock:m,writer:E}=await x(y,b,w);L(m,E,null)}catch{G(o)}}}}try{const y=q&&w?!0:Q?!1:w,{remoteSock:b,writer:m}=await x(n,t,y);L(b,m,()=>{S(b,m),H()})}catch{await H()}}function O(e){return e instanceof Uint8Array?e:e instanceof ArrayBuffer?new Uint8Array(e):ArrayBuffer.isView(e)?new Uint8Array(e.buffer,e.byteOffset,e.byteLength):new Uint8Array(e)}function Se(e,n){const t=O(e),r=O(n),o=new Uint8Array(t.byteLength+r.byteLength);return o.set(t),o.set(r,t.byteLength),o}function sn(e,n=e,t=Math.max(1,n>>8)){let r=[],o=0,a=0,s=null;function u(){o>32&&o*2>=r.length&&(r=r.slice(o),o=0)}function f(){if(o>=r.length)return null;const i=r[o];return r[o++]=void 0,a-=i.byteLength,u(),i}return{get empty(){return o>=r.length},clear(){r=[],o=0,a=0},sow(i){const h=i?.byteLength||0;return h?a+h>n||r.length-o>=t?!1:(r.push(i),a+=h,!0):!0},bundle(i=null){if(i||=f(),!i||o>=r.length||i.byteLength>=e)return[i,!1];let h=i.byteLength,l=o;for(;l<r.length;){const p=r[l],g=h+p.byteLength;if(g>e)break;h=g,l++}if(l===o)return[i,!1];const c=s||=new Uint8Array(e);c.set(i);let d=i.byteLength;for(;o<l;){const p=r[o];r[o++]=void 0,a-=p.byteLength,c.set(p,d),d+=p.byteLength}return u(),[c.subarray(0,h),!0]}}}function cn(e){const n=zt,t=Yt,r=Math.max(4096,t<<3);let o=new Uint8Array(n),a=0,s=0,u=!1,f=0,i=0,h=0;function l(){s&&clearTimeout(s),s=0,u=!1,a&&(e.readyState===1&&e.send(o.subarray(0,a).slice()),o=new Uint8Array(n),a=0,h=0)}function c(){s||u||(u=!0,i=f,queueMicrotask(()=>{if(u=!1,!(!a||s)){if(n-a<t)return l();s=setTimeout(()=>{if(s=0,!!a){if(n-a<t)return l();if(h<2&&(f!==i||a<r))return h++,i=f,c();l()}},Math.max(Kt,1))}}))}return{send(d){const p=O(d);let g=0;const w=p.byteLength;if(w)for(;g<w;){if(!a&&w-g>=n){const x=Math.min(n,w-g);e.readyState===1&&e.send(g||x!==w?p.subarray(g,g+x):p),g+=x;continue}const U=Math.min(n-a,w-g);o.set(p.subarray(g,g+U),a),a+=U,g+=U,f++,a===n||n-a<t?l():c()}},flush:l}}function Qe(e,n,t=null){const r={hostname:e,port:n};return t&&typeof t.connect=="function"?t.connect(r):Ae(r)}async function qe(e,n,t=null){try{const r=Qe(e,n,t);return r?.opened&&await r.opened,r}catch(r){if(!t)throw r;const o=Ae({hostname:e,port:n});return o?.opened&&await o.opened,o}}async function Le(e,n,t=null,r=1){const o=Math.max(1,r|0);if(o<=1)return qe(e,n,t);const a=Array.from({length:o},()=>qe(e,n,t)),s=await Promise.any(a);return a.forEach(u=>{u.then(f=>{if(f!==s)try{f.close()}catch{}},()=>{})}),s}function ln(e){if(re.has(e))return re.get(e);const n=String(e||"").replace(/-/g,"");if(n.length!==32)return null;const t=new Uint8Array(16);for(let r=0;r<16;r++){const o=Number.parseInt(n.slice(r*2,r*2+2),16);if(Number.isNaN(o))return null;t[r]=o}return re.size>16&&re.clear(),re.set(e,t),t}function un(e,n,t){const r=ln(t);return!!r&&e[n]===r[0]&&e[n+1]===r[1]&&e[n+2]===r[2]&&e[n+3]===r[3]&&e[n+4]===r[4]&&e[n+5]===r[5]&&e[n+6]===r[6]&&e[n+7]===r[7]&&e[n+8]===r[8]&&e[n+9]===r[9]&&e[n+10]===r[10]&&e[n+11]===r[11]&&e[n+12]===r[12]&&e[n+13]===r[13]&&e[n+14]===r[14]&&e[n+15]===r[15]}function fn(e,n){const t=O(e);if(t.byteLength<24)return{hasError:!0,message:X};const r=t.subarray(0,1);if(!un(t,1,n))return{hasError:!0,message:It};const o=t[17],a=18+o;if(t.byteLength<a+5)return{hasError:!0,message:X};const s=t[a];let u=!1;if(s!==1)if(s===2)u=!0;else return{hasError:!0,message:Pt};const f=19+o,i=t[f]<<8|t[f+1];let h=f+2,l=0,c=h+1,d="";const p=t[h];switch(p){case xe:if(l=4,t.byteLength<c+l)return{hasError:!0,message:X};d=`${t[c]}.${t[c+1]}.${t[c+2]}.${t[c+3]}`;break;case ue:if(t.byteLength<c+1)return{hasError:!0,message:X};if(l=t[c++],t.byteLength<c+l)return{hasError:!0,message:X};d=fe.decode(t.subarray(c,c+l));break;case Ee:if(l=16,t.byteLength<c+l)return{hasError:!0,message:X};const g=[],w=new DataView(t.buffer,t.byteOffset+c,l);for(let U=0;U<8;U++)g.push(w.getUint16(U*2).toString(16));d=g.join(":");break;default:return{hasError:!0,message:`${Mt}: ${p}`}}return d?{hasError:!1,addressType:p,port:i,hostname:d,isUDP:u,rawIndex:c+l,version:r}:{hasError:!0,message:`${Ot}: ${p}`}}function dn(e,n){let t=!1;return new ReadableStream({start(r){function o(f){if(!t)try{v.consume(f.byteLength),r.enqueue(O(f))}catch(i){t=!0;try{r.error(i)}catch{}}}const a=f=>o(f.data);e.addEventListener("message",a),v.onExhausted(()=>e.removeEventListener("message",a)),e.addEventListener("close",()=>{t||(G(e),r.close())}),e.addEventListener("error",f=>r.error(f));const{earlyData:s,error:u}=In(n);u?r.error(u):s&&o(s)},cancel(){t=!0,G(e)}})}async function et(e,n,t,r){let o=t,a=!1,s=!1,u=null;r&&(u=setTimeout(()=>{if(!a&&!s){s=!0;try{e.close&&e.close()}catch{}r()}},qt));const f=cn(n);let i=null,h=!0,l=new ArrayBuffer(z);try{try{i=e.readable.getReader({mode:"byob"})}catch{h=!1,i=e.readable.getReader()}for(;;){const c=h?await i.read(new Uint8Array(l,0,z)):await i.read();if(c.done)break;const d=c.value;v.consume(d.byteLength);let p=O(d);const g=h&&d?.buffer instanceof ArrayBuffer&&d.buffer.byteLength>=z?d.buffer:new ArrayBuffer(z);if(p.byteLength){if(a||(a=!0,u&&(clearTimeout(u),u=null)),n.readyState!==1)throw new Error(Vt);o&&(p=Se(o,p),o=null),p.byteLength>=z>>1?(f.flush(),n.send(p),h&&(l=new ArrayBuffer(z))):(f.send(p),h&&(l=g))}}f.flush()}catch{s||G(n)}finally{try{f.flush()}catch{}try{i?.releaseLock()}catch{}}u&&(clearTimeout(u),u=null),!a&&!s&&r&&!v.exhausted&&r()}async function tt(e,n,t,r=null){try{const o=await Le("8.8.4.4",53,r,1);v.onExhausted(()=>{try{o.close()}catch{}});let a=t;const s=o.writable.getWriter();await s.write(e),s.releaseLock(),await et(o,n,a,null)}catch{}}async function nt(e,n,t,r=ne,o=null,a=null){if(r&&(r.kind===Fe||r.kind===le))return pn(n,t,r,o,a);const{username:s,password:u,hostname:f,socksPort:i}=r,h=Qe(f,i,o),l=h.writable.getWriter();await l.write(new Uint8Array(s?[5,2,0,2]:[5,1,0]));const c=h.readable.getReader();let d=new Uint8Array(0);async function p(b){for(;d.length<b;){const{value:m,done:E}=await c.read();if(E||!m)throw new Error(Je);d=Se(d,m)}return d}function g(b){const m=d.subarray(0,b);return d=d.subarray(b),m}let w=await p(2);if(w[0]!==5||w[1]===255)throw new Error(Jt);const U=w[1];if(g(2),U===2){if(!s||!u)throw new Error(jt);const b=new TextEncoder,m=new Uint8Array([1,s.length,...b.encode(s),u.length,...b.encode(u)]);if(await l.write(m),w=await p(2),w[0]!==1||w[1]!==0)throw new Error(Bt);g(2)}const S=new TextEncoder().encode(hn(n)),L=new Uint8Array([3,S.length,...S]);if(await l.write(new Uint8Array([5,1,0,...L,t>>8,t&255])),w=await p(4),w[1]!==0)throw new Error(Je);const H=w[3];let y;if(H===1)y=10;else if(H===4)y=22;else if(H===3)y=7+(await p(5))[4];else throw new Error(me);return await p(y),g(y),a&&a.byteLength&&await l.write(a),l.releaseLock(),c.releaseLock(),d.length?rt(h,d):h}function hn(e){const n=String(e||"");return/^\[.*\]$/.test(n)?n.slice(1,-1):n}async function pn(e,n,t,r=null,o=null){const{username:a,password:s,hostname:u,socksPort:f,kind:i}=t,h=i===le?{secureTransport:"on",allowHalfOpen:!1}:void 0,l={hostname:u,port:f},c=r&&typeof r.connect=="function"?h===void 0?r.connect(l):r.connect(l,h):Ae(l,h);c?.opened&&await c.opened;const p=`${e.includes(":")&&!/^\[.*\]$/.test(e)?`[${e}]`:e}:${n}`;let g=`${$t} ${p}${Gt}${Z}${Wt}${p}${Z}${Xt}${Z}${Ft}${Z}`;a&&(g+=`${_t}${btoa(`${a}:${s||""}`)}${Z}`),g+=Z;const w=c.writable.getWriter(),U=c.readable.getReader();try{await w.write(new TextEncoder().encode(g));const x=[13,10,13,10];let S=new Uint8Array(0),L=-1;for(;L<0;){const{value:m,done:E}=await U.read();if(E||!m)throw new Error(je);S=Se(S,m);for(let T=0;T+3<S.length;T++)if(S[T]===x[0]&&S[T+1]===x[1]&&S[T+2]===x[2]&&S[T+3]===x[3]){L=T+4;break}if(L<0&&S.length>8192)throw new Error(me)}const H=fe.decode(S.subarray(0,Math.min(L,128)));if(!H.startsWith(Zt))throw new Error(me);const y=Number(H.split(" ")[1]);if(!(y>=200&&y<300))throw new Error(je);const b=S.subarray(L);return o&&o.byteLength&&await w.write(o),w.releaseLock(),U.releaseLock(),b.byteLength?rt(c,b):c}catch(x){try{w.releaseLock()}catch{}try{U.releaseLock()}catch{}try{c.close()}catch{}throw x}}function rt(e,n){let t=null;return{readable:new ReadableStream({start(o){o.enqueue(n),t=e.readable.getReader()},async pull(o){const{value:a,done:s}=await t.read();if(s){o.close();return}o.enqueue(a)},cancel(o){try{t?.cancel(o)}catch{}}}),writable:e.writable,closed:e.closed,opened:e.opened,close:()=>e.close()}}function ot(e){let n=String(e||"").trim(),t=_e;const r=n.toLowerCase();r.startsWith(We)?(t=le,n=n.slice(We.length)):r.startsWith(Ge)?(t=Fe,n=n.slice(Ge.length)):r.startsWith(Be)?n=n.slice(Be.length):r.startsWith($e)&&(n=n.slice($e.length));const o=n.indexOf("/");if(o>=0&&(n=n.slice(0,o)),!n)throw new Error(te);let[a,s]=n.split("@").reverse(),u,f,i,h;if(s){const d=s.split(":");if(d.length!==2)throw new Error(te);[u,f]=d}const l=a.split(":"),c=l.pop();if(h=Number(c),isNaN(h)){if(t===_e)throw new Error(te);l.push(c),h=t===le?443:80}if(i=l.join(":"),!i)throw new Error(te);if(i.includes(":")&&!/^\[.*\]$/.test(i))throw new Error(te);return{username:u,password:f,hostname:i,socksPort:h,kind:t}}async function yn(e,n){const t=O(e),o=await wn(ce||n);if(t.byteLength<56)return{hasError:!0,message:"invalid "+atob("dHJvamFu")+" data - too short"};let a=56;if(t[56]!==13||t[57]!==10)return{hasError:!0,message:"invalid "+atob("dHJvamFu")+" header format (missing CR LF)"};if(fe.decode(t.subarray(0,a))!==o)return{hasError:!0,message:"invalid "+atob("dHJvamFu")+" password"};const u=t.subarray(a+2);if(u.byteLength<6)return{hasError:!0,message:atob("aW52YWxpZCBTT0NLUzUgcmVxdWVzdCBkYXRh")};const f=new DataView(u.buffer,u.byteOffset,u.byteLength);if(f.getUint8(0)!==1)return{hasError:!0,message:"unsupported command, only TCP (CONNECT) is allowed"};const h=f.getUint8(1);let l=0,c=2,d="";switch(h){case 1:l=4,d=u.subarray(c,c+l).join(".");break;case 3:l=u[c],c+=1,d=fe.decode(u.subarray(c,c+l));break;case 4:l=16;const w=new DataView(u.buffer,u.byteOffset+c,l),U=[];for(let x=0;x<8;x++)U.push(w.getUint16(x*2).toString(16));d=U.join(":");break;default:return{hasError:!0,message:`invalid addressType is ${h}`}}if(!d)return{hasError:!0,message:`address is empty, addressType is ${h}`};const p=c+l,g=new DataView(u.buffer,u.byteOffset+p,2).getUint16(0);return{hasError:!1,addressRemote:d,addressType:h,port:g,hostname:d,rawClientData:u.subarray(p+4)}}async function wn(e){if(K.has(e))return K.get(e);const t=new TextEncoder().encode(e),r=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298];let o=[3238371032,914150663,812702999,4144912697,4290775857,1750603025,1694076839,3204075428];const a=t.length,s=a*8,u=Math.ceil((a+9)/64)*64,f=new Uint8Array(u);f.set(t),f[a]=128;const i=new DataView(f.buffer);i.setUint32(u-4,s,!1);for(let c=0;c<u;c+=64){const d=new Uint32Array(64);for(let y=0;y<16;y++)d[y]=i.getUint32(c+y*4,!1);for(let y=16;y<64;y++){const b=V(d[y-15],7)^V(d[y-15],18)^d[y-15]>>>3,m=V(d[y-2],17)^V(d[y-2],19)^d[y-2]>>>10;d[y]=d[y-16]+b+d[y-7]+m>>>0}let[p,g,w,U,x,S,L,H]=o;for(let y=0;y<64;y++){const b=V(x,6)^V(x,11)^V(x,25),m=x&S^~x&L,E=H+b+m+r[y]+d[y]>>>0,T=V(p,2)^V(p,13)^V(p,22),W=p&g^p&w^g&w,ae=T+W>>>0;H=L,L=S,S=x,x=U+E>>>0,U=w,w=g,g=p,p=E+ae>>>0}o[0]=o[0]+p>>>0,o[1]=o[1]+g>>>0,o[2]=o[2]+w>>>0,o[3]=o[3]+U>>>0,o[4]=o[4]+x>>>0,o[5]=o[5]+S>>>0,o[6]=o[6]+L>>>0,o[7]=o[7]+H>>>0}const h=[];for(let c=0;c<7;c++)h.push((o[c]>>>24&255).toString(16).padStart(2,"0"),(o[c]>>>16&255).toString(16).padStart(2,"0"),(o[c]>>>8&255).toString(16).padStart(2,"0"),(o[c]&255).toString(16).padStart(2,"0"));const l=h.join("");return K.size>=32&&K.delete(K.keys().next().value),K.set(e,l),l}function V(e,n){return e>>>n|e<<32-n}let de=0;const at=128*1024,st=45e3,gn=32,bn=[13,23,28,28,28,28,28,28,28,24,30,28,28,30,28,28,28,28,28,28,28,28,30,28,28,28,28,28,28,28,28,28,6,10,10,12,13,6,8,11,10,10,8,11,8,6,6,6,5,5,5,6,6,6,6,6,6,6,7,8,15,6,12,10,13,6,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,8,7,8,13,19,13,14,6,15,5,6,5,6,5,6,6,6,5,7,7,6,6,6,5,6,7,6,5,5,6,7,7,7,7,7,15,11,14,13,28,20,22,20,20,22,22,22,23,22,23,23,23,23,23,24,23,24,24,22,23,24,23,23,23,23,21,22,23,22,23,23,24,22,21,20,22,22,23,23,21,23,22,22,24,21,22,23,23,21,21,22,21,23,22,23,23,20,22,22,22,23,22,22,23,26,26,20,19,22,23,22,25,26,26,26,27,27,26,24,25,19,21,26,27,27,26,27,24,21,21,26,26,28,27,27,27,20,24,20,21,22,21,21,23,22,22,25,25,24,24,26,23,26,27,26,26,27,27,27,27,27,28,27,27,27,27,27,26,30];function mn(e){return{头:e.slice(1,7),键:"_"+e.slice(25,31)}}function xn(e){const n=new TextEncoder().encode(e);let t=0;for(let r=0;r<n.length;r++)t+=bn[n[r]];return Math.ceil(t/8)}function En(e,n,t){const r=e.headers.get(n);if(r){try{const a=new URL(r,"https://x.invalid").searchParams.get(t);if(a)return a}catch{}return r}try{return new URL(e.url).searchParams.get(t)||""}catch{return""}}function Un(e,n,t){const r=En(e,n,t);if(!r)return!0;const o=xn(r);return o>=98&&o<=1002}const ct="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";function Cn(e){const n=ct.length;let t="";for(let r=0;r<e;r++)t+=ct[Math.floor(Math.random()*n)];return t}function he(e){return new Promise(n=>setTimeout(n,e))}function Sn(e,n){for(let t=0;t<16;t++)if(e[t]!==n[t])return!1;return!0}class it{#e;constructor(){this.#e=0}get(){return this.#e}add(n){this.#e+=n}}function lt(e,...n){let t=e.length;for(let o of n)t+=o.length;const r=new e.constructor(t);r.set(e,0),t=e.length;for(let o of n)r.set(o,t),t+=o.length;return r}function Ln(e){e=e.replaceAll("-","");const n=[];for(let t=0;t<16;t++){const r=parseInt(e.substr(t*2,2),16);n.push(r)}return n}function pe(e){return new Uint8Array(new ArrayBuffer(e||at))}async function Tn(e,n){const t=e.getReader({mode:"byob"});try{let r=await t.readAtLeast(18,pe());v.consume(r.value?.byteLength||0);let o=0,a=0,s=r.value;o+=r.value.length;const u=s[0],f=s.slice(1,17),i=Ln(n);if(!Sn(f,i))return"invalid UUID";const h=s[17],l=18+h+1+2+1;if(l+1>o){if(r.done)return"header too short";a=l+1-o,r=await t.readAtLeast(a,pe()),v.consume(r.value?.byteLength||0),o+=r.value.length,s=lt(s,r.value)}const c=s[18+h];if(c!==1)return`unsupported command: ${c}`;const d=(s[l-1-2]<<8)+s[l-1-1],p=s[l-1];let g=-1;if(p===xe?g=l+4:p===Ee?g=l+16:p===ue&&(g=l+1+s[l]),g<0)return"read address type failed";if(a=g-o,a>0){if(r.done)return"read address failed";r=await t.readAtLeast(a,pe()),v.consume(r.value?.byteLength||0),o+=r.value.length,s=lt(s,r.value)}let w="";switch(a=l,p){case xe:w=s.slice(a,a+4).join(".");break;case ue:w=new TextDecoder().decode(s.slice(a+1,a+1+s[a]));break;case Ee:w=s.slice(a,a+16).reduce((x,S,L,H)=>L%2?x.concat(((H[L-1]<<8)+S).toString(16)):x,[]).join(":");break}if(w.length<1)return"failed to parse hostname";const U=s.slice(g);return{hostname:w,port:d,data:U,resp:new Uint8Array([u,0]),reader:t,done:r.done}}catch(r){try{t.releaseLock()}catch{}throw r}}async function vn(e,n,t){async function r(o){if(!(!o||o.length===0)){e.add(o.length);try{await n.write(o)}catch(a){throw a}}}try{await r(t.data);let o=0;for(;!t.done;){const a=await t.reader.read(pe());if(a.done)break;v.consume(a.value?.byteLength||0),await r(a.value),t.done=a.done,o++,!v.enabled&&o%10===0&&await he(0),(!a.value||a.value.length===0)&&await he(2)}}catch(o){throw o}}function kn(e,n){const t=new it,r=n.getWriter(),o=(async()=>{try{await vn(t,r,e)}catch(a){if(!v.exhausted)throw a}finally{try{await r.close()}catch{}}})();return{counter:t,done:o,abort:()=>{try{r.abort().catch(()=>{})}catch{}}}}function An(e,n){const t=new it;let r,o,a;const s=new Promise((u,f)=>{r=new TransformStream({start(d){t.add(e.length),d.enqueue(e)},transform(d,p){t.add(d.length),p.enqueue(d)},cancel(d){f(`download cancelled: ${d}`)}},null,new ByteLengthQueuingStrategy({highWaterMark:at}));let i=Date.now();const h=setInterval(()=>{if(Date.now()-i>st){try{r.writable.abort?.("idle timeout")}catch{}clearInterval(h),f("idle timeout")}},5e3),l=o=n.getReader(),c=a=r.writable.getWriter();(async()=>{try{let d=0;for(;;){const p=await l.read();if(p.done)break;v.consume(p.value?.byteLength||0),i=Date.now(),await c.write(p.value),d++,!v.enabled&&d%5===0&&await he(0)}await c.close(),u()}catch(d){if(v.exhausted){try{await c.close()}catch{}u()}else f(d)}finally{try{l.releaseLock()}catch{}try{c.releaseLock()}catch{}clearInterval(h)}})()});return{readable:r.readable,counter:t,done:s,finish:()=>{try{o?.cancel().catch(()=>{})}catch{}try{a?.close().catch(()=>{})}catch{}},abort:()=>{try{o?.cancel().catch(()=>{})}catch{}try{a?.abort().catch(()=>{})}catch{}}}}function ye(e,n){let t,r;return v.onExhausted(()=>{try{n.close()}catch{}t?.abort(),r?.finish()}),t=kn(e,n.writable),r=An(e.resp,n.readable),{downloader:r,uploader:t,close:()=>{try{n.close()}catch{}}}}async function Hn(e,n=null){const t=e.hostname,r=e.port,o=async(f,i)=>Le(f,i,n,Ze),a=async(f,i)=>nt(ue,f,i,ne,n,null),s=async()=>{if(N&&N.trim()){const i=oe(N);return{address:i.address,port:i.port||r}}const f=await Ce(J,ee);return f?{address:f.domain,port:f.port}:{address:t,port:r}},u=q&&j?!0:Q?!1:j;try{const f=u?await a(t,r):await o(t,r);return ye(e,f)}catch{if(q&&j)return null;try{if(Q&&j)try{const l=await a(t,r);return ye(e,l)}catch{const c=await s(),d=await o(c.address,c.port);return ye(e,d)}const i=await s(),h=j?await a(i.address,i.port):await o(i.address,i.port);return ye(e,h)}catch{return null}}}async function Rn(e,n,t=null){if(de>=gn)return new Response("Too many connections",{status:429});de++;let r=!1;const o=()=>{r||(de=Math.max(0,de-1),r=!0)};try{const a=await Tn(e,n);if(typeof a!="object"||!a)return null;const s=await Hn(a,t);if(s===null)return null;const u=Promise.race([(async()=>{try{await s.downloader.done}catch{}})(),(async()=>{try{await s.uploader.done}catch{}})(),he(st).then(()=>{})]).finally(()=>{try{s.close()}catch{}try{v.exhausted?s.downloader.finish():s.downloader.abort()}catch{}try{s.uploader.abort()}catch{}o()});return{readable:s.downloader.readable,closed:u}}catch{return o(),null}}async function Nn(e){try{return await Rn(e.body,k,e.fetcher)}catch{return null}}function In(e){if(!e)return{error:null};try{return e=e.replace(/-/g,"+").replace(/_/g,"/"),{earlyData:Uint8Array.from(atob(e),n=>n.charCodeAt(0)).buffer,error:null}}catch(n){return{error:n}}}function G(e){try{(e.readyState===1||e.readyState===2)&&e.close()}catch{}}async function Pn(e){if(!D)return new Response(JSON.stringify({success:!1,error:"KV存储未配置",message:"需要配置KV存储才能使用此功能"}),{status:503,headers:{"Content-Type":"application/json"}});if(!(Y("ae","")==="yes"))return new Response(JSON.stringify({success:!1,error:"API功能未启用",message:'出于安全考虑,优选IP API功能默认关闭。请在配置管理页面开启"允许API管理"选项后使用。'}),{status:403,headers:{"Content-Type":"application/json"}});try{if(e.method==="GET"){const t=Y("yx",""),r=we(t);return new Response(JSON.stringify({success:!0,count:r.length,data:r}),{headers:{"Content-Type":"application/json"}})}else if(e.method==="POST"){const t=await e.json(),r=Array.isArray(t)?t:[t];if(r.length===0)return new Response(JSON.stringify({success:!1,error:"请求数据为空",message:"请提供IP数据"}),{status:400,headers:{"Content-Type":"application/json"}});const o=Y("yx","");let a=we(o);const s=[],u=[],f=[];for(const i of r){if(!i.ip){f.push({ip:"未知",reason:"IP地址是必需的"});continue}const h=i.port||443,l=i.name||`API优选-${i.ip}:${h}`;if(!ze(i.ip)&&!Mn(i.ip)){f.push({ip:i.ip,reason:"无效的IP或域名格式"});continue}if(a.some(p=>p.ip===i.ip&&p.port===h)){u.push({ip:i.ip,port:h,reason:"已存在"});continue}const d={ip:i.ip,port:h,name:l,addedAt:new Date().toISOString()};a.push(d),s.push(d)}if(s.length>0){const i=ut(a);await Ue("yx",i),Te()}return new Response(JSON.stringify({success:s.length>0,message:`成功添加 ${s.length} 个IP`,added:s.length,skipped:u.length,errors:f.length,data:{addedIPs:s,skippedIPs:u.length>0?u:void 0,errors:f.length>0?f:void 0}}),{headers:{"Content-Type":"application/json"}})}else if(e.method==="DELETE"){const t=await e.json();if(t.all===!0){const i=Y("yx",""),l=we(i).length;return await Ue("yx",""),Te(),new Response(JSON.stringify({success:!0,message:`已清空所有优选IP,共删除 ${l} 个`,deletedCount:l}),{headers:{"Content-Type":"application/json"}})}if(!t.ip)return new Response(JSON.stringify({success:!1,error:"IP地址是必需的",message:'请提供要删除的ip字段,或使用 {"all": true} 清空所有'}),{status:400,headers:{"Content-Type":"application/json"}});const r=t.port||443,o=Y("yx","");let a=we(o);const s=a.length,u=a.filter(i=>!(i.ip===t.ip&&i.port===r));if(u.length===s)return new Response(JSON.stringify({success:!1,error:"优选IP不存在",message:`${t.ip}:${r} 未找到`}),{status:404,headers:{"Content-Type":"application/json"}});const f=ut(u);return await Ue("yx",f),Te(),new Response(JSON.stringify({success:!0,message:"优选IP已删除",deleted:{ip:t.ip,port:r}}),{headers:{"Content-Type":"application/json"}})}else return new Response(JSON.stringify({success:!1,error:"不支持的请求方法",message:"支持的方法: GET, POST, DELETE"}),{status:405,headers:{"Content-Type":"application/json"}})}catch(t){return new Response(JSON.stringify({success:!1,error:"处理请求失败",message:t.message}),{status:500,headers:{"Content-Type":"application/json"}})}}function Dn(){const e=ie();v=pt(e.freeCpu==="yes");const n=e.wk;if(n&&n.trim())B=n.trim().toUpperCase(),J=B;else{const r=e.p;r&&r.trim()?J="CUSTOM":(B="",J="")}ee=!(e.rm&&e.rm.toLowerCase()==="no"),Re=e.ev==="yes",Ne=e.et==="yes",Ie=e.ex==="yes",ce=e.tp||"",Et=e.scu||F.scu,Ut=e.epd==="yes",Ct=e.epi==="yes",St=e.egi==="yes",Lt=e.ena==="yes",Tt=e.jk==="yes",Pe=e.ech==="yes",bt=e.customDNS||F.customDNS,mt=e.customECHDomain||F.customECHDomain,xt=tn(e.alpn||""),yt=e.dkby==="yes"||Pe;const t=(e.qj||"").toLowerCase();if(Q=t==="no",q=t==="only",be=e.d||"",gt=e.yxURL||"",N=e.p?e.p.trim():"",$=e.s||"",$)try{ne=ot($),j=!0}catch{j=!1}else ne={},j=!1;wt=!!(e.yxby&&e.yxby.toLowerCase()==="yes")}function Te(){const e=Y("yx","");if(e)try{const n=e.split(/[,\r\n]+/).map(t=>t.trim()).filter(t=>t);I=[],_=[],n.forEach(t=>{let r="",o=t;if(t.includes("#")){const u=t.split("#");o=u[0].trim(),r=u[1].trim()}const{address:a,port:s}=oe(o);r||(r="自定义优选-"+a+(s?":"+s:"")),ze(a)?I.push({ip:a,port:s,isp:r}):_.push({domain:a,port:s,name:r})})}catch{I=[],_=[]}else I=[],_=[]}function we(e){if(!e||!e.trim())return[];const n=e.split(/[,\r\n]+/).map(r=>r.trim()).filter(r=>r),t=[];for(const r of n){let o="",a=r;if(r.includes("#")){const f=r.split("#");a=f[0].trim(),o=f[1].trim()}const{address:s,port:u}=oe(a);o||(o=s+(u?":"+u:"")),t.push({ip:s,port:u||443,name:o,addedAt:new Date().toISOString()})}return t}function ut(e){return!e||e.length===0?"":e.map(n=>{const t=n.port||443;return`${n.ip}:${t}#${n.name}`}).join(",")}function Mn(e){return/^(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}$/.test(e)}async function On(e,n,t={waitUntil(){}}){if(e.method==="OPTIONS")return new Response(null,{status:204,headers:He});const r=new URL(e.url);if(r.pathname==="/"&&e.method==="GET"&&!e.headers.get("Upgrade"))return new Response("hello",{headers:{"Content-Type":"text/plain; charset=utf-8"}});if(k=String(n.u||n.U||k).trim().toLowerCase(),!en(k))return P({error:"UUID 格式无效"},503);D=n.C||n.c||null,M=await Bn(D,r.pathname.endsWith("/api/config"));const o=M;M=ie(n),Dn(),J||="CF",M=o;const a="/"+k,s=be?new URL("/"+be.replace(/^\/+|\/+$/g,""),"https://path.invalid").pathname:"",u=i=>r.pathname===a+i||s&&r.pathname===s+i;if(u("/api/config")){if(e.method==="GET")return P({...ie(n),uuid:k,coreVersion:ht,kvEnabled:!!D});if(e.method!=="POST")return P({error:"只支持 GET 和 POST"},405);if(!D)return P({success:!1,message:"KV 未绑定,无法保存配置"},503);let i;try{const h=await e.text();if(new TextEncoder().encode(h).length>1048576)return P({success:!1,message:"配置过大,请减少优选条目或改用列表 URL(请求上限 1 MiB)"},413);if(i=JSON.parse(h),!i||Array.isArray(i)||typeof i!="object")throw new Error;Object.hasOwn(i,"customIP")&&(Object.hasOwn(i,"p")||(i.p=i.customIP),delete i.customIP);for(const[l,c]of Object.entries(i)){if(!Object.hasOwn(F,l)||c!==null&&!["string","boolean","number"].includes(typeof c))throw new Error;if(typeof c=="string"&&c.length>(l==="yx"?262144:16384))return P({success:!1,message:l==="yx"?"优选列表过长,请减少条目或改用列表 URL(上限 262144 字符)":"配置字段过长:"+l},413);c===""||c===null?delete M[l]:M[l]=c}}catch{return P({success:!1,message:"配置格式无效"},400)}return await Ye(),se.delete(D),P({success:!0,message:"配置已保存",config:{...ie(n),coreVersion:ht}})}if(u("/api/preferred-ips")){const i=await Pn(e);return e.method!=="GET"&&i.ok&&D&&se.delete(D),jn(i)}if(u("/region")&&e.method==="GET")return P({region:J,detectionMethod:B?"手动指定地区":N?"自定义 ProxyIP 模式":"官方直连",manualRegion:B,ci:N,timestamp:new Date().toISOString()});if(u("/test-api")&&e.method==="GET")return P({detectedRegion:J,message:"API 正常运行"});if(e.headers.get("Upgrade")?.toLowerCase()===atob("d2Vic29ja2V0"))return an(e);const f=r.pathname.replace(/\/+$/,"");if(e.method==="POST"&&Ie&&(u("")||f===a||f==="/"+k.substring(0,8)||ce&&f==="/"+ce.replace(/^\/+|\/+$/g,""))){const{头:i,键:h}=mn(k);if(!Un(e,i,h))return new Response("Bad Request",{status:400});const l=await Nn(e);if(!l)return new Response("Internal Server Error",{status:502});t.waitUntil(l.closed.catch(()=>{}));const c=new URL("https://x.invalid/");return c.searchParams.set(h,Cn(100+Math.floor(Math.random()*901))),new Response(l.readable,{headers:{"X-Accel-Buffering":"no","Cache-Control":"no-store","Content-Type":"application/grpc",[i]:c.toString()}})}return P({error:"Not Found"},404)}return On}export{Wn as default};