diff --git a/lib/src/frb/api/engine.dart b/lib/src/frb/api/engine.dart index 0750378..2fc36dd 100644 --- a/lib/src/frb/api/engine.dart +++ b/lib/src/frb/api/engine.dart @@ -489,6 +489,16 @@ abstract class JsEngine implements RustOpaqueInterface { /// Sets the memory limit on the engine-owned runtime. Future setMemoryLimit({required BigInt limit}); + + /// Starts the background driver on the engine-owned runtime. + /// + /// See [`JsAsyncRuntime::start_drive`]. + Future startDrive(); + + /// Stops the background driver on the engine-owned runtime. + /// + /// See [`JsAsyncRuntime::stop_drive`]. Safe to call at any time. + Future stopDrive(); } /// Runtime configuration applied when constructing a high-level `JsEngine`. diff --git a/lib/src/frb/api/runtime.dart b/lib/src/frb/api/runtime.dart index 02b7e04..e225284 100644 --- a/lib/src/frb/api/runtime.dart +++ b/lib/src/frb/api/runtime.dart @@ -356,6 +356,36 @@ abstract class JsAsyncRuntime implements RustOpaqueInterface { /// await runtime.setMemoryLimit(limit: 16 * 1024 * 1024); // 16 MB /// ``` Future setMemoryLimit({required BigInt limit}); + + /// Starts a background task that keeps the runtime's async work moving, so + /// timers, `fetch`, and other background work finish promptly without the + /// host having to keep checking. Unlike [`idle()`](Self::idle), which only + /// returns once all work is done, this keeps running — so it's fine to leave + /// on for the whole life of the app, and `eval` and other calls still run in + /// between. + /// + /// Calling it again while a driver is already running does nothing. The + /// driver runs until [`stop_drive()`](Self::stop_drive) is called or the + /// runtime is dropped. + /// + /// ## Example + /// + /// ```dart + /// await runtime.startDrive(); + /// ``` + Future startDrive(); + + /// Stops the background driver started by [`start_drive()`](Self::start_drive). + /// + /// Cancels the task if one is running, and does nothing if not. The runtime + /// is left usable — you can start a driver again or drain it by hand afterwards. + /// + /// ## Example + /// + /// ```dart + /// await runtime.stopDrive(); + /// ``` + Future stopDrive(); } // Rust type: RustOpaqueMoi> diff --git a/lib/src/frb/frb_generated.dart b/lib/src/frb/frb_generated.dart index 7007374..55bd8fb 100644 --- a/lib/src/frb/frb_generated.dart +++ b/lib/src/frb/frb_generated.dart @@ -75,7 +75,7 @@ class LibFjs extends BaseEntrypoint { String get codegenVersion => '2.12.0'; @override - int get rustContentHash => 202636287; + int get rustContentHash => 1608407051; static const kDefaultExternalLibraryLoaderConfig = ExternalLibraryLoaderConfig( @@ -147,6 +147,12 @@ abstract class LibFjsApi extends BaseApi { Future crateApiRuntimeJsAsyncRuntimeSetMemoryLimit( {required JsAsyncRuntime that, required BigInt limit}); + Future crateApiRuntimeJsAsyncRuntimeStartDrive( + {required JsAsyncRuntime that}); + + Future crateApiRuntimeJsAsyncRuntimeStopDrive( + {required JsAsyncRuntime that}); + Future crateApiBytecodeJsBytecodeCompile( {required JsModule module, JsModuleBytecodeOptions? options}); @@ -305,6 +311,10 @@ abstract class LibFjsApi extends BaseApi { Future crateApiEngineJsEngineSetMemoryLimit( {required JsEngine that, required BigInt limit}); + Future crateApiEngineJsEngineStartDrive({required JsEngine that}); + + Future crateApiEngineJsEngineStopDrive({required JsEngine that}); + Future crateApiRuntimeJsRuntimeCreate( {JsBuiltinOptions? builtins, List? modules}); @@ -1082,6 +1092,60 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { argNames: ["that", "limit"], ); + @override + Future crateApiRuntimeJsAsyncRuntimeStartDrive( + {required JsAsyncRuntime that}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJsAsyncRuntime( + that, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 19, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: null, + ), + constMeta: kCrateApiRuntimeJsAsyncRuntimeStartDriveConstMeta, + argValues: [that], + apiImpl: this, + )); + } + + TaskConstMeta get kCrateApiRuntimeJsAsyncRuntimeStartDriveConstMeta => + const TaskConstMeta( + debugName: "JsAsyncRuntime_start_drive", + argNames: ["that"], + ); + + @override + Future crateApiRuntimeJsAsyncRuntimeStopDrive( + {required JsAsyncRuntime that}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJsAsyncRuntime( + that, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 20, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: null, + ), + constMeta: kCrateApiRuntimeJsAsyncRuntimeStopDriveConstMeta, + argValues: [that], + apiImpl: this, + )); + } + + TaskConstMeta get kCrateApiRuntimeJsAsyncRuntimeStopDriveConstMeta => + const TaskConstMeta( + debugName: "JsAsyncRuntime_stop_drive", + argNames: ["that"], + ); + @override Future crateApiBytecodeJsBytecodeCompile( {required JsModule module, JsModuleBytecodeOptions? options}) { @@ -1092,7 +1156,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { sse_encode_opt_box_autoadd_js_module_bytecode_options( options, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 19, port: port_); + funcId: 21, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_js_module_bytecode, @@ -1123,7 +1187,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { sse_encode_opt_box_autoadd_js_module_bytecode_options( options, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 20, port: port_); + funcId: 22, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_js_module_bytecode_bundle, @@ -1153,7 +1217,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { sse_encode_opt_String(entry, serializer); sse_encode_opt_box_autoadd_js_module_bytecode_options( options, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 21)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 23)!; }, codec: SseCodec( decodeSuccessData: sse_decode_js_module_bytecode_bundle, @@ -1185,7 +1249,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { sse_encode_opt_box_autoadd_js_script_bytecode_options( options, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 22, port: port_); + funcId: 24, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_js_script_bytecode, @@ -1215,7 +1279,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { sse_encode_box_autoadd_js_code(source, serializer); sse_encode_opt_box_autoadd_js_script_bytecode_options( options, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 23)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 25)!; }, codec: SseCodec( decodeSuccessData: sse_decode_js_script_bytecode, @@ -1242,7 +1306,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { sse_encode_box_autoadd_js_module(module, serializer); sse_encode_opt_box_autoadd_js_module_bytecode_options( options, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 24)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 26)!; }, codec: SseCodec( decodeSuccessData: sse_decode_js_module_bytecode, @@ -1268,7 +1332,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_js_module_bytecode(module, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 25, port: port_); + funcId: 27, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -1294,7 +1358,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_js_module_bytecode_bundle(bundle, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 26, port: port_); + funcId: 28, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -1319,7 +1383,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { callFfi: () { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_js_module_bytecode_bundle(bundle, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 27)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 29)!; }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -1345,7 +1409,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_js_script_bytecode(script, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 28, port: port_); + funcId: 30, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -1370,7 +1434,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { callFfi: () { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_js_script_bytecode(script, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 29)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 31)!; }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -1395,7 +1459,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { callFfi: () { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_js_module_bytecode(module, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 30)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 32)!; }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -1422,7 +1486,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJsContext( that, serializer); sse_encode_String(code, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 31)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 33)!; }, codec: SseCodec( decodeSuccessData: sse_decode_js_result, @@ -1449,7 +1513,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJsContext( that, serializer); sse_encode_String(path, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 32)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 34)!; }, codec: SseCodec( decodeSuccessData: sse_decode_js_result, @@ -1479,7 +1543,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { that, serializer); sse_encode_String(path, serializer); sse_encode_box_autoadd_js_eval_options(options, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 33)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 35)!; }, codec: SseCodec( decodeSuccessData: sse_decode_js_result, @@ -1509,7 +1573,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { that, serializer); sse_encode_String(code, serializer); sse_encode_box_autoadd_js_eval_options(options, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 34)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 36)!; }, codec: SseCodec( decodeSuccessData: sse_decode_js_result, @@ -1534,7 +1598,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJsRuntime( runtime, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 35)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 37)!; }, codec: SseCodec( decodeSuccessData: @@ -1561,7 +1625,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJsContext( that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 36)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 38)!; }, codec: SseCodec( decodeSuccessData: sse_decode_list_String, @@ -1594,7 +1658,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { sse_encode_String(method, serializer); sse_encode_opt_list_js_value(params, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 37, port: port_); + funcId: 39, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_js_value, @@ -1620,7 +1684,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJsEngine( that, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 38, port: port_); + funcId: 40, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -1646,7 +1710,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJsEngine( that, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 39, port: port_); + funcId: 41, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -1671,7 +1735,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJsEngine( that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 40)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 42)!; }, codec: SseCodec( decodeSuccessData: sse_decode_bool, @@ -1702,7 +1766,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { sse_encode_opt_box_autoadd_js_engine_runtime_options( runtimeOptions, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 41, port: port_); + funcId: 43, port: port_); }, codec: SseCodec( decodeSuccessData: @@ -1731,7 +1795,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { that, serializer); sse_encode_box_autoadd_js_module_bytecode_bundle(bundle, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 42, port: port_); + funcId: 44, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -1759,7 +1823,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { that, serializer); sse_encode_box_autoadd_js_module_bytecode(module, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 43, port: port_); + funcId: 45, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -1787,7 +1851,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { that, serializer); sse_encode_list_js_module_bytecode(modules, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 44, port: port_); + funcId: 46, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -1815,7 +1879,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { that, serializer); sse_encode_box_autoadd_js_module(module, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 45, port: port_); + funcId: 47, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -1843,7 +1907,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { that, serializer); sse_encode_list_js_module(modules, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 46, port: port_); + funcId: 48, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -1874,7 +1938,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { sse_encode_box_autoadd_js_code(source, serializer); sse_encode_opt_box_autoadd_js_eval_options(options, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 47, port: port_); + funcId: 49, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_js_value, @@ -1901,7 +1965,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { that, serializer); sse_encode_box_autoadd_js_module_bytecode_bundle(bundle, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 48, port: port_); + funcId: 50, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_js_value, @@ -1929,7 +1993,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { that, serializer); sse_encode_box_autoadd_js_module_bytecode(module, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 49, port: port_); + funcId: 51, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_js_value, @@ -1957,7 +2021,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { that, serializer); sse_encode_box_autoadd_js_module(module, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 50, port: port_); + funcId: 52, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_js_value, @@ -1985,7 +2049,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { that, serializer); sse_encode_box_autoadd_js_script_bytecode(script, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 51, port: port_); + funcId: 53, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_js_value, @@ -2012,7 +2076,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJsEngine( that, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 52, port: port_); + funcId: 54, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_bool, @@ -2039,7 +2103,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJsEngine( that, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 53, port: port_); + funcId: 55, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_list_String, @@ -2066,7 +2130,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJsEngine( that, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 54, port: port_); + funcId: 56, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_list_String, @@ -2092,7 +2156,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJsEngine( that, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 55, port: port_); + funcId: 57, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -2121,7 +2185,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { sse_encode_DartFn_Inputs_js_value_Output_js_result_AnyhowException( bridge, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 56, port: port_); + funcId: 58, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -2147,7 +2211,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJsEngine( that, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 57, port: port_); + funcId: 59, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -2173,7 +2237,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJsEngine( that, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 58, port: port_); + funcId: 60, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_bool, @@ -2201,7 +2265,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { that, serializer); sse_encode_String(moduleName, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 59, port: port_); + funcId: 61, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_bool, @@ -2229,7 +2293,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { that, serializer); sse_encode_String(moduleName, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 60, port: port_); + funcId: 62, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_bool, @@ -2256,7 +2320,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJsEngine( that, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 61, port: port_); + funcId: 63, port: port_); }, codec: SseCodec( decodeSuccessData: @@ -2283,7 +2347,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJsEngine( that, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 62, port: port_); + funcId: 64, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -2308,7 +2372,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJsEngine( that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 63)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 65)!; }, codec: SseCodec( decodeSuccessData: sse_decode_bool, @@ -2336,7 +2400,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { that, serializer); sse_encode_usize(threshold, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 64, port: port_); + funcId: 66, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -2364,7 +2428,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { that, serializer); sse_encode_String(info, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 65, port: port_); + funcId: 67, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -2392,7 +2456,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { that, serializer); sse_encode_usize(limit, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 66, port: port_); + funcId: 68, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -2420,7 +2484,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { that, serializer); sse_encode_usize(limit, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 67, port: port_); + funcId: 69, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -2438,6 +2502,58 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { argNames: ["that", "limit"], ); + @override + Future crateApiEngineJsEngineStartDrive({required JsEngine that}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJsEngine( + that, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 70, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiEngineJsEngineStartDriveConstMeta, + argValues: [that], + apiImpl: this, + )); + } + + TaskConstMeta get kCrateApiEngineJsEngineStartDriveConstMeta => + const TaskConstMeta( + debugName: "JsEngine_start_drive", + argNames: ["that"], + ); + + @override + Future crateApiEngineJsEngineStopDrive({required JsEngine that}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJsEngine( + that, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 71, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiEngineJsEngineStopDriveConstMeta, + argValues: [that], + apiImpl: this, + )); + } + + TaskConstMeta get kCrateApiEngineJsEngineStopDriveConstMeta => + const TaskConstMeta( + debugName: "JsEngine_stop_drive", + argNames: ["that"], + ); + @override Future crateApiRuntimeJsRuntimeCreate( {JsBuiltinOptions? builtins, List? modules}) { @@ -2447,7 +2563,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { sse_encode_opt_box_autoadd_js_builtin_options(builtins, serializer); sse_encode_opt_list_js_module(modules, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 68, port: port_); + funcId: 72, port: port_); }, codec: SseCodec( decodeSuccessData: @@ -2473,7 +2589,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJsRuntime( that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 69)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 73)!; }, codec: SseCodec( decodeSuccessData: sse_decode_bool, @@ -2498,7 +2614,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJsRuntime( that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 70)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 74)!; }, codec: SseCodec( decodeSuccessData: sse_decode_bool, @@ -2523,7 +2639,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJsRuntime( that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 71)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 75)!; }, codec: SseCodec( decodeSuccessData: @@ -2547,7 +2663,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { return handler.executeSync(SyncTask( callFfi: () { final serializer = SseSerializer(generalizedFrbRustBinding); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 72)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 76)!; }, codec: SseCodec( decodeSuccessData: @@ -2573,7 +2689,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJsRuntime( that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 73)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 77)!; }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -2600,7 +2716,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJsRuntime( that, serializer); sse_encode_u_64(flags, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 74)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 78)!; }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -2627,7 +2743,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJsRuntime( that, serializer); sse_encode_usize(threshold, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 75)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 79)!; }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -2654,7 +2770,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJsRuntime( that, serializer); sse_encode_String(info, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 76)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 80)!; }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -2681,7 +2797,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJsRuntime( that, serializer); sse_encode_usize(limit, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 77)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 81)!; }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -2708,7 +2824,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerJsRuntime( that, serializer); sse_encode_usize(limit, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 78)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 82)!; }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -2734,7 +2850,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMemoryUsage( that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 79)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 83)!; }, codec: SseCodec( decodeSuccessData: sse_decode_i_64, @@ -2760,7 +2876,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMemoryUsage( that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 80)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 84)!; }, codec: SseCodec( decodeSuccessData: sse_decode_i_64, @@ -2786,7 +2902,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMemoryUsage( that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 81)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 85)!; }, codec: SseCodec( decodeSuccessData: sse_decode_i_64, @@ -2812,7 +2928,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMemoryUsage( that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 82)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 86)!; }, codec: SseCodec( decodeSuccessData: sse_decode_i_64, @@ -2838,7 +2954,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMemoryUsage( that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 83)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 87)!; }, codec: SseCodec( decodeSuccessData: sse_decode_i_64, @@ -2864,7 +2980,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMemoryUsage( that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 84)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 88)!; }, codec: SseCodec( decodeSuccessData: sse_decode_i_64, @@ -2890,7 +3006,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMemoryUsage( that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 85)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 89)!; }, codec: SseCodec( decodeSuccessData: sse_decode_i_64, @@ -2916,7 +3032,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMemoryUsage( that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 86)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 90)!; }, codec: SseCodec( decodeSuccessData: sse_decode_i_64, @@ -2942,7 +3058,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMemoryUsage( that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 87)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 91)!; }, codec: SseCodec( decodeSuccessData: sse_decode_i_64, @@ -2968,7 +3084,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMemoryUsage( that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 88)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 92)!; }, codec: SseCodec( decodeSuccessData: sse_decode_i_64, @@ -2994,7 +3110,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMemoryUsage( that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 89)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 93)!; }, codec: SseCodec( decodeSuccessData: sse_decode_i_64, @@ -3020,7 +3136,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMemoryUsage( that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 90)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 94)!; }, codec: SseCodec( decodeSuccessData: sse_decode_i_64, @@ -3046,7 +3162,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMemoryUsage( that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 91)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 95)!; }, codec: SseCodec( decodeSuccessData: sse_decode_i_64, @@ -3072,7 +3188,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMemoryUsage( that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 92)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 96)!; }, codec: SseCodec( decodeSuccessData: sse_decode_i_64, @@ -3098,7 +3214,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMemoryUsage( that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 93)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 97)!; }, codec: SseCodec( decodeSuccessData: sse_decode_i_64, @@ -3124,7 +3240,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMemoryUsage( that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 94)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 98)!; }, codec: SseCodec( decodeSuccessData: sse_decode_i_64, @@ -3150,7 +3266,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMemoryUsage( that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 95)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 99)!; }, codec: SseCodec( decodeSuccessData: sse_decode_i_64, @@ -3176,7 +3292,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMemoryUsage( that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 96)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 100)!; }, codec: SseCodec( decodeSuccessData: sse_decode_i_64, @@ -3202,7 +3318,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMemoryUsage( that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 97)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 101)!; }, codec: SseCodec( decodeSuccessData: sse_decode_i_64, @@ -3227,7 +3343,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMemoryUsage( that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 98)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 102)!; }, codec: SseCodec( decodeSuccessData: sse_decode_i_64, @@ -3253,7 +3369,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMemoryUsage( that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 99)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 103)!; }, codec: SseCodec( decodeSuccessData: sse_decode_i_64, @@ -3279,7 +3395,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMemoryUsage( that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 100)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 104)!; }, codec: SseCodec( decodeSuccessData: sse_decode_i_64, @@ -3305,7 +3421,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMemoryUsage( that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 101)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 105)!; }, codec: SseCodec( decodeSuccessData: sse_decode_i_64, @@ -3331,7 +3447,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMemoryUsage( that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 102)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 106)!; }, codec: SseCodec( decodeSuccessData: sse_decode_i_64, @@ -3357,7 +3473,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMemoryUsage( that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 103)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 107)!; }, codec: SseCodec( decodeSuccessData: sse_decode_i_64, @@ -3382,7 +3498,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMemoryUsage( that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 104)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 108)!; }, codec: SseCodec( decodeSuccessData: sse_decode_i_64, @@ -3407,7 +3523,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMemoryUsage( that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 105)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 109)!; }, codec: SseCodec( decodeSuccessData: sse_decode_String, @@ -3433,7 +3549,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMemoryUsage( that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 106)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 110)!; }, codec: SseCodec( decodeSuccessData: sse_decode_i_64, @@ -3459,7 +3575,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerMemoryUsage( that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 107)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 111)!; }, codec: SseCodec( decodeSuccessData: sse_decode_i_64, @@ -3483,7 +3599,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 108, port: port_); + funcId: 112, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -3505,7 +3621,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { return handler.executeSync(SyncTask( callFfi: () { final serializer = SseSerializer(generalizedFrbRustBinding); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 109)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 113)!; }, codec: SseCodec( decodeSuccessData: sse_decode_js_builtin_options, @@ -3529,7 +3645,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 110, port: port_); + funcId: 114, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_js_builtin_options, @@ -3552,7 +3668,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { return handler.executeSync(SyncTask( callFfi: () { final serializer = SseSerializer(generalizedFrbRustBinding); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 111)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 115)!; }, codec: SseCodec( decodeSuccessData: sse_decode_js_builtin_options, @@ -3575,7 +3691,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { return handler.executeSync(SyncTask( callFfi: () { final serializer = SseSerializer(generalizedFrbRustBinding); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 112)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 116)!; }, codec: SseCodec( decodeSuccessData: sse_decode_js_builtin_options, @@ -3598,7 +3714,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { return handler.executeSync(SyncTask( callFfi: () { final serializer = SseSerializer(generalizedFrbRustBinding); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 113)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 117)!; }, codec: SseCodec( decodeSuccessData: sse_decode_js_builtin_options, @@ -3621,7 +3737,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { return handler.executeSync(SyncTask( callFfi: () { final serializer = SseSerializer(generalizedFrbRustBinding); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 114)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 118)!; }, codec: SseCodec( decodeSuccessData: sse_decode_js_builtin_options, @@ -3645,7 +3761,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 115, port: port_); + funcId: 119, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_js_bytecode_endianness, @@ -3669,7 +3785,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { callFfi: () { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_js_code(that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 116)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 120)!; }, codec: SseCodec( decodeSuccessData: sse_decode_bool, @@ -3693,7 +3809,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { callFfi: () { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_js_code(that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 117)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 121)!; }, codec: SseCodec( decodeSuccessData: sse_decode_bool, @@ -3716,7 +3832,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { callFfi: () { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_js_code(that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 118)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 122)!; }, codec: SseCodec( decodeSuccessData: sse_decode_bool, @@ -3739,7 +3855,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 119, port: port_); + funcId: 123, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_js_engine_runtime_options, @@ -3763,7 +3879,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { callFfi: () { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_js_error(that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 120)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 124)!; }, codec: SseCodec( decodeSuccessData: sse_decode_String, @@ -3786,7 +3902,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { callFfi: () { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_js_error(that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 121)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 125)!; }, codec: SseCodec( decodeSuccessData: sse_decode_bool, @@ -3810,7 +3926,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { callFfi: () { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_js_error(that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 122)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 126)!; }, codec: SseCodec( decodeSuccessData: sse_decode_String, @@ -3834,7 +3950,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 123, port: port_); + funcId: 127, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_js_eval_options, @@ -3857,7 +3973,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { return handler.executeSync(SyncTask( callFfi: () { final serializer = SseSerializer(generalizedFrbRustBinding); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 124)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 128)!; }, codec: SseCodec( decodeSuccessData: sse_decode_js_eval_options, @@ -3880,7 +3996,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { return handler.executeSync(SyncTask( callFfi: () { final serializer = SseSerializer(generalizedFrbRustBinding); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 125)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 129)!; }, codec: SseCodec( decodeSuccessData: sse_decode_js_eval_options, @@ -3908,7 +4024,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { sse_encode_opt_box_autoadd_bool(strict, serializer); sse_encode_opt_box_autoadd_bool(backtraceBarrier, serializer); sse_encode_opt_box_autoadd_bool(promise, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 126)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 130)!; }, codec: SseCodec( decodeSuccessData: sse_decode_js_eval_options, @@ -3931,7 +4047,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { return handler.executeSync(SyncTask( callFfi: () { final serializer = SseSerializer(generalizedFrbRustBinding); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 127)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 131)!; }, codec: SseCodec( decodeSuccessData: sse_decode_js_eval_options, @@ -3957,7 +4073,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_opt_String(entry, serializer); sse_encode_list_js_module_bytecode(modules, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 128)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 132)!; }, codec: SseCodec( decodeSuccessData: sse_decode_js_module_bytecode_bundle, @@ -3983,7 +4099,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_String(name, serializer); sse_encode_list_prim_u_8_loose(bytes, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 129)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 133)!; }, codec: SseCodec( decodeSuccessData: sse_decode_js_module_bytecode, @@ -4008,7 +4124,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 130, port: port_); + funcId: 134, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_js_module_bytecode_options, @@ -4031,7 +4147,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { return handler.executeSync(SyncTask( callFfi: () { final serializer = SseSerializer(generalizedFrbRustBinding); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 131)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 135)!; }, codec: SseCodec( decodeSuccessData: sse_decode_js_module_bytecode_options, @@ -4057,7 +4173,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_String(module, serializer); sse_encode_list_prim_u_8_loose(bytes, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 132)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 136)!; }, codec: SseCodec( decodeSuccessData: sse_decode_js_module, @@ -4083,7 +4199,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_String(module, serializer); sse_encode_String(code, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 133)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 137)!; }, codec: SseCodec( decodeSuccessData: sse_decode_js_module, @@ -4108,7 +4224,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_String(name, serializer); sse_encode_box_autoadd_js_code(source, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 134)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 138)!; }, codec: SseCodec( decodeSuccessData: sse_decode_js_module, @@ -4133,7 +4249,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_String(module, serializer); sse_encode_String(path, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 135)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 139)!; }, codec: SseCodec( decodeSuccessData: sse_decode_js_module, @@ -4158,7 +4274,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_String(name, serializer); sse_encode_list_prim_u_8_loose(bytes, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 136)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 140)!; }, codec: SseCodec( decodeSuccessData: sse_decode_js_script_bytecode, @@ -4183,7 +4299,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 137, port: port_); + funcId: 141, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_js_script_bytecode_options, @@ -4206,7 +4322,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { return handler.executeSync(SyncTask( callFfi: () { final serializer = SseSerializer(generalizedFrbRustBinding); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 138)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 142)!; }, codec: SseCodec( decodeSuccessData: sse_decode_js_script_bytecode_options, @@ -4230,7 +4346,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 139, port: port_); + funcId: 143, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_js_value, @@ -4254,7 +4370,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { callFfi: () { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_js_value(that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 140)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 144)!; }, codec: SseCodec( decodeSuccessData: sse_decode_bool, @@ -4278,7 +4394,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { callFfi: () { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_js_value(that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 141)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 145)!; }, codec: SseCodec( decodeSuccessData: sse_decode_bool, @@ -4302,7 +4418,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { callFfi: () { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_js_value(that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 142)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 146)!; }, codec: SseCodec( decodeSuccessData: sse_decode_bool, @@ -4326,7 +4442,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { callFfi: () { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_js_value(that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 143)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 147)!; }, codec: SseCodec( decodeSuccessData: sse_decode_bool, @@ -4349,7 +4465,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { callFfi: () { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_js_value(that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 144)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 148)!; }, codec: SseCodec( decodeSuccessData: sse_decode_bool, @@ -4372,7 +4488,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { callFfi: () { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_js_value(that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 145)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 149)!; }, codec: SseCodec( decodeSuccessData: sse_decode_bool, @@ -4396,7 +4512,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { callFfi: () { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_js_value(that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 146)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 150)!; }, codec: SseCodec( decodeSuccessData: sse_decode_bool, @@ -4420,7 +4536,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { callFfi: () { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_js_value(that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 147)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 151)!; }, codec: SseCodec( decodeSuccessData: sse_decode_bool, @@ -4444,7 +4560,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { callFfi: () { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_js_value(that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 148)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 152)!; }, codec: SseCodec( decodeSuccessData: sse_decode_bool, @@ -4468,7 +4584,7 @@ class LibFjsApiImpl extends LibFjsApiImplPlatform implements LibFjsApi { callFfi: () { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_js_value(that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 149)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 153)!; }, codec: SseCodec( decodeSuccessData: sse_decode_String, @@ -7528,6 +7644,42 @@ class JsAsyncRuntimeImpl extends RustOpaque implements JsAsyncRuntime { /// ``` Future setMemoryLimit({required BigInt limit}) => LibFjs.instance.api .crateApiRuntimeJsAsyncRuntimeSetMemoryLimit(that: this, limit: limit); + + /// Starts a background task that keeps the runtime's async work moving, so + /// timers, `fetch`, and other background work finish promptly without the + /// host having to keep checking. Unlike [`idle()`](Self::idle), which only + /// returns once all work is done, this keeps running — so it's fine to leave + /// on for the whole life of the app, and `eval` and other calls still run in + /// between. + /// + /// Calling it again while a driver is already running does nothing. The + /// driver runs until [`stop_drive()`](Self::stop_drive) is called or the + /// runtime is dropped. + /// + /// ## Example + /// + /// ```dart + /// await runtime.startDrive(); + /// ``` + Future startDrive() => + LibFjs.instance.api.crateApiRuntimeJsAsyncRuntimeStartDrive( + that: this, + ); + + /// Stops the background driver started by [`start_drive()`](Self::start_drive). + /// + /// Cancels the task if one is running, and does nothing if not. The runtime + /// is left usable — you can start a driver again or drain it by hand afterwards. + /// + /// ## Example + /// + /// ```dart + /// await runtime.stopDrive(); + /// ``` + Future stopDrive() => + LibFjs.instance.api.crateApiRuntimeJsAsyncRuntimeStopDrive( + that: this, + ); } @sealed @@ -8217,6 +8369,22 @@ class JsEngineImpl extends RustOpaque implements JsEngine { /// Sets the memory limit on the engine-owned runtime. Future setMemoryLimit({required BigInt limit}) => LibFjs.instance.api .crateApiEngineJsEngineSetMemoryLimit(that: this, limit: limit); + + /// Starts the background driver on the engine-owned runtime. + /// + /// See [`JsAsyncRuntime::start_drive`]. + Future startDrive() => + LibFjs.instance.api.crateApiEngineJsEngineStartDrive( + that: this, + ); + + /// Stops the background driver on the engine-owned runtime. + /// + /// See [`JsAsyncRuntime::stop_drive`]. Safe to call at any time. + Future stopDrive() => + LibFjs.instance.api.crateApiEngineJsEngineStopDrive( + that: this, + ); } @sealed diff --git a/libfjs/src/api/engine.rs b/libfjs/src/api/engine.rs index 6b416a4..b693fdf 100644 --- a/libfjs/src/api/engine.rs +++ b/libfjs/src/api/engine.rs @@ -220,6 +220,23 @@ impl JsEngine { Ok(()) } + /// Starts the background driver on the engine-owned runtime. + /// + /// See [`JsAsyncRuntime::start_drive`]. + pub async fn start_drive(&self) -> anyhow::Result<()> { + self.ensure_runtime_accessible()?; + self.runtime.start_drive().await; + Ok(()) + } + + /// Stops the background driver on the engine-owned runtime. + /// + /// See [`JsAsyncRuntime::stop_drive`]. Safe to call at any time. + pub async fn stop_drive(&self) -> anyhow::Result<()> { + self.runtime.stop_drive().await; + Ok(()) + } + /// Returns whether the engine-owned runtime still has work pending. pub async fn is_job_pending(&self) -> anyhow::Result { self.ensure_runtime_accessible()?; @@ -437,6 +454,10 @@ impl JsEngine { let previous_state = self.begin_close()?; if previous_state == STATE_CREATED || previous_state == STATE_RUNNING { + // Stop the background driver (if any) before draining and freeing + // the runtime, so it cannot race teardown. + self.runtime.stop_drive().await; + let _ = self .context .ctx diff --git a/libfjs/src/api/runtime.rs b/libfjs/src/api/runtime.rs index 11a8fa6..096f08a 100644 --- a/libfjs/src/api/runtime.rs +++ b/libfjs/src/api/runtime.rs @@ -14,7 +14,7 @@ use flutter_rust_bridge::frb; use rquickjs::loader::{BuiltinLoader, BuiltinResolver, FileResolver, NativeLoader, ScriptLoader}; use rquickjs::promise::MaybePromise; use rquickjs::{CatchResultExt, FromJs, Module, Promise}; -use std::sync::{Arc, RwLock}; +use std::sync::{Arc, Mutex, RwLock}; /// Memory usage statistics for the JavaScript runtime. /// @@ -703,6 +703,11 @@ impl JsContext { pub struct JsAsyncRuntime { pub(crate) rt: rquickjs::AsyncRuntime, pub(crate) global_attachment: Option, + /// Handle to the background task spawned by [`JsAsyncRuntime::start_drive`]. + /// + /// Shared across clones so that starting/stopping the driver is coherent + /// regardless of which clone the call lands on. + pub(crate) driver: Arc>>>, } impl JsAsyncRuntime { @@ -727,6 +732,7 @@ impl JsAsyncRuntime { Ok(Self { rt: runtime, global_attachment: None, + driver: Arc::new(Mutex::new(None)), }) } @@ -777,6 +783,7 @@ impl JsAsyncRuntime { Ok(Self { rt: runtime, global_attachment: Some(global_attachment), + driver: Arc::new(Mutex::new(None)), }) } @@ -927,6 +934,46 @@ impl JsAsyncRuntime { self.rt.idle().await; } + /// Starts a background task that keeps the runtime's async work moving, so + /// timers, `fetch`, and other background work finish promptly without the + /// host having to keep checking. Unlike [`idle()`](Self::idle), which only + /// returns once all work is done, this keeps running — so it's fine to leave + /// on for the whole life of the app, and `eval` and other calls still run in + /// between. + /// + /// Calling it again while a driver is already running does nothing. The + /// driver runs until [`stop_drive()`](Self::stop_drive) is called or the + /// runtime is dropped. + /// + /// ## Example + /// + /// ```dart + /// await runtime.startDrive(); + /// ``` + pub async fn start_drive(&self) { + let mut slot = self.driver.lock().unwrap(); + if slot.as_ref().is_some_and(|handle| !handle.is_finished()) { + return; + } + *slot = Some(tokio::spawn(self.rt.drive())); + } + + /// Stops the background driver started by [`start_drive()`](Self::start_drive). + /// + /// Cancels the task if one is running, and does nothing if not. The runtime + /// is left usable — you can start a driver again or drain it by hand afterwards. + /// + /// ## Example + /// + /// ```dart + /// await runtime.stopDrive(); + /// ``` + pub async fn stop_drive(&self) { + if let Some(handle) = self.driver.lock().unwrap().take() { + handle.abort(); + } + } + /// Sets runtime info string. /// /// Sets informational metadata about the runtime instance. diff --git a/libfjs/src/frb_generated.rs b/libfjs/src/frb_generated.rs index 6b0f44b..7681f35 100644 --- a/libfjs/src/frb_generated.rs +++ b/libfjs/src/frb_generated.rs @@ -41,7 +41,7 @@ flutter_rust_bridge::frb_generated_boilerplate!( default_rust_auto_opaque = RustAutoOpaqueMoi, ); pub(crate) const FLUTTER_RUST_BRIDGE_CODEGEN_VERSION: &str = "2.12.0"; -pub(crate) const FLUTTER_RUST_BRIDGE_CODEGEN_CONTENT_HASH: i32 = 202636287; +pub(crate) const FLUTTER_RUST_BRIDGE_CODEGEN_CONTENT_HASH: i32 = 1608407051; // Section: executor @@ -1087,6 +1087,121 @@ fn wire__crate__api__runtime__JsAsyncRuntime_set_memory_limit_impl( }, ) } +fn wire__crate__api__runtime__JsAsyncRuntime_start_drive_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "JsAsyncRuntime_start_drive", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = , + >>::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, ()>( + (move || async move { + let mut api_that_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_that, 0, false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_that_guard = + Some(api_that.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_that_guard = api_that_guard.unwrap(); + let output_ok = Result::<_, ()>::Ok({ + crate::api::runtime::JsAsyncRuntime::start_drive(&*api_that_guard) + .await; + })?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__runtime__JsAsyncRuntime_stop_drive_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "JsAsyncRuntime_stop_drive", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = , + >>::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, ()>( + (move || async move { + let mut api_that_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_that, 0, false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_that_guard = + Some(api_that.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_that_guard = api_that_guard.unwrap(); + let output_ok = Result::<_, ()>::Ok({ + crate::api::runtime::JsAsyncRuntime::stop_drive(&*api_that_guard).await; + })?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} fn wire__crate__api__bytecode__JsBytecode_compile_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, @@ -3644,6 +3759,118 @@ fn wire__crate__api__engine__JsEngine_set_memory_limit_impl( }, ) } +fn wire__crate__api__engine__JsEngine_start_drive_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "JsEngine_start_drive", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = , + >>::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let mut api_that_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_that, 0, false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_that_guard = + Some(api_that.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_that_guard = api_that_guard.unwrap(); + let output_ok = + crate::api::engine::JsEngine::start_drive(&*api_that_guard).await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} +fn wire__crate__api__engine__JsEngine_stop_drive_impl( + port_: flutter_rust_bridge::for_generated::MessagePort, + ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, + rust_vec_len_: i32, + data_len_: i32, +) { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_async::( + flutter_rust_bridge::for_generated::TaskInfo { + debug_name: "JsEngine_stop_drive", + port: Some(port_), + mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + }, + move || { + let message = unsafe { + flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire( + ptr_, + rust_vec_len_, + data_len_, + ) + }; + let mut deserializer = + flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let api_that = , + >>::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let mut api_that_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_that, 0, false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_that_guard = + Some(api_that.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_that_guard = api_that_guard.unwrap(); + let output_ok = + crate::api::engine::JsEngine::stop_drive(&*api_that_guard).await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} fn wire__crate__api__runtime__JsRuntime_create_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, @@ -7913,206 +8140,222 @@ fn pde_ffi_dispatcher_primary_impl( rust_vec_len, data_len, ), - 19 => { + 19 => wire__crate__api__runtime__JsAsyncRuntime_start_drive_impl( + port, + ptr, + rust_vec_len, + data_len, + ), + 20 => wire__crate__api__runtime__JsAsyncRuntime_stop_drive_impl( + port, + ptr, + rust_vec_len, + data_len, + ), + 21 => { wire__crate__api__bytecode__JsBytecode_compile_impl(port, ptr, rust_vec_len, data_len) } - 20 => wire__crate__api__bytecode__JsBytecode_compile_module_bundle_impl( + 22 => wire__crate__api__bytecode__JsBytecode_compile_module_bundle_impl( port, ptr, rust_vec_len, data_len, ), - 22 => wire__crate__api__bytecode__JsBytecode_compile_script_impl( + 24 => wire__crate__api__bytecode__JsBytecode_compile_script_impl( port, ptr, rust_vec_len, data_len, ), - 25 => { + 27 => { wire__crate__api__bytecode__JsBytecode_validate_impl(port, ptr, rust_vec_len, data_len) } - 26 => wire__crate__api__bytecode__JsBytecode_validate_bundle_impl( + 28 => wire__crate__api__bytecode__JsBytecode_validate_bundle_impl( port, ptr, rust_vec_len, data_len, ), - 28 => wire__crate__api__bytecode__JsBytecode_validate_script_impl( + 30 => wire__crate__api__bytecode__JsBytecode_validate_script_impl( port, ptr, rust_vec_len, data_len, ), - 37 => wire__crate__api__engine__JsEngine_call_impl(port, ptr, rust_vec_len, data_len), - 38 => wire__crate__api__engine__JsEngine_clear_pending_modules_impl( + 39 => wire__crate__api__engine__JsEngine_call_impl(port, ptr, rust_vec_len, data_len), + 40 => wire__crate__api__engine__JsEngine_clear_pending_modules_impl( port, ptr, rust_vec_len, data_len, ), - 39 => wire__crate__api__engine__JsEngine_close_impl(port, ptr, rust_vec_len, data_len), - 41 => wire__crate__api__engine__JsEngine_create_impl(port, ptr, rust_vec_len, data_len), - 42 => wire__crate__api__engine__JsEngine_declare_new_bytecode_bundle_impl( + 41 => wire__crate__api__engine__JsEngine_close_impl(port, ptr, rust_vec_len, data_len), + 43 => wire__crate__api__engine__JsEngine_create_impl(port, ptr, rust_vec_len, data_len), + 44 => wire__crate__api__engine__JsEngine_declare_new_bytecode_bundle_impl( port, ptr, rust_vec_len, data_len, ), - 43 => wire__crate__api__engine__JsEngine_declare_new_bytecode_module_impl( + 45 => wire__crate__api__engine__JsEngine_declare_new_bytecode_module_impl( port, ptr, rust_vec_len, data_len, ), - 44 => wire__crate__api__engine__JsEngine_declare_new_bytecode_modules_impl( + 46 => wire__crate__api__engine__JsEngine_declare_new_bytecode_modules_impl( port, ptr, rust_vec_len, data_len, ), - 45 => wire__crate__api__engine__JsEngine_declare_new_module_impl( + 47 => wire__crate__api__engine__JsEngine_declare_new_module_impl( port, ptr, rust_vec_len, data_len, ), - 46 => wire__crate__api__engine__JsEngine_declare_new_modules_impl( + 48 => wire__crate__api__engine__JsEngine_declare_new_modules_impl( port, ptr, rust_vec_len, data_len, ), - 47 => wire__crate__api__engine__JsEngine_eval_impl(port, ptr, rust_vec_len, data_len), - 48 => wire__crate__api__engine__JsEngine_evaluate_bytecode_bundle_impl( + 49 => wire__crate__api__engine__JsEngine_eval_impl(port, ptr, rust_vec_len, data_len), + 50 => wire__crate__api__engine__JsEngine_evaluate_bytecode_bundle_impl( port, ptr, rust_vec_len, data_len, ), - 49 => wire__crate__api__engine__JsEngine_evaluate_bytecode_module_impl( + 51 => wire__crate__api__engine__JsEngine_evaluate_bytecode_module_impl( port, ptr, rust_vec_len, data_len, ), - 50 => wire__crate__api__engine__JsEngine_evaluate_module_impl( + 52 => wire__crate__api__engine__JsEngine_evaluate_module_impl( port, ptr, rust_vec_len, data_len, ), - 51 => wire__crate__api__engine__JsEngine_evaluate_script_bytecode_impl( + 53 => wire__crate__api__engine__JsEngine_evaluate_script_bytecode_impl( port, ptr, rust_vec_len, data_len, ), - 52 => wire__crate__api__engine__JsEngine_execute_pending_job_impl( + 54 => wire__crate__api__engine__JsEngine_execute_pending_job_impl( port, ptr, rust_vec_len, data_len, ), - 53 => wire__crate__api__engine__JsEngine_get_available_modules_impl( + 55 => wire__crate__api__engine__JsEngine_get_available_modules_impl( port, ptr, rust_vec_len, data_len, ), - 54 => wire__crate__api__engine__JsEngine_get_declared_modules_impl( + 56 => wire__crate__api__engine__JsEngine_get_declared_modules_impl( port, ptr, rust_vec_len, data_len, ), - 55 => wire__crate__api__engine__JsEngine_idle_impl(port, ptr, rust_vec_len, data_len), - 56 => wire__crate__api__engine__JsEngine_init_impl(port, ptr, rust_vec_len, data_len), - 57 => wire__crate__api__engine__JsEngine_init_without_bridge_impl( + 57 => wire__crate__api__engine__JsEngine_idle_impl(port, ptr, rust_vec_len, data_len), + 58 => wire__crate__api__engine__JsEngine_init_impl(port, ptr, rust_vec_len, data_len), + 59 => wire__crate__api__engine__JsEngine_init_without_bridge_impl( port, ptr, rust_vec_len, data_len, ), - 58 => wire__crate__api__engine__JsEngine_is_job_pending_impl( + 60 => wire__crate__api__engine__JsEngine_is_job_pending_impl( port, ptr, rust_vec_len, data_len, ), - 59 => wire__crate__api__engine__JsEngine_is_module_available_impl( + 61 => wire__crate__api__engine__JsEngine_is_module_available_impl( port, ptr, rust_vec_len, data_len, ), - 60 => wire__crate__api__engine__JsEngine_is_module_declared_impl( + 62 => wire__crate__api__engine__JsEngine_is_module_declared_impl( port, ptr, rust_vec_len, data_len, ), - 61 => { + 63 => { wire__crate__api__engine__JsEngine_memory_usage_impl(port, ptr, rust_vec_len, data_len) } - 62 => wire__crate__api__engine__JsEngine_run_gc_impl(port, ptr, rust_vec_len, data_len), - 64 => wire__crate__api__engine__JsEngine_set_gc_threshold_impl( + 64 => wire__crate__api__engine__JsEngine_run_gc_impl(port, ptr, rust_vec_len, data_len), + 66 => wire__crate__api__engine__JsEngine_set_gc_threshold_impl( port, ptr, rust_vec_len, data_len, ), - 65 => wire__crate__api__engine__JsEngine_set_info_impl(port, ptr, rust_vec_len, data_len), - 66 => wire__crate__api__engine__JsEngine_set_max_stack_size_impl( + 67 => wire__crate__api__engine__JsEngine_set_info_impl(port, ptr, rust_vec_len, data_len), + 68 => wire__crate__api__engine__JsEngine_set_max_stack_size_impl( port, ptr, rust_vec_len, data_len, ), - 67 => wire__crate__api__engine__JsEngine_set_memory_limit_impl( + 69 => wire__crate__api__engine__JsEngine_set_memory_limit_impl( port, ptr, rust_vec_len, data_len, ), - 68 => wire__crate__api__runtime__JsRuntime_create_impl(port, ptr, rust_vec_len, data_len), - 108 => wire__crate__api__init_app_impl(port, ptr, rust_vec_len, data_len), - 110 => wire__crate__api__source__js_builtin_options_default_impl( + 70 => { + wire__crate__api__engine__JsEngine_start_drive_impl(port, ptr, rust_vec_len, data_len) + } + 71 => wire__crate__api__engine__JsEngine_stop_drive_impl(port, ptr, rust_vec_len, data_len), + 72 => wire__crate__api__runtime__JsRuntime_create_impl(port, ptr, rust_vec_len, data_len), + 112 => wire__crate__api__init_app_impl(port, ptr, rust_vec_len, data_len), + 114 => wire__crate__api__source__js_builtin_options_default_impl( port, ptr, rust_vec_len, data_len, ), - 115 => wire__crate__api__source__js_bytecode_endianness_default_impl( + 119 => wire__crate__api__source__js_bytecode_endianness_default_impl( port, ptr, rust_vec_len, data_len, ), - 119 => wire__crate__api__engine__js_engine_runtime_options_default_impl( + 123 => wire__crate__api__engine__js_engine_runtime_options_default_impl( port, ptr, rust_vec_len, data_len, ), - 123 => wire__crate__api__source__js_eval_options_default_impl( + 127 => wire__crate__api__source__js_eval_options_default_impl( port, ptr, rust_vec_len, data_len, ), - 130 => wire__crate__api__source__js_module_bytecode_options_default_impl( + 134 => wire__crate__api__source__js_module_bytecode_options_default_impl( port, ptr, rust_vec_len, data_len, ), - 137 => wire__crate__api__source__js_script_bytecode_options_default_impl( + 141 => wire__crate__api__source__js_script_bytecode_options_default_impl( port, ptr, rust_vec_len, data_len, ), - 139 => wire__crate__api__value__js_value_default_impl(port, ptr, rust_vec_len, data_len), + 143 => wire__crate__api__value__js_value_default_impl(port, ptr, rust_vec_len, data_len), _ => unreachable!(), } } @@ -8126,193 +8369,193 @@ fn pde_ffi_dispatcher_sync_impl( // Codec=Pde (Serialization + dispatch), see doc to use other codecs match func_id { 13 => wire__crate__api__runtime__JsAsyncRuntime_new_impl(ptr, rust_vec_len, data_len), - 21 => wire__crate__api__bytecode__JsBytecode_compile_module_bundle_sync_impl( + 23 => wire__crate__api__bytecode__JsBytecode_compile_module_bundle_sync_impl( ptr, rust_vec_len, data_len, ), - 23 => wire__crate__api__bytecode__JsBytecode_compile_script_sync_impl( + 25 => wire__crate__api__bytecode__JsBytecode_compile_script_sync_impl( ptr, rust_vec_len, data_len, ), - 24 => wire__crate__api__bytecode__JsBytecode_compile_sync_impl(ptr, rust_vec_len, data_len), - 27 => wire__crate__api__bytecode__JsBytecode_validate_bundle_sync_impl( + 26 => wire__crate__api__bytecode__JsBytecode_compile_sync_impl(ptr, rust_vec_len, data_len), + 29 => wire__crate__api__bytecode__JsBytecode_validate_bundle_sync_impl( ptr, rust_vec_len, data_len, ), - 29 => wire__crate__api__bytecode__JsBytecode_validate_script_sync_impl( + 31 => wire__crate__api__bytecode__JsBytecode_validate_script_sync_impl( ptr, rust_vec_len, data_len, ), - 30 => { + 32 => { wire__crate__api__bytecode__JsBytecode_validate_sync_impl(ptr, rust_vec_len, data_len) } - 31 => wire__crate__api__runtime__JsContext_eval_impl(ptr, rust_vec_len, data_len), - 32 => wire__crate__api__runtime__JsContext_eval_file_impl(ptr, rust_vec_len, data_len), - 33 => wire__crate__api__runtime__JsContext_eval_file_with_options_impl( + 33 => wire__crate__api__runtime__JsContext_eval_impl(ptr, rust_vec_len, data_len), + 34 => wire__crate__api__runtime__JsContext_eval_file_impl(ptr, rust_vec_len, data_len), + 35 => wire__crate__api__runtime__JsContext_eval_file_with_options_impl( ptr, rust_vec_len, data_len, ), - 34 => { + 36 => { wire__crate__api__runtime__JsContext_eval_with_options_impl(ptr, rust_vec_len, data_len) } - 35 => wire__crate__api__runtime__JsContext_from_impl(ptr, rust_vec_len, data_len), - 36 => wire__crate__api__runtime__JsContext_get_available_modules_impl( + 37 => wire__crate__api__runtime__JsContext_from_impl(ptr, rust_vec_len, data_len), + 38 => wire__crate__api__runtime__JsContext_get_available_modules_impl( ptr, rust_vec_len, data_len, ), - 40 => wire__crate__api__engine__JsEngine_closed_impl(ptr, rust_vec_len, data_len), - 63 => wire__crate__api__engine__JsEngine_running_impl(ptr, rust_vec_len, data_len), - 69 => wire__crate__api__runtime__JsRuntime_execute_pending_job_impl( + 42 => wire__crate__api__engine__JsEngine_closed_impl(ptr, rust_vec_len, data_len), + 65 => wire__crate__api__engine__JsEngine_running_impl(ptr, rust_vec_len, data_len), + 73 => wire__crate__api__runtime__JsRuntime_execute_pending_job_impl( ptr, rust_vec_len, data_len, ), - 70 => wire__crate__api__runtime__JsRuntime_is_job_pending_impl(ptr, rust_vec_len, data_len), - 71 => wire__crate__api__runtime__JsRuntime_memory_usage_impl(ptr, rust_vec_len, data_len), - 72 => wire__crate__api__runtime__JsRuntime_new_impl(ptr, rust_vec_len, data_len), - 73 => wire__crate__api__runtime__JsRuntime_run_gc_impl(ptr, rust_vec_len, data_len), - 74 => wire__crate__api__runtime__JsRuntime_set_dump_flags_impl(ptr, rust_vec_len, data_len), - 75 => { + 74 => wire__crate__api__runtime__JsRuntime_is_job_pending_impl(ptr, rust_vec_len, data_len), + 75 => wire__crate__api__runtime__JsRuntime_memory_usage_impl(ptr, rust_vec_len, data_len), + 76 => wire__crate__api__runtime__JsRuntime_new_impl(ptr, rust_vec_len, data_len), + 77 => wire__crate__api__runtime__JsRuntime_run_gc_impl(ptr, rust_vec_len, data_len), + 78 => wire__crate__api__runtime__JsRuntime_set_dump_flags_impl(ptr, rust_vec_len, data_len), + 79 => { wire__crate__api__runtime__JsRuntime_set_gc_threshold_impl(ptr, rust_vec_len, data_len) } - 76 => wire__crate__api__runtime__JsRuntime_set_info_impl(ptr, rust_vec_len, data_len), - 77 => wire__crate__api__runtime__JsRuntime_set_max_stack_size_impl( + 80 => wire__crate__api__runtime__JsRuntime_set_info_impl(ptr, rust_vec_len, data_len), + 81 => wire__crate__api__runtime__JsRuntime_set_max_stack_size_impl( ptr, rust_vec_len, data_len, ), - 78 => { + 82 => { wire__crate__api__runtime__JsRuntime_set_memory_limit_impl(ptr, rust_vec_len, data_len) } - 79 => wire__crate__api__runtime__MemoryUsage_array_count_impl(ptr, rust_vec_len, data_len), - 80 => wire__crate__api__runtime__MemoryUsage_atom_count_impl(ptr, rust_vec_len, data_len), - 81 => wire__crate__api__runtime__MemoryUsage_atom_size_impl(ptr, rust_vec_len, data_len), - 82 => wire__crate__api__runtime__MemoryUsage_binary_object_count_impl( + 83 => wire__crate__api__runtime__MemoryUsage_array_count_impl(ptr, rust_vec_len, data_len), + 84 => wire__crate__api__runtime__MemoryUsage_atom_count_impl(ptr, rust_vec_len, data_len), + 85 => wire__crate__api__runtime__MemoryUsage_atom_size_impl(ptr, rust_vec_len, data_len), + 86 => wire__crate__api__runtime__MemoryUsage_binary_object_count_impl( ptr, rust_vec_len, data_len, ), - 83 => wire__crate__api__runtime__MemoryUsage_binary_object_size_impl( + 87 => wire__crate__api__runtime__MemoryUsage_binary_object_size_impl( ptr, rust_vec_len, data_len, ), - 84 => wire__crate__api__runtime__MemoryUsage_c_func_count_impl(ptr, rust_vec_len, data_len), - 85 => wire__crate__api__runtime__MemoryUsage_fast_array_count_impl( + 88 => wire__crate__api__runtime__MemoryUsage_c_func_count_impl(ptr, rust_vec_len, data_len), + 89 => wire__crate__api__runtime__MemoryUsage_fast_array_count_impl( ptr, rust_vec_len, data_len, ), - 86 => wire__crate__api__runtime__MemoryUsage_fast_array_elements_impl( + 90 => wire__crate__api__runtime__MemoryUsage_fast_array_elements_impl( ptr, rust_vec_len, data_len, ), - 87 => wire__crate__api__runtime__MemoryUsage_js_func_code_size_impl( + 91 => wire__crate__api__runtime__MemoryUsage_js_func_code_size_impl( ptr, rust_vec_len, data_len, ), - 88 => { + 92 => { wire__crate__api__runtime__MemoryUsage_js_func_count_impl(ptr, rust_vec_len, data_len) } - 89 => wire__crate__api__runtime__MemoryUsage_js_func_pc2line_count_impl( + 93 => wire__crate__api__runtime__MemoryUsage_js_func_pc2line_count_impl( ptr, rust_vec_len, data_len, ), - 90 => wire__crate__api__runtime__MemoryUsage_js_func_pc2line_size_impl( + 94 => wire__crate__api__runtime__MemoryUsage_js_func_pc2line_size_impl( ptr, rust_vec_len, data_len, ), - 91 => wire__crate__api__runtime__MemoryUsage_js_func_size_impl(ptr, rust_vec_len, data_len), - 92 => wire__crate__api__runtime__MemoryUsage_malloc_count_impl(ptr, rust_vec_len, data_len), - 93 => wire__crate__api__runtime__MemoryUsage_malloc_limit_impl(ptr, rust_vec_len, data_len), - 94 => wire__crate__api__runtime__MemoryUsage_malloc_size_impl(ptr, rust_vec_len, data_len), - 95 => wire__crate__api__runtime__MemoryUsage_memory_used_count_impl( + 95 => wire__crate__api__runtime__MemoryUsage_js_func_size_impl(ptr, rust_vec_len, data_len), + 96 => wire__crate__api__runtime__MemoryUsage_malloc_count_impl(ptr, rust_vec_len, data_len), + 97 => wire__crate__api__runtime__MemoryUsage_malloc_limit_impl(ptr, rust_vec_len, data_len), + 98 => wire__crate__api__runtime__MemoryUsage_malloc_size_impl(ptr, rust_vec_len, data_len), + 99 => wire__crate__api__runtime__MemoryUsage_memory_used_count_impl( ptr, rust_vec_len, data_len, ), - 96 => wire__crate__api__runtime__MemoryUsage_memory_used_size_impl( + 100 => wire__crate__api__runtime__MemoryUsage_memory_used_size_impl( ptr, rust_vec_len, data_len, ), - 97 => wire__crate__api__runtime__MemoryUsage_obj_count_impl(ptr, rust_vec_len, data_len), - 98 => wire__crate__api__runtime__MemoryUsage_obj_size_impl(ptr, rust_vec_len, data_len), - 99 => wire__crate__api__runtime__MemoryUsage_prop_count_impl(ptr, rust_vec_len, data_len), - 100 => wire__crate__api__runtime__MemoryUsage_prop_size_impl(ptr, rust_vec_len, data_len), - 101 => wire__crate__api__runtime__MemoryUsage_shape_count_impl(ptr, rust_vec_len, data_len), - 102 => wire__crate__api__runtime__MemoryUsage_shape_size_impl(ptr, rust_vec_len, data_len), - 103 => wire__crate__api__runtime__MemoryUsage_str_count_impl(ptr, rust_vec_len, data_len), - 104 => wire__crate__api__runtime__MemoryUsage_str_size_impl(ptr, rust_vec_len, data_len), - 105 => wire__crate__api__runtime__MemoryUsage_summary_impl(ptr, rust_vec_len, data_len), - 106 => wire__crate__api__runtime__MemoryUsage_total_allocations_impl( + 101 => wire__crate__api__runtime__MemoryUsage_obj_count_impl(ptr, rust_vec_len, data_len), + 102 => wire__crate__api__runtime__MemoryUsage_obj_size_impl(ptr, rust_vec_len, data_len), + 103 => wire__crate__api__runtime__MemoryUsage_prop_count_impl(ptr, rust_vec_len, data_len), + 104 => wire__crate__api__runtime__MemoryUsage_prop_size_impl(ptr, rust_vec_len, data_len), + 105 => wire__crate__api__runtime__MemoryUsage_shape_count_impl(ptr, rust_vec_len, data_len), + 106 => wire__crate__api__runtime__MemoryUsage_shape_size_impl(ptr, rust_vec_len, data_len), + 107 => wire__crate__api__runtime__MemoryUsage_str_count_impl(ptr, rust_vec_len, data_len), + 108 => wire__crate__api__runtime__MemoryUsage_str_size_impl(ptr, rust_vec_len, data_len), + 109 => wire__crate__api__runtime__MemoryUsage_summary_impl(ptr, rust_vec_len, data_len), + 110 => wire__crate__api__runtime__MemoryUsage_total_allocations_impl( ptr, rust_vec_len, data_len, ), - 107 => { + 111 => { wire__crate__api__runtime__MemoryUsage_total_memory_impl(ptr, rust_vec_len, data_len) } - 109 => wire__crate__api__source__js_builtin_options_all_impl(ptr, rust_vec_len, data_len), - 111 => { + 113 => wire__crate__api__source__js_builtin_options_all_impl(ptr, rust_vec_len, data_len), + 115 => { wire__crate__api__source__js_builtin_options_essential_impl(ptr, rust_vec_len, data_len) } - 112 => wire__crate__api__source__js_builtin_options_node_impl(ptr, rust_vec_len, data_len), - 113 => wire__crate__api__source__js_builtin_options_none_impl(ptr, rust_vec_len, data_len), - 114 => wire__crate__api__source__js_builtin_options_web_impl(ptr, rust_vec_len, data_len), - 116 => wire__crate__api__source__js_code_is_bytes_impl(ptr, rust_vec_len, data_len), - 117 => wire__crate__api__source__js_code_is_code_impl(ptr, rust_vec_len, data_len), - 118 => wire__crate__api__source__js_code_is_path_impl(ptr, rust_vec_len, data_len), - 120 => wire__crate__api__error__js_error_code_impl(ptr, rust_vec_len, data_len), - 121 => wire__crate__api__error__js_error_is_recoverable_impl(ptr, rust_vec_len, data_len), - 122 => wire__crate__api__error__js_error_to_string_impl(ptr, rust_vec_len, data_len), - 124 => wire__crate__api__source__js_eval_options_defaults_impl(ptr, rust_vec_len, data_len), - 125 => wire__crate__api__source__js_eval_options_module_impl(ptr, rust_vec_len, data_len), - 126 => wire__crate__api__source__js_eval_options_new_impl(ptr, rust_vec_len, data_len), - 127 => { + 116 => wire__crate__api__source__js_builtin_options_node_impl(ptr, rust_vec_len, data_len), + 117 => wire__crate__api__source__js_builtin_options_none_impl(ptr, rust_vec_len, data_len), + 118 => wire__crate__api__source__js_builtin_options_web_impl(ptr, rust_vec_len, data_len), + 120 => wire__crate__api__source__js_code_is_bytes_impl(ptr, rust_vec_len, data_len), + 121 => wire__crate__api__source__js_code_is_code_impl(ptr, rust_vec_len, data_len), + 122 => wire__crate__api__source__js_code_is_path_impl(ptr, rust_vec_len, data_len), + 124 => wire__crate__api__error__js_error_code_impl(ptr, rust_vec_len, data_len), + 125 => wire__crate__api__error__js_error_is_recoverable_impl(ptr, rust_vec_len, data_len), + 126 => wire__crate__api__error__js_error_to_string_impl(ptr, rust_vec_len, data_len), + 128 => wire__crate__api__source__js_eval_options_defaults_impl(ptr, rust_vec_len, data_len), + 129 => wire__crate__api__source__js_eval_options_module_impl(ptr, rust_vec_len, data_len), + 130 => wire__crate__api__source__js_eval_options_new_impl(ptr, rust_vec_len, data_len), + 131 => { wire__crate__api__source__js_eval_options_with_promise_impl(ptr, rust_vec_len, data_len) } - 128 => wire__crate__api__source__js_module_bytecode_bundle_new_impl( + 132 => wire__crate__api__source__js_module_bytecode_bundle_new_impl( ptr, rust_vec_len, data_len, ), - 129 => wire__crate__api__source__js_module_bytecode_new_impl(ptr, rust_vec_len, data_len), - 131 => wire__crate__api__source__js_module_bytecode_options_defaults_impl( + 133 => wire__crate__api__source__js_module_bytecode_new_impl(ptr, rust_vec_len, data_len), + 135 => wire__crate__api__source__js_module_bytecode_options_defaults_impl( ptr, rust_vec_len, data_len, ), - 132 => wire__crate__api__source__js_module_bytes_impl(ptr, rust_vec_len, data_len), - 133 => wire__crate__api__source__js_module_code_impl(ptr, rust_vec_len, data_len), - 134 => wire__crate__api__source__js_module_new_impl(ptr, rust_vec_len, data_len), - 135 => wire__crate__api__source__js_module_path_impl(ptr, rust_vec_len, data_len), - 136 => wire__crate__api__source__js_script_bytecode_new_impl(ptr, rust_vec_len, data_len), - 138 => wire__crate__api__source__js_script_bytecode_options_defaults_impl( + 136 => wire__crate__api__source__js_module_bytes_impl(ptr, rust_vec_len, data_len), + 137 => wire__crate__api__source__js_module_code_impl(ptr, rust_vec_len, data_len), + 138 => wire__crate__api__source__js_module_new_impl(ptr, rust_vec_len, data_len), + 139 => wire__crate__api__source__js_module_path_impl(ptr, rust_vec_len, data_len), + 140 => wire__crate__api__source__js_script_bytecode_new_impl(ptr, rust_vec_len, data_len), + 142 => wire__crate__api__source__js_script_bytecode_options_defaults_impl( ptr, rust_vec_len, data_len, ), - 140 => wire__crate__api__value__js_value_is_array_impl(ptr, rust_vec_len, data_len), - 141 => wire__crate__api__value__js_value_is_boolean_impl(ptr, rust_vec_len, data_len), - 142 => wire__crate__api__value__js_value_is_bytes_impl(ptr, rust_vec_len, data_len), - 143 => wire__crate__api__value__js_value_is_date_impl(ptr, rust_vec_len, data_len), - 144 => wire__crate__api__value__js_value_is_none_impl(ptr, rust_vec_len, data_len), - 145 => wire__crate__api__value__js_value_is_number_impl(ptr, rust_vec_len, data_len), - 146 => wire__crate__api__value__js_value_is_object_impl(ptr, rust_vec_len, data_len), - 147 => wire__crate__api__value__js_value_is_primitive_impl(ptr, rust_vec_len, data_len), - 148 => wire__crate__api__value__js_value_is_string_impl(ptr, rust_vec_len, data_len), - 149 => wire__crate__api__value__js_value_type_name_impl(ptr, rust_vec_len, data_len), + 144 => wire__crate__api__value__js_value_is_array_impl(ptr, rust_vec_len, data_len), + 145 => wire__crate__api__value__js_value_is_boolean_impl(ptr, rust_vec_len, data_len), + 146 => wire__crate__api__value__js_value_is_bytes_impl(ptr, rust_vec_len, data_len), + 147 => wire__crate__api__value__js_value_is_date_impl(ptr, rust_vec_len, data_len), + 148 => wire__crate__api__value__js_value_is_none_impl(ptr, rust_vec_len, data_len), + 149 => wire__crate__api__value__js_value_is_number_impl(ptr, rust_vec_len, data_len), + 150 => wire__crate__api__value__js_value_is_object_impl(ptr, rust_vec_len, data_len), + 151 => wire__crate__api__value__js_value_is_primitive_impl(ptr, rust_vec_len, data_len), + 152 => wire__crate__api__value__js_value_is_string_impl(ptr, rust_vec_len, data_len), + 153 => wire__crate__api__value__js_value_type_name_impl(ptr, rust_vec_len, data_len), _ => unreachable!(), } } diff --git a/libfjs/src/tests/async_tests.rs b/libfjs/src/tests/async_tests.rs index e57329f..f1fe626 100644 --- a/libfjs/src/tests/async_tests.rs +++ b/libfjs/src/tests/async_tests.rs @@ -750,3 +750,197 @@ async fn test_context_async_eval_state_persistence() { _ => panic!("Expected 42"), } } + +// ============================================================================ +// Background Driver Tests +// ============================================================================ + +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn test_start_stop_drive_lifecycle() { + let runtime = JsAsyncRuntime::new().unwrap(); + + // No driver before it is started. + assert!(runtime.driver.lock().unwrap().is_none()); + + // Starting spawns a live background task. + runtime.start_drive().await; + let first_id = { + let slot = runtime.driver.lock().unwrap(); + let handle = slot.as_ref().expect("driver task should be present"); + assert!(!handle.is_finished(), "driver task should be running"); + handle.id() + }; + + // Idempotent: a second start does not replace the running task. + runtime.start_drive().await; + let second_id = runtime.driver.lock().unwrap().as_ref().unwrap().id(); + assert_eq!(first_id, second_id, "start_drive should not re-spawn"); + + // Stopping aborts the task and clears the slot. + runtime.stop_drive().await; + assert!(runtime.driver.lock().unwrap().is_none()); + + // Stopping again is a harmless no-op. + runtime.stop_drive().await; + assert!(runtime.driver.lock().unwrap().is_none()); + + // The runtime is still usable after stopping the driver. + let context = JsAsyncContext::from(&runtime).await.unwrap(); + let _ = context.eval("globalThis.y = 7".to_string()).await; + assert!(matches!( + context.eval("y".to_string()).await, + JsResult::Ok(JsValue::Integer(7)) + )); +} + +/// The whole point of `start_drive`: a *detached* async job (one not awaited by +/// any live `eval`) must still resolve on its own. `eval`'s own await loop +/// (rquickjs `WithFuture`) already pumps work it is awaiting, so a timer inside +/// `await new Promise(...)` is not a real test of the driver. Here we schedule a +/// timer and return immediately, leaving it parked on the scheduler with nothing +/// awaiting it — exactly how the app's `fetch`/timers behave. +/// +/// `is_job_pending()` is a pure state read; it never drives the scheduler, so it +/// cannot itself pump the timer. +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn test_background_driver_pumps_detached_timer() { + use crate::api::engine::JsEngine; + use crate::api::source::{JsBuiltinOptions, JsCode}; + use std::time::Duration; + + let schedule = "setTimeout(() => { globalThis.__fired = true; }, 50); 'scheduled'"; + + // Control: with NO driver, the detached timer can never run — nothing polls + // the scheduler during the sleep — so it stays pending. + let engine = JsEngine::create(Some(JsBuiltinOptions::essential()), None, None) + .await + .unwrap(); + engine.init_without_bridge().await.unwrap(); + engine + .eval(JsCode::Code(schedule.to_string()), None) + .await + .unwrap(); + assert!( + engine.is_job_pending().await.unwrap(), + "timer should be queued right after scheduling" + ); + tokio::time::sleep(Duration::from_millis(300)).await; + assert!( + engine.is_job_pending().await.unwrap(), + "without a driver the detached timer must still be pending after 300ms" + ); + engine.close().await.unwrap(); + + // With the driver: the same detached timer resolves on its own. + let engine = JsEngine::create(Some(JsBuiltinOptions::essential()), None, None) + .await + .unwrap(); + engine.init_without_bridge().await.unwrap(); + engine.start_drive().await.unwrap(); + engine + .eval(JsCode::Code(schedule.to_string()), None) + .await + .unwrap(); + tokio::time::sleep(Duration::from_millis(300)).await; + assert!( + !engine.is_job_pending().await.unwrap(), + "the background driver should have pumped the detached timer to completion" + ); + engine.close().await.unwrap(); +} + +/// Same idea as the timer test, but for `fetch` — the path that actually fails +/// in the app. A fetch's network I/O is driven by a connection task hyper +/// `tokio::spawn`s separately from the scheduler, so it exercises more of the +/// wake chain than a self-contained timer. +/// +/// The app's symptom is specific: the request *egress* works, but the response +/// reaching JS (the `.then`) is what lags. So we test the full round trip into +/// JS by chaining a second fetch inside `.then`: server B only hears anything if +/// `fetch(A)`'s promise actually resolved in JS and ran the callback. All +/// observation is host-side (a server reading request bytes), so no `eval` can +/// mask a missing wake by pumping the scheduler itself. +#[tokio::test(flavor = "multi_thread", worker_threads = 4)] +async fn test_background_driver_pumps_detached_fetch() { + use crate::api::engine::JsEngine; + use crate::api::source::{JsBuiltinOptions, JsCode}; + use std::time::Duration; + use tokio::io::{AsyncReadExt, AsyncWriteExt}; + + // A local server that replies 200, and signals once it has read a request. + async fn spawn_server() -> (String, tokio::sync::mpsc::Receiver<()>) { + let listener = tokio::net::TcpListener::bind("127.0.0.1:0").await.unwrap(); + let addr = listener.local_addr().unwrap(); + let (tx, rx) = tokio::sync::mpsc::channel(1); + tokio::spawn(async move { + loop { + let Ok((mut sock, _)) = listener.accept().await else { + return; + }; + let tx = tx.clone(); + tokio::spawn(async move { + let mut buf = [0u8; 1024]; + if sock.read(&mut buf).await.unwrap_or(0) > 0 { + let _ = tx.send(()).await; + let _ = sock + .write_all(b"HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n") + .await; + } + }); + } + }); + (format!("http://{addr}/"), rx) + } + + // fetch(A).then(() => fetch(B)) — B is reached only if A's response was + // delivered back into JS and the .then ran. Detached: nothing awaits it. + let schedule = |a: &str, b: &str| { + format!("fetch('{a}').then(() => fetch('{b}')).catch(() => {{}}); 'scheduled'") + }; + + // Control: with NO driver nothing pumps, so A's request never even goes out. + let (url_a, rx_a) = spawn_server().await; + let (url_b, mut rx_b) = spawn_server().await; + let engine = JsEngine::create(Some(JsBuiltinOptions::all()), None, None) + .await + .unwrap(); + engine.init_without_bridge().await.unwrap(); + engine + .eval(JsCode::Code(schedule(&url_a, &url_b)), None) + .await + .unwrap(); + assert!( + tokio::time::timeout(Duration::from_millis(800), rx_b.recv()) + .await + .is_err(), + "without a driver the chained fetch must never reach server B" + ); + let _ = rx_a; + engine.close().await.unwrap(); + + // With the driver: A goes out, A's response reaches JS, .then runs, B is hit. + let (url_a, mut rx_a) = spawn_server().await; + let (url_b, mut rx_b) = spawn_server().await; + let engine = JsEngine::create(Some(JsBuiltinOptions::all()), None, None) + .await + .unwrap(); + engine.init_without_bridge().await.unwrap(); + engine.start_drive().await.unwrap(); + engine + .eval(JsCode::Code(schedule(&url_a, &url_b)), None) + .await + .unwrap(); + assert!( + tokio::time::timeout(Duration::from_secs(3), rx_a.recv()) + .await + .is_ok(), + "the driver should have sent fetch A" + ); + assert!( + tokio::time::timeout(Duration::from_secs(3), rx_b.recv()) + .await + .is_ok(), + "fetch A's response should have reached JS and triggered fetch B" + ); + engine.close().await.unwrap(); +} diff --git a/libfjs/src/tests/engine_tests.rs b/libfjs/src/tests/engine_tests.rs index 72803fc..12f9ecd 100644 --- a/libfjs/src/tests/engine_tests.rs +++ b/libfjs/src/tests/engine_tests.rs @@ -180,6 +180,7 @@ async fn test_engine_init_failure_rolls_back_state() { global_attachment: Some( GlobalAttachment::default().add_function(failing_global_attachment), ), + driver: std::sync::Arc::new(std::sync::Mutex::new(None)), }; let context = JsAsyncContext::from(&runtime).await.unwrap(); let engine = JsEngine::new_for_test(runtime, context); @@ -210,6 +211,7 @@ async fn test_engine_runtime_proxy_methods_fail_while_initializing() { global_attachment: Some( GlobalAttachment::default().add_function(blocking_global_attachment), ), + driver: std::sync::Arc::new(std::sync::Mutex::new(None)), }; let context = JsAsyncContext::from(&runtime).await.unwrap(); let engine = std::sync::Arc::new(JsEngine::new_for_test(runtime, context));