vmComputer.test.ts 1.5 KB

12345678910111213141516171819202122232425262728293031
  1. // @vitest-environment node
  2. import {expect,it} from 'vitest'
  3. import {WebSocketServer} from 'ws'
  4. import {VmToolSession} from '../../src/server/vmComputer'
  5. import type {GatewayTarget} from '../../src/server/workspaceGateway'
  6. it('connects the virtual computer tool channel before creating its session',async()=>{
  7. const server=new WebSocketServer({port:0,host:'127.0.0.1'})
  8. await new Promise<void>(resolve=>server.once('listening',resolve))
  9. const methods:string[]=[]
  10. server.on('connection',socket=>{
  11. socket.send(JSON.stringify({method:'event',params:{type:'gateway.ready'}}))
  12. socket.on('message',raw=>{
  13. const frame=JSON.parse(String(raw))
  14. methods.push(frame.method)
  15. socket.send(JSON.stringify({id:frame.id,result:frame.method==='session.create'?{session_id:'vm-session'}:{ok:true}}))
  16. })
  17. })
  18. const target={url:new URL(`http://127.0.0.1:${(server.address() as {port:number}).port}`),client:{},
  19. session:{webSocketCredential:async()=>({name:'ticket',value:'fixture'})}} as unknown as GatewayTarget
  20. const session=new VmToolSession(target,'default','work-id',()=>{})
  21. try{
  22. await expect(session.call('computer_shell',{command:'pwd'})).resolves.toEqual({ok:true})
  23. await expect(session.call('computer_desktop_state',{})).resolves.toEqual({ok:true})
  24. expect(methods).toEqual(['session.create','computer.invoke','computer.invoke'])
  25. }finally{
  26. session.close()
  27. for(const client of server.clients)client.terminate()
  28. await new Promise<void>(resolve=>server.close(()=>resolve()))
  29. }
  30. })