siera_cloudagent_python/cloudagent/
webhook.rs

1use 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    /// Listen to all incoming webhook
10    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 forever, parse message to stdout
25        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}