(request: Request<unknown, CfProperties<unknown>>)
| 143 | ) {} |
| 144 | |
| 145 | async fetch(request: Request<unknown, CfProperties<unknown>>): Promise<Response> { |
| 146 | const url = new URL(request.url); |
| 147 | |
| 148 | switch (url.pathname) { |
| 149 | case '/connect': { |
| 150 | console.log(`Handling connect request`); |
| 151 | |
| 152 | // This is a request from the client to connect to the tunnel |
| 153 | if (request.headers.get('Upgrade') !== 'websocket') { |
| 154 | return new Response('expected websocket', { status: 400 }); |
| 155 | } |
| 156 | |
| 157 | const pair = new WebSocketPair(); |
| 158 | const [clientSocket, serverSocket] = Object.values(pair); |
| 159 | |
| 160 | await this.handleSocket(serverSocket); |
| 161 | |
| 162 | console.log(`Successfully connected to tunnel`); |
| 163 | |
| 164 | return new Response(null, { status: 101, webSocket: clientSocket }); |
| 165 | } |
| 166 | case '/api/trigger': { |
| 167 | return this.handleTunnelRequest(request); |
| 168 | } |
| 169 | default: { |
| 170 | return new Response('Not Found', { status: 404 }); |
| 171 | } |
| 172 | } |
| 173 | } |
| 174 | |
| 175 | private async handleSocket(socket: WebSocket) { |
| 176 | if (this.socket) { |
no test coverage detected