use super::ReplayInput;
use crate::event::Event;
use crate::id::EntityIdType;
use crate::store::read_api::PayloadPlaintext;
use crate::store::{Store, StoreError};
pub(super) fn read_batch_key_aware<I, State>(
store: &Store<State>,
entity: &str,
positions: &[&crate::store::index::DiskPos],
) -> Result<Vec<Event<I::Payload>>, StoreError>
where
I: ReplayInput,
State: crate::store::StoreState,
{
let mut events = Vec::with_capacity(positions.len());
for pos in positions {
if let Some(event) = read_one_key_aware::<I, State>(store, entity, pos)? {
events.push(event);
}
}
Ok(events)
}
pub(super) fn read_one_key_aware<I, State>(
store: &Store<State>,
entity: &str,
pos: &crate::store::index::DiskPos,
) -> Result<Option<Event<I::Payload>>, StoreError>
where
I: ReplayInput,
State: crate::store::StoreState,
{
let raw = store.reader.read_entry_raw(pos)?;
let coordinate = raw.coordinate;
let header = raw.event.header;
let hash_chain = raw.event.hash_chain;
let payload_bytes = raw.event.payload;
let Some(meta) = header.payload_encryption.clone() else {
let payload = I::payload_from_plaintext_bytes(payload_bytes, header.event_kind)?;
return Ok(Some(Event {
header,
payload,
hash_chain,
}));
};
match store.open_encrypted_payload_bytes(
&coordinate,
header.event_kind,
header.event_id,
&meta,
&payload_bytes,
)? {
PayloadPlaintext::Shredded => {
tracing::warn!(
target: "batpak::projection",
flow = "project",
entity,
event_id = header.event_id.as_u128(),
"skipping a crypto-shredded event during projection replay; the projected \
state omits its effect (the payload key has been destroyed — plaintext gone)"
);
Ok(None)
}
PayloadPlaintext::Plaintext(plaintext) => {
let payload = I::payload_from_plaintext_bytes(plaintext, header.event_kind)?;
Ok(Some(Event {
header,
payload,
hash_chain,
}))
}
}
}