zed-industries/zed · error
ErrorCode::Internal
ErrorCode::Internal
Error message
handler did not send a response
What it means
add_request_handler wraps each handler with a Response whose 'responded' flag is checked after the handler future completes; if the handler returned Ok without sending a reply, this framework assertion fires. It signals a handler implementation bug — every request handler must respond exactly once.
Source
Thrown at crates/collab/src/rpc.rs:811
M: RequestMessage,
{
let handler = Arc::new(handler);
self.add_handler(move |envelope, session| {
let receipt = envelope.receipt();
let handler = handler.clone();
async move {
let peer = session.peer.clone();
let responded = Arc::new(AtomicBool::default());
let response = Response {
peer: peer.clone(),
responded: responded.clone(),
receipt,
};
match (handler)(envelope.payload, response, session).await {
Ok(()) => {
if responded.load(std::sync::atomic::Ordering::SeqCst) {
Ok(())
} else {
let error = anyhow!("handler did not send a response");
let proto_err =
ErrorCode::Internal.message(format!("{error}")).to_proto();
peer.respond_with_error(receipt, proto_err)?;
Err(error)?
}
}
Err(error) => {
let proto_err = match &error {
Error::Internal(err) => err.to_proto(),
_ => ErrorCode::Internal.message(format!("{error}")).to_proto(),
};
peer.respond_with_error(receipt, proto_err)?;
Err(error)
}
}
}
})View on GitHub (pinned to 9d272b0363)
Solutions
- Fix the handler to call response.send(...) on all success paths
- Ensure early returns and error branches still send or propagate a response
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at crates/collab/src/rpc.rs:804 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of zed-industries/zed@9d272b0363 (2026-08-20).
Data as JSON: /api/errors/8a115b112f2e032e.
Report an issue: GitHub.