use std::collections::HashMap;
use std::sync::Mutex;
use uuid::Uuid;
use super::types::{MessageEnqueueCallback, QueuedUserMessage};
static SESSION_ROUTES: Mutex<Option<HashMap<Uuid, MessageEnqueueCallback>>> = Mutex::new(None);
pub fn register_session_route(session_id: Uuid, enqueue: MessageEnqueueCallback) {
match SESSION_ROUTES.lock() {
Ok(mut guard) => {
guard
.get_or_insert_with(HashMap::new)
.insert(session_id, enqueue.clone());
super::restart_recovery::claim_session(session_id, &enqueue);
}
Err(e) => {
tracing::error!(
target: "background_task",
"Could not register resume route for session {session_id}: {e}"
);
}
}
}
pub fn resolve_route(
session_id: Uuid,
executing: &MessageEnqueueCallback,
) -> MessageEnqueueCallback {
session_route(session_id).unwrap_or_else(|| executing.clone())
}
static LOCAL_ROUTE: Mutex<Option<MessageEnqueueCallback>> = Mutex::new(None);
pub fn register_local_route(enqueue: MessageEnqueueCallback) {
match LOCAL_ROUTE.lock() {
Ok(mut guard) => *guard = Some(enqueue),
Err(e) => {
tracing::error!(
target: "background_task",
"Could not register the local delivery route: {e}"
);
}
}
}
pub fn deliver_to_session(session_id: Uuid, msg: QueuedUserMessage) -> bool {
if let Some(route) = session_route(session_id) {
route(session_id, msg);
return true;
}
let local = match LOCAL_ROUTE.lock() {
Ok(guard) => guard.clone(),
Err(e) => {
tracing::error!(
target: "background_task",
"Could not read the local delivery route for session {session_id}: {e}"
);
None
}
};
match local {
Some(route) => {
route(session_id, msg);
true
}
None => {
tracing::error!(
target: "background_task",
"Nothing can receive a message for session {session_id}; it is dropped: {}",
msg.display_text
);
false
}
}
}
pub fn session_route(session_id: Uuid) -> Option<MessageEnqueueCallback> {
match SESSION_ROUTES.lock() {
Ok(guard) => guard.as_ref()?.get(&session_id).cloned(),
Err(e) => {
tracing::error!(
target: "background_task",
"Could not read resume route for session {session_id}: {e}"
);
None
}
}
}
pub fn claim_for_channel(session_id: Uuid, enqueue: Option<MessageEnqueueCallback>) {
if let Some(enqueue) = enqueue {
register_session_route(session_id, enqueue);
}
}