tap_node/message/
router.rs1use log::debug;
6use std::sync::Arc;
7use tap_agent::Agent;
8use tap_msg::didcomm::PlainMessage;
9
10use crate::agent::AgentRegistry;
11use crate::error::{Error, Result};
12use crate::message::PlainMessageRouter;
13
14#[derive(Debug, Clone)]
16pub struct DefaultPlainMessageRouter {
17 agents: Option<Arc<AgentRegistry>>,
19}
20
21impl Default for DefaultPlainMessageRouter {
22 fn default() -> Self {
23 Self::new()
24 }
25}
26
27impl DefaultPlainMessageRouter {
28 pub fn new() -> Self {
30 Self { agents: None }
31 }
32
33 pub fn with_agents(mut self, agents: Arc<AgentRegistry>) -> Self {
35 self.agents = Some(agents);
36 self
37 }
38}
39
40impl PlainMessageRouter for DefaultPlainMessageRouter {
41 fn route_message_impl(&self, message: &PlainMessage) -> Result<String> {
42 if !message.to.is_empty() {
44 {
45 let to_did = message.to[0].clone();
47
48 if let Some(agents) = &self.agents {
50 if agents.has_agent(&to_did) {
51 debug!("Routing message to: {}", to_did);
52 return Ok(to_did);
53 }
54 } else {
55 debug!("No agent registry available, routing to: {}", to_did);
57 return Ok(to_did);
58 }
59 }
60 }
61
62 Err(Error::Dispatch(format!(
64 "No route found for message: {}",
65 message.id
66 )))
67 }
68}
69
70#[derive(Debug, Default)]
72pub struct CompositePlainMessageRouter {
73 routers: Vec<crate::message::PlainMessageRouterType>,
75}
76
77impl CompositePlainMessageRouter {
78 pub fn new() -> Self {
80 Self::default()
81 }
82
83 pub fn add_router(&mut self, router: crate::message::PlainMessageRouterType) {
85 self.routers.push(router);
86 }
87}
88
89impl PlainMessageRouter for CompositePlainMessageRouter {
90 fn route_message_impl(&self, message: &PlainMessage) -> Result<String> {
91 for router in &self.routers {
93 match router {
94 crate::message::PlainMessageRouterType::Default(r) => {
95 match r.route_message_impl(message) {
96 Ok(target) => return Ok(target),
97 Err(_) => continue, }
99 }
100 crate::message::PlainMessageRouterType::IntraNode(r) => {
101 match r.route_message_impl(message) {
102 Ok(target) => return Ok(target),
103 Err(_) => continue, }
105 }
106 }
107 }
108
109 Err(Error::Dispatch(format!(
111 "No route found for message: {}",
112 message.id
113 )))
114 }
115}
116
117#[derive(Debug, Clone)]
119pub struct IntraNodePlainMessageRouter {
120 agents: Option<Arc<AgentRegistry>>,
122}
123
124impl Default for IntraNodePlainMessageRouter {
125 fn default() -> Self {
126 Self::new()
127 }
128}
129
130impl IntraNodePlainMessageRouter {
131 pub fn new() -> Self {
133 Self { agents: None }
134 }
135
136 pub fn with_agents(mut self, agents: Arc<AgentRegistry>) -> Self {
138 self.agents = Some(agents);
139 self
140 }
141
142 async fn route_to_local_agents(&self, message: &PlainMessage) -> Result<Vec<String>> {
144 let mut local_recipients = Vec::new();
145
146 if let Some(agents) = &self.agents {
147 for recipient in &message.to {
149 if agents.has_agent(recipient) {
150 local_recipients.push(recipient.clone());
151 }
152 }
153 }
154
155 Ok(local_recipients)
156 }
157
158 pub async fn deliver_to_local_agents(&self, message: &PlainMessage) -> Result<()> {
160 if let Some(agents) = &self.agents {
161 let local_recipients = self.route_to_local_agents(message).await?;
162
163 for recipient_did in local_recipients {
164 if let Ok(agent) = agents.get_agent(&recipient_did).await {
165 if let Err(e) = agent.receive_plain_message(message.clone()).await {
167 log::warn!(
168 "Failed to deliver message {} to local agent {}: {}",
169 message.id,
170 recipient_did,
171 e
172 );
173 } else {
174 log::debug!(
175 "Delivered message {} to local agent {}",
176 message.id,
177 recipient_did
178 );
179 }
180 }
181 }
182 }
183
184 Ok(())
185 }
186}
187
188impl PlainMessageRouter for IntraNodePlainMessageRouter {
189 fn route_message_impl(&self, message: &PlainMessage) -> Result<String> {
190 if let Some(agents) = &self.agents {
192 for recipient in &message.to {
193 if agents.has_agent(recipient) {
194 debug!("Routing message to local agent: {}", recipient);
195 return Ok(recipient.clone());
196 }
197 }
198 }
199
200 Err(Error::Dispatch(format!(
202 "No local agents found for message: {}",
203 message.id
204 )))
205 }
206}