siera_cloudagent_python/cloudagent/
webhook.rs1use crate::agent::CloudAgentPython;
2use async_trait::async_trait;
3use siera_agent::error::{Error, Result};
4use siera_agent::modules::webhook::WebhookModule;
5use tungstenite::connect;
6
7#[async_trait]
8impl WebhookModule for CloudAgentPython {
9 async fn listen(&self, on_event: fn(serde_json::Value)) -> Result<()> {
11 let (uses_tls, stripped_agent_url) = match &self.endpoint {
12 s if s.starts_with("http://") => (false, &s[7..]),
13 s if s.starts_with("https://") => (true, &s[8..]),
14 s => return Err(Error::InvalidAgentUrl(s.clone()).into()),
15 };
16
17 let scheme = if uses_tls { "wss" } else { "ws" };
18
19 let listen_url = format!("{scheme}://{stripped_agent_url}/ws");
20 info!({ "message": format!("Listening on {listen_url}") });
21
22 let (mut socket, _response) = connect(listen_url)?;
23
24 loop {
26 let message = socket.read()?;
27 let parsed: serde_json::Value = serde_json::from_str(&message.to_string())?;
28 on_event(parsed);
29 }
30 }
31}