| 371 | * sessions to drain; closing the listener is the whole shutdown. |
| 372 | */ |
| 373 | export async function startHttpServer( |
| 374 | port: number, |
| 375 | opts: HttpServerOptions, |
| 376 | ): Promise<{ close: () => Promise<void>; port: number }> { |
| 377 | const { app, cache } = buildApp(opts); |
| 378 | const server = app.listen(port); |
| 379 | await new Promise<void>((resolve, reject) => { |
| 380 | server.once("listening", resolve); |
| 381 | server.once("error", reject); |
| 382 | }); |
| 383 | const actualPort = (server.address() as { port: number }).port; |
| 384 | return { |
| 385 | port: actualPort, |
| 386 | close: async () => { |
| 387 | await new Promise<void>((resolve) => server.close(() => resolve())); |
| 388 | cache.clear(); |
| 389 | }, |
| 390 | }; |
| 391 | } |