Spaces:
Paused
Paused
| import { connect } from 'cloudflare:sockets'; | |
| const passwd = "iamissupperman" | |
| export default{ | |
| async fetch(request, env){ | |
| let params = new URL(request.url).searchParams; | |
| const token=params.get("token"); | |
| const upgradeHeader=request.headers.get("Upgrade"); | |
| if(passwd!=token) return new Response(null, {status:401}); | |
| if(upgradeHeader!=="websocket"){ | |
| 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 [hostname, port] = params.get("proxy").split(":"); | |
| const socket=connect({hostname, port:parseInt(port)}); | |
| const [client, server]=Object.values(new WebSocketPair()); | |
| try{ | |
| server.accept(); | |
| 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(e) { | |
| server.close(); | |
| return new Response(e, {status:400}); | |
| } | |
| return new Response(null, {status:101, webSocket:client}); | |
| } | |
| } |