this repo has no description
1use crate::state::AppState;
2use crate::sync::firehose::SequencedEvent;
3use crate::sync::frame::{CommitFrame, Frame, FrameData};
4use cid::Cid;
5use jacquard_repo::car::write_car_bytes;
6use jacquard_repo::storage::BlockStore;
7use std::str::FromStr;
8
9pub async fn format_event_for_sending(
10 state: &AppState,
11 event: SequencedEvent,
12) -> Result<Vec<u8>, anyhow::Error> {
13 let block_cids_str = event.blocks_cids.clone().unwrap_or_default();
14 let mut frame: CommitFrame = event.try_into()
15 .map_err(|e| anyhow::anyhow!("Invalid event: {}", e))?;
16
17 let car_bytes = if !block_cids_str.is_empty() {
18 let mut blocks = std::collections::BTreeMap::new();
19
20 for cid_str in block_cids_str {
21 let cid = Cid::from_str(&cid_str)?;
22 let data = state
23 .block_store
24 .get(&cid)
25 .await?
26 .ok_or_else(|| anyhow::anyhow!("Block not found: {}", cid))?;
27 blocks.insert(cid, data);
28 }
29
30 let root = Cid::from_str(&frame.commit)?;
31 write_car_bytes(root, blocks).await?
32 } else {
33 Vec::new()
34 };
35 frame.blocks = car_bytes;
36
37 let frame = Frame {
38 op: 1,
39 data: FrameData::Commit(Box::new(frame)),
40 };
41
42 let mut bytes = Vec::new();
43 serde_ipld_dagcbor::to_writer(&mut bytes, &frame)?;
44 Ok(bytes)
45}