diff options
Diffstat (limited to 'makima/src/server/handlers/mesh_supervisor.rs')
| -rw-r--r-- | makima/src/server/handlers/mesh_supervisor.rs | 64 |
1 files changed, 54 insertions, 10 deletions
diff --git a/makima/src/server/handlers/mesh_supervisor.rs b/makima/src/server/handlers/mesh_supervisor.rs index 6d9f8fb..24ba4bb 100644 --- a/makima/src/server/handlers/mesh_supervisor.rs +++ b/makima/src/server/handlers/mesh_supervisor.rs @@ -1538,6 +1538,9 @@ pub async fn create_pr( ).into_response(); }; + // Subscribe to PR results BEFORE sending the command + let mut rx = state.pr_results.subscribe(); + // Send CreatePR command to daemon let cmd = DaemonCommand::CreatePR { task_id: request.task_id, @@ -1554,16 +1557,57 @@ pub async fn create_pr( ).into_response(); } - ( - StatusCode::CREATED, - Json(CreatePRResponse { - task_id: request.task_id, - success: true, - message: "PR creation command sent".to_string(), - pr_url: None, - pr_number: None, - }), - ).into_response() + // Wait for the PR result with a timeout (60 seconds should be plenty for PR creation) + let timeout = tokio::time::Duration::from_secs(60); + let result = tokio::time::timeout(timeout, async { + loop { + match rx.recv().await { + Ok(notification) => { + if notification.task_id == request.task_id { + return Some(notification); + } + // Not our task, keep waiting + } + Err(_) => { + // Channel closed or lagged + return None; + } + } + } + }).await; + + match result { + Ok(Some(notification)) => { + let status = if notification.success { + StatusCode::CREATED + } else { + StatusCode::INTERNAL_SERVER_ERROR + }; + ( + status, + Json(CreatePRResponse { + task_id: request.task_id, + success: notification.success, + message: notification.message, + pr_url: notification.pr_url, + pr_number: notification.pr_number, + }), + ).into_response() + } + Ok(None) | Err(_) => { + // Timeout or channel error - return error status + ( + StatusCode::GATEWAY_TIMEOUT, + Json(CreatePRResponse { + task_id: request.task_id, + success: false, + message: "PR creation timed out waiting for daemon response".to_string(), + pr_url: None, + pr_number: None, + }), + ).into_response() + } + } } /// Get the diff for a task's changes. |
