| 173 | } |
| 174 | |
| 175 | private async handleSocket(socket: WebSocket) { |
| 176 | if (this.socket) { |
| 177 | this.socket.close(1000, 'replaced'); |
| 178 | } |
| 179 | |
| 180 | this.socket = socket; |
| 181 | |
| 182 | this.socket.addEventListener('message', (event) => { |
| 183 | // Here we need to listen for "response" messages from the client and send them to the server via stored promises on this object |
| 184 | const data = JSON.parse(typeof event.data === 'string' ? event.data : new TextDecoder('utf-8').decode(event.data)); |
| 185 | |
| 186 | const message = ClientMessages.safeParse(data); |
| 187 | |
| 188 | if (!message.success) { |
| 189 | console.error(message.error); |
| 190 | return; |
| 191 | } |
| 192 | |
| 193 | switch (message.data.type) { |
| 194 | case 'response': { |
| 195 | const { id, ...response } = message.data; |
| 196 | |
| 197 | const resolver = this.responseResolvers[id]; |
| 198 | |
| 199 | if (!resolver) { |
| 200 | console.error(`No resolver found for ${id}`); |
| 201 | return; |
| 202 | } |
| 203 | |
| 204 | delete this.responseResolvers[id]; |
| 205 | |
| 206 | resolver.resolve( |
| 207 | new Response(response.body, { |
| 208 | status: response.status, |
| 209 | headers: response.headers, |
| 210 | }), |
| 211 | ); |
| 212 | |
| 213 | break; |
| 214 | } |
| 215 | } |
| 216 | }); |
| 217 | |
| 218 | this.socket.accept(); |
| 219 | } |
| 220 | |
| 221 | private async handleTunnelRequest(request: Request): Promise<Response> { |
| 222 | if (!this.socket) { |