| 324 | }; |
| 325 | |
| 326 | const dispose = (): void => { |
| 327 | disposed = true; |
| 328 | connected = false; |
| 329 | |
| 330 | if (reconnectTimer) { |
| 331 | clearTimeout(reconnectTimer); |
| 332 | reconnectTimer = null; |
| 333 | } |
| 334 | |
| 335 | listeners.clear(); |
| 336 | |
| 337 | if (socket) { |
| 338 | if ( |
| 339 | socket.readyState === WebSocket.CLOSED || |
| 340 | socket.readyState === WebSocket.CLOSING |
| 341 | ) { |
| 342 | return; |
| 343 | } |
| 344 | try { |
| 345 | socket.close(1000, "Client disposed"); |
| 346 | } catch (_) { |
| 347 | // Ignore close errors |
| 348 | } |
| 349 | } |
| 350 | }; |
| 351 | |
| 352 | return { transport: transportInterface, dispose, ready }; |
| 353 | } |