#![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::HolochainP2pCellFixturator;
pub use kitsune_p2p;
#[mockall::automock]
#[async_trait::async_trait]
pub trait HolochainP2pCellT {
fn dna_hash(&self) -> DnaHash;
fn from_agent(&self) -> AgentPubKey;
fn cell_id(&self) -> CellId {
CellId::new(self.dna_hash(), self.from_agent())
}
async fn join(&self) -> actor::HolochainP2pResult<()>;
async fn leave(&self) -> actor::HolochainP2pResult<()>;
async fn call_remote(
&self,
to_agent: AgentPubKey,
zome_name: ZomeName,
fn_name: FunctionName,
cap: Option<CapSecret>,
payload: ExternIO,
) -> actor::HolochainP2pResult<SerializedBytes>;
#[allow(clippy::ptr_arg)]
async fn publish(
&self,
request_validation_receipt: bool,
countersigning_session: bool,
dht_hash: holo_hash::AnyDhtHash,
ops: Vec<(holo_hash::DhtOpHash, holochain_types::dht_op::DhtOp)>,
timeout_ms: Option<u64>,
) -> actor::HolochainP2pResult<()>;
async fn get_validation_package(
&self,
request_from: AgentPubKey,
header_hash: HeaderHash,
) -> 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<HeaderHash>>>;
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_authority_response(
&self,
agents: Vec<AgentPubKey>,
response: Vec<SignedHeader>,
) -> actor::HolochainP2pResult<()>;
async fn new_integrated_data(&self) -> actor::HolochainP2pResult<()>;
}
#[derive(Clone)]
pub struct HolochainP2pCell {
sender: ghost_actor::GhostSender<actor::HolochainP2p>,
dna_hash: Arc<DnaHash>,
from_agent: Arc<AgentPubKey>,
}
#[async_trait::async_trait]
impl HolochainP2pCellT for HolochainP2pCell {
fn dna_hash(&self) -> DnaHash {
(*self.dna_hash).clone()
}
fn from_agent(&self) -> AgentPubKey {
(*self.from_agent).clone()
}
async fn join(&self) -> actor::HolochainP2pResult<()> {
self.sender
.join((*self.dna_hash).clone(), (*self.from_agent).clone())
.await
}
async fn leave(&self) -> actor::HolochainP2pResult<()> {
self.sender
.leave((*self.dna_hash).clone(), (*self.from_agent).clone())
.await
}
async fn call_remote(
&self,
to_agent: AgentPubKey,
zome_name: ZomeName,
fn_name: FunctionName,
cap: Option<CapSecret>,
payload: ExternIO,
) -> actor::HolochainP2pResult<SerializedBytes> {
self.sender
.call_remote(
(*self.dna_hash).clone(),
(*self.from_agent).clone(),
to_agent,
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<(holo_hash::DhtOpHash, holochain_types::dht_op::DhtOp)>,
timeout_ms: Option<u64>,
) -> actor::HolochainP2pResult<()> {
self.sender
.publish(
(*self.dna_hash).clone(),
(*self.from_agent).clone(),
request_validation_receipt,
countersigning_session,
dht_hash,
ops,
timeout_ms,
)
.await
}
async fn get_validation_package(
&self,
request_from: AgentPubKey,
header_hash: HeaderHash,
) -> actor::HolochainP2pResult<ValidationPackageResponse> {
self.sender
.get_validation_package(actor::GetValidationPackage {
dna_hash: (*self.dna_hash).clone(),
agent_pub_key: (*self.from_agent).clone(),
request_from,
header_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(),
(*self.from_agent).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(),
(*self.from_agent).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(),
(*self.from_agent).clone(),
link_key,
options,
)
.await
}
async fn get_agent_activity(
&self,
agent: AgentPubKey,
query: ChainQueryFilter,
options: actor::GetActivityOptions,
) -> actor::HolochainP2pResult<Vec<AgentActivityResponse<HeaderHash>>> {
self.sender
.get_agent_activity(
(*self.dna_hash).clone(),
(*self.from_agent).clone(),
agent,
query,
options,
)
.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,
(*self.from_agent).clone(),
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(),
(*self.from_agent).clone(),
dht_hash,
)
.await
}
async fn countersigning_authority_response(
&self,
agents: Vec<AgentPubKey>,
response: Vec<SignedHeader>,
) -> actor::HolochainP2pResult<()> {
self.sender
.countersigning_authority_response(
(*self.dna_hash).clone(),
(*self.from_agent).clone(),
agents,
response,
)
.await
}
async fn new_integrated_data(&self) -> actor::HolochainP2pResult<()> {
self.sender
.new_integrated_data((*self.dna_hash).clone())
.await
}
}
pub use kitsune_p2p::dht_arc;
mod test;