()
| 200 | } |
| 201 | |
| 202 | start(): Promise<number> { |
| 203 | return new Promise((resolve) => { |
| 204 | if (process.env.NODE_ENV !== 'development') { |
| 205 | resolve(this.#port) |
| 206 | return |
| 207 | } |
| 208 | if (this.#server || this.#wssServer) { |
| 209 | // console.warn('Server is already running') |
| 210 | resolve(this.#port) |
| 211 | return |
| 212 | } |
| 213 | |
| 214 | this.#eventTarget.addEventListener( |
| 215 | 'tanstack-dispatch-event', |
| 216 | this.#dispatcher, |
| 217 | ) |
| 218 | this.#eventTarget.addEventListener( |
| 219 | 'tanstack-connect', |
| 220 | this.#connectFunction, |
| 221 | ) |
| 222 | |
| 223 | // When an external server is provided (e.g. Vite's HTTPS server), |
| 224 | // piggyback on it instead of creating a standalone server. |
| 225 | if (this.#externalServer) { |
| 226 | this.debugLog('Piggybacking on external HTTP server') |
| 227 | const wss = this.createWebSocketServer() |
| 228 | this.handleNewConnection(wss) |
| 229 | |
| 230 | // Add request handler for SSE and POST endpoints |
| 231 | this.#externalRequestHandler = ( |
| 232 | req: http.IncomingMessage, |
| 233 | res: http.ServerResponse, |
| 234 | ) => { |
| 235 | if (req.url === '/__devtools/sse') { |
| 236 | res.writeHead(200, { |
| 237 | 'Content-Type': 'text/event-stream', |
| 238 | 'Cache-Control': 'no-cache', |
| 239 | Connection: 'keep-alive', |
| 240 | 'Access-Control-Allow-Origin': '*', |
| 241 | }) |
| 242 | res.write('\n') |
| 243 | this.debugLog('New SSE client connected (external server)') |
| 244 | this.#sseClients.add(res) |
| 245 | req.on('close', () => this.#sseClients.delete(res)) |
| 246 | return |
| 247 | } |
| 248 | |
| 249 | if (req.url === '/__devtools/send' && req.method === 'POST') { |
| 250 | let body = '' |
| 251 | req.on('data', (chunk) => (body += chunk)) |
| 252 | req.on('end', () => { |
| 253 | try { |
| 254 | const msg = parseWithBigInt(body) |
| 255 | this.debugLog( |
| 256 | 'Received event from client (external server)', |
| 257 | msg, |
| 258 | ) |
| 259 | this.emitToServer(msg) |
no test coverage detected