| 299 | let done = false; |
| 300 | const startedAt = (typeof performance !== 'undefined' && performance.now) ? performance.now() : Date.now(); |
| 301 | const finish = (ok) => { |
| 302 | if (done) return; |
| 303 | done = true; |
| 304 | const endedAt = (typeof performance !== 'undefined' && performance.now) ? performance.now() : Date.now(); |
| 305 | resolve({ |
| 306 | ok, |
| 307 | latencyMs: ok ? Math.max(1, Math.round(endedAt - startedAt)) : null, |
| 308 | }); |
| 309 | }; |
| 310 | try { |
| 311 | const ws = new WebSocket(server.wsUrl); |
| 312 | const timer = setTimeout(() => { try { ws.close(); } catch {} finish(false); }, HUB_PROBE_TIMEOUT_MS); |