cfpilot 0.7.0 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/cfpilot-worker.js +1 -1
- package/dist/cli.js +220 -87
- package/package.json +1 -1
package/assets/cfpilot-worker.js
CHANGED
|
@@ -18,4 +18,4 @@ data: ${JSON.stringify({count:l})}
|
|
|
18
18
|
\u5E38\u89C1\u539F\u56E0\uFF1A\u76EE\u6807\u5730\u5740\u5728 Cloudflare \u81EA\u5BB6\u7F51\u6BB5\uFF08Worker \u4E0D\u80FD\u4E3B\u52A8\u8FDE\u56DE CF \u81EA\u5DF1\u7684\u5165\u53E3\uFF09\u3002
|
|
19
19
|
\u2192 \u6362\u4E00\u4E2A\u7B2C\u4E09\u65B9 IP\uFF0C\u6216\u6539\u7528\u4EE3\u7406\u843D\u5730\u3002`;case"timeout":return`\u51FA\u7AD9\u8D85\u65F6\uFF08${e.candidate}\uFF09\uFF1A${e.message}
|
|
20
20
|
\u2192 \u8BE5\u5730\u5740\u5F53\u524D\u4E0D\u53EF\u8FBE\uFF0C\u53EF\u6362\u4E00\u6761\u5019\u9009\u6216\u542F\u7528\u4EE3\u7406\u843D\u5730\u3002`;default:return`\u51FA\u7AD9\u5931\u8D25\uFF08${e.candidate}\uFF09\uFF1A${e.message}`}}var Vo,Ft=k(()=>{"use strict";Vo=[["104.16.0.0",13],["104.24.0.0",14],["104.31.0.0",15],["172.64.0.0",13],["162.158.0.0",15],["188.114.96.0",20],["141.101.64.0",18],["108.162.192.0",18],["103.21.244.0",22],["103.22.200.0",22],["103.31.4.0",22],["131.0.72.0",22],["197.234.240.0",22],["198.41.128.0",17],["192.0.0.0",24],["192.0.2.0",24],["192.88.99.0",24],["199.27.128.0",21],["223.5.5.0",24],["1.0.0.0",24],["1.1.1.0",24]]});function Cr(e,t="direct"){let n=e.trim();if(!n)return null;let r=t,o=n,s=/^([a-z0-9+.-]+):\/\//i.exec(n);if(s){let h=s[1].toLowerCase();o=n.slice(s[0].length),h==="socks5"||h==="socks"||h==="socks5h"?r="socks5":h==="https"?r="https":h==="http"&&(r="http")}let i=o.lastIndexOf("@"),a={};if(i>=0){let h=o.slice(0,i);o=o.slice(i+1);let m=h.indexOf(":");m>=0?a={username:h.slice(0,m),password:h.slice(m+1)}:a={username:h}}let c,f=/#sni=([^/#]+)/i.exec(o);f&&(c=f[1].trim(),o=o.slice(0,f.index)+o.slice(f.index+f[0].length));let l=o.lastIndexOf(":");if(l<0)return null;let u=o.slice(0,l).replace(/^\[|\]$/g,""),p=Number(o.slice(l+1));return!u||!Number.isInteger(p)||p<=0||p>65535?null:(!c&&r==="https"&&!Yo(u)&&(c=u),{host:u,port:p,kind:r,...a,...c?{serverName:c}:{}})}function Yo(e){return/^\d{1,3}(\.\d{1,3}){3}$/.test(e)}function ye(e,t="direct"){let n=[];for(let r of e.split(/[\n,;]+/)){let o=r.trim();if(!o)continue;let s=Cr(o,t);s&&n.push(s)}return n}var Bt=k(()=>{"use strict"});async function Xo(){return Ht||(Ht=(async()=>(await import("cloudflare"+":sockets")).connect)()),await Ht}function Jo(e,t){if(!v(e))return null;let n=e.split(".").map(i=>Number(i)),r=(n[0]<<8|n[1]).toString(16),o=(n[2]<<8|n[3]).toString(16);return`${t.replace(/:+$/,"")}::${r}:${o}`}async function Ge(e,t,n,r,o){let i=(await Xo())({hostname:e,port:t},r?{secureTransport:r}:void 0),a=async(f,l)=>{let u,p=new Promise((h,m)=>{u=setTimeout(()=>m(new Error(`${l}\u8D85\u65F6\uFF1A${e}:${t}`)),n)});try{return await Promise.race([f,p])}finally{u&&clearTimeout(u)}},c;try{if(await a(i.opened,"\u8FDE\u63A5"),r==="starttls"){if(c=i.startTls?.(o?{expectedServerHostname:o}:void 0),!c)throw new Error("\u5F53\u524D\u8FD0\u884C\u65F6\u4E0D\u652F\u6301 startTls");return await a(c.opened,"TLS \u63E1\u624B"),c}return i}catch(f){try{await(c??i).close()}catch{}throw f}}async function Qo(e){let t=e.timeoutMs??jt;try{let n=await Ge(e.hostname,e.port,t);return{readable:n.readable,writable:n.writable,via:"direct",endpoint:`${e.hostname}:${e.port}`}}catch(n){if(e.nat64&&v(e.hostname)){let r=Jo(e.hostname,e.nat64);if(r){let o=await Ge(r,e.port,t);return{readable:o.readable,writable:o.writable,via:"nat64",endpoint:`${r}:${e.port}`}}}throw n}}async function _o(e,t){let n=e.timeoutMs??jt;if(t.kind==="direct"){let s=await Ge(t.host,t.port,n);return{readable:s.readable,writable:s.writable,via:"direct",endpoint:`${t.host}:${t.port}`}}let r=t.kind==="https"?"starttls":void 0,o=await Ge(t.host,t.port,n,r,t.kind==="https"?t.serverName:void 0);try{return t.kind==="http"||t.kind==="https"?{readable:await lr(o.readable,o.writable,e.hostname,e.port,{username:t.username,password:t.password}),writable:o.writable,via:t.kind,endpoint:`${t.host}:${t.port}`}:{readable:await ir(o.readable,o.writable,e.hostname,e.port,{username:t.username,password:t.password}),writable:o.writable,via:"socks5",endpoint:`${t.host}:${t.port}`}}catch(s){try{await o.close()}catch{}throw s}}async function zt(e,t){if(e.length===0)throw new Error("\u6CA1\u6709\u53EF\u7528\u7684\u51FA\u7AD9\u62E8\u53F7\u65B9\u5F0F");if(e.length===1||!t){let n=new Error("\u62E8\u53F7\u5931\u8D25");for(let r of e)try{return await r()}catch(o){n=o}throw n}return await new Promise((n,r)=>{let o=e.length,s=!1,i=[];for(let a of e)a().then(c=>{if(s){try{c.writable.getWriter().close()}catch{}return}s=!0,n(c)},c=>{i.push(c),o-=1,o===0&&!s&&(s=!0,r(i[0]??new Error("\u62E8\u53F7\u5931\u8D25")))})})}async function Tr(e,t){let n=[...e];if(!t)return n;try{let r=await ge(t),o=new Set(n.map(s=>`${s.ip}:${s.port}`));for(let s of r){let i=`${s.ip}:${s.port}`;o.has(i)||(o.add(i),n.push(s))}}catch{}return n}async function qo(e,t,n){if(e.length===0)return null;for(let r=0;r<e.length;r+=ie){let s=e.slice(r,r+ie).map(i=>t({source:"relay",host:i.ip,port:i.port,label:`\u53CD\u4EE3 ${i.label}`}));try{return await zt(s,n)}catch{}}return null}async function we(e){let t=e.proxies??[],n=e.concurrent??!0,r=e.budgetMs??Zo,o=Date.now()+r,s=[...e.optimizedIps??[]],i=!1;if(e.resolvePreferred)try{let S=await He(e.hostname,e.port,{deadline:o});if(S.length>0){i=!0;for(let U of S)s.push({ip:U.hostname,port:U.port})}}catch{}let a=ae(e.hostname),c=i&&s.length>0&&s.every(S=>ae(S.ip)),f=[...e.relay??[]],l=c||a;l&&e.relayPool&&(f=await Tr(f,{...e.relayPool,deadline:o}));let u=l?f.slice(0,ie):[],p=l?f.slice(ie):[],h=Ar({targetHost:e.hostname,targetPort:e.port,optimizedIps:s,proxies:t,deprioritizeDirect:a||c,relay:u,relayAsPrimary:u.length>0});if(h.length===0)throw new Error("\u6CA1\u6709\u53EF\u7528\u7684\u51FA\u7AD9\u62E8\u53F7\u65B9\u5F0F");let m=S=>async()=>{let U=o-Date.now();if(U<=0)throw new Error(`\u62E8\u53F7\u9884\u7B97\u5DF2\u7528\u5C3D\uFF08${r}ms\uFF09\uFF1A${e.hostname}:${e.port}`);let A=Math.max(200,Math.min(e.timeoutMs??jt,U)),E={...e,timeoutMs:A};try{return S.source==="proxy"&&S.via?await _o(E,{host:S.via.host,port:S.via.port,kind:S.via.kind,username:S.via.username,password:S.via.password,serverName:S.via.serverName}):await Qo({...E,hostname:S.host,port:S.port})}catch(B){let J=Sr(B,S.label);throw e.onFailure?.(J),B}},b=Er(h),{proxy:y,direct:d,fallback:g}=b;if(y.length>0){let S=y.map(m);try{return await zt(S,n)}catch(U){if(g.length===0)throw U;for(let A of g)try{return await m(A)()}catch{}throw U}}let P=d.map(m);try{return await zt(P,n)}catch(S){let U=p;U.length===0&&e.relayPool&&(U=await Tr([],{...e.relayPool,deadline:o}));let A=await qo(U,m,n);if(A)return A;if(g.length===0)throw S;for(let E of g)try{return await m(E)()}catch{}throw S}}var Ht,jt,Zo,Kt=k(()=>{"use strict";ar();cr();_();Ut();Ke();Ft();Bt();Ht=null;jt=8e3,Zo=15e3});var Or={};Ae(Or,{handleWebSocket:()=>Ve,recentDiagnostics:()=>ts,recordDiagnostics:()=>be,truncateCloseReason:()=>Ir});function Ir(e,t=123){let n=new TextEncoder;if(n.encode(e).length<=t)return e;let r=e.slice(0,t);for(;n.encode(r).length>t;)r=r.slice(0,-1);r=r.replace(/\uFFFD+$/,"");let o="\u2026";for(;r.length>0&&n.encode(r+o).length>t;)r=r.slice(0,-1);return r+o}function be(e,t,n){We.unshift({at:Date.now(),target:e,failures:t,summary:n}),We.length>Ur&&(We.length=Ur)}function ts(){return We}async function Ve(e,t,n,r,o,s){let[i,a]=Object.values(new WebSocketPair);try{a.accept({allowHalfOpen:!0})}catch{a.accept()}a.binaryType="arraybuffer";let c=new Uint8Array(0),f=!1,l=null,u=null,p=null,h=null,m=w=>{try{a.send(w)}catch{}},b=w=>{let x=new Uint8Array(2+w.byteLength);x[0]=0,x[1]=w.byteLength,x.set(w,2),m(x)},y=(w,x)=>{try{a.close(w,Ir(x))}catch{}},d=()=>{if(p&&(clearTimeout(p),p=null),g&&(clearTimeout(g),g=null),l)try{l.writable.close()}catch{}},g=null,P=new Set,S=0,U=async()=>{if(!l)return;let w=l.readable.getReader();g&&clearTimeout(g),g=setTimeout(()=>{g=null,!(A>0)&&(be(`${h.hostname}:${h.port}`,[],`\u76F4\u8FDE ${Nr}ms \u65E0\u4E0B\u884C\u6570\u636E\uFF0C\u6539\u8D70\u53CD\u4EE3\u5165\u53E3`),C())},Nr);try{for(;;){let{done:x,value:N}=await w.read();if(x)break;N&&N.byteLength>0&&(A+=N.byteLength,m(N))}}catch{}finally{try{w.releaseLock()}catch{}g&&(clearTimeout(g),g=null),y(1e3,"done")}},A=0,E=async w=>{if(u)try{await u.write(w)}catch{d()}},B=w=>{if(t==="vless"){let N=$n(w,n.uuid);return N?{command:N.header.command,port:N.header.port,hostname:N.header.hostname,headerLength:N.consumed}:null}let x=or(w,n.trojanPassword);return x?{command:x.header.command,port:x.header.port,hostname:x.header.hostname,headerLength:x.consumed}:null},J=async w=>{let x=B(c);if(!x){w||(p=setTimeout(()=>{p=null,J(!0).catch(G=>y(1011,String(G)))},ns));return}if(p&&(clearTimeout(p),p=null),f)return;f=!0,h=x;let N=t==="vless"?Qn:rr;if(x.command===N){y(1002,"UDP over WebSocket \u6682\u4E0D\u652F\u6301");return}b(new Uint8Array(0));let I=[],V=null;try{l=await we({hostname:x.hostname,port:x.port,proxies:r,timeoutMs:Rr,concurrent:n.concurrentDial,nat64:n.nat64||void 0,resolvePreferred:n.resolvePreferred,relayPool:{userEntries:n.relayPool||void 0,useBuiltin:n.useBuiltinRelay,colo:typeof e.cf?.colo=="string"?e.cf.colo:void 0},onFailure:G=>{I.push(G),s?.failures.push(G)}})}catch(G){V=G}if(!l){let G=I.length>0?I.map(D=>Pr(D)).join(`
|
|
21
|
-
`):`\u51FA\u7AD9\u8FDE\u63A5\u5931\u8D25\uFF1A${String(V)}`;be(`${x.hostname}:${x.port}`,I,G),y(1011,G);return}u=l.writable.getWriter();let xe=c.byteLength>x.headerLength?c.slice(x.headerLength):new Uint8Array(0);xe.byteLength>0&&await E(xe),c=new Uint8Array(0),o?.waitUntil(U())},C=async()=>{let w=h;if(!w){y(1011,"\u51FA\u7AD9\u65E0\u6570\u636E\uFF1A\u76EE\u6807\u672A\u89E3\u6790");return}if(S>=kr){y(1011,"\u51FA\u7AD9\u65E0\u6570\u636E\uFF1A\u76F4\u8FDE\u4E0E\u53CD\u4EE3\u5165\u53E3\u5747\u65E0\u54CD\u5E94");return}S++;let x=[];try{x=await ge({userEntries:n.relayPool||void 0,useBuiltin:n.useBuiltinRelay,colo:typeof e.cf?.colo=="string"?e.cf.colo:void 0})}catch{x=[]}let N=x.filter(I=>!P.has(`${I.ip}:${I.port}`));if(N.length===0){y(1011,"\u51FA\u7AD9\u65E0\u6570\u636E\uFF1A\u65E0\u53CD\u4EE3\u5165\u53E3\u53EF\u7528");return}for(let I of N.slice(0,kr)){if(P.add(`${I.ip}:${I.port}`),l)try{l.writable.close()}catch{}u=null,A=0;try{let V=await we({hostname:I.ip,port:I.port,timeoutMs:Rr,resolvePreferred:!1});if(!V)continue;l=V,u=V.writable.getWriter(),c.byteLength>0&&(await u.write(c),c=new Uint8Array(0)),be(`${w.hostname}:${w.port}`,[],`\u5DF2\u5207\u6362\u53CD\u4EE3\u5165\u53E3 ${I.ip}:${I.port}`),o?.waitUntil(U());return}catch(V){be(`${w.hostname}:${w.port}`,[],`\u53CD\u4EE3\u5165\u53E3 ${I.ip}:${I.port} \u5931\u8D25\uFF1A${String(V)}`)}}y(1011,"\u51FA\u7AD9\u65E0\u6570\u636E\uFF1A\u6240\u6709\u53CD\u4EE3\u5165\u53E3\u5747\u5931\u8D25")};a.addEventListener("message",w=>{(async()=>{let x=w.data,N=typeof x=="string"?new TextEncoder().encode(x):new Uint8Array(x);if(N.byteLength!==0){if(!f){if(c=Rt(c,N),c.byteLength>$o){y(1009,"\u63E1\u624B\u5934\u8D85\u8FC7 64KB");return}await J(!1);return}if(!u){if(c=Rt(c,N),c.byteLength>es){y(1009,"\u62E8\u53F7\u671F\u95F4\u6570\u636E\u8FC7\u591A");return}return}await E(N)}})()});let T=()=>{d()};a.addEventListener("close",T),a.addEventListener("error",T);try{return new Response(null,{status:101,webSocket:i})}catch(w){return console.error("[\u81EA\u7814\u6570\u636E\u9762] 101 \u54CD\u5E94\u6784\u9020\u5931\u8D25\uFF1A",w),new Response(null,{status:200})}}var Rr,Nr,kr,$o,es,We,Ur,ns,Gt=k(()=>{"use strict";Tt();sr();he();Kt();Ft();Ke();Rr=5e3,Nr=2500,kr=2,$o=64*1024,es=8*1024*1024;We=[],Ur=20;ns=80});var Dr={};Ae(Dr,{handleXhttp:()=>Wt,recentXhttpDiagnostics:()=>rs,recordXhttpDiagnostics:()=>vr});function vr(e,t,n){Ye.unshift({at:Date.now(),target:e,...t,summary:n}),Ye.length>20&&(Ye.length=20)}function rs(){return Ye}async function Wt(e,t,n){let r=e.body;if(!r)return new Response("\u7F3A\u5C11\u8BF7\u6C42\u4F53",{status:400});let o=new $(r),s=await qn(o,t.uuid);if(!s)return new Response("VLESS \u5934\u89E3\u6790\u5931\u8D25",{status:400});if(s.header.command!==Jn)return new Response("XHTTP \u6682\u4E0D\u652F\u6301 UDP",{status:400});let i=await we({hostname:s.header.hostname,port:s.header.port,proxies:n,nat64:t.nat64,concurrent:t.concurrentDial,resolvePreferred:t.resolvePreferred,relayPool:{userEntries:t.relayPool||void 0,useBuiltin:t.useBuiltinRelay},onFailure:m=>{vr(`${s.header.hostname}:${s.header.port}`,m,`XHTTP \u51FA\u7AD9\u5931\u8D25\uFF08${m.candidate}\uFF09\uFF1A${m.message}`)}}),{readable:a,writable:c}=new TransformStream;Et(s.payload,i.writable,void 0,!1),Et(i.readable,c);let f=s.header.addons;if(f.byteLength>255)return new Response("Addons \u957F\u5EA6\u8D85\u51FA VLESS \u534F\u8BAE\u4E0A\u9650",{status:400});let l=new Uint8Array(2+f.byteLength);l[0]=s.header.version,l[1]=f.byteLength,l.set(f,2);let u=!1,p=null,h=new ReadableStream({start(m){m.enqueue(l),u=!0},async pull(m){if(u){p||(p=a.getReader());try{let{done:b,value:y}=await p.read();if(b){m.close();return}y&&y.byteLength>0&&m.enqueue(y)}catch{try{m.close()}catch{}}}},cancel(m){a.cancel(m)}});return new Response(h,{status:200,headers:{"Content-Type":"text/event-stream","Cache-Control":"no-store","X-Accel-Buffering":"no"}})}var Ye,Vt=k(()=>{"use strict";he();Tt();St();Kt();Ye=[]});ue();pt();re();var bo=15*1024*1024,xo=2*1024*1024;async function Oe(e){let t=new URL(e.url);if(e.headers.get("Upgrade")?.toLowerCase()==="websocket"){let c=new WebSocketPair,[f,l]=Object.values(c);return l.accept(),l.addEventListener("message",u=>{let p=typeof u.data=="string"?u.data:"";if(p==="PING"||p==="ping"){l.send(JSON.stringify({pong:!0,colo:e.cf?.colo??"UNK",clientIp:e.headers.get("CF-Connecting-IP")??""}));try{l.close(1e3,"Probe complete")}catch{}}}),new Response(null,{status:101,webSocket:f})}let r=Number.parseInt(t.searchParams.get("bytes")??"",10),o=Number.isFinite(r)&&r>0?Math.min(r,bo):xo,s=new Uint8Array(64*1024);for(let c=0;c<s.length;c++)s[c]=97;let i=0,a=new ReadableStream({pull(c){if(i>=o){c.close();return}let f=Math.min(s.byteLength,o-i);c.enqueue(s.subarray(0,f)),i+=f}});return new Response(a,{status:200,headers:{"Content-Type":"application/octet-stream","Cache-Control":"no-store","Access-Control-Allow-Origin":"*","X-Probe-Bytes":String(o),"X-Probe-Nonce":Y(4)}})}var Tn="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";var ve=null;function Ao(e){let t=atob(e),n=new Uint8Array(new ArrayBuffer(t.length));for(let r=0;r<t.length;r++)n[r]=t.charCodeAt(r);return n}async function Rn(){if(ve!==null)return ve;let e=Ao(Tn),t=new Response(e).body;if(!t)throw new Error("\u9762\u677F\u6570\u636E\u635F\u574F");let n=t.pipeThrough(new DecompressionStream("gzip"));return ve=await new Response(n).text(),ve}function dt(e){let t=e===200?"Welcome":e===404?"Not Found":"Service Unavailable",n=`<!DOCTYPE html><html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>${t}</title><style>body{margin:0;min-height:100vh;display:flex;align-items:center;justify-content:center;background:#f7f8fa;color:#333;font-family:-apple-system,"Segoe UI","PingFang SC",sans-serif}.c{text-align:center}h1{font-size:22px;font-weight:600;margin:0 0 10px}p{color:#888;font-size:14px;margin:0}</style></head><body><div class="c"><h1>${t}</h1><p>This site is up and running.</p></div></body></html>`;return new Response(n,{status:e,headers:{"Content-Type":"text/html; charset=utf-8","Cache-Control":"no-store","X-Content-Type-Options":"nosniff"}})}function se(e,t){return new Response(JSON.stringify({ok:!1,error:e}),{status:t,headers:{"Content-Type":"application/json; charset=utf-8","Cache-Control":"no-store"}})}Me();Me();var Ct=null;async function No(){return Ct||(Ct=await Promise.resolve().then(()=>(Wn(),Gn))),Ct}async function ko(e,t,n,r){let o=await Le(n,r),s=t.pathname.slice(5).split("/")[0]??"";if(!(s===o.uuid||s===o.trojanPassword||t.searchParams.get("token")===o.uuid))return se("\u8BA2\u9605\u4EE4\u724C\u65E0\u6548",403);let a=t.searchParams.get("target")??t.searchParams.get("format"),c=a?At(a):Kn(e.headers.get("User-Agent"))??At(null),f=await n.get(Q)??"",l=await Ie(o,f),u=await n.get($t)??"",p=me(o.subDomain||r.DATA_HOST||t.hostname),h={nodes:l.nodes,groups:l.groups,config:o,domain:p,port:443,ports:Sn(o),protocol:o.subProtocol,transport:o.subTransport,routeProfile:u},m=Cn(c,h);return new Response(m.body,{status:200,headers:{"Content-Type":m.contentType,"Cache-Control":"no-store","Content-Disposition":`inline; filename="${m.fileName}"`,"Profile-Title":ut(o.subName),"Subscription-Userinfo":""}})}async function Vn(e,t){let n=new URL(e.url),r=bt(t);if(e.method==="OPTIONS")return new Response(null,{status:204,headers:{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":"GET, POST, PUT, DELETE, OPTIONS","Access-Control-Allow-Headers":"Content-Type, Authorization","Access-Control-Max-Age":"86400"}});if(n.pathname==="/__edge_probe")return Oe(e);if(n.pathname.startsWith("/api/")){let{handleApi:s}=await No(),i=await s(e,n,{store:r,env:t,config:await Le(r,t),auth:await xt(r,t),onConfigChanged:jn});if(i)return i}if(n.pathname==="/sub"||n.pathname.startsWith("/sub/"))return await ko(e,n,r,t);let o=await xt(r,t);return n.pathname===o.panelPath||n.pathname===`${o.panelPath}/`?new Response(await Rn(),{status:200,headers:{"Content-Type":"text/html; charset=utf-8","Cache-Control":"no-store","X-Content-Type-Options":"nosniff","Referrer-Policy":"no-referrer"}}):null}async function Yn(e){let t=bt(e);return await Le(t,e)}Gt();Vt();Bt();var Yt="4144233-aaf28587",Lr="/__cfp_version";function Mr(){return new Response(JSON.stringify({build:Yt,ts:Date.now()}),{status:200,headers:{"Content-Type":"application/json","Cache-Control":"no-store","Access-Control-Allow-Origin":"*"}})}function Xt(e){let t=[];return t.push(...ye(e.proxyIp,"direct")),t.push(...ye(e.socks5,"socks5")),t.push(...ye(e.httpProxy,"http")),t}async function Fr(e,t,n){let r=new URL(e.url);if(r.pathname==="/__edge_probe")return Oe(e);if(r.pathname===Lr||r.pathname==="/__version")return Mr();if(r.pathname==="/__diag"){let{recentDiagnostics:i}=await Promise.resolve().then(()=>(Gt(),Or)),{recentXhttpDiagnostics:a}=await Promise.resolve().then(()=>(Vt(),Dr));return new Response(JSON.stringify({ok:!0,impl:"self",build:Yt,recent:i(),xhttp:a()},null,2),{status:200,headers:{"Content-Type":"application/json; charset=utf-8"}})}if(r.pathname==="/region"&&e.method==="GET"){let{coloToCountry:i,rankRegions:a}=await Promise.resolve().then(()=>(Ke(),br)),c=e.cf?.colo??"",f=c?i(c):"";return new Response(JSON.stringify({ok:!0,colo:c,region:f,relayPreference:f?a(f):[],timestamp:new Date().toISOString()},null,2),{status:200,headers:{"Content-Type":"application/json; charset=utf-8"}})}let o=await Yn(t),s=e.headers.get("Upgrade")?.toLowerCase();return r.pathname===o.wsPath?s!=="websocket"?se("\u8BE5\u8DEF\u5F84\u9700\u8981 WebSocket \u5347\u7EA7",400):await Ve(e,"vless",o,Xt(o),n):o.enableTrojan&&r.pathname===o.trojanPath?s!=="websocket"?se("\u8BE5\u8DEF\u5F84\u9700\u8981 WebSocket \u5347\u7EA7",400):await Ve(e,"trojan",o,Xt(o),n):o.enableXhttp&&r.pathname===o.xhttpPath?e.method!=="POST"?se("XHTTP \u9700\u8981 POST \u8BF7\u6C42",405):await Wt(e,o,Xt(o)):null}var ji={async fetch(e,t,n){try{return await Vn(e,t)??await Fr(e,t,n)??dt(200)}catch{return dt(500)}}};export{ji as default};
|
|
21
|
+
`):`\u51FA\u7AD9\u8FDE\u63A5\u5931\u8D25\uFF1A${String(V)}`;be(`${x.hostname}:${x.port}`,I,G),y(1011,G);return}u=l.writable.getWriter();let xe=c.byteLength>x.headerLength?c.slice(x.headerLength):new Uint8Array(0);xe.byteLength>0&&await E(xe),c=new Uint8Array(0),o?.waitUntil(U())},C=async()=>{let w=h;if(!w){y(1011,"\u51FA\u7AD9\u65E0\u6570\u636E\uFF1A\u76EE\u6807\u672A\u89E3\u6790");return}if(S>=kr){y(1011,"\u51FA\u7AD9\u65E0\u6570\u636E\uFF1A\u76F4\u8FDE\u4E0E\u53CD\u4EE3\u5165\u53E3\u5747\u65E0\u54CD\u5E94");return}S++;let x=[];try{x=await ge({userEntries:n.relayPool||void 0,useBuiltin:n.useBuiltinRelay,colo:typeof e.cf?.colo=="string"?e.cf.colo:void 0})}catch{x=[]}let N=x.filter(I=>!P.has(`${I.ip}:${I.port}`));if(N.length===0){y(1011,"\u51FA\u7AD9\u65E0\u6570\u636E\uFF1A\u65E0\u53CD\u4EE3\u5165\u53E3\u53EF\u7528");return}for(let I of N.slice(0,kr)){if(P.add(`${I.ip}:${I.port}`),l)try{l.writable.close()}catch{}u=null,A=0;try{let V=await we({hostname:I.ip,port:I.port,timeoutMs:Rr,resolvePreferred:!1});if(!V)continue;l=V,u=V.writable.getWriter(),c.byteLength>0&&(await u.write(c),c=new Uint8Array(0)),be(`${w.hostname}:${w.port}`,[],`\u5DF2\u5207\u6362\u53CD\u4EE3\u5165\u53E3 ${I.ip}:${I.port}`),o?.waitUntil(U());return}catch(V){be(`${w.hostname}:${w.port}`,[],`\u53CD\u4EE3\u5165\u53E3 ${I.ip}:${I.port} \u5931\u8D25\uFF1A${String(V)}`)}}y(1011,"\u51FA\u7AD9\u65E0\u6570\u636E\uFF1A\u6240\u6709\u53CD\u4EE3\u5165\u53E3\u5747\u5931\u8D25")};a.addEventListener("message",w=>{(async()=>{let x=w.data,N=typeof x=="string"?new TextEncoder().encode(x):new Uint8Array(x);if(N.byteLength!==0){if(!f){if(c=Rt(c,N),c.byteLength>$o){y(1009,"\u63E1\u624B\u5934\u8D85\u8FC7 64KB");return}await J(!1);return}if(!u){if(c=Rt(c,N),c.byteLength>es){y(1009,"\u62E8\u53F7\u671F\u95F4\u6570\u636E\u8FC7\u591A");return}return}await E(N)}})()});let T=()=>{d()};a.addEventListener("close",T),a.addEventListener("error",T);try{return new Response(null,{status:101,webSocket:i})}catch(w){return console.error("[\u81EA\u7814\u6570\u636E\u9762] 101 \u54CD\u5E94\u6784\u9020\u5931\u8D25\uFF1A",w),new Response(null,{status:200})}}var Rr,Nr,kr,$o,es,We,Ur,ns,Gt=k(()=>{"use strict";Tt();sr();he();Kt();Ft();Ke();Rr=5e3,Nr=2500,kr=2,$o=64*1024,es=8*1024*1024;We=[],Ur=20;ns=80});var Dr={};Ae(Dr,{handleXhttp:()=>Wt,recentXhttpDiagnostics:()=>rs,recordXhttpDiagnostics:()=>vr});function vr(e,t,n){Ye.unshift({at:Date.now(),target:e,...t,summary:n}),Ye.length>20&&(Ye.length=20)}function rs(){return Ye}async function Wt(e,t,n){let r=e.body;if(!r)return new Response("\u7F3A\u5C11\u8BF7\u6C42\u4F53",{status:400});let o=new $(r),s=await qn(o,t.uuid);if(!s)return new Response("VLESS \u5934\u89E3\u6790\u5931\u8D25",{status:400});if(s.header.command!==Jn)return new Response("XHTTP \u6682\u4E0D\u652F\u6301 UDP",{status:400});let i=await we({hostname:s.header.hostname,port:s.header.port,proxies:n,nat64:t.nat64,concurrent:t.concurrentDial,resolvePreferred:t.resolvePreferred,relayPool:{userEntries:t.relayPool||void 0,useBuiltin:t.useBuiltinRelay},onFailure:m=>{vr(`${s.header.hostname}:${s.header.port}`,m,`XHTTP \u51FA\u7AD9\u5931\u8D25\uFF08${m.candidate}\uFF09\uFF1A${m.message}`)}}),{readable:a,writable:c}=new TransformStream;Et(s.payload,i.writable,void 0,!1),Et(i.readable,c);let f=s.header.addons;if(f.byteLength>255)return new Response("Addons \u957F\u5EA6\u8D85\u51FA VLESS \u534F\u8BAE\u4E0A\u9650",{status:400});let l=new Uint8Array(2+f.byteLength);l[0]=s.header.version,l[1]=f.byteLength,l.set(f,2);let u=!1,p=null,h=new ReadableStream({start(m){m.enqueue(l),u=!0},async pull(m){if(u){p||(p=a.getReader());try{let{done:b,value:y}=await p.read();if(b){m.close();return}y&&y.byteLength>0&&m.enqueue(y)}catch{try{m.close()}catch{}}}},cancel(m){a.cancel(m)}});return new Response(h,{status:200,headers:{"Content-Type":"text/event-stream","Cache-Control":"no-store","X-Accel-Buffering":"no"}})}var Ye,Vt=k(()=>{"use strict";he();Tt();St();Kt();Ye=[]});ue();pt();re();var bo=15*1024*1024,xo=2*1024*1024;async function Oe(e){let t=new URL(e.url);if(e.headers.get("Upgrade")?.toLowerCase()==="websocket"){let c=new WebSocketPair,[f,l]=Object.values(c);return l.accept(),l.addEventListener("message",u=>{let p=typeof u.data=="string"?u.data:"";if(p==="PING"||p==="ping"){l.send(JSON.stringify({pong:!0,colo:e.cf?.colo??"UNK",clientIp:e.headers.get("CF-Connecting-IP")??""}));try{l.close(1e3,"Probe complete")}catch{}}}),new Response(null,{status:101,webSocket:f})}let r=Number.parseInt(t.searchParams.get("bytes")??"",10),o=Number.isFinite(r)&&r>0?Math.min(r,bo):xo,s=new Uint8Array(64*1024);for(let c=0;c<s.length;c++)s[c]=97;let i=0,a=new ReadableStream({pull(c){if(i>=o){c.close();return}let f=Math.min(s.byteLength,o-i);c.enqueue(s.subarray(0,f)),i+=f}});return new Response(a,{status:200,headers:{"Content-Type":"application/octet-stream","Cache-Control":"no-store","Access-Control-Allow-Origin":"*","X-Probe-Bytes":String(o),"X-Probe-Nonce":Y(4)}})}var Tn="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";var ve=null;function Ao(e){let t=atob(e),n=new Uint8Array(new ArrayBuffer(t.length));for(let r=0;r<t.length;r++)n[r]=t.charCodeAt(r);return n}async function Rn(){if(ve!==null)return ve;let e=Ao(Tn),t=new Response(e).body;if(!t)throw new Error("\u9762\u677F\u6570\u636E\u635F\u574F");let n=t.pipeThrough(new DecompressionStream("gzip"));return ve=await new Response(n).text(),ve}function dt(e){let t=e===200?"Welcome":e===404?"Not Found":"Service Unavailable",n=`<!DOCTYPE html><html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>${t}</title><style>body{margin:0;min-height:100vh;display:flex;align-items:center;justify-content:center;background:#f7f8fa;color:#333;font-family:-apple-system,"Segoe UI","PingFang SC",sans-serif}.c{text-align:center}h1{font-size:22px;font-weight:600;margin:0 0 10px}p{color:#888;font-size:14px;margin:0}</style></head><body><div class="c"><h1>${t}</h1><p>This site is up and running.</p></div></body></html>`;return new Response(n,{status:e,headers:{"Content-Type":"text/html; charset=utf-8","Cache-Control":"no-store","X-Content-Type-Options":"nosniff"}})}function se(e,t){return new Response(JSON.stringify({ok:!1,error:e}),{status:t,headers:{"Content-Type":"application/json; charset=utf-8","Cache-Control":"no-store"}})}Me();Me();var Ct=null;async function No(){return Ct||(Ct=await Promise.resolve().then(()=>(Wn(),Gn))),Ct}async function ko(e,t,n,r){let o=await Le(n,r),s=t.pathname.slice(5).split("/")[0]??"";if(!(s===o.uuid||s===o.trojanPassword||t.searchParams.get("token")===o.uuid))return se("\u8BA2\u9605\u4EE4\u724C\u65E0\u6548",403);let a=t.searchParams.get("target")??t.searchParams.get("format"),c=a?At(a):Kn(e.headers.get("User-Agent"))??At(null),f=await n.get(Q)??"",l=await Ie(o,f),u=await n.get($t)??"",p=me(o.subDomain||r.DATA_HOST||t.hostname),h={nodes:l.nodes,groups:l.groups,config:o,domain:p,port:443,ports:Sn(o),protocol:o.subProtocol,transport:o.subTransport,routeProfile:u},m=Cn(c,h);return new Response(m.body,{status:200,headers:{"Content-Type":m.contentType,"Cache-Control":"no-store","Content-Disposition":`inline; filename="${m.fileName}"`,"Profile-Title":ut(o.subName),"Subscription-Userinfo":""}})}async function Vn(e,t){let n=new URL(e.url),r=bt(t);if(e.method==="OPTIONS")return new Response(null,{status:204,headers:{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":"GET, POST, PUT, DELETE, OPTIONS","Access-Control-Allow-Headers":"Content-Type, Authorization","Access-Control-Max-Age":"86400"}});if(n.pathname==="/__edge_probe")return Oe(e);if(n.pathname.startsWith("/api/")){let{handleApi:s}=await No(),i=await s(e,n,{store:r,env:t,config:await Le(r,t),auth:await xt(r,t),onConfigChanged:jn});if(i)return i}if(n.pathname==="/sub"||n.pathname.startsWith("/sub/"))return await ko(e,n,r,t);let o=await xt(r,t);return n.pathname===o.panelPath||n.pathname===`${o.panelPath}/`?new Response(await Rn(),{status:200,headers:{"Content-Type":"text/html; charset=utf-8","Cache-Control":"no-store","X-Content-Type-Options":"nosniff","Referrer-Policy":"no-referrer"}}):null}async function Yn(e){let t=bt(e);return await Le(t,e)}Gt();Vt();Bt();var Yt="7b0f430-aaf28587",Lr="/__cfp_version";function Mr(){return new Response(JSON.stringify({build:Yt,ts:Date.now()}),{status:200,headers:{"Content-Type":"application/json","Cache-Control":"no-store","Access-Control-Allow-Origin":"*"}})}function Xt(e){let t=[];return t.push(...ye(e.proxyIp,"direct")),t.push(...ye(e.socks5,"socks5")),t.push(...ye(e.httpProxy,"http")),t}async function Fr(e,t,n){let r=new URL(e.url);if(r.pathname==="/__edge_probe")return Oe(e);if(r.pathname===Lr||r.pathname==="/__version")return Mr();if(r.pathname==="/__diag"){let{recentDiagnostics:i}=await Promise.resolve().then(()=>(Gt(),Or)),{recentXhttpDiagnostics:a}=await Promise.resolve().then(()=>(Vt(),Dr));return new Response(JSON.stringify({ok:!0,impl:"self",build:Yt,recent:i(),xhttp:a()},null,2),{status:200,headers:{"Content-Type":"application/json; charset=utf-8"}})}if(r.pathname==="/region"&&e.method==="GET"){let{coloToCountry:i,rankRegions:a}=await Promise.resolve().then(()=>(Ke(),br)),c=e.cf?.colo??"",f=c?i(c):"";return new Response(JSON.stringify({ok:!0,colo:c,region:f,relayPreference:f?a(f):[],timestamp:new Date().toISOString()},null,2),{status:200,headers:{"Content-Type":"application/json; charset=utf-8"}})}let o=await Yn(t),s=e.headers.get("Upgrade")?.toLowerCase();return r.pathname===o.wsPath?s!=="websocket"?se("\u8BE5\u8DEF\u5F84\u9700\u8981 WebSocket \u5347\u7EA7",400):await Ve(e,"vless",o,Xt(o),n):o.enableTrojan&&r.pathname===o.trojanPath?s!=="websocket"?se("\u8BE5\u8DEF\u5F84\u9700\u8981 WebSocket \u5347\u7EA7",400):await Ve(e,"trojan",o,Xt(o),n):o.enableXhttp&&r.pathname===o.xhttpPath?e.method!=="POST"?se("XHTTP \u9700\u8981 POST \u8BF7\u6C42",405):await Wt(e,o,Xt(o)):null}var ji={async fetch(e,t,n){try{return await Vn(e,t)??await Fr(e,t,n)??dt(200)}catch{return dt(500)}}};export{ji as default};
|
package/dist/cli.js
CHANGED
|
@@ -93,7 +93,7 @@ var VERSION, NAME;
|
|
|
93
93
|
var init_version = __esm({
|
|
94
94
|
"src/shared/version.ts"() {
|
|
95
95
|
"use strict";
|
|
96
|
-
VERSION = "0.7.
|
|
96
|
+
VERSION = "0.7.1";
|
|
97
97
|
NAME = "cfpilot";
|
|
98
98
|
}
|
|
99
99
|
});
|
|
@@ -218,17 +218,18 @@ async function ask(question, options = {}) {
|
|
|
218
218
|
if (key?.name === "return" || key?.name === "enter") {
|
|
219
219
|
const value = buf.trim();
|
|
220
220
|
if (!value && !fallback && !allowEmpty) {
|
|
221
|
-
stdout.write(
|
|
221
|
+
stdout.write(
|
|
222
|
+
`\r${c.yellow("!")} \u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u91CD\u65B0\u8F93\u5165${c.gray(": ")}${password ? "*".repeat(buf.length) : buf}`
|
|
223
|
+
);
|
|
222
224
|
return;
|
|
223
225
|
}
|
|
224
226
|
finish(value || fallback);
|
|
225
227
|
return;
|
|
226
228
|
}
|
|
227
229
|
if (key?.name === "backspace") {
|
|
230
|
+
if (buf.length === 0) return;
|
|
228
231
|
buf = buf.slice(0, -1);
|
|
229
|
-
|
|
230
|
-
stdout.write("\b \b");
|
|
231
|
-
}
|
|
232
|
+
stdout.write("\b \b");
|
|
232
233
|
return;
|
|
233
234
|
}
|
|
234
235
|
if (key?.name === "escape") {
|
|
@@ -241,7 +242,7 @@ async function ask(question, options = {}) {
|
|
|
241
242
|
}
|
|
242
243
|
if (str && !key?.ctrl && str >= " ") {
|
|
243
244
|
buf += str;
|
|
244
|
-
|
|
245
|
+
stdout.write(password ? "*" : str);
|
|
245
246
|
}
|
|
246
247
|
};
|
|
247
248
|
stdin.setRawMode(true);
|
|
@@ -4760,19 +4761,81 @@ __export(scan_exports, {
|
|
|
4760
4761
|
function makeArgs2(flags) {
|
|
4761
4762
|
return { command: "", flags, positionals: [] };
|
|
4762
4763
|
}
|
|
4764
|
+
async function fetchInstances(token) {
|
|
4765
|
+
try {
|
|
4766
|
+
const client = new CloudflareClient({ token });
|
|
4767
|
+
const cfg = loadConfig();
|
|
4768
|
+
const accounts = await client.listAccounts();
|
|
4769
|
+
const accountId = cfg.accountId || accounts[0]?.id;
|
|
4770
|
+
if (!accountId) return [];
|
|
4771
|
+
const list = await listCfPilotNamespaces(client, accountId);
|
|
4772
|
+
return list.map((i) => ({
|
|
4773
|
+
id: i.id,
|
|
4774
|
+
controlProject: i.manifest.controlProject,
|
|
4775
|
+
dataProject: i.manifest.dataProject,
|
|
4776
|
+
controlSubdomain: i.manifest.controlSubdomain,
|
|
4777
|
+
dataSubdomain: i.manifest.dataSubdomain,
|
|
4778
|
+
wsPath: i.manifest.credentials?.wsPath ?? ""
|
|
4779
|
+
}));
|
|
4780
|
+
} catch {
|
|
4781
|
+
return [];
|
|
4782
|
+
}
|
|
4783
|
+
}
|
|
4784
|
+
async function pickInstance(token) {
|
|
4785
|
+
const cfg = loadConfig();
|
|
4786
|
+
status("info", "\u6B63\u5728\u8BC6\u522B\u8D26\u53F7\u4E0B\u7684\u5B9E\u4F8B\u2026");
|
|
4787
|
+
const instances = await fetchInstances(token);
|
|
4788
|
+
if (instances.length === 0) {
|
|
4789
|
+
status("warn", "\u6CA1\u6709\u8BC6\u522B\u5230\u5DF2\u90E8\u7F72\u7684 CFPilot \u5B9E\u4F8B");
|
|
4790
|
+
return null;
|
|
4791
|
+
}
|
|
4792
|
+
let chosen;
|
|
4793
|
+
if (instances.length === 1) {
|
|
4794
|
+
chosen = instances[0];
|
|
4795
|
+
status("ok", `\u5B9E\u4F8B\uFF1A${chosen.controlProject} / ${chosen.dataProject}`);
|
|
4796
|
+
} else {
|
|
4797
|
+
const picked = await select(
|
|
4798
|
+
"\u9009\u62E9\u8981\u4F18\u9009\u7684\u5B9E\u4F8B",
|
|
4799
|
+
instances.map((i) => ({
|
|
4800
|
+
label: `${i.controlProject} / ${i.dataProject}`,
|
|
4801
|
+
value: i.id,
|
|
4802
|
+
hint: i.dataSubdomain
|
|
4803
|
+
})),
|
|
4804
|
+
{ initial: Math.max(0, instances.findIndex((i) => i.id === cfg.kvNamespaceId)) }
|
|
4805
|
+
);
|
|
4806
|
+
chosen = instances.find((i) => i.id === picked) ?? instances[0];
|
|
4807
|
+
}
|
|
4808
|
+
saveConfig({
|
|
4809
|
+
kvNamespaceId: chosen.id,
|
|
4810
|
+
panelHost: chosen.controlSubdomain,
|
|
4811
|
+
dataHost: chosen.dataSubdomain,
|
|
4812
|
+
wsPath: chosen.wsPath
|
|
4813
|
+
});
|
|
4814
|
+
return chosen;
|
|
4815
|
+
}
|
|
4763
4816
|
async function menuScan() {
|
|
4817
|
+
const token = resolveToken();
|
|
4818
|
+
if (!token) {
|
|
4819
|
+
status("warn", "\u5C1A\u672A\u914D\u7F6E API Token");
|
|
4820
|
+
status("info", "\u8BF7\u5148\u5230\u300C\u914D\u7F6E\u300D\u83DC\u5355\u6DFB\u52A0");
|
|
4821
|
+
return;
|
|
4822
|
+
}
|
|
4823
|
+
const instance = await pickInstance(token);
|
|
4824
|
+
if (!instance) {
|
|
4825
|
+
const manual = await ask("\u624B\u52A8\u8F93\u5165\u6570\u636E\u9762\u57DF\u540D\uFF08\u7559\u7A7A\u53D6\u6D88\uFF09", { allowEmpty: true });
|
|
4826
|
+
if (!manual) {
|
|
4827
|
+
status("info", "\u5DF2\u53D6\u6D88");
|
|
4828
|
+
return;
|
|
4829
|
+
}
|
|
4830
|
+
saveConfig({ dataHost: manual });
|
|
4831
|
+
}
|
|
4764
4832
|
const cfg = loadConfig();
|
|
4833
|
+
process.stdout.write("\n");
|
|
4765
4834
|
box("\u672C\u5730\u4F18\u9009", [
|
|
4766
|
-
`${c.gray("\u76EE\u6807\u57DF\u540D")} ${cfg.dataHost || c.yellow("\
|
|
4767
|
-
`${c.gray("WS \u8DEF\u5F84")} ${cfg.wsPath || c.gray("\uFF08\
|
|
4835
|
+
`${c.gray("\u76EE\u6807\u57DF\u540D")} ${cfg.dataHost || c.yellow("\u672A\u914D\u7F6E")}`,
|
|
4836
|
+
`${c.gray("WS \u8DEF\u5F84")} ${cfg.wsPath || c.gray("\uFF08\u9ED8\u8BA4\u63A2\u9488\u8DEF\u5F84\uFF09")}`
|
|
4768
4837
|
]);
|
|
4769
4838
|
process.stdout.write("\n");
|
|
4770
|
-
const host = await ask("\u6570\u636E\u9762\u57DF\u540D\uFF08\u5982 cpdata-xxx.pages.dev\uFF09", { fallback: cfg.dataHost });
|
|
4771
|
-
if (!host) {
|
|
4772
|
-
status("warn", "\u5FC5\u987B\u586B\u5199\u6570\u636E\u9762\u57DF\u540D\uFF08\u4EE3\u7406\u6240\u5728\u7684\u90A3\u4E2A\u9879\u76EE\uFF09");
|
|
4773
|
-
return;
|
|
4774
|
-
}
|
|
4775
|
-
if (host !== cfg.dataHost) saveConfig({ dataHost: host });
|
|
4776
4839
|
const wantFilter = await confirm("\u8981\u6309\u673A\u623F\u5730\u533A\u7B5B\u9009\u5417\uFF1F\uFF08\u4E0D\u7B5B\u9009\u8DD1\u5168\u91CF\uFF09", false);
|
|
4777
4840
|
let countries = [];
|
|
4778
4841
|
if (wantFilter) {
|
|
@@ -4789,7 +4852,7 @@ async function menuScan() {
|
|
|
4789
4852
|
status("info", "\u5F00\u59CB\u4F18\u9009\u2026");
|
|
4790
4853
|
process.stdout.write("\n");
|
|
4791
4854
|
const flags = {
|
|
4792
|
-
host,
|
|
4855
|
+
host: cfg.dataHost ?? "",
|
|
4793
4856
|
sample: String(sample),
|
|
4794
4857
|
"no-callback": true
|
|
4795
4858
|
};
|
|
@@ -4799,30 +4862,31 @@ async function menuScan() {
|
|
|
4799
4862
|
await runScanCommand2(makeArgs2(flags));
|
|
4800
4863
|
}
|
|
4801
4864
|
async function menuScanPush() {
|
|
4802
|
-
const
|
|
4803
|
-
|
|
4804
|
-
"\
|
|
4805
|
-
c.gray("\u9700\u8981\u63A7\u5236\u9762\u57DF\u540D + \u9762\u677F\u5BC6\u7801")
|
|
4806
|
-
]);
|
|
4807
|
-
process.stdout.write("\n");
|
|
4808
|
-
const host = await ask("\u63A7\u5236\u9762\u57DF\u540D\uFF08\u5982 cpmanager.pages.dev\uFF09", { fallback: cfg.panelHost });
|
|
4809
|
-
if (!host) {
|
|
4810
|
-
status("warn", "\u5FC5\u987B\u586B\u5199\u63A7\u5236\u9762\u57DF\u540D\uFF08\u9762\u677F\u6240\u5728\u7684\u90A3\u4E2A\u9879\u76EE\uFF09");
|
|
4865
|
+
const token = resolveToken();
|
|
4866
|
+
if (!token) {
|
|
4867
|
+
status("warn", "\u5C1A\u672A\u914D\u7F6E API Token");
|
|
4811
4868
|
return;
|
|
4812
4869
|
}
|
|
4813
|
-
|
|
4814
|
-
|
|
4815
|
-
|
|
4816
|
-
status("warn", "\u5FC5\u987B\u586B\u5199\u6570\u636E\u9762\u57DF\u540D");
|
|
4870
|
+
const instance = await pickInstance(token);
|
|
4871
|
+
if (!instance) {
|
|
4872
|
+
status("warn", "\u9700\u8981\u5148\u6709\u4E00\u4E2A\u5DF2\u90E8\u7F72\u7684\u5B9E\u4F8B");
|
|
4817
4873
|
return;
|
|
4818
4874
|
}
|
|
4819
|
-
|
|
4875
|
+
const cfg = loadConfig();
|
|
4876
|
+
process.stdout.write("\n");
|
|
4877
|
+
box("\u56DE\u586B\u5230\u9762\u677F", [
|
|
4878
|
+
`${c.gray("\u63A7\u5236\u9762")} ${cfg.panelHost}`,
|
|
4879
|
+
`${c.gray("\u6570\u636E\u9762")} ${cfg.dataHost}`,
|
|
4880
|
+
"\u7ED3\u679C\u4F1A\u5199\u5165\u9762\u677F\u7684\u300C\u624B\u52A8\u4F18\u9009 IP\u300D"
|
|
4881
|
+
]);
|
|
4882
|
+
process.stdout.write("\n");
|
|
4820
4883
|
const password = await ask("\u9762\u677F\u5BC6\u7801\uFF08\u7528\u4E8E\u7533\u8BF7\u56DE\u586B\u4EE4\u724C\uFF09", {
|
|
4821
4884
|
password: true,
|
|
4822
4885
|
allowEmpty: true
|
|
4823
4886
|
});
|
|
4824
4887
|
if (!password) {
|
|
4825
4888
|
status("warn", "\u9700\u8981\u9762\u677F\u5BC6\u7801\u624D\u80FD\u7533\u8BF7\u4EE4\u724C");
|
|
4889
|
+
status("info", "\u5BC6\u7801\u5728\u90E8\u7F72\u65F6\u751F\u6210\uFF0C\u53EF\u5230\u300C\u90E8\u7F72\u300D\u9875\u6216\u9762\u677F\u51ED\u636E\u91CC\u67E5");
|
|
4826
4890
|
return;
|
|
4827
4891
|
}
|
|
4828
4892
|
const skipSpeed = await confirm("\u8DF3\u8FC7\u6D4B\u901F\uFF1F\uFF08\u5FEB\u5F88\u591A\uFF0C\u4F46\u7ED3\u679C\u8D28\u91CF\u7565\u964D\uFF09", true);
|
|
@@ -4831,8 +4895,8 @@ async function menuScanPush() {
|
|
|
4831
4895
|
status("info", "\u4EE4\u724C\u4F1A\u5728\u626B\u63CF\u7ED3\u675F\u540E\u624D\u7533\u8BF7\uFF0810 \u5206\u949F\u6709\u6548\uFF09");
|
|
4832
4896
|
process.stdout.write("\n");
|
|
4833
4897
|
const flags = {
|
|
4834
|
-
host: dataHost,
|
|
4835
|
-
panel:
|
|
4898
|
+
host: cfg.dataHost ?? "",
|
|
4899
|
+
panel: cfg.panelHost ?? "",
|
|
4836
4900
|
"panel-password": password,
|
|
4837
4901
|
sample: "6556"
|
|
4838
4902
|
};
|
|
@@ -4847,6 +4911,8 @@ var init_scan2 = __esm({
|
|
|
4847
4911
|
init_prompt();
|
|
4848
4912
|
init_store();
|
|
4849
4913
|
init_countries();
|
|
4914
|
+
init_cf_api();
|
|
4915
|
+
init_pages_deploy();
|
|
4850
4916
|
}
|
|
4851
4917
|
});
|
|
4852
4918
|
|
|
@@ -4854,50 +4920,146 @@ var init_scan2 = __esm({
|
|
|
4854
4920
|
var config_exports = {};
|
|
4855
4921
|
__export(config_exports, {
|
|
4856
4922
|
menuConfig: () => menuConfig,
|
|
4857
|
-
runConfig: () => runConfig
|
|
4923
|
+
runConfig: () => runConfig,
|
|
4924
|
+
syncAccount: () => syncAccount
|
|
4858
4925
|
});
|
|
4926
|
+
async function syncFromCloud(token) {
|
|
4927
|
+
try {
|
|
4928
|
+
const client = new CloudflareClient({ token });
|
|
4929
|
+
const accounts = await client.listAccounts();
|
|
4930
|
+
if (accounts.length === 0) {
|
|
4931
|
+
status("fail", "\u8BE5 Token \u6CA1\u6709\u53EF\u8BBF\u95EE\u7684\u8D26\u53F7");
|
|
4932
|
+
return false;
|
|
4933
|
+
}
|
|
4934
|
+
let account = accounts[0];
|
|
4935
|
+
if (accounts.length > 1) {
|
|
4936
|
+
const picked = await select(
|
|
4937
|
+
"\u68C0\u6D4B\u5230\u591A\u4E2A\u8D26\u53F7\uFF0C\u8BF7\u9009\u62E9",
|
|
4938
|
+
accounts.map((a) => ({ label: a.name, value: a.id, hint: a.id.slice(0, 12) + "\u2026" }))
|
|
4939
|
+
);
|
|
4940
|
+
account = accounts.find((a) => a.id === picked) ?? accounts[0];
|
|
4941
|
+
}
|
|
4942
|
+
saveConfig({ accountId: account.id, accountName: account.name });
|
|
4943
|
+
status("ok", `\u8D26\u53F7\uFF1A${account.name}`);
|
|
4944
|
+
const namespaces = await client.listKvNamespaces(account.id);
|
|
4945
|
+
if (namespaces.length === 0) {
|
|
4946
|
+
status("info", "\u8BE5\u8D26\u53F7\u4E0B\u8FD8\u6CA1\u6709 KV\uFF08\u9996\u6B21\u90E8\u7F72\u65F6\u4F1A\u81EA\u52A8\u521B\u5EFA\uFF09");
|
|
4947
|
+
return true;
|
|
4948
|
+
}
|
|
4949
|
+
const instances = await listCfPilotNamespaces(client, account.id);
|
|
4950
|
+
if (instances.length > 0) {
|
|
4951
|
+
let chosen = instances[0];
|
|
4952
|
+
if (instances.length > 1) {
|
|
4953
|
+
const picked = await select(
|
|
4954
|
+
"\u68C0\u6D4B\u5230\u591A\u4E2A CFPilot \u5B9E\u4F8B\uFF0C\u8BF7\u9009\u62E9\u672C\u6B21\u4F7F\u7528\u54EA\u4E2A",
|
|
4955
|
+
instances.map((i) => ({
|
|
4956
|
+
label: `${i.manifest.controlProject} / ${i.manifest.dataProject}`,
|
|
4957
|
+
value: i.id,
|
|
4958
|
+
hint: i.manifest.controlSubdomain
|
|
4959
|
+
}))
|
|
4960
|
+
);
|
|
4961
|
+
chosen = instances.find((i) => i.id === picked) ?? instances[0];
|
|
4962
|
+
}
|
|
4963
|
+
saveConfig({
|
|
4964
|
+
kvNamespaceId: chosen.id,
|
|
4965
|
+
panelHost: chosen.manifest.controlSubdomain,
|
|
4966
|
+
dataHost: chosen.manifest.dataSubdomain
|
|
4967
|
+
});
|
|
4968
|
+
status("ok", `\u5B9E\u4F8B\uFF1A${chosen.manifest.controlProject} / ${chosen.manifest.dataProject}`);
|
|
4969
|
+
status("info", `\u63A7\u5236\u9762\uFF1A${chosen.manifest.controlSubdomain}`);
|
|
4970
|
+
status("info", `\u6570\u636E\u9762\uFF1A${chosen.manifest.dataSubdomain}`);
|
|
4971
|
+
return true;
|
|
4972
|
+
}
|
|
4973
|
+
if (namespaces.length === 1) {
|
|
4974
|
+
saveConfig({ kvNamespaceId: namespaces[0].id });
|
|
4975
|
+
status("info", `KV\uFF1A${namespaces[0].title}\uFF08\u5C1A\u65E0\u90E8\u7F72\uFF09`);
|
|
4976
|
+
} else {
|
|
4977
|
+
const picked = await select(
|
|
4978
|
+
"\u8BE5\u8D26\u53F7\u6709\u591A\u4E2A KV\uFF0C\u8BF7\u9009\u62E9\uFF08\u6216\u7A0D\u540E\u9996\u6B21\u90E8\u7F72\u65F6\u81EA\u52A8\u521B\u5EFA\uFF09",
|
|
4979
|
+
[
|
|
4980
|
+
...namespaces.map((ns) => ({
|
|
4981
|
+
label: ns.title,
|
|
4982
|
+
value: ns.id,
|
|
4983
|
+
hint: ns.id.slice(0, 12) + "\u2026"
|
|
4984
|
+
})),
|
|
4985
|
+
{ label: "\u4E0D\u6307\u5B9A\uFF08\u90E8\u7F72\u65F6\u81EA\u52A8\u521B\u5EFA\uFF09", value: "" }
|
|
4986
|
+
]
|
|
4987
|
+
);
|
|
4988
|
+
if (picked) {
|
|
4989
|
+
saveConfig({ kvNamespaceId: picked });
|
|
4990
|
+
status("ok", "KV \u5DF2\u4FDD\u5B58");
|
|
4991
|
+
}
|
|
4992
|
+
}
|
|
4993
|
+
return true;
|
|
4994
|
+
} catch (err) {
|
|
4995
|
+
status("fail", `\u540C\u6B65\u5931\u8D25\uFF1A${err instanceof Error ? err.message : String(err)}`);
|
|
4996
|
+
return false;
|
|
4997
|
+
}
|
|
4998
|
+
}
|
|
4999
|
+
function summaryLines() {
|
|
5000
|
+
const cfg = loadConfig();
|
|
5001
|
+
return [
|
|
5002
|
+
`${c.gray("Token")} ${cfg.token ? c.green("\u5DF2\u4FDD\u5B58") : c.yellow("\u672A\u914D\u7F6E")}`,
|
|
5003
|
+
`${c.gray("\u8D26\u53F7")} ${cfg.accountName || cfg.accountId || c.yellow("\u672A\u914D\u7F6E")}`,
|
|
5004
|
+
`${c.gray("KV")} ${cfg.kvNamespaceId ? cfg.kvNamespaceId.slice(0, 16) + "\u2026" : c.yellow("\u672A\u914D\u7F6E")}`,
|
|
5005
|
+
`${c.gray("\u63A7\u5236\u9762")} ${cfg.panelHost || c.yellow("\u672A\u914D\u7F6E")}`,
|
|
5006
|
+
`${c.gray("\u6570\u636E\u9762")} ${cfg.dataHost || c.yellow("\u672A\u914D\u7F6E")}`
|
|
5007
|
+
];
|
|
5008
|
+
}
|
|
5009
|
+
function maskSecret(s) {
|
|
5010
|
+
if (s.length <= 12) return "***";
|
|
5011
|
+
return s.slice(0, 6) + "\u2026" + s.slice(-4);
|
|
5012
|
+
}
|
|
4859
5013
|
async function menuConfig() {
|
|
5014
|
+
const initial = loadConfig();
|
|
5015
|
+
if (initial.token && !initial.accountName) {
|
|
5016
|
+
status("info", "\u68C0\u6D4B\u5230\u5DF2\u4FDD\u5B58 Token\uFF0C\u6B63\u5728\u8BC6\u522B\u8D26\u53F7\u4E0E\u5B9E\u4F8B\u2026");
|
|
5017
|
+
process.stdout.write("\n");
|
|
5018
|
+
await syncFromCloud(initial.token);
|
|
5019
|
+
process.stdout.write("\n");
|
|
5020
|
+
}
|
|
4860
5021
|
for (; ; ) {
|
|
5022
|
+
box("\u914D\u7F6E", [`${c.gray("\u6587\u4EF6")} ${configPath()}`, ...summaryLines()]);
|
|
5023
|
+
process.stdout.write("\n");
|
|
4861
5024
|
const cfg = loadConfig();
|
|
4862
|
-
box("\u914D\u7F6E", [
|
|
4863
|
-
`${c.gray("\u914D\u7F6E\u6587\u4EF6")} ${configPath()}`,
|
|
4864
|
-
`${c.gray("Token")} ${cfg.token ? c.green("\u5DF2\u4FDD\u5B58") : c.yellow("\u672A\u914D\u7F6E")}`,
|
|
4865
|
-
`${c.gray("\u8D26\u53F7")} ${cfg.accountName || cfg.accountId || c.yellow("\u672A\u914D\u7F6E")}`,
|
|
4866
|
-
`${c.gray("KV")} ${cfg.kvNamespaceId || c.yellow("\u672A\u914D\u7F6E")}`,
|
|
4867
|
-
`${c.gray("\u63A7\u5236\u9762")} ${cfg.panelHost || c.yellow("\u672A\u914D\u7F6E")}`
|
|
4868
|
-
]);
|
|
4869
5025
|
const action = await select("\u914D\u7F6E\u64CD\u4F5C", [
|
|
4870
|
-
{
|
|
4871
|
-
|
|
5026
|
+
{
|
|
5027
|
+
label: "\u6DFB\u52A0 API Token\uFF08\u8D26\u6237\uFF09",
|
|
5028
|
+
value: "token",
|
|
5029
|
+
hint: cfg.token ? "\u5DF2\u4FDD\u5B58\uFF0C\u53EF\u91CD\u65B0\u6DFB\u52A0\u8986\u76D6" : ""
|
|
5030
|
+
},
|
|
5031
|
+
{ label: "\u5220\u9664 API Token\uFF08\u8D26\u6237\uFF09", value: "delete", disabled: !cfg.token },
|
|
4872
5032
|
{ label: "\u8BBE\u7F6E KV \u547D\u540D\u7A7A\u95F4", value: "kv" },
|
|
4873
5033
|
{ label: "\u8BBE\u7F6E\u63A7\u5236\u9762\u57DF\u540D", value: "panel" },
|
|
4874
5034
|
{ label: "\u67E5\u770B\u5B8C\u6574\u914D\u7F6E", value: "show" },
|
|
4875
|
-
{ label: "\u6E05\u7A7A\u914D\u7F6E", value: "clear" },
|
|
4876
5035
|
{ label: "\u8FD4\u56DE", value: "back" }
|
|
4877
5036
|
]);
|
|
4878
5037
|
if (action === null || action === "back") return;
|
|
4879
5038
|
process.stdout.write("\n");
|
|
4880
5039
|
switch (action) {
|
|
4881
5040
|
case "token": {
|
|
4882
|
-
const token = await ask("Cloudflare API Token", { password: true });
|
|
5041
|
+
const token = await ask("\u7C98\u8D34 Cloudflare API Token", { password: true });
|
|
4883
5042
|
if (!token) {
|
|
4884
5043
|
status("warn", "\u672A\u8F93\u5165\uFF0C\u5DF2\u53D6\u6D88");
|
|
4885
5044
|
break;
|
|
4886
5045
|
}
|
|
4887
5046
|
saveConfig({ token });
|
|
4888
|
-
status("ok", "Token \u5DF2\u4FDD\u5B58
|
|
4889
|
-
status("info",
|
|
4890
|
-
|
|
4891
|
-
|
|
4892
|
-
}
|
|
5047
|
+
status("ok", "Token \u5DF2\u4FDD\u5B58");
|
|
5048
|
+
status("info", "\u6B63\u5728\u8BC6\u522B\u8D26\u53F7\u4E0E\u5B9E\u4F8B\u2026");
|
|
5049
|
+
process.stdout.write("\n");
|
|
5050
|
+
await syncFromCloud(token);
|
|
4893
5051
|
break;
|
|
4894
5052
|
}
|
|
4895
|
-
case "
|
|
4896
|
-
|
|
4897
|
-
|
|
4898
|
-
|
|
5053
|
+
case "delete": {
|
|
5054
|
+
process.stdout.write(`\u5F53\u524D\u8D26\u53F7\uFF1A${c.cyan(cfg.accountName || cfg.accountId || "\u672A\u77E5")}
|
|
5055
|
+
`);
|
|
5056
|
+
if (await confirm("\u786E\u8BA4\u5220\u9664\u672C\u5730\u4FDD\u5B58\u7684 Token \u4E0E\u8D26\u53F7\u4FE1\u606F\uFF1F", false)) {
|
|
5057
|
+
clearConfig();
|
|
5058
|
+
status("ok", "\u5DF2\u5220\u9664\u672C\u5730 Token \u4E0E\u8D26\u53F7\u914D\u7F6E");
|
|
5059
|
+
status("info", "\u4E91\u7AEF\u90E8\u7F72\u4E0D\u53D7\u5F71\u54CD\uFF0C\u53EF\u968F\u65F6\u91CD\u65B0\u6DFB\u52A0 Token \u6062\u590D");
|
|
5060
|
+
} else {
|
|
5061
|
+
status("info", "\u5DF2\u53D6\u6D88");
|
|
4899
5062
|
}
|
|
4900
|
-
await detectAccount(cfg.token);
|
|
4901
5063
|
break;
|
|
4902
5064
|
}
|
|
4903
5065
|
case "kv": {
|
|
@@ -4925,42 +5087,11 @@ async function menuConfig() {
|
|
|
4925
5087
|
rule();
|
|
4926
5088
|
break;
|
|
4927
5089
|
}
|
|
4928
|
-
case "clear": {
|
|
4929
|
-
if (await confirm("\u786E\u5B9A\u6E05\u7A7A\u6240\u6709\u672C\u5730\u914D\u7F6E\uFF1F", false)) {
|
|
4930
|
-
clearConfig();
|
|
4931
|
-
status("ok", "\u914D\u7F6E\u5DF2\u6E05\u7A7A");
|
|
4932
|
-
}
|
|
4933
|
-
break;
|
|
4934
|
-
}
|
|
4935
5090
|
}
|
|
4936
5091
|
process.stdout.write("\n");
|
|
4937
5092
|
await pause();
|
|
4938
5093
|
}
|
|
4939
5094
|
}
|
|
4940
|
-
async function detectAccount(token) {
|
|
4941
|
-
status("info", "\u6B63\u5728\u68C0\u6D4B\u8D26\u53F7\u2026");
|
|
4942
|
-
try {
|
|
4943
|
-
const client = new CloudflareClient({ token });
|
|
4944
|
-
const accounts = await client.listAccounts();
|
|
4945
|
-
if (accounts.length === 0) {
|
|
4946
|
-
status("fail", "\u8BE5 Token \u6CA1\u6709\u53EF\u8BBF\u95EE\u7684\u8D26\u53F7");
|
|
4947
|
-
return;
|
|
4948
|
-
}
|
|
4949
|
-
let picked = accounts[0];
|
|
4950
|
-
if (accounts.length > 1) {
|
|
4951
|
-
const value = await select(
|
|
4952
|
-
"\u9009\u62E9\u8D26\u53F7",
|
|
4953
|
-
accounts.map((a) => ({ label: a.name, value: a.id, hint: a.id.slice(0, 12) + "\u2026" }))
|
|
4954
|
-
);
|
|
4955
|
-
picked = accounts.find((a) => a.id === value) ?? accounts[0];
|
|
4956
|
-
}
|
|
4957
|
-
saveConfig({ accountId: picked.id, accountName: picked.name });
|
|
4958
|
-
status("ok", `\u8D26\u53F7\uFF1A${picked.name}`);
|
|
4959
|
-
status("info", `ID\uFF1A${picked.id}`);
|
|
4960
|
-
} catch (err) {
|
|
4961
|
-
status("fail", `\u68C0\u6D4B\u5931\u8D25\uFF1A${err instanceof Error ? err.message : String(err)}`);
|
|
4962
|
-
}
|
|
4963
|
-
}
|
|
4964
5095
|
async function runConfig(args) {
|
|
4965
5096
|
const cfg = loadConfig();
|
|
4966
5097
|
const flags = args.flags;
|
|
@@ -4983,9 +5114,10 @@ async function runConfig(args) {
|
|
|
4983
5114
|
saveConfig(patch);
|
|
4984
5115
|
process.stdout.write("\u5DF2\u4FDD\u5B58\uFF1A" + Object.keys(patch).join(", ") + "\n");
|
|
4985
5116
|
}
|
|
4986
|
-
function
|
|
4987
|
-
|
|
4988
|
-
|
|
5117
|
+
async function syncAccount(token) {
|
|
5118
|
+
const t = token || resolveToken();
|
|
5119
|
+
if (!t) return false;
|
|
5120
|
+
return await syncFromCloud(t);
|
|
4989
5121
|
}
|
|
4990
5122
|
var init_config = __esm({
|
|
4991
5123
|
"src/menu/config.ts"() {
|
|
@@ -4994,6 +5126,7 @@ var init_config = __esm({
|
|
|
4994
5126
|
init_prompt();
|
|
4995
5127
|
init_store();
|
|
4996
5128
|
init_cf_api();
|
|
5129
|
+
init_pages_deploy();
|
|
4997
5130
|
}
|
|
4998
5131
|
});
|
|
4999
5132
|
|