use std::collections::HashMap;
use std::sync::atomic::AtomicU64;
use std::sync::{Arc, Mutex, OnceLock, RwLock};
#[derive(Default)]
pub struct RuntimeContext {
pub hooks_hmac_secret: RwLock<Option<String>>,
pub max_decompressed_bytes: RwLock<Option<usize>>,
pub audit: Arc<AuditState>,
pub recall_tracker: Arc<crate::reranker::SessionRecallTracker>,
pub keypair_cache: Arc<Mutex<HashMap<String, crate::encryption::Keypair>>>,
pub reranker: OnceLock<Arc<crate::reranker::BatchedReranker>>,
}
impl std::fmt::Debug for RuntimeContext {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let secret_present = self
.hooks_hmac_secret
.read()
.map(|g| g.is_some())
.unwrap_or(false);
f.debug_struct("RuntimeContext")
.field(
"hooks_hmac_secret",
&if secret_present {
crate::REDACTED_PLACEHOLDER
} else {
"<unset>"
},
)
.field("max_decompressed_bytes", &self.max_decompressed_bytes)
.field("audit", &self.audit)
.field("recall_tracker", &"<recall_tracker>")
.field("keypair_cache", &"<keypair_cache>")
.field(
"reranker",
&if self.reranker.get().is_some() {
"<reranker>"
} else {
"<unset>"
},
)
.finish()
}
}
impl Drop for RuntimeContext {
fn drop(&mut self) {
if let Ok(mut guard) = self.hooks_hmac_secret.write() {
if let Some(secret) = guard.as_mut() {
use zeroize::Zeroize;
secret.zeroize();
}
}
}
}
#[derive(Debug, Default)]
pub struct AuditState {
pub sink: RwLock<Option<Arc<crate::audit::AuditSink>>>,
pub sequence: AtomicU64,
}
static GLOBAL: OnceLock<Arc<RuntimeContext>> = OnceLock::new();
impl RuntimeContext {
pub fn install_global(ctx: RuntimeContext) {
let _ = GLOBAL.set(Arc::new(ctx));
}
#[must_use]
pub fn global() -> &'static RuntimeContext {
Self::global_arc_ref()
}
fn global_arc_ref() -> &'static Arc<RuntimeContext> {
GLOBAL.get_or_init(|| Arc::new(RuntimeContext::default()))
}
#[must_use]
pub fn global_arc() -> Arc<RuntimeContext> {
Arc::clone(Self::global_arc_ref())
}
pub fn install_reranker(&self, reranker: Arc<crate::reranker::BatchedReranker>) {
let _ = self.reranker.set(reranker);
}
#[must_use]
pub fn reranker(&self) -> Option<&Arc<crate::reranker::BatchedReranker>> {
self.reranker.get()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn install_and_read_reranker_on_fresh_context() {
let ctx = RuntimeContext::default();
assert!(ctx.reranker().is_none(), "fresh context has no reranker");
ctx.install_reranker(Arc::new(crate::reranker::BatchedReranker::new(
crate::reranker::CrossEncoder::new(),
)));
assert!(ctx.reranker().is_some(), "reranker present after install");
ctx.install_reranker(Arc::new(crate::reranker::BatchedReranker::new(
crate::reranker::CrossEncoder::new(),
)));
assert!(ctx.reranker().is_some());
}
#[test]
fn runtime_context_default_is_constructible() {
let ctx = RuntimeContext::default();
assert!(ctx.hooks_hmac_secret.read().unwrap().is_none());
assert!(ctx.max_decompressed_bytes.read().unwrap().is_none());
assert!(ctx.audit.sink.read().unwrap().is_none());
assert_eq!(
ctx.audit.sequence.load(std::sync::atomic::Ordering::SeqCst),
0
);
assert_eq!(ctx.recall_tracker.session_count(), 0);
assert_eq!(ctx.keypair_cache.lock().unwrap().len(), 0);
}
#[test]
fn runtime_context_global_returns_stable_handle() {
let a = RuntimeContext::global() as *const RuntimeContext;
let b = RuntimeContext::global() as *const RuntimeContext;
assert_eq!(a, b, "global() must return a stable reference");
}
#[test]
fn runtime_context_audit_state_default() {
let audit = AuditState::default();
assert!(audit.sink.read().unwrap().is_none());
assert_eq!(audit.sequence.load(std::sync::atomic::Ordering::SeqCst), 0);
}
#[test]
fn debug_impl_redacts_secret_when_present() {
let ctx = RuntimeContext::default();
*ctx.hooks_hmac_secret.write().unwrap() = Some("super-secret-hmac-key".to_string());
let rendered = format!("{ctx:?}");
assert!(
!rendered.contains("super-secret-hmac-key"),
"Debug leaked the raw HMAC secret: {rendered}"
);
assert!(rendered.contains(crate::REDACTED_PLACEHOLDER));
assert!(rendered.contains("RuntimeContext"));
}
#[test]
fn debug_impl_marks_unset_secret() {
let ctx = RuntimeContext::default();
let rendered = format!("{ctx:?}");
assert!(rendered.contains("<unset>"), "got: {rendered}");
assert!(rendered.contains("<recall_tracker>"));
assert!(rendered.contains("<keypair_cache>"));
}
#[test]
fn drop_zeroizes_secret_on_scope_exit() {
let ctx = RuntimeContext::default();
*ctx.hooks_hmac_secret.write().unwrap() = Some("to-be-zeroized".to_string());
drop(ctx);
let empty = RuntimeContext::default();
drop(empty);
}
#[test]
fn install_global_is_last_writer_loses_against_lazy_init() {
RuntimeContext::install_global(RuntimeContext::default());
let a = RuntimeContext::global_arc();
let b = RuntimeContext::global_arc();
assert!(std::sync::Arc::ptr_eq(&a, &b));
let r = RuntimeContext::global();
assert!(std::ptr::eq(r, a.as_ref()));
}
}