Skip to content

Instantly share code, notes, and snippets.

@Gowee
Created May 17, 2023 02:09
Show Gist options
  • Select an option

  • Save Gowee/8c7b38d1a3fa20993cf66b7891d32b59 to your computer and use it in GitHub Desktop.

Select an option

Save Gowee/8c7b38d1a3fa20993cf66b7891d32b59 to your computer and use it in GitHub Desktop.

Revisions

  1. Gowee created this gist May 17, 2023.
    55 changes: 55 additions & 0 deletions wow.worker.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,55 @@
    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,
    });
    }