Skip to main content

foundry_wallets/wallet_browser/
queue.rs

1use std::collections::{HashMap, VecDeque};
2
3use alloy_network::Network;
4use uuid::Uuid;
5
6use crate::wallet_browser::types::{BrowserSignRequest, BrowserTransactionRequest};
7
8#[derive(Debug)]
9pub(crate) struct RequestQueue<Req, Res> {
10    /// Pending requests from CLI to browser
11    requests: VecDeque<Req>,
12    /// Responses from browser indexed by request ID
13    responses: HashMap<Uuid, Res>,
14}
15
16impl<Req, Res> Default for RequestQueue<Req, Res> {
17    fn default() -> Self {
18        Self::new()
19    }
20}
21
22impl<Req, Res> RequestQueue<Req, Res> {
23    /// Create a new request queue.
24    pub fn new() -> Self {
25        Self { requests: VecDeque::new(), responses: HashMap::new() }
26    }
27
28    /// Add a new request to the queue.
29    pub fn add_request(&mut self, request: Req) {
30        self.requests.push_back(request);
31    }
32
33    /// Check if the queue contains any pending requests matching the given ID.
34    pub fn has_request(&self, id: &Uuid) -> bool
35    where
36        Req: HasId,
37    {
38        self.requests.iter().any(|r| r.id() == id)
39    }
40
41    /// Read the next request from the queue without removing it.
42    pub fn read_request(&self) -> Option<&Req> {
43        self.requests.front()
44    }
45
46    /// Remove a request by its ID.
47    pub fn remove_request(&mut self, id: &Uuid) -> Option<Req>
48    where
49        Req: HasId,
50    {
51        if let Some(pos) = self.requests.iter().position(|r| r.id() == id) {
52            self.requests.remove(pos)
53        } else {
54            None
55        }
56    }
57
58    /// Add a response to the queue.
59    pub fn add_response(&mut self, id: Uuid, response: Res) {
60        self.responses.insert(id, response);
61    }
62
63    /// Get a response by its ID, removing it from the queue.
64    pub fn get_response(&mut self, id: &Uuid) -> Option<Res> {
65        self.responses.remove(id)
66    }
67}
68
69pub(crate) trait HasId {
70    fn id(&self) -> &Uuid;
71}
72
73impl<N: Network> HasId for BrowserTransactionRequest<N> {
74    fn id(&self) -> &Uuid {
75        &self.id
76    }
77}
78
79impl HasId for BrowserSignRequest {
80    fn id(&self) -> &Uuid {
81        &self.id
82    }
83}