use bytes::Bytes;
use helix_core::effect::TransportId;
use helix_core::Effect;
pub fn ping_frame(seq: u64, roots: &[crate::sync_increment::RootCursor]) -> Effect {
let cursors: Vec<serde_json::Value> = roots
.iter()
.map(|rc| {
serde_json::json!({ "channelId": rc.channel_id.as_str(), "fromSeq": rc.from_seq.0 })
})
.collect();
let mut data = serde_json::json!({ "cursors": cursors });
if !roots.is_empty() {
data["allHash"] = serde_json::Value::String(crate::sync_increment::all_hash_fnv1a(roots));
}
let payload = serde_json::json!({ "action": "ping", "seq": seq, "data": data });
let bytes = Bytes::from(
serde_json::to_vec(&payload).expect("ping_frame: static JSON shape must not fail"),
);
Effect::Send {
transport: TransportId::from_raw(0),
frame: bytes,
}
}