use systemprompt_config::SecretsBootstrap;
use systemprompt_runtime::AppContext;
pub(in crate::services::server) fn start_secrets_refresh(ctx: &AppContext) {
let Some(interval) = SecretsBootstrap::refresh_interval() else {
return;
};
tracing::info!(
interval_secs = interval.as_secs(),
"secrets refresh scheduled on this replica"
);
ctx.background_tasks()
.spawn_cancellable("secrets_refresh", move |cancel| async move {
let mut tick = tokio::time::interval(interval);
tick.set_missed_tick_behavior(tokio::time::MissedTickBehavior::Delay);
tick.tick().await;
loop {
tokio::select! {
() = cancel.cancelled() => break,
_ = tick.tick() => {},
}
match SecretsBootstrap::reload().await {
Ok(outcome) if outcome.swapped => tracing::info!(
generation = outcome.generation,
changed = ?outcome.changed_keys,
"secrets refresh applied a new generation"
),
Ok(_) => tracing::debug!("secrets refresh found no change"),
Err(error) => tracing::warn!(
error = %error,
generation = SecretsBootstrap::generation(),
"secrets refresh failed; keeping the current generation"
),
}
}
});
}