use super::Client;
use crate::client::Error;
use crate::elder_count;
use crate::messaging::{
data::{DataCmd, ServiceMsg},
ServiceAuth, WireMsg,
};
use crate::types::{PublicKey, Signature};
use bytes::Bytes;
use xor_name::XorName;
impl Client {
pub async fn send_signed_command(
&self,
dst_address: XorName,
client_pk: PublicKey,
serialised_cmd: Bytes,
signature: Signature,
targets: usize,
) -> Result<(), Error> {
let auth = ServiceAuth {
public_key: client_pk,
signature,
};
self.session
.send_cmd(dst_address, auth, serialised_cmd, targets)
.await
}
#[instrument(skip_all, level = "debug", name = "client-api send cmd")]
pub(crate) async fn send_cmd(&self, cmd: DataCmd) -> Result<(), Error> {
let client_pk = self.public_key();
let dst_name = cmd.dst_name();
let chunk_count = (elder_count() / 3) + 1;
let targets = match &cmd {
DataCmd::StoreChunk(_) => chunk_count, DataCmd::Register(_) => elder_count(), };
let serialised_cmd = {
let msg = ServiceMsg::Cmd(cmd);
WireMsg::serialize_msg_payload(&msg)?
};
let signature = self.keypair.sign(&serialised_cmd);
self.send_signed_command(dst_name, client_pk, serialised_cmd, signature, targets)
.await
}
}