Files
orca/src/main/browser/browser-network-deferred-socket.test.ts
T
OrcaWinandOrca Worker 982b3d4234 fix(browser): settle WSL tunnel reads so responses past 256 KiB complete (#27625)
* fix(browser): settle WSL tunnel reads so responses past 256 KiB complete

The WSL execution route hands the deferred socket a credit-accounted tunnel
duplex, but the deferred socket forwarded its data without settling it, so the
relay's 256 KiB receive window was never replenished and larger responses
stalled. Settle each chunk once tunnel-socket listeners have taken it; their
pause() still holds the source, so unsettled bytes stay bounded by the window.

Fixes #27356

* test(browser): bound the WSL backpressure wait so a regression fails instead of hanging

* test(browser): keep unchanged WSL route test lines in their original form

---------

Co-authored-by: Orca Worker <orca-worker@localhost>
2026-10-12 11:36:23 -07:00

54 lines
1.7 KiB
TypeScript

import { PassThrough } from 'node:stream'
import { describe, expect, it, vi } from 'vitest'
import { BrowserNetworkDeferredSocket } from './browser-network-deferred-socket'
describe('BrowserNetworkDeferredSocket', () => {
it('emits close once when destroyed before its source attaches', () => {
const socket = new BrowserNetworkDeferredSocket()
const source = new PassThrough()
const onClose = vi.fn()
socket.on('close', onClose)
socket.destroy()
socket.attach(source)
source.emit('close')
expect(onClose).toHaveBeenCalledOnce()
expect(source.destroyed).toBe(true)
})
it('emits one close when an attached source closes after destroy', async () => {
const socket = new BrowserNetworkDeferredSocket()
const source = new PassThrough()
const onClose = vi.fn()
socket.on('close', onClose)
socket.attach(source)
socket.destroy()
await new Promise((resolve) => setImmediate(resolve))
expect(onClose).toHaveBeenCalledOnce()
})
it('settles a credit-accounted source only after listeners take the bytes', async () => {
const socket = new BrowserNetworkDeferredSocket()
const settleRead = vi.fn()
const source = Object.assign(new PassThrough(), { settleRead })
const received: number[] = []
socket.on('data', (bytes: Buffer) => {
expect(settleRead).toHaveBeenCalledTimes(received.length)
received.push(bytes.byteLength)
})
socket.pause()
socket.attach(source)
source.write(Buffer.alloc(5))
await new Promise((resolve) => setImmediate(resolve))
expect(settleRead).not.toHaveBeenCalled()
socket.resume()
await vi.waitFor(() => expect(settleRead).toHaveBeenCalledWith(5))
expect(received).toEqual([5])
})
})