use std::{sync::Arc, time::SystemTime};
use bytes::Bytes;
use tokio::{
sync::{RwLock, Semaphore, mpsc},
task::JoinHandle,
};
pub(crate) struct LynnUser {
sender: mpsc::Sender<Bytes>,
user_id: Option<u64>,
process_permit: Arc<Semaphore>,
last_communicate_time: Arc<RwLock<SystemTime>>,
thread: Option<JoinHandle<()>>,
}
impl LynnUser {
pub(crate) fn new(
sender: mpsc::Sender<Bytes>,
process_permit: Arc<Semaphore>,
join_handle: JoinHandle<()>,
last_communicate_time: Arc<RwLock<SystemTime>>,
) -> Self {
Self {
sender,
user_id: None,
process_permit,
last_communicate_time,
thread: Some(join_handle),
}
}
pub(crate) fn get_process_permit(&self) -> Arc<Semaphore> {
self.process_permit.clone()
}
pub(crate) fn get_last_communicate_time(&self) -> Arc<RwLock<SystemTime>> {
self.last_communicate_time.clone()
}
pub(crate) async fn send_response(&self, response: &Bytes) {
self.sender.send(response.clone()).await;
}
}
impl Drop for LynnUser {
fn drop(&mut self) {
if let Some(thread) = self.thread.take() {
let _ = thread.abort();
}
self.thread = None;
}
}