From b7c342710a1e607d9af50f233c4d2ca5b0cda87b Mon Sep 17 00:00:00 2001 From: Aleksey Proshutisnkiy Date: Mon, 13 Feb 2023 19:01:20 +0400 Subject: [PATCH] feat(spells): support -relay- for spell scripts [NET-374] (#1461) --- crates/particle-node-tests/tests/spells.rs | 39 +++++++++++++++++++++- sorcerer/src/sorcerer.rs | 10 ++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/crates/particle-node-tests/tests/spells.rs b/crates/particle-node-tests/tests/spells.rs index b637603a4c..3574dcaf2c 100644 --- a/crates/particle-node-tests/tests/spells.rs +++ b/crates/particle-node-tests/tests/spells.rs @@ -177,7 +177,7 @@ fn spell_args_test() { let mut config = TriggerConfig::default(); config.clock.period_sec = 1; config.clock.start_sec = 1; - let expected_value = json! ({"a": "b", "c": 1}); + let expected_value = json!({"a": "b", "c": 1}); create_spell( &mut client, &script, @@ -1007,6 +1007,7 @@ fn spell_peer_id_test() { assert_eq!(result, scope_peer_id); } + #[test] fn spell_update_config() { let swarms = make_swarms(1); @@ -1245,3 +1246,39 @@ fn resolve_global_alias() { assert_eq!(*resolved, tetraplets_service.id); } } + +#[test] +fn spell_relay_id_test() { + let swarms = make_swarms(1); + let mut client = ConnectedClient::connect_to(swarms[0].multiaddr.clone()) + .wrap_err("connect client") + .unwrap(); + + let script = format!( + r#" + (seq + (seq + (call %init_peer_id% ("getDataSrv" "-relay-") [] -relay-) + (call -relay- ("op" "identity") [-relay-] also_relay) + ) + (call "{}" ("return" "") [also_relay]) + )"#, + client.peer_id + ); + + let mut config = TriggerConfig::default(); + config.clock.period_sec = 1; + config.clock.start_sec = 1; + create_spell(&mut client, &script, config, json!({})); + + if let [JValue::String(relay_id)] = client + .receive_args() + .wrap_err("receive") + .unwrap() + .as_slice() + { + assert_eq!(*relay_id, client.node.to_base58()); + } else { + panic!("expected one string result") + } +} diff --git a/sorcerer/src/sorcerer.rs b/sorcerer/src/sorcerer.rs index 1780b1688a..3f92890f68 100644 --- a/sorcerer/src/sorcerer.rs +++ b/sorcerer/src/sorcerer.rs @@ -20,6 +20,7 @@ use std::time::Duration; use async_std::task::{spawn, JoinHandle}; use fluence_spell_dtos::trigger_config::TriggerConfigValue; use futures::{FutureExt, StreamExt}; +use serde_json::Value; use aquamarine::AquamarineApi; use fluence_libp2p::types::Inlet; @@ -167,6 +168,7 @@ impl Sorcerer { let mut get_data_srv = SpellBuiltin::new("getDataSrv"); get_data_srv.append("spell_id", self.make_get_spell_id_closure().into()); + get_data_srv.append("-relay-", self.make_get_relay_closure().into()); get_data_srv.set_unhandled(self.make_get_spell_arg_closure().into()); spell_builtins.push(get_data_srv); @@ -254,6 +256,14 @@ impl Sorcerer { Box::new(move |_, params| async move { wrap(get_spell_id(params)) }.boxed()) } + fn make_get_relay_closure(&self) -> ServiceFunctionImmut { + let relay_peer_id = self.key_manager.get_host_peer_id().to_base58(); + Box::new(move |_, _| { + let relay = relay_peer_id.clone(); + async move { wrap(Ok(Value::String(relay))) }.boxed() + }) + } + fn make_get_spell_arg_closure(&self) -> ServiceFunctionImmut { let services = self.services.clone(); Box::new(move |args, params| {