mirror of
https://github.com/openai/codex.git
synced 2026-11-11 21:10:39 +00:00
## What changed - Keep `ClientResponsePayload` typed through the app-server outgoing queue and serialize it at the transport boundary, avoiding an intermediate `serde_json::Value` while preserving the JSON-RPC wire shape. - Return a JSON-RPC internal error when a response cannot be serialized, including over remote control, and skip unserializable analytics responses. - Scan reverse JSONL input a chunk at a time with a larger buffer instead of processing each byte individually. ## Testing - Cover typed response serialization and serialization failures for direct and remote-control transports. - Cover filtering unserializable responses from analytics. GitOrigin-RevId: cc4fd7a43461a273315bb95261bd1ae3ff65fbf7
60 lines
1.6 KiB
Rust
60 lines
1.6 KiB
Rust
use std::fmt;
|
|
|
|
use codex_app_server_protocol::ClientResponsePayload;
|
|
use codex_app_server_protocol::JSONRPCErrorError;
|
|
use codex_app_server_protocol::RequestId;
|
|
use codex_app_server_protocol::ServerNotificationEnvelope;
|
|
use codex_app_server_protocol::ServerRequest;
|
|
use serde::Serialize;
|
|
use tokio::sync::oneshot;
|
|
|
|
/// Stable identifier for a transport connection.
|
|
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
|
|
pub struct ConnectionId(pub u64);
|
|
|
|
impl fmt::Display for ConnectionId {
|
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
write!(f, "{}", self.0)
|
|
}
|
|
}
|
|
|
|
/// Outgoing message from the server to the client.
|
|
#[derive(Debug, Clone, Serialize)]
|
|
#[serde(untagged)]
|
|
#[allow(clippy::large_enum_variant)]
|
|
pub enum OutgoingMessage {
|
|
Request(ServerRequest),
|
|
/// AppServerNotification is specific to the case where this is run as an
|
|
/// "app server" as opposed to an MCP server.
|
|
AppServerNotification(ServerNotificationEnvelope),
|
|
Response(OutgoingResponse),
|
|
Error(OutgoingError),
|
|
}
|
|
|
|
#[derive(Debug, Clone, Serialize)]
|
|
pub struct OutgoingResponse {
|
|
pub id: RequestId,
|
|
pub result: Box<ClientResponsePayload>,
|
|
}
|
|
|
|
#[derive(Debug, Clone, PartialEq, Serialize)]
|
|
pub struct OutgoingError {
|
|
pub error: JSONRPCErrorError,
|
|
pub id: RequestId,
|
|
}
|
|
|
|
#[derive(Debug)]
|
|
pub struct QueuedOutgoingMessage {
|
|
pub message: OutgoingMessage,
|
|
pub write_complete_tx: Option<oneshot::Sender<()>>,
|
|
}
|
|
|
|
impl QueuedOutgoingMessage {
|
|
pub fn new(message: OutgoingMessage) -> Self {
|
|
Self {
|
|
message,
|
|
write_complete_tx: None,
|
|
}
|
|
}
|
|
}
|