host-transfer-transport.test.mjs 1.7 KB

1234567891011121314151617181920212223
  1. import {test} from 'node:test'
  2. import assert from 'node:assert/strict'
  3. import {createServer} from 'node:http'
  4. import {randomUUID} from 'node:crypto'
  5. import {exchangeDesktopEnvironment} from './environment-exchange.mjs'
  6. import {remoteExchange} from './host-manager.mjs'
  7. for(const kind of ['server','client'])test(`${kind} transport accepts a complete 10 MiB file and still bounds oversized commands`,async()=>{
  8. const data=Buffer.alloc(10*1024*1024,255).toString('base64'),hostId=randomUUID(),seen=[]
  9. let response={commands:[{id:randomUUID(),operation:'file',action:{op:'receive',path:'Desktop/a.bin',data}}]}
  10. const server=createServer(async(req,res)=>{let body='';for await(const chunk of req)body+=chunk;seen.push({path:req.url,headers:req.headers,body:JSON.parse(body)});res.writeHead(200,{'content-type':'application/json'});res.end(JSON.stringify(response))})
  11. await new Promise(resolve=>server.listen(0,'127.0.0.1',resolve))
  12. const url=`http://127.0.0.1:${server.address().port}`
  13. const exchange=()=>kind==='server'?exchangeDesktopEnvironment({url,token:'fixture'},{results:[]}):remoteExchange({serverURL:url,hostId,token:'fixture'},{results:[]})
  14. try{
  15. const result=await exchange()
  16. assert.equal(result.commands[0].action.data,data)
  17. assert.equal(seen[0].path,kind==='server'?'/desktop/environment':`/api/desktop-host/v1/${hostId}/exchange`)
  18. assert.equal(kind==='server'?seen[0].headers['x-yaoyao-desktop-token']:seen[0].headers.authorization,kind==='server'?'fixture':'Bearer fixture')
  19. response={commands:[],padding:'x'.repeat(16*1024*1024)}
  20. await assert.rejects(exchange,/超过限制/)
  21. }finally{server.closeAllConnections();await new Promise(resolve=>server.close(resolve))}
  22. })