11import { Duration , Effect , pipe , Schedule } from "effect"
22
33import { resolveControllerComposeUpArgs , shouldBuildControllerImage } from "./controller-bootstrap-plan.js"
4- import {
5- controllerContainerName ,
6- controllerExists ,
7- type ControllerRuntime ,
8- ensureControllerReachabilityNetworks ,
9- inspectContainerNetworks ,
10- inspectControllerPublishedPorts ,
11- inspectControllerRevision ,
12- prepareLocalControllerRevision ,
13- resolveCurrentContainerNetworks ,
14- runCompose
15- } from "./controller-docker.js"
4+ import * as ControllerDocker from "./controller-docker.js"
165import { findReachableApiBaseUrl , findReachableDirectHealthProbe } from "./controller-health.js"
176import { inspectControllerImageRevision } from "./controller-image-revision.js"
187import {
@@ -21,6 +10,7 @@ import {
2110 formatNetworkIps ,
2211 resolveApiPort ,
2312 resolveConfiguredApiBaseUrl ,
13+ resolveDefaultLocalApiBaseUrl ,
2414 resolveExplicitApiBaseUrl ,
2515 shouldRequireExplicitApiUrlForRemoteDocker ,
2616 trimTrailingSlashes
@@ -43,6 +33,8 @@ const controllerBootstrapError = (message: string): ControllerBootstrapError =>
4333 message
4434} )
4535
36+ type ControllerEffect < A > = Effect . Effect < A , ControllerBootstrapError , ControllerDocker . ControllerRuntime >
37+
4638const rememberSelectedApiBaseUrl = ( value : string ) : void => {
4739 selectedApiBaseUrl = trimTrailingSlashes ( value )
4840}
@@ -54,9 +46,9 @@ const collectReachabilityDiagnostics = (
5446 candidateUrls : ReadonlyArray < string > ,
5547 currentContainerNetworks : DockerNetworkIps ,
5648 controllerNetworks : DockerNetworkIps
57- ) : Effect . Effect < string , never , ControllerRuntime > =>
49+ ) : Effect . Effect < string , never , ControllerDocker . ControllerRuntime > =>
5850 Effect . gen ( function * ( _ ) {
59- const publishedPorts = yield * _ ( inspectControllerPublishedPorts ( ) )
51+ const publishedPorts = yield * _ ( ControllerDocker . inspectControllerPublishedPorts ( ) )
6052
6153 return [
6254 "Tried endpoints:" ,
@@ -71,7 +63,7 @@ const waitForReachableApiBaseUrl = (
7163 candidateUrls : ReadonlyArray < string > ,
7264 currentContainerNetworks : DockerNetworkIps ,
7365 controllerNetworks : DockerNetworkIps
74- ) : Effect . Effect < string , ControllerBootstrapError , ControllerRuntime > =>
66+ ) : ControllerEffect < string > =>
7567 pipe (
7668 findReachableApiBaseUrl ( candidateUrls ) ,
7769 Effect . retry (
@@ -160,21 +152,19 @@ type ControllerBootstrapContext = {
160152 readonly initialControllerNetworks : DockerNetworkIps
161153}
162154
163- const loadControllerBootstrapContext = ( ) : Effect . Effect <
164- ControllerBootstrapContext ,
165- ControllerBootstrapError ,
166- ControllerRuntime
167- > =>
155+ const loadControllerBootstrapContext = ( ) : ControllerEffect < ControllerBootstrapContext > =>
168156 Effect . gen ( function * ( _ ) {
169157 yield * _ ( prepareControllerRuntimeEnv ( ) )
170158 yield * _ ( prepareControllerResourceLimitEnv ( ) )
171159 const explicitApiBaseUrl = resolveExplicitApiBaseUrl ( )
172- const localControllerRevision = yield * _ ( prepareLocalControllerRevision ( ) )
173- const currentControllerExists = yield * _ ( controllerExists ( ) )
174- const currentControllerRevision = yield * _ ( inspectControllerRevision ( ) )
160+ const localControllerRevision = yield * _ ( ControllerDocker . prepareLocalControllerRevision ( ) )
161+ const currentControllerExists = yield * _ ( ControllerDocker . controllerExists ( ) )
162+ const currentControllerRevision = yield * _ ( ControllerDocker . inspectControllerRevision ( ) )
175163 const currentImageRevision = yield * _ ( inspectControllerImageRevision ( ) )
176- const currentContainerNetworks = yield * _ ( resolveCurrentContainerNetworks ( ) )
177- const initialControllerNetworks = yield * _ ( inspectContainerNetworks ( controllerContainerName ) )
164+ const currentContainerNetworks = yield * _ ( ControllerDocker . resolveCurrentContainerNetworks ( ) )
165+ const initialControllerNetworks = yield * _ (
166+ ControllerDocker . inspectContainerNetworks ( ControllerDocker . controllerContainerName )
167+ )
178168 const forceRecreateForResourceLimits = shouldForceRecreateForControllerResourceLimits ( )
179169 const forceRecreateController = forceRecreateForResourceLimits ||
180170 shouldForceRecreateController ( currentControllerExists , localControllerRevision , currentControllerRevision )
@@ -203,6 +193,7 @@ const buildBootstrapCandidateUrls = (
203193) : ReadonlyArray < string > =>
204194 buildApiBaseUrlCandidates ( {
205195 explicitApiBaseUrl,
196+ defaultLocalApiBaseUrl : resolveDefaultLocalApiBaseUrl ( ) ,
206197 cachedApiBaseUrl : selectedApiBaseUrl ,
207198 defaultApiBaseUrl : resolveConfiguredApiBaseUrl ( ) ,
208199 currentContainerNetworks,
@@ -243,16 +234,18 @@ const logControllerStart = (
243234
244235const startAndRememberController = (
245236 context : ControllerBootstrapContext
246- ) : Effect . Effect < void , ControllerBootstrapError , ControllerRuntime > =>
237+ ) : ControllerEffect < void > =>
247238 Effect . gen ( function * ( _ ) {
248239 if ( context . forceRecreateController || context . buildController ) {
249240 yield * _ ( logControllerStart ( context ) )
250241 }
251242
252- yield * _ ( runCompose ( resolveControllerComposeUpArgs ( context ) ) )
253- yield * _ ( ensureControllerReachabilityNetworks ( context . currentContainerNetworks ) )
243+ yield * _ ( ControllerDocker . runCompose ( resolveControllerComposeUpArgs ( context ) ) )
244+ yield * _ ( ControllerDocker . ensureControllerReachabilityNetworks ( context . currentContainerNetworks ) )
254245
255- const controllerNetworks = yield * _ ( inspectContainerNetworks ( controllerContainerName ) )
246+ const controllerNetworks = yield * _ (
247+ ControllerDocker . inspectContainerNetworks ( ControllerDocker . controllerContainerName )
248+ )
256249 const candidateUrls = buildBootstrapCandidateUrls (
257250 context . explicitApiBaseUrl ,
258251 context . currentContainerNetworks ,
@@ -274,12 +267,17 @@ const startAndRememberController = (
274267// EFFECT: Effect<void, ControllerBootstrapError, CommandExecutor>
275268// INVARIANT: controller is reachable from the current runtime before any host API dispatch
276269// COMPLEXITY: O(1) compose + O(k) health checks
277- export const ensureControllerReady = ( ) : Effect . Effect < void , ControllerBootstrapError , ControllerRuntime > =>
270+ export const ensureControllerReady = ( ) : ControllerEffect < void > =>
278271 Effect . gen ( function * ( _ ) {
279272 const explicitApiBaseUrl = resolveExplicitApiBaseUrl ( )
273+ const defaultLocalApiBaseUrl = resolveDefaultLocalApiBaseUrl ( )
280274 if ( explicitApiBaseUrl !== undefined ) {
281275 const reachableBeforeDocker = yield * _ (
282- findReachableDirectHealthProbe ( { explicitApiBaseUrl, cachedApiBaseUrl : selectedApiBaseUrl } )
276+ findReachableDirectHealthProbe ( {
277+ cachedApiBaseUrl : selectedApiBaseUrl ,
278+ defaultLocalApiBaseUrl,
279+ explicitApiBaseUrl
280+ } )
283281 )
284282 if ( reachableBeforeDocker !== null ) {
285283 rememberSelectedApiBaseUrl ( reachableBeforeDocker . apiBaseUrl )
@@ -288,12 +286,13 @@ export const ensureControllerReady = (): Effect.Effect<void, ControllerBootstrap
288286 yield * _ ( failIfExplicitApiUrlIsUnreachable ( explicitApiBaseUrl ) )
289287 }
290288
291- const localControllerRevision = yield * _ ( prepareLocalControllerRevision ( ) )
289+ const localControllerRevision = yield * _ ( ControllerDocker . prepareLocalControllerRevision ( ) )
292290 const forceRecreateForResourceLimits = shouldForceRecreateForControllerResourceLimits ( )
293291 const reachableBeforeDocker = yield * _ (
294292 findReachableDirectHealthProbe ( {
295- explicitApiBaseUrl,
296- cachedApiBaseUrl : selectedApiBaseUrl
293+ cachedApiBaseUrl : selectedApiBaseUrl ,
294+ defaultLocalApiBaseUrl,
295+ explicitApiBaseUrl
297296 } )
298297 )
299298 if (
@@ -314,7 +313,7 @@ export const ensureControllerReady = (): Effect.Effect<void, ControllerBootstrap
314313 yield * _ ( startAndRememberController ( bootstrapContext ) )
315314 } )
316315
317- export const restartController = ( ) : Effect . Effect < void , ControllerBootstrapError , ControllerRuntime > =>
316+ export const restartController = ( ) : ControllerEffect < void > =>
318317 Effect . gen ( function * ( _ ) {
319318 const explicitApiBaseUrl = resolveExplicitApiBaseUrl ( )
320319 if ( explicitApiBaseUrl !== undefined ) {
0 commit comments