@@ -172,6 +172,7 @@ fn to_token_stream(
172
172
timeout,
173
173
os_thread,
174
174
borrow,
175
+ rate_limit,
175
176
} = options;
176
177
177
178
let mut functions = TokenStream :: new ( ) ;
@@ -204,6 +205,18 @@ fn to_token_stream(
204
205
let dart_transforms: Vec < String > = DartTransforms :: try_from ( & inputs) ?. into ( ) ;
205
206
let dart_inner_args: Vec < String > = DartArgs :: from ( & inputs) . into ( ) ;
206
207
208
+ let rate_limit_condition = if let Some ( limiter) = rate_limit {
209
+ let hasher_function = Ident :: new ( & format ! ( "hash_{}" , & rust_fn_name) , Span :: call_site ( ) ) ;
210
+ quote ! {
211
+ let :: std:: result:: Result :: Err ( err) = {
212
+ let hash = #limiter. #hasher_function( #rust_fn_name, #( & #rust_inner_args) , * ) ;
213
+ #limiter. check( #rust_fn_name, hash) . await
214
+ }
215
+ }
216
+ } else {
217
+ quote ! ( false )
218
+ } ;
219
+
207
220
let return_statement = match output_style {
208
221
OutputStyle :: EmitterSerialized | OutputStyle :: StreamEmitterSerialized if sync => {
209
222
syn:: Error :: new (
@@ -281,9 +294,13 @@ fn to_token_stream(
281
294
OutputStyle :: Serialized => quote ! {
282
295
let membrane_join_handle = crate :: RUNTIME . get( ) . info_spawn(
283
296
async move {
284
- let result: :: std:: result:: Result <#output, #error> = #fn_name( #( #rust_inner_args) , * ) . await ;
285
297
let isolate = :: membrane:: allo_isolate:: Isolate :: new( membrane_port) ;
286
- :: membrane:: utils:: send:: <#output, #error>( isolate, result) ;
298
+ if #rate_limit_condition {
299
+ :: membrane:: utils:: send_rate_limited( isolate) ;
300
+ } else {
301
+ let result: :: std:: result:: Result <#output, #error> = #fn_name( #( #rust_inner_args) , * ) . await ;
302
+ :: membrane:: utils:: send:: <#output, #error>( isolate, result) ;
303
+ }
287
304
} ,
288
305
:: membrane:: runtime:: Info { name: #rust_fn_name }
289
306
) ;
0 commit comments