sending and receiving message via Rhai script + added examples
Some checks failed
Rhai Tests / Run Rhai Tests (push) Has been cancelled
Rhai Tests / Run Rhai Tests (pull_request) Has been cancelled

This commit is contained in:
Maxime Van Hees
2025-05-15 17:30:20 +02:00
parent 3e64a53a83
commit 9a23c4cc09
4 changed files with 97 additions and 38 deletions

View File

@@ -222,7 +222,7 @@ pub async fn list_fallback_routes(api_url: &str) -> Result<Value, String> {
/// * `destination` - The destination address
/// * `topic` - The message topic
/// * `message` - The message content
/// * `deadline_secs` - The deadline in seconds
/// * `reply_deadline` - The deadline in seconds; pass `-1` to indicate we do not want to wait on a reply
///
/// # Returns
///
@@ -232,20 +232,21 @@ pub async fn send_message(
destination: &str,
topic: &str,
message: &str,
deadline_secs: u64,
reply_deadline: Option<Duration>, // This is passed in URL query
) -> Result<Value, String> {
let client = Client::new();
let url = format!("{}/api/v1/messages", api_url);
// Convert deadline to seconds
let deadline = Duration::from_secs(deadline_secs).as_secs();
let mut request = client.post(&url);
if let Some(deadline) = reply_deadline {
request = request.query(&[("reply_timeout", deadline.as_secs())]);
}
let response = client
.post(&url)
let response = request
.json(&serde_json::json!({
"dst": { "ip": destination },
"topic": general_purpose::STANDARD.encode(topic),
"payload": general_purpose::STANDARD.encode(message)
"dst": { "ip": destination },
"topic": general_purpose::STANDARD.encode(topic),
"payload": general_purpose::STANDARD.encode(message)
}))
.send()
.await
@@ -270,18 +271,31 @@ pub async fn send_message(
///
/// * `api_url` - The URL of the Mycelium API
/// * `topic` - The message topic
/// * `count` - The maximum number of messages to receive
/// * `wait_deadline` - Time we wait for receiving a message
///
/// # Returns
///
/// * `Result<Value, String>` - The received messages as a JSON value, or an error message
pub async fn receive_messages(api_url: &str, topic: &str, count: u32) -> Result<Value, String> {
pub async fn receive_messages(
api_url: &str,
topic: &str,
wait_deadline: Option<Duration>,
) -> Result<Value, String> {
let client = Client::new();
let url = format!("{}/api/v1/messages", api_url);
let response = client
.get(&url)
.query(&[("topic", general_purpose::STANDARD.encode(topic))])
let mut request = client.get(&url);
if let Some(deadline) = wait_deadline {
request = request.query(&[
("topic", general_purpose::STANDARD.encode(topic)),
("timeout", deadline.as_secs().to_string()),
])
} else {
request = request.query(&[("topic", general_purpose::STANDARD.encode(topic))])
};
let response = request
.send()
.await
.map_err(|e| format!("Failed to send request: {}", e))?;