mirror of
https://github.com/stablyai/orca.git
synced 2026-10-31 00:57:45 +00:00
* 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>
54 lines
1.7 KiB
TypeScript
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])
|
|
})
|
|
})
|