app-server: prepare to run initialized rpcs concurrently (#17372)

## Summary

- Refactors `MessageProcessor` and per-connection session state so
initialized service RPC handling can be moved into spawned tasks in a
follow-up PR.
- Shares the processor and initialized session data with
`Arc`/`OnceLock` instead of mutable borrowed connection state.
- Keeps initialized request handling synchronous in this PR; it does
**not** call `tokio::spawn` for service RPCs yet.

## Testing

- `just fmt`
- `cargo test -p codex-app-server` *(fails on existing hardening gaps
covered by #17375, #17376, and #17377; the pipelined config regression
passed before the unrelated failures)*
- `just fix -p codex-app-server`
This commit is contained in:
Ruslan Nigmatullin
2026-04-14 11:24:34 -07:00
committed by GitHub
parent 769b1c3d7e
commit 23d4098c0f
6 changed files with 282 additions and 168 deletions

View File

@@ -109,9 +109,9 @@ fn tracing_test_guard() -> &'static tokio::sync::Mutex<()> {
struct TracingHarness {
_server: MockServer,
_codex_home: TempDir,
processor: MessageProcessor,
processor: Arc<MessageProcessor>,
outgoing_rx: mpsc::Receiver<crate::outgoing_message::OutgoingEnvelope>,
session: ConnectionSessionState,
session: Arc<ConnectionSessionState>,
tracing: &'static TestTracing,
}
@@ -129,7 +129,7 @@ impl TracingHarness {
_codex_home: codex_home,
processor,
outgoing_rx,
session: ConnectionSessionState::default(),
session: Arc::new(ConnectionSessionState::default()),
tracing,
};
@@ -152,7 +152,7 @@ impl TracingHarness {
/*trace*/ None,
)
.await;
assert!(harness.session.initialized);
assert!(harness.session.initialized());
Ok(harness)
}
@@ -182,7 +182,7 @@ impl TracingHarness {
TEST_CONNECTION_ID,
request,
AppServerTransport::Stdio,
&mut self.session,
Arc::clone(&self.session),
)
.await;
read_response(&mut self.outgoing_rx, request_id).await
@@ -230,14 +230,14 @@ async fn build_test_config(codex_home: &Path, server_uri: &str) -> Result<Config
fn build_test_processor(
config: Arc<Config>,
) -> (
MessageProcessor,
Arc<MessageProcessor>,
mpsc::Receiver<crate::outgoing_message::OutgoingEnvelope>,
) {
let (outgoing_tx, outgoing_rx) = mpsc::channel(16);
let outgoing = Arc::new(OutgoingMessageSender::new(outgoing_tx));
let auth_manager =
AuthManager::shared_from_config(config.as_ref(), /*enable_codex_api_key_env*/ false);
let processor = MessageProcessor::new(MessageProcessorArgs {
let processor = Arc::new(MessageProcessor::new(MessageProcessorArgs {
outgoing,
arg0_paths: Arg0DispatchPaths::default(),
config,
@@ -252,7 +252,7 @@ fn build_test_processor(
auth_manager,
rpc_transport: AppServerRpcTransport::Stdio,
remote_control_handle: None,
});
}));
(processor, outgoing_rx)
}