Compare commits

...

10 Commits

Author SHA1 Message Date
Ahmed Ibrahim
b5e6318e0c Merge branch 'main' into dev/ws-terminal-error-split 2026-03-09 23:44:12 -07:00
Ahmed Ibrahim
e2f7a5d5cb Merge branch 'main' into dev/ws-terminal-error-split 2026-03-09 23:12:49 -07:00
Ahmed Ibrahim
9410787295 Merge branch 'main' into dev/ws-terminal-error-split 2026-03-09 22:35:17 -07:00
Ahmed Ibrahim
9a08315f52 Merge branch 'main' into dev/ws-terminal-error-split 2026-03-09 14:54:07 -07:00
Ahmed Ibrahim
a5a7db0d67 Merge branch 'main' into dev/ws-terminal-error-split 2026-03-09 13:09:02 -07:00
Ahmed Ibrahim
73c7ae6888 Merge branch 'main' into dev/ws-terminal-error-split 2026-03-09 12:07:39 -07:00
Ahmed Ibrahim
007a2aca37 Merge branch 'main' into dev/ws-terminal-error-split 2026-03-09 11:33:36 -07:00
Ahmed Ibrahim
a9e47dd9a3 Merge branch 'main' into dev/ws-terminal-error-split 2026-03-09 10:53:57 -07:00
Ahmed Ibrahim
b9e92b6ee5 codex: remove dead websocket close path 2026-03-08 18:01:16 -07:00
Ahmed Ibrahim
26fa5b89c8 codex: surface websocket terminal errors promptly 2026-03-08 17:58:47 -07:00

View File

@@ -53,9 +53,6 @@ enum WsCommand {
message: Message,
tx_result: oneshot::Sender<Result<(), WsError>>,
},
Close {
tx_result: oneshot::Sender<Result<(), WsError>>,
},
}
impl WsStream {
@@ -80,11 +77,6 @@ impl WsStream {
break;
}
}
WsCommand::Close { tx_result } => {
let result = inner.close(None).await;
let _ = tx_result.send(result);
break;
}
}
}
message = inner.next() => {
@@ -144,11 +136,6 @@ impl WsStream {
.await
}
async fn close(&self) -> Result<(), WsError> {
self.request(|tx_result| WsCommand::Close { tx_result })
.await
}
async fn next(&mut self) -> Option<Result<Message, WsError>> {
self.rx_message.recv().await
}
@@ -242,26 +229,32 @@ impl ResponsesWebsocketConnection {
.await;
}
let mut guard = stream.lock().await;
let Some(ws_stream) = guard.as_mut() else {
let _ = tx_event
.send(Err(ApiError::Stream(
"websocket connection is closed".to_string(),
)))
.await;
return;
let result = {
let Some(ws_stream) = guard.as_mut() else {
let _ = tx_event
.send(Err(ApiError::Stream(
"websocket connection is closed".to_string(),
)))
.await;
return;
};
run_websocket_response_stream(
ws_stream,
tx_event.clone(),
request_body,
idle_timeout,
telemetry,
)
.await
};
if let Err(err) = run_websocket_response_stream(
ws_stream,
tx_event.clone(),
request_body,
idle_timeout,
telemetry,
)
.await
{
let _ = ws_stream.close().await;
*guard = None;
if let Err(err) = result {
// A terminal stream error should reach the caller immediately. Waiting for a
// graceful close handshake here can stall indefinitely and mask the error.
let failed_stream = guard.take();
drop(guard);
drop(failed_stream);
let _ = tx_event.send(Err(err)).await;
}
});