use calimero_context::governance_broadcast::verify_readiness_beacon;
use calimero_context_client::local_governance::{ReadinessProbe, SignedReadinessBeacon};
use libp2p::PeerId;
use tracing::{debug, info};
use crate::readiness::{ApplyBeaconLocal, EmitOutOfCycleBeacon};
use crate::NodeManager;
pub(super) fn handle_readiness_beacon(
manager: &mut NodeManager,
_ctx: &mut actix::Context<NodeManager>,
_peer_id: PeerId,
beacon: SignedReadinessBeacon,
) {
if !verify_readiness_beacon(&manager.datastore, &beacon) {
debug!(
namespace_id = %hex::encode(beacon.namespace_id),
"ReadinessBeacon failed verification; dropping"
);
return;
}
let namespace_id = beacon.namespace_id;
let peer_pubkey = beacon.peer_pubkey;
let applied_through = beacon.applied_through;
let strong = beacon.strong;
manager.readiness_cache.insert(&beacon);
manager.readiness_notify.notify(namespace_id);
info!(
namespace_id = %hex::encode(namespace_id),
peer = %peer_pubkey,
applied_through,
strong,
"readiness beacon received"
);
if let Some(addr) = &manager.readiness_addr {
addr.do_send(ApplyBeaconLocal { namespace_id });
}
}
pub(super) fn handle_readiness_probe(
manager: &mut NodeManager,
_ctx: &mut actix::Context<NodeManager>,
peer_id: PeerId,
probe: ReadinessProbe,
) {
if let Some(addr) = &manager.readiness_addr {
addr.do_send(EmitOutOfCycleBeacon {
namespace_id: probe.namespace_id,
requesting_peer: peer_id,
});
}
}