use crate::state::AppState; use crate::sync::firehose::SequencedEvent; use crate::sync::frame::{CommitFrame, Frame, FrameData}; use cid::Cid; use jacquard_repo::car::write_car; use jacquard_repo::storage::BlockStore; use std::fs; use std::str::FromStr; use tokio::fs::File; use tokio::io::AsyncReadExt; use uuid::Uuid; pub async fn format_event_for_sending( state: &AppState, event: SequencedEvent, ) -> Result, anyhow::Error> { let block_cids_str = event.blocks_cids.clone().unwrap_or_default(); let mut frame: CommitFrame = event.into(); let mut car_bytes = Vec::new(); if !block_cids_str.is_empty() { let temp_path = format!("/tmp/{}.car", Uuid::new_v4()); let mut blocks = std::collections::BTreeMap::new(); for cid_str in block_cids_str { let cid = Cid::from_str(&cid_str)?; let data = state .block_store .get(&cid) .await? .ok_or_else(|| anyhow::anyhow!("Block not found: {}", cid))?; blocks.insert(cid, data); } let root = Cid::from_str(&frame.commit)?; write_car(&temp_path, vec![root], blocks).await?; let mut file = File::open(&temp_path).await?; file.read_to_end(&mut car_bytes).await?; fs::remove_file(&temp_path)?; } frame.blocks = car_bytes; let frame = Frame { op: 1, data: FrameData::Commit(Box::new(frame)), }; let mut bytes = Vec::new(); serde_ipld_dagcbor::to_writer(&mut bytes, &frame)?; Ok(bytes) }