use tokio::sync::{oneshot::Sender, Mutex};
use crate::prelude::*;
#[derive(Default)]
pub struct Requests(Mutex<HashMap<i64, (i64, Sender<Response>)>>);
impl Requests {
pub async fn insert(&self, id: i64, tx: Sender<Response>) {
let time = chrono::Utc::now().timestamp();
let mut hashmap = self.0.lock().await;
hashmap.insert(id, (time, tx));
if hashmap.len() != 0 {
drop(hashmap);
self.clear().await;
}
}
async fn clear(&self) {
let now = chrono::Utc::now().timestamp();
let mut hashmap = self.0.lock().await;
hashmap.retain(|_, (time, _)| now < 20 + *time);
}
pub async fn intercept(&self, response: Response) -> Result<(), Response> {
let id = response.id();
if let Some(id) = id {
self.send_response(id, response).await
} else {
Err(response)
}
}
async fn send_response(&self, id: i64, response: Response) -> Result<(), Response> {
let mut hashmap = self.0.lock().await;
if let Some((_, (_, tx))) = hashmap.remove_entry(&id) {
tx.send(response)?;
Ok(())
} else {
Err(response)
}
}
}