swimtw
05/23/2023, 5:02 AMjs
addEventListener("fetch", async (event) => {
let requestURL = new URL(event.request.url);
let path = requestURL.pathname;
let location = redirectMap.get(path);
if (event.request.headers.get("upgrade") === "websocket") {
const url = new URL(event.request.url);
url.hostname = "domainA.com";
const wsURL = `wss://${url.host}${url.pathname}${url.search}`;
console.log(wsURL);
const ws = new WebSocket(wsURL);
const webSocketPair = new WebSocketPair();
const [client, server] = Object.values(webSocketPair);
server.accept();
// Proxied data receiver
ws.addEventListener('message', event => {
console.log(`Original data received: ${event.data}`);
server.send(event.data);
})
server.addEventListener('message', event => {
console.log(`Received client data: ${event.data}`);
ws.send(event.data);
})
ws.addEventListener('close', event => {
ws.close();
})
server.addEventListener('close', event => {
server.close();
client.close();
})
return new Response(null, {
status: 101,
webSocket: client,
});
}
else {
if (location == void 0) {
location = `https://domainA.com${path}`;
}
event.respondWith(fetch(location));
}
});
swimtw
05/23/2023, 7:48 AMfailed to connect to the backend. Socket.io connect_error: websocket error
.
What is the problem and how can I solve this issue?Isaac McFadyen | YYZ01
05/23/2023, 11:43 AMswimtw
05/23/2023, 12:05 PMMrBBot
05/24/2023, 8:34 AMaddEventListener()
must be synchronous (i.e. not marked async
or return a Promise
). Instead, I'd recommend you lift that function out into its own async function handleEvent(event) {}
function which returns a Promise<Response>
. event.respondWith()
accepts either a Response
or a Promise<Response>
, so you can call your handleEvent
function and pass the result directly to respondWith()
. Something like...
ts
async function handleEvent(event) {
let requestURL = new URL(event.request.url);
let path = requestURL.pathname;
let location = redirectMap.get(path);
if (event.request.headers.get("upgrade") === "websocket") {
// ...
return new Response(null, {
status: 101,
webSocket: client,
});
} else {
// ...
return fetch(location);
}
}
addEventListener("fetch", (event) => {
event.respondWith(handleEvent(event));
});
swimtw
05/24/2023, 10:13 AM