Skip to content
This repository was archived by the owner on Feb 18, 2025. It is now read-only.

Commit b462380

Browse files
committed
Support to cancel task
1 parent 8426a61 commit b462380

1 file changed

Lines changed: 26 additions & 3 deletions

File tree

  • crates/cursor-core/src/project

crates/cursor-core/src/project/mod.rs

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
mod handler;
22

3-
use futures::StreamExt;
4-
use node_bridge::{bindings::AbortSignal, prelude::*};
3+
use std::future::IntoFuture;
4+
5+
use futures::{
6+
future::{select, Either},
7+
StreamExt,
8+
};
9+
use node_bridge::{bindings::AbortSignal, futures::Defer, prelude::*};
510
use serde_json::json;
611
use wasm_bindgen::prelude::*;
712
use wasm_bindgen_futures::future_to_promise;
@@ -49,7 +54,17 @@ pub async fn generate_project(prompt: &str, handler: ProjectHandler) -> Result<J
4954
cancellable: true,
5055
},
5156
closure_once!(|progress: Progress, abort_signal: AbortSignal| {
52-
future_to_promise(async move {
57+
let defer_abort = Defer::new();
58+
let defer_abort_clone = defer_abort.clone();
59+
abort_signal.add_event_listener(
60+
"abort",
61+
closure_once!(|| {
62+
defer_abort_clone.resolve(JsValue::null());
63+
})
64+
.into_js_value(),
65+
);
66+
67+
let task = async move {
5368
let mut state: StreamResponseState =
5469
make_stream_request("/gen_project", &json!({ "description": prompt }))
5570
.send()
@@ -107,6 +122,14 @@ pub async fn generate_project(prompt: &str, handler: ProjectHandler) -> Result<J
107122
}
108123
drop(data_stream);
109124
state.complete().await.map(|_| JsValue::null())
125+
};
126+
127+
future_to_promise(async move {
128+
let task = std::pin::pin!(task);
129+
match select(defer_abort.into_future(), task).await {
130+
Either::Left((_, _)) => Ok(JsValue::null()),
131+
Either::Right((result, _)) => result,
132+
}
110133
})
111134
})
112135
.into_js_value()

0 commit comments

Comments
 (0)