use crate::error::RuntimeError;
use crate::runtime::{KhiveRuntime, NamespaceToken};
use khive_storage::{Event, StorageError, SubstrateKind};
pub fn is_benign_shutdown_cancellation(err: &RuntimeError) -> bool {
let RuntimeError::Storage(StorageError::Driver { source, .. }) = err else {
return false;
};
source
.downcast_ref::<tokio::task::JoinError>()
.is_some_and(tokio::task::JoinError::is_cancelled)
}
pub async fn emit_phase_event<P: serde::Serialize>(
rt: &KhiveRuntime,
token: &NamespaceToken,
label: &str,
kind: khive_types::EventKind,
payload: P,
) {
let Ok(store) = rt.events(token) else {
return;
};
let payload_value = match serde_json::to_value(&payload) {
Ok(v) => v,
Err(e) => {
tracing::warn!(
error = %e,
event_kind = %kind.name(),
label,
"failed to serialize ADR-103 phase-span event payload"
);
return;
}
};
let actor = format!("{}:{}", token.actor().kind, token.actor().id);
let event = Event::new(
token.namespace().as_str(),
label,
kind,
SubstrateKind::Event,
actor,
)
.with_payload(payload_value);
if let Err(err) = store.append_event(event).await {
tracing::warn!(
error = %err,
event_kind = %kind.name(),
label,
"ADR-103 phase-span event append failed"
);
}
}