atm0s_sdn_node_alias/
sdk.rs1use 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}