pavex_session/
incoming.rsuse crate::{config::SessionCookieConfig, wire::WireClientState, SessionId};
use pavex::cookie::RequestCookies;
use pavex_tracing::fields::{error_details, error_message, ERROR_DETAILS, ERROR_MESSAGE};
use serde_json::Value;
use std::collections::HashMap;
pub struct IncomingSession {
pub(crate) id: SessionId,
pub(crate) client_state: HashMap<String, Value>,
}
impl IncomingSession {
pub fn extract(cookies: &RequestCookies<'_>, config: &SessionCookieConfig) -> Option<Self> {
let cookie = cookies.get(&config.name)?;
match serde_json::from_str::<WireClientState>(cookie.value()) {
Ok(s) => Some(Self {
id: s.session_id,
client_state: s.user_values.into_owned(),
}),
Err(e) => {
tracing::event!(
tracing::Level::WARN,
{ ERROR_MESSAGE } = error_message(&e),
{ ERROR_DETAILS } = error_details(&e),
"Invalid client state for session, creating a new session."
);
None
}
}
}
pub fn from_parts(id: SessionId, state: HashMap<String, Value>) -> Self {
Self {
id,
client_state: state,
}
}
}