atm0s_sdn_node_alias/
sdk.rs

1use std::{collections::VecDeque, sync::Arc};
2
3use atm0s_sdn_identity::NodeId;
4use atm0s_sdn_utils::awaker::Awaker;
5use parking_lot::Mutex;
6
7use crate::{msg::SdkControl, NodeAliasId};
8
9#[derive(Debug, PartialEq)]
10pub enum NodeAliasResult {
11    FromLocal,
12    FromHint(NodeId),
13    FromScan(NodeId),
14}
15
16#[derive(Debug, PartialEq)]
17pub enum NodeAliasError {
18    Timeout,
19}
20
21#[derive(Clone, Default)]
22pub struct NodeAliasSdk {
23    sdk_control_queue: Arc<Mutex<VecDeque<SdkControl>>>,
24    awaker: Arc<Mutex<Option<Arc<dyn Awaker>>>>,
25}
26
27impl NodeAliasSdk {
28    pub(crate) fn set_awaker(&self, awaker: Arc<dyn Awaker>) {
29        *self.awaker.lock() = Some(awaker);
30    }
31
32    pub fn register(&self, alias: NodeAliasId) {
33        log::info!("[NodeAliasSdk] Register alias: {}", alias);
34        self.sdk_control_queue.lock().push_back(SdkControl::Register(alias));
35        if let Some(awaker) = &*self.awaker.lock() {
36            awaker.notify();
37        }
38    }
39
40    pub fn unregister(&self, alias: NodeAliasId) {
41        log::info!("[NodeAliasSdk] Unregister alias: {}", alias);
42        self.sdk_control_queue.lock().push_back(SdkControl::Unregister(alias));
43        if let Some(awaker) = &*self.awaker.lock() {
44            awaker.notify();
45        }
46    }
47
48    pub fn find_alias(&self, alias: NodeAliasId, handler: Box<dyn FnOnce(Result<NodeAliasResult, NodeAliasError>) + Send>) {
49        log::info!("[NodeAliasSdk] Find alias: {}", alias);
50        self.sdk_control_queue.lock().push_back(SdkControl::Query(alias, handler));
51        if let Some(awaker) = &*self.awaker.lock() {
52            awaker.notify();
53        }
54    }
55
56    pub(crate) fn pop_control(&self) -> Option<SdkControl> {
57        self.sdk_control_queue.lock().pop_front()
58    }
59}