(options: ProxyNodeOptions = {})
| 23 | } |
| 24 | |
| 25 | export async function createProxyServerNode (options: ProxyNodeOptions = {}): Promise<ProxyServerNode> { |
| 26 | const service = await createProxyService(options) |
| 27 | const { hostname, port } = service.config as { hostname: string; port: number } |
| 28 | const signals = options.shutdownSignals ?? ['SIGINT', 'SIGTERM'] |
| 29 | |
| 30 | let server: ReturnType<typeof serve> | null = null |
| 31 | let detachSignals: (() => void) | undefined |
| 32 | |
| 33 | const proxy = {} as ProxyServerNode |
| 34 | |
| 35 | const stop = async () => { |
| 36 | try { |
| 37 | await service.stop() |
| 38 | } finally { |
| 39 | if (server) { |
| 40 | await new Promise<void>((resolve) => server?.close(() => resolve())) |
| 41 | server = null |
| 42 | proxy.server = null |
| 43 | } |
| 44 | if (detachSignals) { |
| 45 | detachSignals() |
| 46 | detachSignals = undefined |
| 47 | proxy.detachSignals = undefined |
| 48 | } |
| 49 | } |
| 50 | } |
| 51 | |
| 52 | const start = async () => { |
| 53 | await service.start() |
| 54 | if (!server) { |
| 55 | const info = await new Promise<{ port: number }>((resolve) => { |
| 56 | server = serve( |
| 57 | { |
| 58 | fetch: service.app.fetch, |
| 59 | port, |
| 60 | hostname |
| 61 | }, |
| 62 | resolve |
| 63 | ) |
| 64 | }) |
| 65 | proxy.server = server |
| 66 | options.onListen?.(info) |
| 67 | } |
| 68 | if (options.attachSignals ?? true) { |
| 69 | detachSignals = attachShutdownListeners(signals, nodeShutdownAdapter, stop) |
| 70 | proxy.detachSignals = detachSignals |
| 71 | } |
| 72 | return { port } |
| 73 | } |
| 74 | |
| 75 | Object.assign(proxy, { |
| 76 | ...service, |
| 77 | hostname, |
| 78 | port, |
| 79 | server, |
| 80 | start, |
| 81 | stop, |
| 82 | detachSignals |
no test coverage detected
searching dependent graphs…