shutdown.test.ts 1.3 KB

12345678910111213141516171819202122232425262728
  1. // 服务关闭:有 SSE 推送连接时 server.close() 不能一直等待(否则 systemd 等 90 秒后强制结束)
  2. import type { AddressInfo } from 'node:net'
  3. import pino from 'pino'
  4. import { expect, it } from 'vitest'
  5. import { createApp } from '../src/app'
  6. import { buildServer } from '../src/http/server'
  7. it('关闭服务时主动结束 SSE 推送', async () => {
  8. const log = pino({ level: 'silent' })
  9. const app = createApp(log, { providers: {} })
  10. const server = await buildServer(app, { logger: log })
  11. await server.listen({ host: '127.0.0.1', port: 0 })
  12. const base = `http://127.0.0.1:${(server.server.address() as AddressInfo).port}`
  13. const builtin = app.profiles.getBuiltin().id
  14. const key = app.apiKeys.create('shutdown', { allowedProfileIds: [builtin], defaultProfileId: builtin })
  15. const s = await app.sessions.create(key.apiKey.id, {})
  16. const res = await fetch(`${base}/v1/sessions/${s.id}/stream`, { headers: { authorization: `Bearer ${key.key}` } })
  17. expect(res.status).toBe(200)
  18. const reader = res.body!.getReader()
  19. await reader.read()
  20. const t0 = Date.now()
  21. await server.close()
  22. expect(Date.now() - t0).toBeLessThan(1000)
  23. // 客户端看到流结束(随后会按 retry 重连到新进程)
  24. let done = false
  25. while (!done) done = (await reader.read()).done
  26. })