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