fix(tasks): avoid dropping completed task results during collection (#639)

* fix(tasks): avoid dropping completed task results during collection

* chore(tasks): make `task_result_receiver` required

* refactor(tasks): make `collect_completed_results` private
This commit is contained in:
Jiho Park 2026-02-05 17:00:09 +09:00 • committed by GitHub
commit be23334f9d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -132,7 +132,6 @@ pub fn task_handler(attr: TokenStream, input: TokenStream) -> syn::Result<TokenS
use rmcp::task_manager::current_timestamp;
let task_id = request.task_id.clone();
let mut processor = (#processor).lock().await;
processor.collect_completed_results();
// Check completed results first
let completed = processor.peek_completed().iter().rev().find(|r| r.descriptor.operation_id == task_id);
@ -200,7 +199,6 @@ pub fn task_handler(attr: TokenStream, input: TokenStream) -> syn::Result<TokenS
// Scope the lock so we can await outside if needed
{
let mut processor = (#processor).lock().await;
processor.collect_completed_results();
if let Some(task_result) = processor.take_completed_result(&task_id) {
match task_result.result {
@ -256,7 +254,6 @@ pub fn task_handler(attr: TokenStream, input: TokenStream) -> syn::Result<TokenS
) -> Result<(), McpError> {
let task_id = request.task_id;
let mut processor = (#processor).lock().await;
processor.collect_completed_results();
if processor.cancel_task(&task_id) {
return Ok(());