channels
This commit is contained in:
		
							parent
							
								
									46ae6f0163
								
							
						
					
					
						commit
						e3611ee15a
					
				
					 2 changed files with 57 additions and 29 deletions
				
			
		| 
						 | 
				
			
			@ -3,6 +3,7 @@ use std::fmt::{Debug, Display};
 | 
			
		|||
use anyhow::{anyhow, Result};
 | 
			
		||||
use bytes::Bytes;
 | 
			
		||||
use futures::Stream;
 | 
			
		||||
use tokio::sync::mpsc;
 | 
			
		||||
use tokio_stream::StreamExt;
 | 
			
		||||
 | 
			
		||||
#[derive(Clone)]
 | 
			
		||||
| 
						 | 
				
			
			@ -41,22 +42,10 @@ impl TryFrom<&str> for Subject {
 | 
			
		|||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug)]
 | 
			
		||||
pub struct Subscriber {
 | 
			
		||||
    subject: Subject,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug)]
 | 
			
		||||
pub struct Publisher {
 | 
			
		||||
    subject: Subject,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug)]
 | 
			
		||||
pub struct Message {
 | 
			
		||||
    subject: Subject,
 | 
			
		||||
    payload: Bytes,
 | 
			
		||||
    subscribers: Vec<Subscriber>,
 | 
			
		||||
    publishers: Vec<Publisher>,
 | 
			
		||||
    reply: Option<async_nats::Subject>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -67,8 +56,6 @@ impl Message {
 | 
			
		|||
 | 
			
		||||
        Ok(Message {
 | 
			
		||||
            subject,
 | 
			
		||||
            subscribers: Vec::default(),
 | 
			
		||||
            publishers: Vec::default(),
 | 
			
		||||
            payload: msg.payload,
 | 
			
		||||
            reply: msg.reply,
 | 
			
		||||
        })
 | 
			
		||||
| 
						 | 
				
			
			@ -89,6 +76,17 @@ impl Message {
 | 
			
		|||
            reply: None,
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    async fn open_subchannels(&self, client: &Client, sender: mpsc::Sender<Self>) {
 | 
			
		||||
        match self.subject {
 | 
			
		||||
            Subject::OpenTerminal => {
 | 
			
		||||
                // let subject = format!("agents.v1.{}.terminal.{}.input");
 | 
			
		||||
                // client.nats.subscribe(subject).await;
 | 
			
		||||
                // sender.send(message).await.unwrap();
 | 
			
		||||
            }
 | 
			
		||||
            _ => {}
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Client {
 | 
			
		||||
| 
						 | 
				
			
			@ -124,14 +122,28 @@ impl Client {
 | 
			
		|||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub async fn subscribe(&self) -> Result<impl Stream<Item = Message>> {
 | 
			
		||||
    pub async fn messages_channel(&self) -> Result<mpsc::Receiver<Message>> {
 | 
			
		||||
        let subject = format!("agents.v1.{}.*", self.id);
 | 
			
		||||
        let (sender, receiver) = mpsc::channel(100);
 | 
			
		||||
        let mut stream = self.subscribe(subject).await?;
 | 
			
		||||
 | 
			
		||||
        let subscriber = self
 | 
			
		||||
        let self_clone = self.clone();
 | 
			
		||||
        tokio::spawn(async move {
 | 
			
		||||
            while let Some(msg) = stream.next().await {
 | 
			
		||||
                self_clone.clone().open_subchannels(&msg).await;
 | 
			
		||||
                sender.send(msg).await.unwrap();
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        Ok(receiver)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    async fn subscribe(&self, subject: String) -> Result<impl Stream<Item = Message>> {
 | 
			
		||||
        let stream = self
 | 
			
		||||
            .nats
 | 
			
		||||
            .subscribe(subject.clone())
 | 
			
		||||
            .await?
 | 
			
		||||
            .filter_map(move |data| match Message::from_transport(data) {
 | 
			
		||||
            .filter_map(|data| match Message::from_transport(data) {
 | 
			
		||||
                Ok(msg) => Some(msg),
 | 
			
		||||
                Err(err) => {
 | 
			
		||||
                    tracing::warn!("{}", err);
 | 
			
		||||
| 
						 | 
				
			
			@ -139,14 +151,33 @@ impl Client {
 | 
			
		|||
                }
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
        // let channel = sync::broadcast::channel(10);
 | 
			
		||||
        // while let Some(message) = subscriber.next().await {
 | 
			
		||||
        //     let subscriptions = self.further_subscriptions(message.subject).await;
 | 
			
		||||
        // }
 | 
			
		||||
        tracing::debug!("subscribed on {}", subject);
 | 
			
		||||
 | 
			
		||||
        tracing::debug!("subscribed on {}", &subject);
 | 
			
		||||
        Ok(stream)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
        Ok(subscriber)
 | 
			
		||||
    async fn open_subchannels(self, message: &Message, sender: mpsc::Sender<Message>) {
 | 
			
		||||
        match message.subject {
 | 
			
		||||
            Subject::OpenTerminal => {
 | 
			
		||||
                let terminal_id = "test";
 | 
			
		||||
                let stream = self
 | 
			
		||||
                    .subscribe(format!(
 | 
			
		||||
                        "agents.v1.{}.terminal.{}.input",
 | 
			
		||||
                        self.id, terminal_id
 | 
			
		||||
                    ))
 | 
			
		||||
                    .await
 | 
			
		||||
                    .unwrap();
 | 
			
		||||
            }
 | 
			
		||||
            _ => {}
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn send_messages_from_stream(self, stream: impl Stream<Item = Message> + Send + Unpin) {
 | 
			
		||||
        tokio::spawn(async {
 | 
			
		||||
            // while let Some(msg) = stream.next().await {
 | 
			
		||||
            //
 | 
			
		||||
            // }
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -47,15 +47,12 @@ where
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
pub async fn init_services(client: crate::messaging::Client) -> anyhow::Result<()> {
 | 
			
		||||
    let mut message_stream = client
 | 
			
		||||
        .subscribe()
 | 
			
		||||
        .await
 | 
			
		||||
        .context("could not initialize services system")?;
 | 
			
		||||
    let mut recv = client.messages_channel().await?;
 | 
			
		||||
 | 
			
		||||
    tokio::spawn(async move {
 | 
			
		||||
        while let Some(message) = message_stream.next().await {
 | 
			
		||||
        while let Some(msg) = recv.recv().await {
 | 
			
		||||
            // TODO: How do i handle this error?
 | 
			
		||||
            if let Err(err) = route_message(message).await {
 | 
			
		||||
            if let Err(err) = route_message(msg).await {
 | 
			
		||||
                tracing::warn!("{}", err);
 | 
			
		||||
            };
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue