server.ts 925 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. import path from 'node:path'
  2. import connect from 'connect'
  3. import sirv from 'sirv'
  4. export type E2ETestServer = {
  5. port: number
  6. close: () => void
  7. }
  8. export async function startE2ETestServer(
  9. testName: string,
  10. dirname: string,
  11. ): Promise<E2ETestServer> {
  12. const app = connect().use(sirv(path.resolve(dirname, '../dist')))
  13. let server: any
  14. let port = 0
  15. await new Promise<void>((resolve, reject) => {
  16. server = app.listen(0, () => {
  17. const address = server.address()
  18. if (!address || typeof address === 'string') {
  19. reject(new Error(`[${testName}] failed to bind e2e server port`))
  20. return
  21. }
  22. port = address.port
  23. resolve()
  24. })
  25. server.once('error', reject)
  26. })
  27. const onSigterm = () => server && server.close()
  28. process.on('SIGTERM', onSigterm)
  29. return {
  30. port,
  31. close: () => {
  32. process.off('SIGTERM', onSigterm)
  33. server.close()
  34. },
  35. }
  36. }