| 12345678910111213141516171819202122232425262728 |
- // @vitest-environment node
- import {expect,it,vi} from 'vitest'
- import {createServer,request} from 'node:http'
- const target=vi.hoisted(()=>({port:0}))
- vi.mock('../../src/runner/network/publicDestination.js',async importOriginal=>({
- ...await importOriginal<object>(),publicDestination:async()=>({host:'fixture.test',address:'127.0.0.1',family:4,port:target.port}),
- }))
- import {BrowserPublicProxy} from '../../src/runner/browser/publicProxy.js'
- it('disconnects an existing response stream when its grant expires and allows an authorized reconnect',async()=>{
- const server=createServer((req,res)=>{res.writeHead(200);if(req.url==='/once')res.end('ok');else res.write('stream-start')})
- await new Promise<void>(resolve=>server.listen(0,'127.0.0.1',resolve));target.port=(server.address() as {port:number}).port
- let allowed=true
- const proxy=await BrowserPublicProxy.start(async()=>{if(!allowed)throw new Error('grant expired')},undefined,20)
- const headers={'Proxy-Authorization':'Basic '+Buffer.from(`${proxy.username}:${proxy.password}`).toString('base64')}
- try{
- let interrupted!:()=>void;const ended=new Promise<void>(resolve=>{interrupted=resolve})
- await new Promise<void>((resolve,reject)=>{
- const req=request(proxy.serverURL,{path:'http://fixture.test/stream',headers},res=>{res.once('data',()=>resolve());res.once('aborted',interrupted);res.on('error',()=>{})})
- req.on('error',reject);req.end()
- })
- allowed=false
- await Promise.race([ended,new Promise((_,reject)=>setTimeout(()=>reject(new Error('expired stream stayed connected')),1000))])
- allowed=true
- const status=await new Promise<number>((resolve,reject)=>{const req=request(proxy.serverURL,{path:'http://fixture.test/once',headers},res=>{res.resume();res.on('end',()=>resolve(res.statusCode!))});req.on('error',reject);req.end()})
- expect(status).toBe(200)
- }finally{await proxy.close();server.closeAllConnections();await new Promise<void>(resolve=>server.close(()=>resolve()))}
- })
|