use std::sync::Arc;
use tokio::sync::Mutex;
use serde::{Serialize, Deserialize};
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct Request {
pubkey: Vec<u8>,
signature: Vec<u8>,
rune: Vec<u8>,
payload: bytes::Bytes,
uri: String,
timestamp: Option<u64>,
}
impl Request {
pub fn new(
uri: String,
payload: bytes::Bytes,
pubkey: Vec<u8>,
signature: Vec<u8>,
timestamp: Option<u64>,
rune: Vec<u8>,
) -> Self {
Request {
uri,
payload,
signature,
timestamp,
pubkey,
rune,
}
}
}
impl From<Request> for crate::pb::PendingRequest {
fn from(r: crate::context::Request) -> Self {
crate::pb::PendingRequest {
pubkey: r.pubkey,
signature: r.signature,
request: r.payload.to_vec(),
uri: r.uri,
timestamp: r.timestamp.unwrap_or_default(),
rune: r.rune,
}
}
}
#[derive(Clone, Debug)]
pub struct Context {
requests: Arc<Mutex<Vec<Request>>>,
}
impl Context {
pub fn new() -> Self {
Context {
requests: Arc::new(Mutex::new(Vec::new())),
}
}
pub async fn snapshot(&self) -> Vec<Request> {
let r = self.requests.lock().await;
r.clone()
}
pub async fn add_request(&self, r: Request) {
let mut reqs = self.requests.lock().await;
reqs.push(r);
}
pub async fn remove_request(&self, r: Request) {
let mut reqs = self.requests.lock().await;
reqs.retain(|a| a.signature != r.signature)
}
}