|
1 | 1 | use crate::napi::convert::{js_object_to_request_options, response_to_js_object}; |
2 | | -use crate::transport::execute_request; |
| 2 | +use crate::store::request_store::{ |
| 3 | + cancel_request as cancel_request_handle, insert_request, remove_request, |
| 4 | +}; |
| 5 | +use crate::store::runtime::runtime; |
| 6 | +use crate::transport::make_request; |
3 | 7 | use neon::prelude::*; |
4 | 8 |
|
5 | | -fn request(mut cx: FunctionContext) -> JsResult<JsPromise> { |
| 9 | +fn request(mut cx: FunctionContext) -> JsResult<JsObject> { |
6 | 10 | let options_obj = cx.argument::<JsObject>(0)?; |
7 | 11 | let options = js_object_to_request_options(&mut cx, options_obj)?; |
8 | 12 |
|
9 | 13 | let channel = cx.channel(); |
10 | 14 | let (deferred, promise) = cx.promise(); |
| 15 | + let (cancel_tx, cancel_rx) = tokio::sync::oneshot::channel::<()>(); |
| 16 | + let handle = insert_request(cancel_tx); |
11 | 17 |
|
12 | 18 | std::thread::spawn(move || { |
13 | | - let result = execute_request(options); |
| 19 | + let result = runtime().block_on(async move { |
| 20 | + tokio::select! { |
| 21 | + result = make_request(options) => result, |
| 22 | + _ = cancel_rx => Err(anyhow::anyhow!("Request aborted")), |
| 23 | + } |
| 24 | + }); |
| 25 | + |
| 26 | + remove_request(handle); |
14 | 27 |
|
15 | 28 | deferred.settle_with(&channel, move |mut cx| match result { |
16 | 29 | Ok(response) => response_to_js_object(&mut cx, response), |
17 | 30 | Err(error) => cx.throw_error(format!("{:#}", error)), |
18 | 31 | }); |
19 | 32 | }); |
20 | 33 |
|
21 | | - Ok(promise) |
| 34 | + let result = JsObject::new(&mut cx); |
| 35 | + let handle_value = cx.number(handle as f64); |
| 36 | + |
| 37 | + result.set(&mut cx, "handle", handle_value)?; |
| 38 | + result.set(&mut cx, "promise", promise)?; |
| 39 | + |
| 40 | + Ok(result) |
| 41 | +} |
| 42 | + |
| 43 | +fn cancel_request(mut cx: FunctionContext) -> JsResult<JsBoolean> { |
| 44 | + let handle = cx.argument::<JsNumber>(0)?.value(&mut cx) as u64; |
| 45 | + |
| 46 | + Ok(cx.boolean(cancel_request_handle(handle))) |
22 | 47 | } |
23 | 48 |
|
24 | 49 | pub fn register(cx: &mut ModuleContext) -> NeonResult<()> { |
25 | 50 | cx.export_function("request", request)?; |
| 51 | + cx.export_function("cancelRequest", cancel_request)?; |
26 | 52 | Ok(()) |
27 | 53 | } |
0 commit comments