holochain_core 0.0.52-alpha2

holochain core
use crate::{
    action::{Action, ActionWrapper, DirectMessageData},
    context::Context,
    instance::dispatch_action,
    network::{
        direct_message::DirectMessage,
        reducers::get_validation_package::GET_VALIDATION_PACKAGE_MESSAGE_TIMEOUT_MS,
    },
    nucleus::actions::{
        build_validation_package::build_validation_package, get_entry::get_entry_from_agent_chain,
    },
};

use holochain_core_types::signature::Provenance;
use holochain_persistence_api::cas::content::Address;
use std::{
    sync::Arc,
    time::{Duration, SystemTime},
    vec::Vec,
};

#[autotrace]
#[holochain_tracing_macros::newrelic_autotrace(HOLOCHAIN_CORE)]
pub fn respond_validation_package_request(
    to_agent_id: Address,
    msg_id: String,
    requested_entry_address: Address,
    context: Arc<Context>,
    provenances: Vec<Provenance>,
) {
    let maybe_validation_package =
        match get_entry_from_agent_chain(&context, &requested_entry_address) {
            Ok(Some(entry)) => build_validation_package(&entry, context.clone(), &provenances).ok(),
            _ => None,
        };

    if maybe_validation_package.is_some() {
        log_debug!(
            context,
            "workflows/validation: Sending validation package of entry {} to agent {}",
            requested_entry_address,
            to_agent_id
        );
    } else {
        log_debug!(context, "workflow/validation: Got request for validation package of unknown entry {} from agent {}!",
            requested_entry_address, to_agent_id
        );
    };

    let direct_message = DirectMessage::ValidationPackage(maybe_validation_package);
    let direct_message_data = DirectMessageData {
        address: to_agent_id,
        message: direct_message,
        msg_id,
        is_response: true,
    };

    // when responding to a validation package request we have to timeout the direct message
    let timeout = (
        SystemTime::now(),
        Duration::from_millis(GET_VALIDATION_PACKAGE_MESSAGE_TIMEOUT_MS),
    );
    let action_wrapper = ActionWrapper::new(Action::SendDirectMessage((
        direct_message_data,
        Some(timeout),
    )));
    dispatch_action(context.action_channel(), action_wrapper);
}