use crate::http_envelope::unwrap_sync_envelope;
use helix_core::tick::PortOutcome;
use helix_core::EffectSink;
pub(crate) fn emit_members_by_ids(
req_id: &str,
outcome: &PortOutcome,
visible: impl Fn(&str) -> bool,
out: &mut EffectSink,
) {
match outcome {
PortOutcome::Ok(reply) => match unwrap_sync_envelope(reply.0.as_ref()) {
Ok(raw_body) => {
let body: serde_json::Value =
serde_json::from_slice(raw_body.as_ref()).unwrap_or(serde_json::Value::Null);
if body
.get("data")
.and_then(serde_json::Value::as_object)
.is_some_and(|channels| channels.keys().any(|id| !visible(id)))
{
out.push(crate::read_relay::emit_read_error(
req_id,
"RENDER_SCOPE_MISMATCH",
));
return;
}
out.push(crate::read_relay::emit_read_result(
req_id,
raw_body.as_ref(),
));
for (cid, members) in crate::render_ready_members::members_from_byids_body(&body) {
out.push(crate::render_ready_members::emit_channel_members(
&cid,
members,
Vec::new(),
crate::render_ready_members::MemberProjectionMode::Snapshot,
));
}
}
Err(e) => {
tracing::warn!(req_id, error = ?e, "byIds members reply envelope decode failed");
out.push(crate::read_relay::emit_read_error(
req_id,
"response envelope decode failed",
));
}
},
PortOutcome::Err(e) => {
tracing::warn!(req_id, error = ?e, "byIds members http failed");
out.push(crate::read_relay::emit_read_error(
req_id,
"http request failed",
));
}
}
}
pub(crate) fn emit_contact_candidates(req_id: &str, outcome: &PortOutcome, out: &mut EffectSink) {
match outcome {
PortOutcome::Ok(reply) => match unwrap_sync_envelope(reply.0.as_ref()) {
Ok(raw_body) => {
let body: serde_json::Value =
serde_json::from_slice(raw_body.as_ref()).unwrap_or(serde_json::Value::Null);
out.push(crate::render_ready_candidates::emit(req_id, &body));
}
Err(_) => out.push(crate::render_ready_candidates::emit_error(
req_id,
"response envelope decode failed",
)),
},
PortOutcome::Err(_) => out.push(crate::render_ready_candidates::emit_error(
req_id,
"http request failed",
)),
}
}
pub(crate) fn normalize_replies(
request: &crate::render_ready_replies::ReplyProjectionRequest,
outcome: &PortOutcome,
revisions: &mut std::collections::HashMap<String, u64>,
seen_ids: &mut std::collections::HashMap<String, std::collections::HashSet<String>>,
) -> Option<crate::render_ready_replies::FlatReplyProjection> {
let req_id = request.req_id.as_str();
match outcome {
PortOutcome::Ok(reply) => match unwrap_sync_envelope(reply.0.as_ref()) {
Ok(raw_body) => {
let body: serde_json::Value = match serde_json::from_slice(raw_body.as_ref()) {
Ok(body) => body,
Err(error) => {
tracing::warn!(req_id, error = ?error, "replies authority JSON decode failed");
return None;
}
};
let mut projection = crate::render_ready_replies::finalize_projection(
request,
crate::render_ready_replies::extract_flat_replies(
&body,
request.viewer_user_id.as_str(),
),
);
if crate::render_ready_replies::accept_projection(
&mut projection,
revisions,
seen_ids,
) {
return Some(projection);
}
}
Err(e) => {
tracing::warn!(req_id, error = ?e, "replies reply envelope decode failed");
}
},
PortOutcome::Err(e) => {
tracing::warn!(req_id, error = ?e, "replies http failed");
}
}
None
}
pub(crate) fn emit_post_readers(req_id: &str, outcome: &PortOutcome, out: &mut EffectSink) {
match outcome {
PortOutcome::Ok(reply) => match unwrap_sync_envelope(reply.0.as_ref()) {
Ok(raw_body) => {
let body =
serde_json::from_slice(raw_body.as_ref()).unwrap_or(serde_json::Value::Null);
for event in crate::query::render_ready::receipts::emit(&body) {
out.push(event);
}
}
Err(_) => {
out.push(crate::read_relay::emit_read_error(
req_id,
"response envelope decode failed",
));
}
},
PortOutcome::Err(_) => {
out.push(crate::read_relay::emit_read_error(
req_id,
"http request failed",
));
}
}
}