Spaces:
Paused
Paused
| import { connect } from 'cloudflare:sockets'; | |
| var TOKEN_URL = "X_TOKEN_URL"; | |
| var WPAD_URL = "X_WPAD_URL"; | |
| var CLI_URL = "X_CLI_URL" | |
| var tokenmap = {}; | |
| var tokenSyncTime = 0; | |
| var syncTokens = async ()=>{ | |
| //let res = await fetch(TOKEN_URL, {}).then(res=>{ | |
| // return res.json() | |
| //}) | |
| let res = { | |
| "iamissupperman":9820768171317 | |
| } | |
| tokenSyncTime = new Date().getTime(); | |
| Object.assign(tokenmap, res); | |
| //console.log(tokenmap); | |
| } | |
| export default{ | |
| async fetch(request, env){ | |
| if (Object.keys(tokenmap).length == 0){ | |
| await syncTokens(); | |
| } else if(new Date().getTime() - 10*1000 > tokenSyncTime) { | |
| syncTokens(); | |
| } | |
| const upgradeHeader=request.headers.get("Upgrade"); | |
| if(upgradeHeader!=="websocket"){ | |
| var url = request.url.split("?token=")[0]; | |
| var token = request.url.split("?token=")[1]; | |
| if (!token || !tokenmap[token] || tokenmap[token] < new Date().getTime()) { | |
| return new Response("Forbidden", {status: 403}); | |
| } | |
| try { | |
| console.log(url); | |
| if(url.length > 9 && url.substring(url.length-9) === "/wpad.dat") { | |
| return await fetch(WPAD_URL, {}) | |
| } else if(url.length > 7 && url.substring(url.length-7) === "/cli.js") { | |
| return await fetch(CLI_URL, {}) | |
| } | |
| } catch(e) { | |
| return new Response("Server error", {status: 500}); | |
| } | |
| return new Response("<html lang='zh_CN'><head><meta charset='utf-8'></meta></head><body><h1>可以<a href='./cli.js'>连接</a>了</h1><body></html>", | |
| { | |
| status:200, | |
| headers:{ | |
| "Content-Type":"text/html" | |
| } | |
| }); | |
| } | |
| const [client, server]=Object.values(new WebSocketPair()); | |
| server.accept(); | |
| server.addEventListener('message',({data})=>{ | |
| try{ | |
| const {hostname,port,psw}=JSON.parse(data); | |
| if(!tokenmap[psw]) throw 'Illegal-User'; | |
| const socket=connect({hostname,port}); | |
| new ReadableStream({ | |
| start(controller){ | |
| server.onmessage= ({data})=>controller.enqueue(data); | |
| server.onerror=e=>controller.error(e); | |
| server.onclose=e=>controller.close(e); | |
| }, | |
| cancel(reason){server.close();} | |
| }).pipeTo(socket.writable); | |
| socket.readable.pipeTo(new WritableStream({ | |
| start(controller){server.onerror=e=>controller.error(e);}, | |
| write(chunk){server.send(chunk);} | |
| })); | |
| }catch(error){ server.close(); } | |
| },{once:true}); | |
| return new Response(null, {status:101, webSocket:client}); | |
| } | |
| } |