serve: keep resolved listen options together
This commit is contained in:
parent
a2008478f9
commit
25400f48df
1 changed files with 10 additions and 11 deletions
|
|
@ -137,14 +137,14 @@ const listenEffect: (opts: ListenOptions) => Effect.Effect<EffectListener, unkno
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
function listenerLayer(opts: ListenOptions, port: number) {
|
function listenerLayer(opts: ListenOptions) {
|
||||||
return HttpRouter.serve(HttpApiApp.createRoutes(opts), {
|
return HttpRouter.serve(HttpApiApp.createRoutes(opts), {
|
||||||
middleware: disposeMiddleware,
|
middleware: disposeMiddleware,
|
||||||
disableLogger: true,
|
disableLogger: true,
|
||||||
disableListenLog: true,
|
disableListenLog: true,
|
||||||
}).pipe(
|
}).pipe(
|
||||||
Layer.provideMerge(WebSocketTracker.layer),
|
Layer.provideMerge(WebSocketTracker.layer),
|
||||||
Layer.provideMerge(serverLayer(opts, port)),
|
Layer.provideMerge(serverLayer(opts)),
|
||||||
// Install a fresh `ConfigProvider` per listener so `Config.string(...)`
|
// Install a fresh `ConfigProvider` per listener so `Config.string(...)`
|
||||||
// reads reflect the current `process.env`. Effect's default
|
// reads reflect the current `process.env`. Effect's default
|
||||||
// `ConfigProvider` snapshots `process.env` on first read and caches the
|
// `ConfigProvider` snapshots `process.env` on first read and caches the
|
||||||
|
|
@ -155,16 +155,15 @@ function listenerLayer(opts: ListenOptions, port: number) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function startWithPortFallback(opts: ListenOptions) {
|
function startWithPortFallback(opts: ListenOptions) {
|
||||||
if (opts.type === "socket") return startListener(opts, 0)
|
if (opts.type === "socket" || opts.port !== 0) return startListener(opts)
|
||||||
if (opts.port !== 0) return startListener(opts, opts.port)
|
|
||||||
// Match the legacy listener port-resolution behavior: explicit `0` prefers
|
// Match the legacy listener port-resolution behavior: explicit `0` prefers
|
||||||
// 4096 first, then any free port.
|
// 4096 first, then any free port.
|
||||||
return startListener(opts, 4096).pipe(Effect.catch(() => startListener(opts, 0)))
|
return startListener({ ...opts, port: 4096 }).pipe(Effect.catch(() => startListener(opts)))
|
||||||
}
|
}
|
||||||
|
|
||||||
function startListener(opts: ListenOptions, port: number) {
|
function startListener(opts: ListenOptions) {
|
||||||
const scope = Scope.makeUnsafe()
|
const scope = Scope.makeUnsafe()
|
||||||
return Layer.buildWithMemoMap(listenerLayer(opts, port), Layer.makeMemoMapUnsafe(), scope).pipe(
|
return Layer.buildWithMemoMap(listenerLayer(opts), Layer.makeMemoMapUnsafe(), scope).pipe(
|
||||||
Effect.provide(HttpApiApp.context),
|
Effect.provide(HttpApiApp.context),
|
||||||
Effect.onError(() => Scope.close(scope, Exit.void).pipe(Effect.ignore)),
|
Effect.onError(() => Scope.close(scope, Exit.void).pipe(Effect.ignore)),
|
||||||
Effect.map(
|
Effect.map(
|
||||||
|
|
@ -240,7 +239,7 @@ function forceClose(state: ListenerState) {
|
||||||
return Effect.all([state.http.closeAll, state.websockets.closeAll], { concurrency: "unbounded", discard: true })
|
return Effect.all([state.http.closeAll, state.websockets.closeAll], { concurrency: "unbounded", discard: true })
|
||||||
}
|
}
|
||||||
|
|
||||||
function serverLayer(opts: ListenOptions, port: number) {
|
function serverLayer(opts: ListenOptions) {
|
||||||
const server = createServer()
|
const server = createServer()
|
||||||
const serverRef = { closeStarted: false, forceStop: false }
|
const serverRef = { closeStarted: false, forceStop: false }
|
||||||
const close = server.close.bind(server)
|
const close = server.close.bind(server)
|
||||||
|
|
@ -255,7 +254,7 @@ function serverLayer(opts: ListenOptions, port: number) {
|
||||||
}) as typeof server.close
|
}) as typeof server.close
|
||||||
|
|
||||||
return Layer.mergeAll(
|
return Layer.mergeAll(
|
||||||
NodeHttpServer.layer(() => server, nodeListenOptions(opts, port)),
|
NodeHttpServer.layer(() => server, nodeListenOptions(opts)),
|
||||||
Layer.succeed(ListenerServerService)(
|
Layer.succeed(ListenerServerService)(
|
||||||
ListenerServerService.of({
|
ListenerServerService.of({
|
||||||
closeAll: Effect.sync(() => {
|
closeAll: Effect.sync(() => {
|
||||||
|
|
@ -267,9 +266,9 @@ function serverLayer(opts: ListenOptions, port: number) {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
function nodeListenOptions(opts: ListenOptions, port: number) {
|
function nodeListenOptions(opts: ListenOptions) {
|
||||||
if (opts.type === "socket") return { path: opts.socket, gracefulShutdownTimeout: "1 second" as const }
|
if (opts.type === "socket") return { path: opts.socket, gracefulShutdownTimeout: "1 second" as const }
|
||||||
return { port, host: opts.hostname, gracefulShutdownTimeout: "1 second" as const }
|
return { port: opts.port, host: opts.hostname, gracefulShutdownTimeout: "1 second" as const }
|
||||||
}
|
}
|
||||||
|
|
||||||
export * as Server from "./server"
|
export * as Server from "./server"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue