#![deny(missing_docs)]
use holo_hash::*;
use holochain_serialized_bytes::prelude::*;
use holochain_types::prelude::*;
use std::sync::Arc;
mod types;
pub use types::actor::HolochainP2pRef;
pub use types::actor::HolochainP2pSender;
pub use types::AgentPubKeyExt; pub use types::*;
mod spawn;
use ghost_actor::dependencies::tracing;
use ghost_actor::dependencies::tracing_futures::Instrument;
pub use spawn::*;
pub use test::stub_network;
pub use test::HolochainP2pDnaFixturator;
pub use kitsune_p2p;
#[mockall::automock]
#[async_trait::async_trait]
pub trait HolochainP2pDnaT {
fn dna_hash(&self) -> DnaHash;
async fn join(
&self,
agent: AgentPubKey,
initial_arc: Option<crate::dht_arc::DhtArc>,
) -> actor::HolochainP2pResult<()>;
async fn leave(&self, agent: AgentPubKey) -> actor::HolochainP2pResult<()>;
async fn call_remote(
&self,
from_agent: AgentPubKey,
to_agent: AgentPubKey,
zome_name: ZomeName,
fn_name: FunctionName,
cap_secret: Option<CapSecret>,
payload: ExternIO,
) -> actor::HolochainP2pResult<SerializedBytes>;
async fn remote_signal(
&self,
from_agent: AgentPubKey,
to_agent_list: Vec<AgentPubKey>,
zome_name: ZomeName,
fn_name: FunctionName,
cap: Option<CapSecret>,
payload: ExternIO,
) -> actor::HolochainP2pResult<()>;
#[allow(clippy::ptr_arg)]
async fn publish(
&self,
request_validation_receipt: bool,
countersigning_session: bool,
dht_hash: holo_hash::AnyDhtHash,
ops: Vec<holochain_types::dht_op::DhtOp>,
timeout_ms: Option<u64>,
) -> actor::HolochainP2pResult<usize>;
async fn get_validation_package(
&self,
request_from: AgentPubKey,
action_hash: ActionHash,
) -> actor::HolochainP2pResult<ValidationPackageResponse>;
async fn get(
&self,
dht_hash: holo_hash::AnyDhtHash,
options: actor::GetOptions,
) -> actor::HolochainP2pResult<Vec<WireOps>>;
async fn get_meta(
&self,
dht_hash: holo_hash::AnyDhtHash,
options: actor::GetMetaOptions,
) -> actor::HolochainP2pResult<Vec<MetadataSet>>;
async fn get_links(
&self,
link_key: WireLinkKey,
options: actor::GetLinksOptions,
) -> actor::HolochainP2pResult<Vec<WireLinkOps>>;
async fn get_agent_activity(
&self,
agent: AgentPubKey,
query: ChainQueryFilter,
options: actor::GetActivityOptions,
) -> actor::HolochainP2pResult<Vec<AgentActivityResponse<ActionHash>>>;
async fn must_get_agent_activity(
&self,
author: AgentPubKey,
filter: holochain_zome_types::chain::ChainFilter,
) -> actor::HolochainP2pResult<Vec<MustGetAgentActivityResponse>>;
async fn send_validation_receipt(
&self,
to_agent: AgentPubKey,
receipt: SerializedBytes,
) -> actor::HolochainP2pResult<()>;
async fn authority_for_hash(
&self,
dht_hash: holo_hash::AnyDhtHash,
) -> actor::HolochainP2pResult<bool>;
async fn countersigning_session_negotiation(
&self,
agents: Vec<AgentPubKey>,
message: event::CountersigningSessionNegotiationMessage,
) -> actor::HolochainP2pResult<()>;
async fn new_integrated_data(&self) -> actor::HolochainP2pResult<()>;
}
#[derive(Clone)]
pub struct HolochainP2pDna {
sender: ghost_actor::GhostSender<actor::HolochainP2p>,
dna_hash: Arc<DnaHash>,
}
#[async_trait::async_trait]
impl HolochainP2pDnaT for HolochainP2pDna {
fn dna_hash(&self) -> DnaHash {
(*self.dna_hash).clone()
}
async fn join(
&self,
agent: AgentPubKey,
initial_arc: Option<crate::dht_arc::DhtArc>,
) -> actor::HolochainP2pResult<()> {
self.sender
.join((*self.dna_hash).clone(), agent, initial_arc)
.await
}
async fn leave(&self, agent: AgentPubKey) -> actor::HolochainP2pResult<()> {
self.sender.leave((*self.dna_hash).clone(), agent).await
}
async fn call_remote(
&self,
from_agent: AgentPubKey,
to_agent: AgentPubKey,
zome_name: ZomeName,
fn_name: FunctionName,
cap_secret: Option<CapSecret>,
payload: ExternIO,
) -> actor::HolochainP2pResult<SerializedBytes> {
self.sender
.call_remote(
(*self.dna_hash).clone(),
from_agent,
to_agent,
zome_name,
fn_name,
cap_secret,
payload,
)
.await
}
async fn remote_signal(
&self,
from_agent: AgentPubKey,
to_agent_list: Vec<AgentPubKey>,
zome_name: ZomeName,
fn_name: FunctionName,
cap: Option<CapSecret>,
payload: ExternIO,
) -> actor::HolochainP2pResult<()> {
self.sender
.remote_signal(
(*self.dna_hash).clone(),
from_agent,
to_agent_list,
zome_name,
fn_name,
cap,
payload,
)
.await
}
async fn publish(
&self,
request_validation_receipt: bool,
countersigning_session: bool,
dht_hash: holo_hash::AnyDhtHash,
ops: Vec<holochain_types::dht_op::DhtOp>,
timeout_ms: Option<u64>,
) -> actor::HolochainP2pResult<usize> {
self.sender
.publish(
(*self.dna_hash).clone(),
request_validation_receipt,
countersigning_session,
dht_hash,
ops,
timeout_ms,
)
.await
}
async fn get_validation_package(
&self,
request_from: AgentPubKey,
action_hash: ActionHash,
) -> actor::HolochainP2pResult<ValidationPackageResponse> {
self.sender
.get_validation_package(actor::GetValidationPackage {
dna_hash: (*self.dna_hash).clone(),
request_from,
action_hash,
})
.await
}
async fn get(
&self,
dht_hash: holo_hash::AnyDhtHash,
options: actor::GetOptions,
) -> actor::HolochainP2pResult<Vec<WireOps>> {
self.sender
.get((*self.dna_hash).clone(), dht_hash, options)
.instrument(tracing::debug_span!("HolochainP2p::get"))
.await
}
async fn get_meta(
&self,
dht_hash: holo_hash::AnyDhtHash,
options: actor::GetMetaOptions,
) -> actor::HolochainP2pResult<Vec<MetadataSet>> {
self.sender
.get_meta((*self.dna_hash).clone(), dht_hash, options)
.await
}
async fn get_links(
&self,
link_key: WireLinkKey,
options: actor::GetLinksOptions,
) -> actor::HolochainP2pResult<Vec<WireLinkOps>> {
self.sender
.get_links((*self.dna_hash).clone(), link_key, options)
.await
}
async fn get_agent_activity(
&self,
agent: AgentPubKey,
query: ChainQueryFilter,
options: actor::GetActivityOptions,
) -> actor::HolochainP2pResult<Vec<AgentActivityResponse<ActionHash>>> {
self.sender
.get_agent_activity((*self.dna_hash).clone(), agent, query, options)
.await
}
async fn must_get_agent_activity(
&self,
author: AgentPubKey,
filter: holochain_zome_types::chain::ChainFilter,
) -> actor::HolochainP2pResult<Vec<MustGetAgentActivityResponse>> {
self.sender
.must_get_agent_activity((*self.dna_hash).clone(), author, filter)
.await
}
async fn send_validation_receipt(
&self,
to_agent: AgentPubKey,
receipt: SerializedBytes,
) -> actor::HolochainP2pResult<()> {
self.sender
.send_validation_receipt((*self.dna_hash).clone(), to_agent, receipt)
.await
}
async fn authority_for_hash(
&self,
dht_hash: holo_hash::AnyDhtHash,
) -> actor::HolochainP2pResult<bool> {
self.sender
.authority_for_hash((*self.dna_hash).clone(), dht_hash)
.await
}
async fn countersigning_session_negotiation(
&self,
agents: Vec<AgentPubKey>,
message: event::CountersigningSessionNegotiationMessage,
) -> actor::HolochainP2pResult<()> {
self.sender
.countersigning_session_negotiation((*self.dna_hash).clone(), agents, message)
.await
}
async fn new_integrated_data(&self) -> actor::HolochainP2pResult<()> {
self.sender
.new_integrated_data((*self.dna_hash).clone())
.await
}
}
pub use kitsune_p2p::dht;
pub use kitsune_p2p::dht_arc;
mod test;