Skip to main content

coil_core/bootstrap/
registry.rs

1use super::*;
2
3pub fn bootstrap_core_services(
4    config: &PlatformConfig,
5) -> Result<CoreBootstrap, RegistrationError> {
6    bootstrap_core_services_with_translation_catalogs(config, Vec::new())
7}
8
9pub fn bootstrap_core_services_with_translation_catalogs(
10    config: &PlatformConfig,
11    customer_translation_catalogs: Vec<TranslationCatalog>,
12) -> Result<CoreBootstrap, RegistrationError> {
13    let mut registry = ServiceRegistry::new();
14    let cache_topology = cache_topology_from_config(config);
15    let cache = CacheRuntimeServices {
16        topology: cache_topology,
17        planner: CachePlanner::new(cache_topology),
18    };
19    let browser = browser_security_from_config(config);
20    let cli = cli_runtime_from_config(config);
21    let data = data_runtime_from_config(config);
22    let jobs = jobs_runtime_from_config(config);
23    let observability = observability_runtime_from_config(config);
24    let i18n = i18n_runtime_from_config(config, customer_translation_catalogs);
25    let seo = seo_runtime_from_config(config);
26    let a11y = a11y_runtime_services();
27    let template = template_runtime_services();
28    let tls = tls_runtime_from_config(config);
29    let wasm = wasm_runtime_from_config(config);
30
31    registry.register_core_service("core.config", "Typed platform configuration")?;
32    registry.register_core_service(
33        "core.cli",
34        format!(
35            "Platform CLI contract for `{}` with {} baseline commands",
36            cli.customer_app, cli.baseline_command_count
37        ),
38    )?;
39    registry.register_core_service("core.logging", "Structured logging service")?;
40    registry.register_core_service(
41        "core.health",
42        "Liveness, readiness, and operator-facing dependency health checks",
43    )?;
44    registry.register_core_service(
45        "core.maintenance",
46        "Maintenance-mode control for deployment-wide and customer-app-scoped traffic shaping",
47    )?;
48    registry.register_core_service(
49        "core.flags",
50        "Scoped feature-flag control plane for staged rollout and customer targeting",
51    )?;
52
53    if config.observability.metrics {
54        registry.register_core_service(
55            "core.metrics",
56            "Structured metric catalog for HTTP, auth, cache, queue, TLS, storage, and extensions",
57        )?;
58    }
59
60    if config.observability.tracing {
61        registry.register_core_service("core.tracing", "Distributed tracing pipeline")?;
62    }
63
64    registry.register_core_service("core.auth", "Authorization engine and model loader")?;
65    registry.register_core_service(
66        "core.data",
67        format!(
68            "Primary {:?} data access with schema `{}` and pool {}..{}",
69            data.driver, data.schema, data.pool.min_connections, data.pool.max_connections
70        ),
71    )?;
72    registry.register_core_service(
73        "core.data.migrations",
74        format!(
75            "Owned migration planning through `{}`",
76            data.migrations_table
77        ),
78    )?;
79    registry.register_core_service(
80        "core.cache.l1",
81        format!("Local cache backend: {}", cache.topology.l1()),
82    )?;
83
84    if let Some(distributed) = cache.distributed_backend() {
85        registry.register_core_service(
86            "core.cache.l2",
87            format!("Distributed cache backend: {distributed}"),
88        )?;
89        registry.register_core_service(
90            "core.cache.invalidation",
91            format!("Shared invalidation, coalescing, and coordination via {distributed}"),
92        )?;
93    }
94    registry.register_core_service(
95        "core.cache.http",
96        "HTTP cache-control, validators, variation keys, and surrogate tags",
97    )?;
98    registry.register_core_service(
99        "core.http",
100        "HTTP request pipeline, middleware ordering, and typed request context",
101    )?;
102    registry.register_core_service(
103        "core.http.sessions",
104        format!(
105            "Server-side session policy backed by {:?}",
106            browser.sessions.store
107        ),
108    )?;
109    registry.register_core_service(
110        "core.http.cookies",
111        "Signed cookie policy with central Secure, HttpOnly, SameSite, domain, and path defaults",
112    )?;
113    registry.register_core_service(
114        "core.http.csrf",
115        "CSRF token issuance and validation for state-changing browser flows",
116    )?;
117
118    registry.register_core_service("core.storage", "Storage policy and object access layer")?;
119    registry.register_core_service("core.assets", "Asset manifest and CDN publication layer")?;
120    registry.register_core_service(
121        "core.i18n",
122        format!(
123            "Locale resolution, fallback translation runtime, and URL generation rooted at `{}`",
124            seo.canonical_host
125        ),
126    )?;
127    registry.register_core_service(
128        "core.seo",
129        format!(
130            "Typed metadata, sitemap, canonical URL, and JSON-LD services with sitemap {}",
131            if seo.sitemap_enabled {
132                "enabled"
133            } else {
134                "disabled"
135            }
136        ),
137    )?;
138    registry.register_core_service(
139        "core.a11y",
140        "Accessibility-aware form, table, dialog, navigation, live-region, and theme-baseline contracts",
141    )?;
142    registry.register_core_service("core.template", "HTML-first template runtime")?;
143    registry.register_core_service(
144        "core.template.fragments",
145        "Named fragment, slot, and partial-rendering composition runtime",
146    )?;
147    registry.register_core_service(
148        "core.wasm",
149        format!(
150            "WASM extension host runtime rooted at `{}` with network {}",
151            wasm.extension_directory,
152            if wasm.allow_network {
153                "enabled"
154            } else {
155                "disabled"
156            }
157        ),
158    )?;
159    registry.register_core_service(
160        "core.wasm.limits",
161        "Per-surface WASM resource limits for pages, APIs, jobs, webhooks, and widgets",
162    )?;
163    registry.register_core_service(
164        "core.customer_plugins",
165        "Linked customer-plugin registration and stable first-party hook runtime",
166    )?;
167    registry.register_core_service(
168        "core.jobs",
169        format!(
170            "Background jobs, scheduler, and domain-event queues over {:?}",
171            jobs.backend
172        ),
173    )?;
174
175    match tls.mode {
176        TlsMode::External => {
177            registry.register_core_service(
178                "core.tls.metadata",
179                "Trusted termination metadata and secure transport policy",
180            )?;
181        }
182        _ => {
183            registry.register_core_service(
184                "core.tls",
185                "Certificate lifecycle, TLS termination, and renewal orchestration",
186            )?;
187            registry.register_core_service(
188                "core.tls.reload",
189                "Hot-reloadable certificate bindings and SNI inventory",
190            )?;
191        }
192    }
193
194    Ok(CoreBootstrap {
195        registry,
196        cache,
197        browser,
198        cli,
199        data,
200        jobs,
201        observability,
202        i18n,
203        seo,
204        a11y,
205        template,
206        tls,
207        wasm,
208    })
209}