socks-server / index.ts
x-undefined-2's picture
Update index.ts
cacb4da verified
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});
}
}