use crate::logger::tracing::debug;
use std::time::{SystemTime, UNIX_EPOCH};
use crate::{
codegen::Request,
context::{Context, RpcContext},
filter::TRI_TIMEOUT_DEADLINE_IN_NANOS,
status::{Code, Status},
};
use super::Filter;
#[derive(Clone)]
pub struct TimeoutFilter {}
impl Filter for TimeoutFilter {
fn call(&mut self, req: Request<()>) -> Result<Request<()>, Status> {
if let Some(attachments) = RpcContext::get_attachments() {
let current_nanos = SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap()
.as_nanos();
let attachments = attachments.lock().unwrap();
let tri_timeout_deadline_in_nanos =
attachments.get(TRI_TIMEOUT_DEADLINE_IN_NANOS).unwrap();
let tri_timeout_deadline_in_nanos: u128 = tri_timeout_deadline_in_nanos
.as_str()
.unwrap()
.parse()
.unwrap();
debug!(
"TimeoutFilter tri-timeout-deadline-in-nanos : {}, current-nanos:{}",
tri_timeout_deadline_in_nanos, current_nanos
);
if tri_timeout_deadline_in_nanos - current_nanos <= 0 {
return Err(Status::new(Code::DeadlineExceeded, String::from("Timeout")));
}
}
Ok(req)
}
}