|
1 | 1 | import { afterEach, beforeEach, describe, expect, test } from 'bun:test' |
2 | | -import { BaseClient, CONNECT_STAGE_TIMEOUT_MS, resolveConnectStageTimeoutMs } from '../src/neko/base' |
| 2 | +import { |
| 3 | + BaseClient, |
| 4 | + CONNECT_STAGE_TIMEOUT_MS, |
| 5 | + SESSION_GONE_CLOSE_CODE, |
| 6 | + resolveConnectStageTimeoutMs, |
| 7 | +} from '../src/neko/base' |
3 | 8 |
|
4 | 9 | const posted: Record<string, any>[] = [] |
5 | 10 | const timers: { id: number; delay: number; run: () => void }[] = [] |
@@ -454,3 +459,38 @@ describe('live view connect failures', () => { |
454 | 459 | }) |
455 | 460 | }) |
456 | 461 | }) |
| 462 | + |
| 463 | +// A connected viewer that drops is not reconnected: the overlay asks for a reload. |
| 464 | +// Only the proxy's session-gone close means the browser itself is gone. |
| 465 | +describe('live view drops after connecting', () => { |
| 466 | + async function connectedClient() { |
| 467 | + const client = new TestClient() |
| 468 | + client.connect('ws://host/ws', 'pw', 'kernel') |
| 469 | + client.openSocket() |
| 470 | + await client.provide() |
| 471 | + client.connectPeer() |
| 472 | + return client |
| 473 | + } |
| 474 | + |
| 475 | + test('a session-gone close marks the session gone and opens no new socket', async () => { |
| 476 | + const client = await connectedClient() |
| 477 | + |
| 478 | + client['_ws']!.onclose({ code: SESSION_GONE_CLOSE_CODE, reason: '' } as CloseEvent) |
| 479 | + |
| 480 | + expect(client.sessionGone).toBe(true) |
| 481 | + expect(client['_ws']).toBeUndefined() |
| 482 | + expect(timers).toEqual([]) |
| 483 | + expect(posted).toEqual([]) |
| 484 | + }) |
| 485 | + |
| 486 | + test('any other close leaves the session not known to be gone', async () => { |
| 487 | + const client = await connectedClient() |
| 488 | + |
| 489 | + client['_ws']!.onclose({ code: 1006, reason: '' } as CloseEvent) |
| 490 | + |
| 491 | + expect(client.sessionGone).toBe(false) |
| 492 | + expect(client['_ws']).toBeUndefined() |
| 493 | + expect(timers).toEqual([]) |
| 494 | + expect(client.reasons.map((r) => r?.message)).toEqual(['websocket closed']) |
| 495 | + }) |
| 496 | +}) |
0 commit comments