Skip to content

Instantly share code, notes, and snippets.

@Gowee
Created May 17, 2023 02:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Gowee/8c7b38d1a3fa20993cf66b7891d32b59 to your computer and use it in GitHub Desktop.
Save Gowee/8c7b38d1a3fa20993cf66b7891d32b59 to your computer and use it in GitHub Desktop.
(draft, incomplete) WebSocket based-proxy service on Workers
const WOW_TOKEN = "W0w!"
async function handleRequest(request) {
const upgradeHeader = request.headers.get('Upgrade');
const token = request.headers.get('X-WOW-TOKEN');
const addr = request.headers.get('X-WOW-ADDR');
if (token !== WOW_TOKEN) {
return new Response('Forbidden', { status: 403 });
}
if (!upgradeHeader || upgradeHeader !== 'websocket') {
return new Response('Expected Upgrade: websocket', { status: 426 });
}
let remote;
try {
remote = connect(addr);
const writer = remote.writable.getWriter()
await writer.write(encoded);
} catch (error) {
return new Response("Socket connection failed: " + error, { status: 500 });
}
const webSocketPair = new WebSocketPair();
const [client, server] = Object.values(webSocketPair);
async function onWebSocketEvent(event) {
switch (event.type) {
case 'message':
console.log(event.data);
// server.send(event.data);
const writer = remote.writable.getWriter()
await writer.write(event.data);
break;
default:
console.error(event);
}
}
server.accept();
['message', 'error', 'close'].forEach((event) => server.addEventListener(event, onWebSocketEvent))
async function processRemoteSocket() {
const reader = remote.getReader()
const data = await reader.read()
await server.send(data)
}
processRemoteSocket()
return new Response(null, {
status: 101,
webSocket: client,
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment