1
- use std:: sync:: mpsc:: { channel, Sender } ;
1
+ use std:: sync:: mpsc:: channel;
2
2
3
3
use edr_eth:: { Address , Bytes } ;
4
- use napi:: { bindgen_prelude:: Buffer , Env , JsFunction , NapiRaw , Status } ;
4
+ use napi:: {
5
+ bindgen_prelude:: Buffer ,
6
+ threadsafe_function:: {
7
+ ErrorStrategy , ThreadSafeCallContext , ThreadsafeFunction , ThreadsafeFunctionCallMode ,
8
+ } ,
9
+ Env , JsFunction , Status ,
10
+ } ;
5
11
use napi_derive:: napi;
6
12
7
- use crate :: {
8
- cast:: TryCast ,
9
- sync:: { await_promise, handle_error} ,
10
- threadsafe_function:: { ThreadSafeCallContext , ThreadsafeFunction , ThreadsafeFunctionCallMode } ,
11
- } ;
13
+ use crate :: cast:: TryCast ;
12
14
13
15
/// The result of executing a call override.
14
16
#[ napi( object) ]
@@ -34,20 +36,16 @@ impl TryCast<Option<edr_provider::CallOverrideResult>> for Option<CallOverrideRe
34
36
struct CallOverrideCall {
35
37
contract_address : Address ,
36
38
data : Bytes ,
37
- sender : Sender < napi:: Result < Option < edr_provider:: CallOverrideResult > > > ,
38
39
}
39
40
40
41
#[ derive( Clone ) ]
41
42
pub struct CallOverrideCallback {
42
- call_override_callback_fn : ThreadsafeFunction < CallOverrideCall > ,
43
+ call_override_callback_fn : ThreadsafeFunction < CallOverrideCall , ErrorStrategy :: Fatal > ,
43
44
}
44
45
45
46
impl CallOverrideCallback {
46
47
pub fn new ( env : & Env , call_override_callback : JsFunction ) -> napi:: Result < Self > {
47
- let call_override_callback_fn = ThreadsafeFunction :: create (
48
- env. raw ( ) ,
49
- // SAFETY: The callback is guaranteed to be valid for the lifetime of the inspector.
50
- unsafe { call_override_callback. raw ( ) } ,
48
+ let mut call_override_callback_fn = call_override_callback. create_threadsafe_function (
51
49
0 ,
52
50
|ctx : ThreadSafeCallContext < CallOverrideCall > | {
53
51
let address = ctx
@@ -60,17 +58,14 @@ impl CallOverrideCallback {
60
58
. create_buffer_with_data ( ctx. value . data . to_vec ( ) ) ?
61
59
. into_raw ( ) ;
62
60
63
- let sender = ctx. value . sender . clone ( ) ;
64
- let promise = ctx. callback . call ( None , & [ address, data] ) ?;
65
- let result = await_promise :: <
66
- Option < CallOverrideResult > ,
67
- Option < edr_provider:: CallOverrideResult > ,
68
- > ( ctx. env , promise, ctx. value . sender ) ;
69
-
70
- handle_error ( sender, result)
61
+ Ok ( vec ! [ address, data] )
71
62
} ,
72
63
) ?;
73
64
65
+ // Maintain a weak reference to the function to avoid the event loop from
66
+ // exiting.
67
+ call_override_callback_fn. unref ( env) ?;
68
+
74
69
Ok ( Self {
75
70
call_override_callback_fn,
76
71
} )
@@ -83,13 +78,22 @@ impl CallOverrideCallback {
83
78
) -> Option < edr_provider:: CallOverrideResult > {
84
79
let ( sender, receiver) = channel ( ) ;
85
80
86
- let status = self . call_override_callback_fn . call (
81
+ let status = self . call_override_callback_fn . call_with_return_value (
87
82
CallOverrideCall {
88
83
contract_address,
89
84
data,
90
- sender,
91
85
} ,
92
86
ThreadsafeFunctionCallMode :: Blocking ,
87
+ move |result : Option < CallOverrideResult > | {
88
+ let result = result. try_cast ( ) ;
89
+
90
+ sender. send ( result) . map_err ( |_error| {
91
+ napi:: Error :: new (
92
+ Status :: GenericFailure ,
93
+ "Failed to send result from call_override_callback" ,
94
+ )
95
+ } )
96
+ } ,
93
97
) ;
94
98
95
99
assert_eq ! ( status, Status :: Ok , "Call override callback failed" ) ;
0 commit comments