Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
bc13f27
Upgrade EdgeZero to the deploy-actions branch
aram356 Jul 20, 2026
e4a8f37
Merge branch 'main' into worktree-edgezero-316-upgrade
aram356 Jul 21, 2026
96dd1f7
Merge branch 'main' into worktree-edgezero-316-upgrade
aram356 Jul 22, 2026
1e7b4ca
Merge remote-tracking branch 'origin/main' into worktree-edgezero-316…
aram356 Jul 26, 2026
b743345
Update EdgeZero to latest deploy-actions branch tip
aram356 Aug 4, 2026
5420390
Sync EdgeZero to latest deploy-actions tip and adopt config gc
aram356 Aug 15, 2026
b23f270
Merge remote-tracking branch 'origin/main' into worktree-edgezero-316…
aram356 Aug 15, 2026
fe5767e
Sync EdgeZero to deploy-actions tip 5f3d648c
aram356 Aug 16, 2026
fc969ce
Merge branch 'main' into worktree-edgezero-316-upgrade
aram356 Aug 19, 2026
46b7052
Merge branch 'main' into worktree-edgezero-316-upgrade
aram356 Aug 20, 2026
f90f638
Pin edgezero dependencies to immutable rev instead of branch
aram356 Aug 21, 2026
bf47680
Document new CLI lifecycle and config gc commands
aram356 Aug 21, 2026
40dd9b3
Drop stale EdgeZero v0.0.4 qualifiers from env-overlay docs
aram356 Aug 21, 2026
7fc5e9b
Merge branch 'main' into worktree-edgezero-316-upgrade
aram356 Aug 22, 2026
87546d3
Document the staged-deploy config leg and correct healthcheck retry w…
aram356 Aug 22, 2026
01d7f61
Extend CLI parse tests for staging config flags, gc gate, and --version
aram356 Aug 22, 2026
4aee052
Refresh secret-fields comment and drop last v0.0.4 qualifiers
aram356 Aug 22, 2026
dd8bcdd
Merge branch 'main' into worktree-edgezero-316-upgrade
aram356 Aug 22, 2026
6462eb8
Upgrade edgezero dependencies to the v0.0.6 release
aram356 Aug 27, 2026
682bcff
Merge remote-tracking branch 'origin/main' into worktree-edgezero-316…
aram356 Aug 27, 2026
89c171e
Correct staging and rollback lifecycle docs, cover config gc --store
aram356 Aug 27, 2026
2786e86
Merge remote-tracking branch 'origin/main' into worktree-edgezero-316…
aram356 Sep 1, 2026
f7bdbe2
Merge remote-tracking branch 'origin/main' into worktree-edgezero-316…
aram356 Sep 1, 2026
c71c582
Document EdgeZero v0.0.7 upgrade design
aram356 Sep 1, 2026
b5331ab
Plan EdgeZero v0.0.7 upgrade
aram356 Sep 1, 2026
a1fa6b1
Upgrade EdgeZero dependencies to v0.0.7
aram356 Sep 1, 2026
05557b5
Add explicit EdgeZero config selectors
aram356 Sep 1, 2026
8436790
Use EdgeZero runtime selectors on Fastly
aram356 Sep 1, 2026
7cc0808
Complete EdgeZero CLI argument coverage
aram356 Sep 1, 2026
40c5a32
Document EdgeZero staging selector support
aram356 Sep 1, 2026
e9a790f
Fix template cache harness timeout budgets
aram356 Sep 1, 2026
0f1c38c
Address final self-review findings
aram356 Sep 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 37 additions & 13 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 6 additions & 6 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -54,12 +54,12 @@ criterion = { version = "0.5", default-features = false, features = ["cargo_benc
derive_more = { version = "2.0", features = ["display", "error"] }
directories = "5"
ed25519-dalek = { version = "2.2", features = ["rand_core"] }
edgezero-adapter-axum = { git = "https://github.com/stackpop/edgezero", tag = "v0.0.4", default-features = false }
edgezero-adapter-cloudflare = { git = "https://github.com/stackpop/edgezero", tag = "v0.0.4", default-features = false }
edgezero-adapter-fastly = { git = "https://github.com/stackpop/edgezero", tag = "v0.0.4", default-features = false }
edgezero-adapter-spin = { git = "https://github.com/stackpop/edgezero", tag = "v0.0.4", default-features = false }
edgezero-cli = { git = "https://github.com/stackpop/edgezero", tag = "v0.0.4" }
edgezero-core = { git = "https://github.com/stackpop/edgezero", tag = "v0.0.4", default-features = false }
edgezero-adapter-axum = { git = "https://github.com/stackpop/edgezero", tag = "v0.0.7", default-features = false }
edgezero-adapter-cloudflare = { git = "https://github.com/stackpop/edgezero", tag = "v0.0.7", default-features = false }
edgezero-adapter-fastly = { git = "https://github.com/stackpop/edgezero", tag = "v0.0.7", default-features = false }
edgezero-adapter-spin = { git = "https://github.com/stackpop/edgezero", tag = "v0.0.7", default-features = false }
edgezero-cli = { git = "https://github.com/stackpop/edgezero", tag = "v0.0.7" }
edgezero-core = { git = "https://github.com/stackpop/edgezero", tag = "v0.0.7", default-features = false }
env_logger = "0.11"
error-stack = "0.6"
esi = "0.7.2"
Expand Down
55 changes: 42 additions & 13 deletions crates/trusted-server-adapter-fastly/src/app.rs
Original file line number Diff line number Diff line change
Expand Up @@ -90,8 +90,9 @@ use std::sync::Arc;

use crate::rate_limiter::{FastlyRateLimiter, RATE_COUNTER_NAME};
use edgezero_adapter_fastly::context::FastlyRequestContext;
use edgezero_core::app::{App, Hooks};
use edgezero_core::app::{App, Hooks, StoreMetadata, StoresMetadata};
use edgezero_core::context::RequestContext;
use edgezero_core::env_config::EnvConfig;
use edgezero_core::error::EdgeError;
use edgezero_core::http::{
HandlerFuture, HeaderValue, Method, Request, Response, StatusCode, header,
Expand Down Expand Up @@ -135,7 +136,7 @@ use trusted_server_core::request_signing::{
};
use trusted_server_core::settings::{ProxyAssetRoute, Settings};
use trusted_server_core::settings_data::{
default_config_key, default_config_store_name, get_settings_from_config_store,
config_key, config_store_name, get_settings_from_config_store,
};
use trusted_server_core::tester_cookie::{handle_clear_tester, handle_set_tester};

Expand Down Expand Up @@ -167,14 +168,16 @@ pub(crate) struct AppState {
///
/// Returns an error when settings, the auction orchestrator, or the integration
/// registry fail to initialise.
pub(crate) fn build_state() -> Result<Arc<AppState>, Report<TrustedServerError>> {
build_state_from_settings(load_settings_from_config_store()?)
pub(crate) fn build_state(env: &EnvConfig) -> Result<Arc<AppState>, Report<TrustedServerError>> {
build_state_from_settings(load_settings_from_config_store(env)?)
}

pub(crate) fn load_settings_from_config_store() -> Result<Settings, Report<TrustedServerError>> {
let store_name = default_config_store_name();
let config_key = default_config_key();
get_settings_from_config_store(&FastlyPlatformConfigStore, &store_name, &config_key)
pub(crate) fn load_settings_from_config_store(
env: &EnvConfig,
) -> Result<Settings, Report<TrustedServerError>> {
let store_name = config_store_name(env);
let key = config_key(env);
get_settings_from_config_store(&FastlyPlatformConfigStore, &store_name, &key)
}

pub(crate) fn build_state_from_settings(
Expand Down Expand Up @@ -1228,15 +1231,15 @@ fn fallback_route_handler(
pub struct TrustedServerApp;

impl TrustedServerApp {
pub(crate) fn build_app_with_state() -> (App, Option<Arc<AppState>>) {
let (router, state) = Self::router_with_state();
pub(crate) fn build_app_with_state(env: &EnvConfig) -> (App, Option<Arc<AppState>>) {
let (router, state) = Self::router_with_state(env);
let mut app = App::with_name(router, Self::name());
Self::configure(&mut app);
(app, state)
}

fn router_with_state() -> (RouterService, Option<Arc<AppState>>) {
let state = match build_state() {
fn router_with_state(env: &EnvConfig) -> (RouterService, Option<Arc<AppState>>) {
let state = match build_state(env) {
Ok(state) => state,
Err(ref e) => {
log::error!("failed to build application state: {:?}", e);
Expand Down Expand Up @@ -1294,7 +1297,17 @@ impl Hooks for TrustedServerApp {
}

fn routes() -> RouterService {
Self::router_with_state().0
Self::router_with_state(&EnvConfig::from_env()).0
}

fn stores() -> StoresMetadata {
StoresMetadata {
config: Some(StoreMetadata {
default: "trusted_server_config",
ids: &["trusted_server_config"],
}),
..StoresMetadata::default()
}
}
}

Expand All @@ -1313,6 +1326,7 @@ mod tests {
};
use base64::Engine as _;
use bytes::Bytes;
use edgezero_core::app::{Hooks as _, StoreMetadata};
use edgezero_core::body::Body;
use edgezero_core::context::RequestContext;
use edgezero_core::http::{Method, Response, StatusCode, header, request_builder};
Expand Down Expand Up @@ -1453,6 +1467,21 @@ mod tests {
TrustedServerApp::routes_for_state(&state)
}

#[test]
fn trusted_server_app_declares_config_store_metadata() {
let stores = TrustedServerApp::stores();

assert_eq!(
stores.config,
Some(StoreMetadata {
default: "trusted_server_config",
ids: &["trusted_server_config"],
})
);
assert_eq!(stores.kv, None);
assert_eq!(stores.secrets, None);
}

#[test]
fn per_request_services_register_the_fastly_template_assembler() {
let state = build_state_from_settings(test_settings()).expect("should build test state");
Expand Down
30 changes: 16 additions & 14 deletions crates/trusted-server-adapter-fastly/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,11 @@ use std::sync::Arc;

use edgezero_adapter_fastly::config_store::FastlyConfigStore as EdgeZeroFastlyConfigStore;
use edgezero_adapter_fastly::request::into_core_request;
use edgezero_adapter_fastly::runtime_env_config;
use edgezero_core::app::Hooks as _;
use edgezero_core::body::Body as EdgeBody;
use edgezero_core::config_store::ConfigStoreHandle;
use edgezero_core::env_config::EnvConfig;
use edgezero_core::error::EdgeError;
use edgezero_core::http::{Request as HttpRequest, Response as HttpResponse};
use edgezero_core::response::IntoResponse;
Expand All @@ -26,6 +29,7 @@ use trusted_server_core::platform::RuntimeServices;
use trusted_server_core::proxy::{AssetProxyCachePolicy, stream_asset_body};
use trusted_server_core::response_privacy::TerminalPrivateResponse;
use trusted_server_core::settings::Settings;
use trusted_server_core::settings_data::config_store_name;

mod app;
mod backend;
Expand All @@ -46,18 +50,15 @@ use crate::middleware::{HEADER_X_TS_FINALIZED, apply_finalize_headers, resolve_g
use crate::platform::{FastlyPlatformGeo, client_info_from_request};
use crate::rate_limiter::{FastlyRateLimiter, RATE_COUNTER_NAME};

const TRUSTED_SERVER_CONFIG_STORE: &str = "trusted_server_config";

/// Opens the Fastly Config Store used by the `EdgeZero` dispatcher.
///
/// # Errors
///
/// Returns [`fastly::Error`] if the config store cannot be opened.
fn open_trusted_server_config_store() -> Result<ConfigStoreHandle, fastly::Error> {
let store = EdgeZeroFastlyConfigStore::try_open(TRUSTED_SERVER_CONFIG_STORE).map_err(|e| {
fastly::Error::msg(format!(
"failed to open config store `{TRUSTED_SERVER_CONFIG_STORE}`: {e}"
))
fn open_trusted_server_config_store(env: &EnvConfig) -> Result<ConfigStoreHandle, fastly::Error> {
let store_name = config_store_name(env);
let store = EdgeZeroFastlyConfigStore::try_open(store_name.as_ref()).map_err(|e| {
fastly::Error::msg(format!("failed to open config store `{store_name}`: {e}"))
})?;
Ok(ConfigStoreHandle::new(Arc::new(store)))
}
Expand Down Expand Up @@ -85,16 +86,17 @@ fn main() {
}

logging::init_logger();
edgezero_main(req);
let env = runtime_env_config(TrustedServerApp::stores());
edgezero_main(req, &env);
}

/// Handles a request through the `EdgeZero` router path.
fn edgezero_main(mut req: FastlyRequest) {
fn edgezero_main(mut req: FastlyRequest, env: &EnvConfig) {
// Short-circuit the JA4 debug probe before app construction. Must run here
// because TLS/JA4 accessors are only available on FastlyRequest before
// conversion to edgezero types.
if req.get_method() == FastlyMethod::GET && req.get_path() == "/_ts/debug/ja4" {
match load_settings_from_config_store() {
match load_settings_from_config_store(env) {
Ok(settings) if settings.debug.ja4_endpoint_enabled => {
build_ja4_debug_response(&req).send_to_client();
}
Expand All @@ -111,7 +113,7 @@ fn edgezero_main(mut req: FastlyRequest) {
return;
}

let config_store = match open_trusted_server_config_store() {
let config_store = match open_trusted_server_config_store(env) {
Ok(cs) => cs,
Err(e) => {
log::error!("failed to open config store: {e}");
Expand All @@ -122,7 +124,7 @@ fn edgezero_main(mut req: FastlyRequest) {
}
};

let (app, app_state) = TrustedServerApp::build_app_with_state();
let (app, app_state) = TrustedServerApp::build_app_with_state(env);
let settings_snapshot = app_state.as_ref().map(|state| Arc::clone(&state.settings));
let trusted_client_ip = settings_snapshot
.as_deref()
Expand Down Expand Up @@ -197,7 +199,7 @@ fn edgezero_main(mut req: FastlyRequest) {
if let Some(settings) = settings_snapshot.as_deref() {
apply_entry_point_finalize_headers(settings, &mut response, client_ip);
} else {
match load_settings_from_config_store() {
match load_settings_from_config_store(env) {
Ok(settings) => {
apply_entry_point_finalize_headers(&settings, &mut response, client_ip);
}
Expand Down Expand Up @@ -227,7 +229,7 @@ fn edgezero_main(mut req: FastlyRequest) {
}
}
} else {
match load_settings_from_config_store() {
match load_settings_from_config_store(env) {
Ok(settings) => {
match apply_edgezero_ec_finalize(&settings, &ec_state, &mut response) {
Ok(partner_registry) => {
Expand Down
Loading
Loading