-
Notifications
You must be signed in to change notification settings - Fork 109
/
Copy pathworker.js
28 lines (28 loc) · 1.11 KB
/
worker.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import { connect } from 'cloudflare:sockets';
const passwd='passwd value';
export default{async fetch(request){
const upgradeHeader=request.headers.get("Upgrade");
if(upgradeHeader!=="websocket") return new Response(null, {status:404});
const [client, server]=Object.values(new WebSocketPair());
server.accept();
server.addEventListener('message',({data})=>{
try{
const {hostname,port,psw}=JSON.parse(data);
if(passwd!=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});
}}