From fca055103297ba91ecc350166da820b51937f845 Mon Sep 17 00:00:00 2001 From: Kingkor Roy Tirtho Date: Wed, 3 Dec 2025 18:25:48 +0600 Subject: [PATCH] feat: weird impl --- lib/main.dart | 68 +- .../plugin_api/localstorage/localstorage.dart | 0 lib/src/plugin_api/webview/webview.dart | 119 ++ .../plugin_api/webview/webview_binding.dart | 40 + lib/src/plugin_api/webview/webview_page.dart | 62 + lib/src/rust/api/host_api/webview.dart | 31 + lib/src/rust/api/plugin/plugin.dart | 3 +- lib/src/rust/frb_generated.dart | 577 ++++-- lib/src/rust/frb_generated.io.dart | 114 ++ pubspec.lock | 8 +- pubspec.yaml | 5 + rust/Cargo.lock | 99 ++ rust/Cargo.toml | 3 +- rust/src/api/host_api/mod.rs | 1 + rust/src/api/host_api/webview.rs | 191 ++ rust/src/api/mod.rs | 1 + rust/src/api/plugin/plugin.rs | 44 +- rust/src/api/plugin/senders.rs | 105 +- rust/src/frb_generated.rs | 1569 +++++++++++++++-- rust/src/main.rs | 4 +- 20 files changed, 2661 insertions(+), 383 deletions(-) create mode 100644 lib/src/plugin_api/localstorage/localstorage.dart create mode 100644 lib/src/plugin_api/webview/webview.dart create mode 100644 lib/src/plugin_api/webview/webview_binding.dart create mode 100644 lib/src/plugin_api/webview/webview_page.dart create mode 100644 lib/src/rust/api/host_api/webview.dart create mode 100644 rust/src/api/host_api/mod.rs create mode 100644 rust/src/api/host_api/webview.rs diff --git a/lib/main.dart b/lib/main.dart index 6506b348..e6b62161 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -45,6 +45,7 @@ import 'package:spotube/services/kv_store/encrypted_kv_store.dart'; import 'package:spotube/services/kv_store/kv_store.dart'; import 'package:spotube/services/logger/logger.dart'; import 'package:spotube/services/wm_tools/wm_tools.dart'; +import 'package:spotube/src/plugin_api/webview/webview_binding.dart'; import 'package:spotube/src/rust/api/plugin/models/core.dart'; import 'package:spotube/src/rust/api/plugin/plugin.dart'; import 'package:spotube/src/rust/frb_generated.dart'; @@ -58,28 +59,6 @@ import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:yt_dlp_dart/yt_dlp_dart.dart'; import 'package:flutter_new_pipe_extractor/flutter_new_pipe_extractor.dart'; -const pluginJS = """ -function timeout(ms) { - return new Promise(resolve => setTimeout(resolve, ms)); -} -class CoreEndpoint { - async checkUpdate() { - console.log('Core checkUpdate'); - await timeout(5000); - console.log('Core checkUpdate done. No updates!'); - } - get support() { - return 'Metadata'; - } -} - -class TestingPlugin { - constructor() { - this.core = new CoreEndpoint(); - } -} -"""; - Future main(List rawArgs) async { if (rawArgs.contains("web_view_title_bar")) { WidgetsFlutterBinding.ensureInitialized(); @@ -120,25 +99,44 @@ Future main(List rawArgs) async { await KVStoreService.initialize(); await RustLib.init(); + WebViewBinding.register(); final plugin = SpotubePlugin(); - const config = PluginConfiguration( - entryPoint: "TestingPlugin", - abilities: [PluginAbility.metadata], - apis: [], - author: "KRTirtho", - description: "Testing Plugin", - name: "Testing Plugin", + const pluginConfiguration = PluginConfiguration( + name: "Spotube Plugin", + description: "Spotube Plugin", + version: "1.0.0", + author: "Spotube", + entryPoint: "Plugin", pluginApiVersion: "2.0.0", - repository: null, - version: "0.1.0", + apis: [PluginApi.localstorage, PluginApi.webview], + abilities: [PluginAbility.metadata], ); - final sender = plugin.createContext( - pluginScript: pluginJS, - pluginConfig: config, + final pluginContext = plugin.createContext( + pluginScript: """ +class AuthEndpoint { +} +class CoreEndpoint { + async checkUpdate() { + const webview = await Webview.create("https://spotube.krtirtho.dev"); + webview.events.on("url_change", (url) => { + console.log("url_change: ", url); + }) + await webview.open(); + } +} +class Plugin { + constructor() { + this.auth = new AuthEndpoint(); + this.core = new CoreEndpoint(); + } +} +""", + pluginConfig: pluginConfiguration, ); - await plugin.core.checkUpdate(mpscTx: sender, pluginConfig: config); + await plugin.core + .checkUpdate(mpscTx: pluginContext, pluginConfig: pluginConfiguration); if (kIsDesktop) { await windowManager.setPreventClose(true); diff --git a/lib/src/plugin_api/localstorage/localstorage.dart b/lib/src/plugin_api/localstorage/localstorage.dart new file mode 100644 index 00000000..e69de29b diff --git a/lib/src/plugin_api/webview/webview.dart b/lib/src/plugin_api/webview/webview.dart new file mode 100644 index 00000000..561d152e --- /dev/null +++ b/lib/src/plugin_api/webview/webview.dart @@ -0,0 +1,119 @@ +import 'dart:async'; +import 'dart:io'; + +import 'package:auto_route/auto_route.dart'; +import 'package:desktop_webview_window/desktop_webview_window.dart'; +import 'package:desktop_webview_window/desktop_webview_window.dart' + as webview_window; +import 'package:flutter_inappwebview/flutter_inappwebview.dart'; +import 'package:path/path.dart'; +import 'package:path_provider/path_provider.dart'; +import 'package:random_user_agents/random_user_agents.dart'; +import 'package:shadcn_flutter/shadcn_flutter.dart' hide join; +import 'package:spotube/collections/routes.dart'; +import 'package:spotube/components/titlebar/titlebar.dart'; +import 'package:spotube/src/plugin_api/webview/webview_page.dart'; +import 'package:uuid/uuid.dart'; + +class Webview { + final String uri; + final String uid; + Webview({ + required this.uri, + }) : _onUrlRequestStreamController = StreamController.broadcast(), + uid = const Uuid().v4(); + + StreamController? _onUrlRequestStreamController; + Stream get onUrlRequestStream => + _onUrlRequestStreamController!.stream; + + webview_window.Webview? _webview; + + BuildContext? _pageContext; + Future open() async { + if (Platform.isLinux) { + final applicationSupportDir = await getApplicationSupportDirectory(); + final userDataFolder = Directory( + join(applicationSupportDir.path, "webview_window_Webview2"), + ); + + if (!await userDataFolder.exists()) { + await userDataFolder.create(); + } + + _webview = await WebviewWindow.create( + configuration: CreateConfiguration( + title: "Spotube Login", + windowHeight: 720, + windowWidth: 1280, + userDataFolderWindows: userDataFolder.path, + ), + ) + ..setApplicationUserAgent(RandomUserAgents.random()); + _webview!.setOnUrlRequestCallback((url) { + _onUrlRequestStreamController?.add(url); + return true; + }); + _webview!.launch(uri); + + return; + } + + final route = WebviewPage( + uri: uri, + onLoad: (url) { + _onUrlRequestStreamController?.add(url.toString()); + }, + ); + + await rootNavigatorKey.currentContext?.router.pushWidget( + Builder(builder: (context) { + _pageContext = context; + return Scaffold( + headers: const [ + TitleBar( + automaticallyImplyLeading: true, + ) + ], + child: route, + ); + }), + ); + } + + Future close() async { + _onUrlRequestStreamController?.close(); + _onUrlRequestStreamController = null; + if (Platform.isLinux) { + _webview?.close(); + _webview = null; + return; + } + await _pageContext?.maybePop(); + } + + Future> getCookies(String url) async { + if (Platform.isLinux) { + final cookies = await _webview?.getAllCookies() ?? []; + + return cookies.map((cookie) { + return Cookie( + name: cookie.name, + value: cookie.value, + domain: cookie.domain, + expiresDate: cookie.expires?.millisecondsSinceEpoch, + isHttpOnly: cookie.httpOnly, + isSecure: cookie.secure, + isSessionOnly: cookie.sessionOnly, + path: cookie.path, + ); + }).toList(); + } + + return await CookieManager.instance( + // Created in [WebviewPage]. Custom WebViewEnvironment for Windows otherwise it installs + // in installation directory so permission exception occurs. + webViewEnvironment: await webViewEnvironment, + ).getCookies(url: WebUri(url)); + } +} diff --git a/lib/src/plugin_api/webview/webview_binding.dart b/lib/src/plugin_api/webview/webview_binding.dart new file mode 100644 index 00000000..08956152 --- /dev/null +++ b/lib/src/plugin_api/webview/webview_binding.dart @@ -0,0 +1,40 @@ +import 'dart:async'; +import 'dart:convert'; + +import 'package:spotube/services/logger/logger.dart'; +import 'package:spotube/src/plugin_api/webview/webview.dart'; +import 'package:spotube/src/rust/api/host_api/webview.dart'; + +class WebViewBinding { + static void register() async { + final subscriptions = {}; + + await initializeWebviewCallbacks( + createWebview: (uri, sender) async { + final webview = Webview(uri: uri); + + subscriptions[webview.uid] = + webview.onUrlRequestStream.listen((event) async { + try { + await sendWebviewEvents(tx: sender, event: event); + } catch (e, stack) { + AppLogger.reportError(e, stack); + } + }); + + return webview; + }, + openWebview: (webview) async { + await (webview as Webview).open(); + }, + closeWebview: (webview) async { + subscriptions.remove((webview as Webview).uid); + await webview.close(); + }, + getCookies: (webview, url) async { + final cookies = await (webview as Webview).getCookies(url); + return jsonEncode(cookies); + }, + ); + } +} diff --git a/lib/src/plugin_api/webview/webview_page.dart b/lib/src/plugin_api/webview/webview_page.dart new file mode 100644 index 00000000..1b67a4a7 --- /dev/null +++ b/lib/src/plugin_api/webview/webview_page.dart @@ -0,0 +1,62 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:flutter_inappwebview/flutter_inappwebview.dart'; +import 'package:path/path.dart'; +import 'package:path_provider/path_provider.dart'; +import 'package:fk_user_agent/fk_user_agent.dart'; + +Future getUserAgent() async { + if (Platform.isIOS || Platform.isAndroid) { + await FkUserAgent.init(); + return FkUserAgent.userAgent; + } + return null; +} + +final webViewEnvironment = Platform.isWindows + ? getApplicationSupportDirectory().then((directory) async { + return await WebViewEnvironment.create( + settings: WebViewEnvironmentSettings( + userDataFolder: join(directory.path, 'inappwebview_data'), + ), + ); + }) + : Future.value(null); + +class WebviewPage extends StatelessWidget { + final String uri; + final void Function(String url)? onLoad; + const WebviewPage({super.key, required this.uri, this.onLoad}); + + @override + Widget build(BuildContext context) { + return FutureBuilder( + future: Future.wait([webViewEnvironment, getUserAgent()]), + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return const Center(child: CircularProgressIndicator()); + } + + return InAppWebView( + initialUrlRequest: URLRequest(url: WebUri(uri)), + webViewEnvironment: snapshot.data?[0] as WebViewEnvironment?, + initialSettings: InAppWebViewSettings( + userAgent: snapshot.data?[1] as String?, + ), + onLoadStop: (controller, url) { + try { + if (onLoad != null && url != null) { + onLoad!(url.toString()); + } + } catch (e, stack) { + debugPrint("[Webview][onLoad] Error: $e"); + debugPrintStack(stackTrace: stack); + rethrow; + } + }, + ); + }, + ); + } +} diff --git a/lib/src/rust/api/host_api/webview.dart b/lib/src/rust/api/host_api/webview.dart new file mode 100644 index 00000000..58d2699a --- /dev/null +++ b/lib/src/rust/api/host_api/webview.dart @@ -0,0 +1,31 @@ +// This file is automatically generated, so please do not edit it. +// @generated by `flutter_rust_bridge`@ 2.11.1. + +// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import + +import '../../frb_generated.dart'; +import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart'; + +// These types are ignored because they are neither used by any `pub` functions nor (for structs and enums) marked `#[frb(unignore)]`: `DART_CLOSE_WEBVIEW`, `DART_CREATE_WEBVIEW`, `DART_GET_COOKIES`, `DART_OPEN_WEBVIEW`, `HostWebview`, `Webview` +// These function are ignored because they are on traits that is not defined in current crate (put an empty `#[frb]` on it to unignore): `deref`, `deref`, `deref`, `deref`, `initialize`, `initialize`, `initialize`, `initialize`, `trace` +// These functions are ignored (category: IgnoreBecauseExplicitAttribute): `close`, `close`, `create`, `create`, `get_cookies`, `get_cookies`, `open`, `open`, `poll_url_change_event` + +Future initializeWebviewCallbacks( + {required FutureOr Function(String, BroadcastSenderString) + createWebview, + required FutureOr Function(Object) openWebview, + required FutureOr Function(Object) closeWebview, + required FutureOr Function(Object, String) getCookies}) => + RustLib.instance.api.crateApiHostApiWebviewInitializeWebviewCallbacks( + createWebview: createWebview, + openWebview: openWebview, + closeWebview: closeWebview, + getCookies: getCookies); + +Future sendWebviewEvents( + {required BroadcastSenderString tx, required String event}) => + RustLib.instance.api + .crateApiHostApiWebviewSendWebviewEvents(tx: tx, event: event); + +// Rust type: RustOpaqueMoi>> +abstract class BroadcastSenderString implements RustOpaqueInterface {} diff --git a/lib/src/rust/api/plugin/plugin.dart b/lib/src/rust/api/plugin/plugin.dart index 72a2b59b..be6c964c 100644 --- a/lib/src/rust/api/plugin/plugin.dart +++ b/lib/src/rust/api/plugin/plugin.dart @@ -12,6 +12,7 @@ import 'senders.dart'; // These functions are ignored because they are not marked as `pub`: `create_context`, `js_executor_thread` // These function are ignored because they are on traits that is not defined in current crate (put an empty `#[frb]` on it to unignore): `clone`, `fmt` +// These functions are ignored (category: IgnoreBecauseExplicitAttribute): `open_webview` // Rust type: RustOpaqueMoi> abstract class OpaqueSender implements RustOpaqueInterface { @@ -66,7 +67,7 @@ abstract class SpotubePlugin implements RustOpaqueInterface { Future close({required OpaqueSender tx}); - Future createContext( + OpaqueSender createContext( {required String pluginScript, required PluginConfiguration pluginConfig}); diff --git a/lib/src/rust/frb_generated.dart b/lib/src/rust/frb_generated.dart index cdb58c64..61423880 100644 --- a/lib/src/rust/frb_generated.dart +++ b/lib/src/rust/frb_generated.dart @@ -3,6 +3,7 @@ // ignore_for_file: unused_import, unused_element, unnecessary_import, duplicate_ignore, invalid_use_of_internal_member, annotate_overrides, non_constant_identifier_names, curly_braces_in_flow_control_structures, prefer_const_literals_to_create_immutables, unused_field +import 'api/host_api/webview.dart'; import 'api/plugin/commands.dart'; import 'api/plugin/models/album.dart'; import 'api/plugin/models/artist.dart'; @@ -85,7 +86,7 @@ class RustLib extends BaseEntrypoint { String get codegenVersion => '2.11.1'; @override - int get rustContentHash => 1716120288; + int get rustContentHash => 1149066488; static const kDefaultExternalLibraryLoaderConfig = ExternalLibraryLoaderConfig( @@ -170,7 +171,7 @@ abstract class RustLibApi extends BaseApi { Future crateApiPluginPluginSpotubePluginClose( {required SpotubePlugin that, required OpaqueSender tx}); - Future crateApiPluginPluginSpotubePluginCreateContext( + OpaqueSender crateApiPluginPluginSpotubePluginCreateContext( {required SpotubePlugin that, required String pluginScript, required PluginConfiguration pluginConfig}); @@ -179,6 +180,13 @@ abstract class RustLibApi extends BaseApi { Future crateApiInitApp(); + Future crateApiHostApiWebviewInitializeWebviewCallbacks( + {required FutureOr Function(String, BroadcastSenderString) + createWebview, + required FutureOr Function(Object) openWebview, + required FutureOr Function(Object) closeWebview, + required FutureOr Function(Object, String) getCookies}); + Future crateApiPluginSendersPluginAlbumSenderGetAlbum( {required PluginAlbumSender that, required OpaqueSender mpscTx, @@ -455,6 +463,9 @@ abstract class RustLibApi extends BaseApi { int? offset, int? limit}); + Future crateApiHostApiWebviewSendWebviewEvents( + {required BroadcastSenderString tx, required String event}); + String crateApiPluginModelsAudioSourceSpotubeAudioLosslessContainerQualityToStringFmt( {required SpotubeAudioLosslessContainerQuality that}); @@ -467,6 +478,15 @@ abstract class RustLibApi extends BaseApi { crateApiPluginModelsAudioSourceSpotubeAudioSourceContainerPresetFileExtension( {required SpotubeAudioSourceContainerPreset that}); + RustArcIncrementStrongCountFnType + get rust_arc_increment_strong_count_BroadcastSenderString; + + RustArcDecrementStrongCountFnType + get rust_arc_decrement_strong_count_BroadcastSenderString; + + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_BroadcastSenderStringPtr; + RustArcIncrementStrongCountFnType get rust_arc_increment_strong_count_OpaqueSender; @@ -1196,19 +1216,18 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { ); @override - Future crateApiPluginPluginSpotubePluginCreateContext( + OpaqueSender crateApiPluginPluginSpotubePluginCreateContext( {required SpotubePlugin that, required String pluginScript, required PluginConfiguration pluginConfig}) { - return handler.executeNormal(NormalTask( - callFfi: (port_) { + return handler.executeSync(SyncTask( + callFfi: () { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSpotubePlugin( that, serializer); sse_encode_String(pluginScript, serializer); sse_encode_box_autoadd_plugin_configuration(pluginConfig, serializer); - pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 25, port: port_); + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 25)!; }, codec: SseCodec( decodeSuccessData: @@ -1274,6 +1293,49 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { argNames: [], ); + @override + Future crateApiHostApiWebviewInitializeWebviewCallbacks( + {required FutureOr Function(String, BroadcastSenderString) + createWebview, + required FutureOr Function(Object) openWebview, + required FutureOr Function(Object) closeWebview, + required FutureOr Function(Object, String) getCookies}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_DartFn_Inputs_String_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBroadcastSenderString_Output_DartOpaque_AnyhowException( + createWebview, serializer); + sse_encode_DartFn_Inputs_DartOpaque_Output_unit_AnyhowException( + openWebview, serializer); + sse_encode_DartFn_Inputs_DartOpaque_Output_unit_AnyhowException( + closeWebview, serializer); + sse_encode_DartFn_Inputs_DartOpaque_String_Output_String_AnyhowException( + getCookies, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 28, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiHostApiWebviewInitializeWebviewCallbacksConstMeta, + argValues: [createWebview, openWebview, closeWebview, getCookies], + apiImpl: this, + )); + } + + TaskConstMeta + get kCrateApiHostApiWebviewInitializeWebviewCallbacksConstMeta => + const TaskConstMeta( + debugName: "initialize_webview_callbacks", + argNames: [ + "createWebview", + "openWebview", + "closeWebview", + "getCookies" + ], + ); + @override Future crateApiPluginSendersPluginAlbumSenderGetAlbum( {required PluginAlbumSender that, @@ -1283,11 +1345,11 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_plugin_album_sender(that, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( mpscTx, serializer); sse_encode_String(id, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 28, port: port_); + funcId: 29, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_spotube_full_album_object, @@ -1316,12 +1378,12 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_plugin_album_sender(that, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( mpscTx, serializer); sse_encode_opt_box_autoadd_u_32(offset, serializer); sse_encode_opt_box_autoadd_u_32(limit, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 29, port: port_); + funcId: 30, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_spotube_pagination_response_object, @@ -1348,11 +1410,11 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_plugin_album_sender(that, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( mpscTx, serializer); sse_encode_list_String(ids, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 30, port: port_); + funcId: 31, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -1382,13 +1444,13 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_plugin_album_sender(that, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( mpscTx, serializer); sse_encode_String(id, serializer); sse_encode_opt_box_autoadd_u_32(offset, serializer); sse_encode_opt_box_autoadd_u_32(limit, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 31, port: port_); + funcId: 32, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_spotube_pagination_response_object, @@ -1415,11 +1477,11 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_plugin_album_sender(that, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( mpscTx, serializer); sse_encode_list_String(ids, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 32, port: port_); + funcId: 33, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -1449,13 +1511,13 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_plugin_artist_sender(that, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( mpscTx, serializer); sse_encode_String(id, serializer); sse_encode_opt_box_autoadd_u_32(offset, serializer); sse_encode_opt_box_autoadd_u_32(limit, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 33, port: port_); + funcId: 34, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_spotube_pagination_response_object, @@ -1483,11 +1545,11 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_plugin_artist_sender(that, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( mpscTx, serializer); sse_encode_String(id, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 34, port: port_); + funcId: 35, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_spotube_full_artist_object, @@ -1518,13 +1580,13 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_plugin_artist_sender(that, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( mpscTx, serializer); sse_encode_String(id, serializer); sse_encode_opt_box_autoadd_u_32(offset, serializer); sse_encode_opt_box_autoadd_u_32(limit, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 35, port: port_); + funcId: 36, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_spotube_pagination_response_object, @@ -1551,11 +1613,11 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_plugin_artist_sender(that, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( mpscTx, serializer); sse_encode_list_String(ids, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 36, port: port_); + funcId: 37, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -1585,13 +1647,13 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_plugin_artist_sender(that, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( mpscTx, serializer); sse_encode_String(id, serializer); sse_encode_opt_box_autoadd_u_32(offset, serializer); sse_encode_opt_box_autoadd_u_32(limit, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 37, port: port_); + funcId: 38, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_spotube_pagination_response_object, @@ -1619,11 +1681,11 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_plugin_artist_sender(that, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( mpscTx, serializer); sse_encode_list_String(ids, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 38, port: port_); + funcId: 39, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -1651,11 +1713,11 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_plugin_audio_source_sender(that, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( mpscTx, serializer); sse_encode_box_autoadd_spotube_track_object(track, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 39, port: port_); + funcId: 40, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_list_spotube_audio_source_match_object, @@ -1684,12 +1746,12 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_plugin_audio_source_sender(that, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( mpscTx, serializer); sse_encode_box_autoadd_spotube_audio_source_match_object( matched, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 40, port: port_); + funcId: 41, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_list_spotube_audio_source_stream_object, @@ -1715,10 +1777,10 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_plugin_auth_sender(that, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( mpscTx, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 41, port: port_); + funcId: 42, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -1744,10 +1806,10 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_plugin_auth_sender(that, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( mpscTx, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 42, port: port_); + funcId: 43, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_bool, @@ -1773,10 +1835,10 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_plugin_auth_sender(that, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( mpscTx, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 43, port: port_); + funcId: 44, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -1806,13 +1868,13 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_plugin_browse_sender(that, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( mpscTx, serializer); sse_encode_String(id, serializer); sse_encode_opt_box_autoadd_u_32(offset, serializer); sse_encode_opt_box_autoadd_u_32(limit, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 44, port: port_); + funcId: 45, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_spotube_pagination_response_object, @@ -1842,12 +1904,12 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_plugin_browse_sender(that, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( mpscTx, serializer); sse_encode_opt_box_autoadd_u_32(offset, serializer); sse_encode_opt_box_autoadd_u_32(limit, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 45, port: port_); + funcId: 46, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_spotube_pagination_response_object, @@ -1873,7 +1935,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_plugin_configuration(that, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 46, port: port_); + funcId: 47, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_String, @@ -1901,11 +1963,11 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_plugin_core_sender(that, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( mpscTx, serializer); sse_encode_box_autoadd_plugin_configuration(pluginConfig, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 47, port: port_); + funcId: 48, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_opt_box_autoadd_plugin_update_available, @@ -1933,11 +1995,11 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_plugin_core_sender(that, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( mpscTx, serializer); sse_encode_box_autoadd_scrobble_details(details, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 48, port: port_); + funcId: 49, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -1962,10 +2024,10 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_plugin_core_sender(that, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( mpscTx, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 49, port: port_); + funcId: 50, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_String, @@ -1994,13 +2056,13 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_plugin_playlist_sender(that, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( mpscTx, serializer); sse_encode_String(playlistId, serializer); sse_encode_list_String(trackIds, serializer); sse_encode_opt_box_autoadd_u_32(position, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 50, port: port_); + funcId: 51, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -2033,7 +2095,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_plugin_playlist_sender(that, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( mpscTx, serializer); sse_encode_String(userId, serializer); sse_encode_String(name, serializer); @@ -2041,7 +2103,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_encode_opt_box_autoadd_bool(public, serializer); sse_encode_opt_box_autoadd_bool(collaborative, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 51, port: port_); + funcId: 52, port: port_); }, codec: SseCodec( decodeSuccessData: @@ -2087,11 +2149,11 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_plugin_playlist_sender(that, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( mpscTx, serializer); sse_encode_String(playlistId, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 52, port: port_); + funcId: 53, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -2121,11 +2183,11 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_plugin_playlist_sender(that, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( mpscTx, serializer); sse_encode_String(id, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 53, port: port_); + funcId: 54, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_spotube_full_playlist_object, @@ -2154,12 +2216,12 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_plugin_playlist_sender(that, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( mpscTx, serializer); sse_encode_String(playlistId, serializer); sse_encode_list_String(trackIds, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 54, port: port_); + funcId: 55, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -2188,11 +2250,11 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_plugin_playlist_sender(that, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( mpscTx, serializer); sse_encode_String(playlistId, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 55, port: port_); + funcId: 56, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -2222,13 +2284,13 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_plugin_playlist_sender(that, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( mpscTx, serializer); sse_encode_String(id, serializer); sse_encode_opt_box_autoadd_u_32(offset, serializer); sse_encode_opt_box_autoadd_u_32(limit, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 56, port: port_); + funcId: 57, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_spotube_pagination_response_object, @@ -2255,11 +2317,11 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_plugin_playlist_sender(that, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( mpscTx, serializer); sse_encode_String(playlistId, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 57, port: port_); + funcId: 58, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -2290,7 +2352,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_plugin_playlist_sender(that, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( mpscTx, serializer); sse_encode_String(playlistId, serializer); sse_encode_opt_String(name, serializer); @@ -2298,7 +2360,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_encode_opt_box_autoadd_bool(public, serializer); sse_encode_opt_box_autoadd_bool(collaborative, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 58, port: port_); + funcId: 59, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -2346,13 +2408,13 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_plugin_search_sender(that, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( mpscTx, serializer); sse_encode_String(query, serializer); sse_encode_opt_box_autoadd_u_32(offset, serializer); sse_encode_opt_box_autoadd_u_32(limit, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 59, port: port_); + funcId: 60, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_spotube_pagination_response_object, @@ -2380,11 +2442,11 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_plugin_search_sender(that, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( mpscTx, serializer); sse_encode_String(query, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 60, port: port_); + funcId: 61, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_spotube_search_response_object, @@ -2414,13 +2476,13 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_plugin_search_sender(that, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( mpscTx, serializer); sse_encode_String(query, serializer); sse_encode_opt_box_autoadd_u_32(offset, serializer); sse_encode_opt_box_autoadd_u_32(limit, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 61, port: port_); + funcId: 62, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_spotube_pagination_response_object, @@ -2445,10 +2507,10 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_plugin_search_sender(that, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( mpscTx, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 62, port: port_); + funcId: 63, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_list_String, @@ -2478,13 +2540,13 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_plugin_search_sender(that, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( mpscTx, serializer); sse_encode_String(query, serializer); sse_encode_opt_box_autoadd_u_32(offset, serializer); sse_encode_opt_box_autoadd_u_32(limit, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 63, port: port_); + funcId: 64, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_spotube_pagination_response_object, @@ -2515,13 +2577,13 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_plugin_search_sender(that, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( mpscTx, serializer); sse_encode_String(query, serializer); sse_encode_opt_box_autoadd_u_32(offset, serializer); sse_encode_opt_box_autoadd_u_32(limit, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 64, port: port_); + funcId: 65, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_spotube_pagination_response_object, @@ -2548,11 +2610,11 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_plugin_track_sender(that, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( mpscTx, serializer); sse_encode_String(id, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 65, port: port_); + funcId: 66, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_spotube_track_object, @@ -2579,11 +2641,11 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_plugin_track_sender(that, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( mpscTx, serializer); sse_encode_String(id, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 66, port: port_); + funcId: 67, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_list_spotube_track_object, @@ -2610,11 +2672,11 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_plugin_track_sender(that, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( mpscTx, serializer); sse_encode_list_String(ids, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 67, port: port_); + funcId: 68, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -2641,11 +2703,11 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_plugin_track_sender(that, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( mpscTx, serializer); sse_encode_list_String(ids, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 68, port: port_); + funcId: 69, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_unit, @@ -2670,10 +2732,10 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_plugin_user_sender(that, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( mpscTx, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 69, port: port_); + funcId: 70, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_spotube_user_object, @@ -2702,12 +2764,12 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_plugin_user_sender(that, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( mpscTx, serializer); sse_encode_opt_box_autoadd_u_32(offset, serializer); sse_encode_opt_box_autoadd_u_32(limit, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 70, port: port_); + funcId: 71, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_spotube_pagination_response_object, @@ -2737,12 +2799,12 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_plugin_user_sender(that, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( mpscTx, serializer); sse_encode_opt_box_autoadd_u_32(offset, serializer); sse_encode_opt_box_autoadd_u_32(limit, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 71, port: port_); + funcId: 72, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_spotube_pagination_response_object, @@ -2772,12 +2834,12 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_plugin_user_sender(that, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( mpscTx, serializer); sse_encode_opt_box_autoadd_u_32(offset, serializer); sse_encode_opt_box_autoadd_u_32(limit, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 72, port: port_); + funcId: 73, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_spotube_pagination_response_object, @@ -2807,12 +2869,12 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { callFfi: (port_) { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_plugin_user_sender(that, serializer); - sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( + sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( mpscTx, serializer); sse_encode_opt_box_autoadd_u_32(offset, serializer); sse_encode_opt_box_autoadd_u_32(limit, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 73, port: port_); + funcId: 74, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_spotube_pagination_response_object, @@ -2831,6 +2893,34 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { argNames: ["that", "mpscTx", "offset", "limit"], ); + @override + Future crateApiHostApiWebviewSendWebviewEvents( + {required BroadcastSenderString tx, required String event}) { + return handler.executeNormal(NormalTask( + callFfi: (port_) { + final serializer = SseSerializer(generalizedFrbRustBinding); + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBroadcastSenderString( + tx, serializer); + sse_encode_String(event, serializer); + pdeCallFfi(generalizedFrbRustBinding, serializer, + funcId: 75, port: port_); + }, + codec: SseCodec( + decodeSuccessData: sse_decode_unit, + decodeErrorData: sse_decode_AnyhowException, + ), + constMeta: kCrateApiHostApiWebviewSendWebviewEventsConstMeta, + argValues: [tx, event], + apiImpl: this, + )); + } + + TaskConstMeta get kCrateApiHostApiWebviewSendWebviewEventsConstMeta => + const TaskConstMeta( + debugName: "send_webview_events", + argNames: ["tx", "event"], + ); + @override String crateApiPluginModelsAudioSourceSpotubeAudioLosslessContainerQualityToStringFmt( @@ -2840,7 +2930,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_spotube_audio_lossless_container_quality( that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 74)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 76)!; }, codec: SseCodec( decodeSuccessData: sse_decode_String, @@ -2870,7 +2960,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_encode_box_autoadd_spotube_audio_lossy_container_quality( that, serializer); pdeCallFfi(generalizedFrbRustBinding, serializer, - funcId: 75, port: port_); + funcId: 77, port: port_); }, codec: SseCodec( decodeSuccessData: sse_decode_String, @@ -2899,7 +2989,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { final serializer = SseSerializer(generalizedFrbRustBinding); sse_encode_box_autoadd_spotube_audio_source_container_preset( that, serializer); - return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 76)!; + return pdeCallFfi(generalizedFrbRustBinding, serializer, funcId: 78)!; }, codec: SseCodec( decodeSuccessData: sse_decode_String, @@ -2919,6 +3009,117 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { argNames: ["that"], ); + Future Function(int, dynamic) + encode_DartFn_Inputs_DartOpaque_Output_unit_AnyhowException( + FutureOr Function(Object) raw) { + return (callId, rawArg0) async { + final arg0 = dco_decode_DartOpaque(rawArg0); + + Box? rawOutput; + Box? rawError; + try { + rawOutput = Box(await raw(arg0)); + } catch (e, s) { + rawError = Box(AnyhowException("$e\n\n$s")); + } + + final serializer = SseSerializer(generalizedFrbRustBinding); + assert((rawOutput != null) ^ (rawError != null)); + if (rawOutput != null) { + serializer.buffer.putUint8(0); + sse_encode_unit(rawOutput.value, serializer); + } else { + serializer.buffer.putUint8(1); + sse_encode_AnyhowException(rawError!.value, serializer); + } + final output = serializer.intoRaw(); + + generalizedFrbRustBinding.dartFnDeliverOutput( + callId: callId, + ptr: output.ptr, + rustVecLen: output.rustVecLen, + dataLen: output.dataLen); + }; + } + + Future Function(int, dynamic, dynamic) + encode_DartFn_Inputs_DartOpaque_String_Output_String_AnyhowException( + FutureOr Function(Object, String) raw) { + return (callId, rawArg0, rawArg1) async { + final arg0 = dco_decode_DartOpaque(rawArg0); + final arg1 = dco_decode_String(rawArg1); + + Box? rawOutput; + Box? rawError; + try { + rawOutput = Box(await raw(arg0, arg1)); + } catch (e, s) { + rawError = Box(AnyhowException("$e\n\n$s")); + } + + final serializer = SseSerializer(generalizedFrbRustBinding); + assert((rawOutput != null) ^ (rawError != null)); + if (rawOutput != null) { + serializer.buffer.putUint8(0); + sse_encode_String(rawOutput.value, serializer); + } else { + serializer.buffer.putUint8(1); + sse_encode_AnyhowException(rawError!.value, serializer); + } + final output = serializer.intoRaw(); + + generalizedFrbRustBinding.dartFnDeliverOutput( + callId: callId, + ptr: output.ptr, + rustVecLen: output.rustVecLen, + dataLen: output.dataLen); + }; + } + + Future Function(int, dynamic, dynamic) + encode_DartFn_Inputs_String_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBroadcastSenderString_Output_DartOpaque_AnyhowException( + FutureOr Function(String, BroadcastSenderString) raw) { + return (callId, rawArg0, rawArg1) async { + final arg0 = dco_decode_String(rawArg0); + final arg1 = + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBroadcastSenderString( + rawArg1); + + Box? rawOutput; + Box? rawError; + try { + rawOutput = Box(await raw(arg0, arg1)); + } catch (e, s) { + rawError = Box(AnyhowException("$e\n\n$s")); + } + + final serializer = SseSerializer(generalizedFrbRustBinding); + assert((rawOutput != null) ^ (rawError != null)); + if (rawOutput != null) { + serializer.buffer.putUint8(0); + sse_encode_DartOpaque(rawOutput.value, serializer); + } else { + serializer.buffer.putUint8(1); + sse_encode_AnyhowException(rawError!.value, serializer); + } + final output = serializer.intoRaw(); + + generalizedFrbRustBinding.dartFnDeliverOutput( + callId: callId, + ptr: output.ptr, + rustVecLen: output.rustVecLen, + dataLen: output.dataLen); + }; + } + + RustArcIncrementStrongCountFnType + get rust_arc_increment_strong_count_BroadcastSenderString => wire + .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBroadcastSenderString; + + RustArcDecrementStrongCountFnType + get rust_arc_decrement_strong_count_BroadcastSenderString => wire + .rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBroadcastSenderString; + RustArcIncrementStrongCountFnType get rust_arc_increment_strong_count_OpaqueSender => wire .rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender; @@ -2957,6 +3158,14 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { return AnyhowException(raw as String); } + @protected + BroadcastSenderString + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBroadcastSenderString( + dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return BroadcastSenderStringImpl.frbInternalDcoDecode(raw as List); + } + @protected OpaqueSender dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( @@ -3021,6 +3230,44 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { return SpotubePluginImpl.frbInternalDcoDecode(raw as List); } + @protected + FutureOr Function(Object) + dco_decode_DartFn_Inputs_DartOpaque_Output_unit_AnyhowException( + dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + throw UnimplementedError(''); + } + + @protected + FutureOr Function(Object, String) + dco_decode_DartFn_Inputs_DartOpaque_String_Output_String_AnyhowException( + dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + throw UnimplementedError(''); + } + + @protected + FutureOr Function(String, BroadcastSenderString) + dco_decode_DartFn_Inputs_String_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBroadcastSenderString_Output_DartOpaque_AnyhowException( + dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + throw UnimplementedError(''); + } + + @protected + Object dco_decode_DartOpaque(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return decodeDartOpaque(raw, generalizedFrbRustBinding); + } + + @protected + BroadcastSenderString + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBroadcastSenderString( + dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return BroadcastSenderStringImpl.frbInternalDcoDecode(raw as List); + } + @protected OpaqueSender dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( @@ -3304,6 +3551,12 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { return dcoDecodeI64(raw); } + @protected + PlatformInt64 dco_decode_isize(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dcoDecodeI64(raw); + } + @protected List dco_decode_list_String(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs @@ -4109,6 +4362,15 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { return AnyhowException(inner); } + @protected + BroadcastSenderString + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBroadcastSenderString( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return BroadcastSenderStringImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + } + @protected OpaqueSender sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( @@ -4181,6 +4443,22 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); } + @protected + Object sse_decode_DartOpaque(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var inner = sse_decode_isize(deserializer); + return decodeDartOpaque(inner, generalizedFrbRustBinding); + } + + @protected + BroadcastSenderString + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBroadcastSenderString( + SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return BroadcastSenderStringImpl.frbInternalSseDecode( + sse_decode_usize(deserializer), sse_decode_i_32(deserializer)); + } + @protected OpaqueSender sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( @@ -4480,6 +4758,12 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { return deserializer.buffer.getPlatformInt64(); } + @protected + PlatformInt64 sse_decode_isize(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return deserializer.buffer.getPlatformInt64(); + } + @protected List sse_decode_list_String(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs @@ -5477,6 +5761,16 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { sse_encode_String(self.message, serializer); } + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBroadcastSenderString( + BroadcastSenderString self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_usize( + (self as BroadcastSenderStringImpl).frbInternalSseEncode(move: true), + serializer); + } + @protected void sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( @@ -5557,6 +5851,57 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { serializer); } + @protected + void sse_encode_DartFn_Inputs_DartOpaque_Output_unit_AnyhowException( + FutureOr Function(Object) self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_DartOpaque( + encode_DartFn_Inputs_DartOpaque_Output_unit_AnyhowException(self), + serializer); + } + + @protected + void sse_encode_DartFn_Inputs_DartOpaque_String_Output_String_AnyhowException( + FutureOr Function(Object, String) self, + SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_DartOpaque( + encode_DartFn_Inputs_DartOpaque_String_Output_String_AnyhowException( + self), + serializer); + } + + @protected + void + sse_encode_DartFn_Inputs_String_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBroadcastSenderString_Output_DartOpaque_AnyhowException( + FutureOr Function(String, BroadcastSenderString) self, + SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_DartOpaque( + encode_DartFn_Inputs_String_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBroadcastSenderString_Output_DartOpaque_AnyhowException( + self), + serializer); + } + + @protected + void sse_encode_DartOpaque(Object self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_isize( + PlatformPointerUtil.ptrToPlatformInt64(encodeDartOpaque( + self, portManager.dartHandlerPort, generalizedFrbRustBinding)), + serializer); + } + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBroadcastSenderString( + BroadcastSenderString self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_usize( + (self as BroadcastSenderStringImpl).frbInternalSseEncode(move: null), + serializer); + } + @protected void sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( @@ -5860,6 +6205,12 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { serializer.buffer.putPlatformInt64(self); } + @protected + void sse_encode_isize(PlatformInt64 self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + serializer.buffer.putPlatformInt64(self); + } + @protected void sse_encode_list_String(List self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs @@ -6625,6 +6976,28 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { } } +@sealed +class BroadcastSenderStringImpl extends RustOpaque + implements BroadcastSenderString { + // Not to be used by end users + BroadcastSenderStringImpl.frbInternalDcoDecode(List wire) + : super.frbInternalDcoDecode(wire, _kStaticData); + + // Not to be used by end users + BroadcastSenderStringImpl.frbInternalSseDecode( + BigInt ptr, int externalSizeOnNative) + : super.frbInternalSseDecode(ptr, externalSizeOnNative, _kStaticData); + + static final _kStaticData = RustArcStaticData( + rustArcIncrementStrongCount: RustLib + .instance.api.rust_arc_increment_strong_count_BroadcastSenderString, + rustArcDecrementStrongCount: RustLib + .instance.api.rust_arc_decrement_strong_count_BroadcastSenderString, + rustArcDecrementStrongCountPtr: RustLib + .instance.api.rust_arc_decrement_strong_count_BroadcastSenderStringPtr, + ); +} + @sealed class OpaqueSenderImpl extends RustOpaque implements OpaqueSender { // Not to be used by end users @@ -6813,7 +7186,7 @@ class SpotubePluginImpl extends RustOpaque implements SpotubePlugin { Future close({required OpaqueSender tx}) => RustLib.instance.api .crateApiPluginPluginSpotubePluginClose(that: this, tx: tx); - Future createContext( + OpaqueSender createContext( {required String pluginScript, required PluginConfiguration pluginConfig}) => RustLib.instance.api.crateApiPluginPluginSpotubePluginCreateContext( diff --git a/lib/src/rust/frb_generated.io.dart b/lib/src/rust/frb_generated.io.dart index 47459acc..3970f67c 100644 --- a/lib/src/rust/frb_generated.io.dart +++ b/lib/src/rust/frb_generated.io.dart @@ -3,6 +3,7 @@ // ignore_for_file: unused_import, unused_element, unnecessary_import, duplicate_ignore, invalid_use_of_internal_member, annotate_overrides, non_constant_identifier_names, curly_braces_in_flow_control_structures, prefer_const_literals_to_create_immutables, unused_field +import 'api/host_api/webview.dart'; import 'api/plugin/commands.dart'; import 'api/plugin/models/album.dart'; import 'api/plugin/models/artist.dart'; @@ -33,6 +34,10 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { required super.portManager, }); + CrossPlatformFinalizerArg + get rust_arc_decrement_strong_count_BroadcastSenderStringPtr => wire + ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBroadcastSenderStringPtr; + CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_OpaqueSenderPtr => wire ._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSenderPtr; @@ -52,6 +57,11 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected AnyhowException dco_decode_AnyhowException(dynamic raw); + @protected + BroadcastSenderString + dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBroadcastSenderString( + dynamic raw); + @protected OpaqueSender dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( @@ -92,6 +102,29 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSpotubePlugin( dynamic raw); + @protected + FutureOr Function(Object) + dco_decode_DartFn_Inputs_DartOpaque_Output_unit_AnyhowException( + dynamic raw); + + @protected + FutureOr Function(Object, String) + dco_decode_DartFn_Inputs_DartOpaque_String_Output_String_AnyhowException( + dynamic raw); + + @protected + FutureOr Function(String, BroadcastSenderString) + dco_decode_DartFn_Inputs_String_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBroadcastSenderString_Output_DartOpaque_AnyhowException( + dynamic raw); + + @protected + Object dco_decode_DartOpaque(dynamic raw); + + @protected + BroadcastSenderString + dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBroadcastSenderString( + dynamic raw); + @protected OpaqueSender dco_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( @@ -242,6 +275,9 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected PlatformInt64 dco_decode_i_64(dynamic raw); + @protected + PlatformInt64 dco_decode_isize(dynamic raw); + @protected List dco_decode_list_String(dynamic raw); @@ -485,6 +521,11 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected AnyhowException sse_decode_AnyhowException(SseDeserializer deserializer); + @protected + BroadcastSenderString + sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBroadcastSenderString( + SseDeserializer deserializer); + @protected OpaqueSender sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( @@ -525,6 +566,14 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSpotubePlugin( SseDeserializer deserializer); + @protected + Object sse_decode_DartOpaque(SseDeserializer deserializer); + + @protected + BroadcastSenderString + sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBroadcastSenderString( + SseDeserializer deserializer); + @protected OpaqueSender sse_decode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( @@ -691,6 +740,9 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected PlatformInt64 sse_decode_i_64(SseDeserializer deserializer); + @protected + PlatformInt64 sse_decode_isize(SseDeserializer deserializer); + @protected List sse_decode_list_String(SseDeserializer deserializer); @@ -968,6 +1020,11 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { void sse_encode_AnyhowException( AnyhowException self, SseSerializer serializer); + @protected + void + sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBroadcastSenderString( + BroadcastSenderString self, SseSerializer serializer); + @protected void sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( @@ -1008,6 +1065,28 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerSpotubePlugin( SpotubePlugin self, SseSerializer serializer); + @protected + void sse_encode_DartFn_Inputs_DartOpaque_Output_unit_AnyhowException( + FutureOr Function(Object) self, SseSerializer serializer); + + @protected + void sse_encode_DartFn_Inputs_DartOpaque_String_Output_String_AnyhowException( + FutureOr Function(Object, String) self, SseSerializer serializer); + + @protected + void + sse_encode_DartFn_Inputs_String_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBroadcastSenderString_Output_DartOpaque_AnyhowException( + FutureOr Function(String, BroadcastSenderString) self, + SseSerializer serializer); + + @protected + void sse_encode_DartOpaque(Object self, SseSerializer serializer); + + @protected + void + sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBroadcastSenderString( + BroadcastSenderString self, SseSerializer serializer); + @protected void sse_encode_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( @@ -1170,6 +1249,9 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { @protected void sse_encode_i_64(PlatformInt64 self, SseSerializer serializer); + @protected + void sse_encode_isize(PlatformInt64 self, SseSerializer serializer); + @protected void sse_encode_list_String(List self, SseSerializer serializer); @@ -1456,6 +1538,38 @@ class RustLibWire implements BaseWire { RustLibWire(ffi.DynamicLibrary dynamicLibrary) : _lookup = dynamicLibrary.lookup; + void + rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBroadcastSenderString( + ffi.Pointer ptr, + ) { + return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBroadcastSenderString( + ptr, + ); + } + + late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBroadcastSenderStringPtr = + _lookup)>>( + 'frbgen_spotube_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBroadcastSenderString'); + late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBroadcastSenderString = + _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBroadcastSenderStringPtr + .asFunction)>(); + + void + rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBroadcastSenderString( + ffi.Pointer ptr, + ) { + return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBroadcastSenderString( + ptr, + ); + } + + late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBroadcastSenderStringPtr = + _lookup)>>( + 'frbgen_spotube_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBroadcastSenderString'); + late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBroadcastSenderString = + _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBroadcastSenderStringPtr + .asFunction)>(); + void rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( ffi.Pointer ptr, diff --git a/pubspec.lock b/pubspec.lock index acaa9b6a..eb8cce1a 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -742,7 +742,7 @@ packages: source: hosted version: "1.1.1" fk_user_agent: - dependency: transitive + dependency: "direct main" description: path: "." ref: master @@ -1935,13 +1935,13 @@ packages: source: hosted version: "3.2.2" random_user_agents: - dependency: transitive + dependency: "direct main" description: name: random_user_agents - sha256: "95647149687167e82a7b39e1b4616fdebb574981b71b6f0cfca21b69f36293a8" + sha256: "80dc025723a73f04797351aa6ef2fddb14836f86a752711a2f8a04e37c4ccdff" url: "https://pub.dev" source: hosted - version: "1.0.17" + version: "1.0.18" recase: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index e4d9a61c..31becd97 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -42,6 +42,10 @@ dependencies: envied: ^1.0.0 file_picker: 10.3.3 file_selector: ^1.0.3 + fk_user_agent: + git: + url: https://github.com/TiffApps/fk_user_agent.git + ref: master fluentui_system_icons: ^1.1.234 flutter: sdk: flutter @@ -157,6 +161,7 @@ dependencies: path: rust_builder flutter_rust_bridge: 2.11.1 json_annotation: ^4.9.0 + random_user_agents: ^1.0.18 dev_dependencies: build_runner: ^2.4.13 diff --git a/rust/Cargo.lock b/rust/Cargo.lock index 69860ca7..7b718882 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -191,6 +191,26 @@ version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" +[[package]] +name = "bindgen" +version = "0.72.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" +dependencies = [ + "bitflags", + "cexpr", + "clang-sys", + "itertools", + "log", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "syn", +] + [[package]] name = "bitflags" version = "2.10.0" @@ -293,6 +313,15 @@ dependencies = [ "shlex", ] +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] + [[package]] name = "cfg-if" version = "1.0.4" @@ -334,6 +363,17 @@ dependencies = [ "inout", ] +[[package]] +name = "clang-sys" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +dependencies = [ + "glob", + "libc", + "libloading", +] + [[package]] name = "cmake" version = "0.1.54" @@ -898,6 +938,12 @@ version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +[[package]] +name = "glob" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" + [[package]] name = "h2" version = "0.4.12" @@ -1266,6 +1312,15 @@ dependencies = [ "hybrid-array", ] +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.15" @@ -1304,6 +1359,16 @@ version = "0.2.177" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" +[[package]] +name = "libloading" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" +dependencies = [ + "cfg-if", + "windows-targets 0.52.6", +] + [[package]] name = "libm" version = "0.2.15" @@ -1909,6 +1974,12 @@ version = "2.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "miniz_oxide" version = "0.7.1" @@ -1939,6 +2010,16 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -2175,6 +2256,16 @@ dependencies = [ "zerovec", ] +[[package]] +name = "prettyplease" +version = "0.2.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff24dfcda44452b9816fff4cd4227e1bb73ff5a2f1bc1105aa92fb8565ce44d2" +dependencies = [ + "proc-macro2", + "syn", +] + [[package]] name = "primefield" version = "0.14.0-rc.1" @@ -2396,6 +2487,7 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57b1b6528590d4d65dc86b5159eae2d0219709546644c66408b2441696d1d725" dependencies = [ + "bindgen", "cc", ] @@ -2428,6 +2520,7 @@ dependencies = [ "flutter_rust_bridge", "heck", "llrt_modules", + "once_cell", "rquickjs", "serde", "serde_json", @@ -2440,6 +2533,12 @@ version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + [[package]] name = "rustc_version" version = "0.4.1" diff --git a/rust/Cargo.toml b/rust/Cargo.toml index cd93dd97..09be3c6e 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -15,10 +15,11 @@ flutter_rust_bridge = "=2.11.1" anyhow = "1" serde_json = "1" serde = { version = "1.0.228", features = ["derive"] } -rquickjs = { version = "0", features = ["chrono", "futures"] } +rquickjs = { version = "0", features = ["chrono", "futures", "macro", "classes", "bindgen"] } tokio = { version = "1.48.0", features = ["full"] } heck = "0.5.0" llrt_modules = { git = "https://github.com/awslabs/llrt.git", rev = "7d749dd18cf26a2e51119094c3b945975ae57bd4", features = ["abort", "buffer", "console", "crypto", "events", "exceptions", "fetch", "navigator", "url", "timers"] } +once_cell = "1.21.3" [patch."https://github.com/DelSkayn/rquickjs"] rquickjs = "0.10.0" diff --git a/rust/src/api/host_api/mod.rs b/rust/src/api/host_api/mod.rs new file mode 100644 index 00000000..0b050a16 --- /dev/null +++ b/rust/src/api/host_api/mod.rs @@ -0,0 +1 @@ +pub mod webview; diff --git a/rust/src/api/host_api/webview.rs b/rust/src/api/host_api/webview.rs new file mode 100644 index 00000000..917cd257 --- /dev/null +++ b/rust/src/api/host_api/webview.rs @@ -0,0 +1,191 @@ +use anyhow::anyhow; +use flutter_rust_bridge::for_generated::lazy_static; +use flutter_rust_bridge::{frb, DartFnFuture, DartOpaque}; +use llrt_modules::events::EventEmitter; +use rquickjs::function::This; +use rquickjs::{Class, Function, Object}; +use std::sync::Mutex; +use tokio::sync::broadcast; + +pub type BroadcastSender = broadcast::Sender; +pub type BroadcastReceiver = broadcast::Receiver; + +lazy_static! { + static ref DART_CREATE_WEBVIEW: Mutex< + Option< + Box< + dyn Fn(String, BroadcastSender) -> DartFnFuture + + Send + + 'static, + >, + >, + > = Mutex::new(None); + static ref DART_OPEN_WEBVIEW: Mutex DartFnFuture<()> + Send + 'static>>> = + Mutex::new(None); + static ref DART_CLOSE_WEBVIEW: Mutex DartFnFuture<()> + Send + 'static>>> = + Mutex::new(None); + static ref DART_GET_COOKIES: Mutex DartFnFuture + Send + 'static>>> = + Mutex::new(None); +} +pub async fn initialize_webview_callbacks( + create_webview: impl Fn(String, BroadcastSender) -> DartFnFuture + + Send + + 'static, + open_webview: impl Fn(DartOpaque) -> DartFnFuture<()> + Send + 'static, + close_webview: impl Fn(DartOpaque) -> DartFnFuture<()> + Send + 'static, + get_cookies: impl Fn(DartOpaque, String) -> DartFnFuture + Send + 'static, +) -> anyhow::Result<()> { + *DART_CREATE_WEBVIEW + .lock() + .map_err(|_| anyhow!("Mutex poisoned"))? = Some(Box::new(create_webview)); + *DART_OPEN_WEBVIEW + .lock() + .map_err(|_| anyhow!("Mutex poisoned"))? = Some(Box::new(open_webview)); + *DART_CLOSE_WEBVIEW + .lock() + .map_err(|_| anyhow!("Mutex poisoned"))? = Some(Box::new(close_webview)); + *DART_GET_COOKIES + .lock() + .map_err(|_| anyhow!("Mutex poisoned"))? = Some(Box::new(get_cookies)); + + Ok(()) +} + +pub async fn send_webview_events(tx: BroadcastSender, event: String) -> anyhow::Result<()> { + tx.send(event) + .map_err(|_| anyhow!("Failed to send event"))?; + Ok(()) +} + +#[frb(ignore)] +pub struct HostWebview { + webview: DartOpaque, + events: BroadcastReceiver, +} + +#[frb(ignore)] +impl HostWebview { + pub async fn create(uri: String) -> anyhow::Result { + let (tx, rx) = broadcast::channel(100); + + let s = DART_CREATE_WEBVIEW + .lock() + .map_err(|_| anyhow!("Mutex poisoned"))?; + if let Some(create_webview_fn) = s.as_ref() { + let s = create_webview_fn(uri, tx.clone()).await; + Ok(Self { + webview: s, + events: rx, + }) + } else { + Err(anyhow!("create_webview not implemented")) + } + } + + pub async fn open(&self) -> anyhow::Result<()> { + let s = DART_OPEN_WEBVIEW + .lock() + .map_err(|_| anyhow!("Mutex poisoned"))?; + if let Some(open_webview) = s.as_ref() { + open_webview(self.webview.clone()).await; + Ok(()) + } else { + Err(anyhow!("open_webview not implemented")) + } + } + + pub async fn close(&self) -> anyhow::Result<()> { + let s = DART_CLOSE_WEBVIEW + .lock() + .map_err(|_| anyhow!("Mutex poisoned"))?; + if let Some(close_webview) = s.as_ref() { + close_webview(self.webview.clone()).await; + Ok(()) + } else { + Err(anyhow!("close_webview not implemented")) + } + } + + pub async fn get_cookies(&self, url: String) -> anyhow::Result { + let s = DART_GET_COOKIES + .lock() + .map_err(|_| anyhow!("Mutex poisoned"))?; + if let Some(get_cookies) = s.as_ref() { + let s = get_cookies(self.webview.clone(), url).await; + Ok(s) + } else { + Err(anyhow!("get_cookies not implemented")) + } + } +} + +#[frb(ignore)] +#[rquickjs::class] +#[derive(rquickjs::JsLifetime, rquickjs::class::Trace)] +pub struct Webview { + #[qjs(skip_trace)] + webview: HostWebview, +} + +#[frb(ignore)] +#[rquickjs::methods(rename_all = "camelCase")] +impl Webview { + #[qjs(static)] + pub async fn create(uri: String) -> rquickjs::Result { + let webview = HostWebview::create(uri) + .await + .map_err(|_| rquickjs::Error::Exception)?; + + Ok(Self { webview }) + } + + pub async fn open(&mut self, this: This>) -> rquickjs::Result<()> { + let mut events = this.get::<_, Object>("events")?; + if events.is_null() || events.is_undefined() { + this.set("events", EventEmitter::new())?; + events = this.get::<_, Object>("events")?; + } + + let emit = events.clone().get::<_, Function>("emit")?; + let mut rx = self.webview.events.resubscribe(); + + this.ctx().spawn(async move { + while let Ok(event) = rx.recv().await { + if let Err(e) = emit.call::<_, ()>(("url_change", event)) { + eprintln!("Failed to emit event: {:?}", e); + } + } + }); + + self.webview + .open() + .await + .map_err(|_| rquickjs::Error::Exception)?; + Ok(()) + } + + pub async fn close(&self) -> rquickjs::Result<()> { + self.webview + .close() + .await + .map_err(|_| rquickjs::Error::Exception)?; + Ok(()) + } + + pub async fn get_cookies(&self, url: String) -> rquickjs::Result { + self.webview + .get_cookies(url) + .await + .map_err(|_| rquickjs::Error::Exception) + } + + pub async fn poll_url_change_event(&mut self) -> rquickjs::Result { + let event = self + .webview + .events + .recv() + .await + .map_err(|_| rquickjs::Error::Exception)?; + Ok(event) + } +} diff --git a/rust/src/api/mod.rs b/rust/src/api/mod.rs index 940d0df8..84a86148 100644 --- a/rust/src/api/mod.rs +++ b/rust/src/api/mod.rs @@ -1,4 +1,5 @@ pub mod plugin; +pub mod host_api; #[flutter_rust_bridge::frb(init)] pub fn init_app() { diff --git a/rust/src/api/plugin/plugin.rs b/rust/src/api/plugin/plugin.rs index 1be942b9..35f05747 100644 --- a/rust/src/api/plugin/plugin.rs +++ b/rust/src/api/plugin/plugin.rs @@ -17,19 +17,26 @@ use llrt_modules::module_builder::ModuleBuilder; use llrt_modules::{ abort, buffer, console, crypto, events, exceptions, fetch, navigator, timers, url, util, }; -use rquickjs::prelude::Func; -use rquickjs::{async_with, AsyncContext, AsyncRuntime, Error, Object}; +use rquickjs::prelude::{Async, Func}; +use rquickjs::{async_with, AsyncContext, AsyncRuntime, Class, Error, Object}; use std::thread; use tokio::sync::mpsc; use tokio::sync::mpsc::{Receiver, Sender}; use tokio::task; use tokio::task::LocalSet; +use crate::api::host_api::webview::{HostWebview, Webview}; #[derive(Debug, Clone)] pub struct OpaqueSender { pub sender: Sender, } +#[frb(ignore)] +pub async fn open_webview(uri: String){ + let webview = HostWebview::create(uri).await.unwrap(); + webview.open().await.unwrap(); +} + #[frb(ignore)] async fn create_context() -> anyhow::Result<(AsyncContext, AsyncRuntime)> { let runtime = AsyncRuntime::new().expect("Unable to create async runtime"); @@ -60,6 +67,13 @@ async fn create_context() -> anyhow::Result<(AsyncContext, AsyncRuntime)> { async_with!(context => |ctx| { global_attachment.attach(&ctx)?; + let global = ctx.globals(); + Class::::define(&global)?; + + + let globals = ctx.globals(); + globals.set("openWebview", Func::new(Async(open_webview)))?; + Ok::<(), Error>(()) }) .await @@ -70,7 +84,7 @@ async fn create_context() -> anyhow::Result<(AsyncContext, AsyncRuntime)> { #[frb(ignore)] async fn js_executor_thread( rx: &mut Receiver, - ctx: &AsyncContext, + context: &AsyncContext, ) -> anyhow::Result<()> { while let Some(command) = rx.recv().await { println!("JS Executor thread received command: {:?}", command); @@ -79,19 +93,19 @@ async fn js_executor_thread( return anyhow::Ok(()); } - let ctx = ctx.clone(); + let context = context.clone(); task::spawn_local(async move { let result = match command { - PluginCommand::Artist(commands) => execute_artists(commands, &ctx).await, - PluginCommand::Album(commands) => execute_albums(commands, &ctx).await, - PluginCommand::AudioSource(commands) => execute_audio_source(commands, &ctx).await, - PluginCommand::Auth(commands) => execute_auth(commands, &ctx).await, - PluginCommand::Browse(commands) => execute_browse(commands, &ctx).await, - PluginCommand::Core(commands) => execute_core(commands, &ctx).await, - PluginCommand::Playlist(commands) => execute_playlist(commands, &ctx).await, - PluginCommand::Search(commands) => execute_search(commands, &ctx).await, - PluginCommand::Track(commands) => execute_track(commands, &ctx).await, - PluginCommand::User(commands) => execute_user(commands, &ctx).await, + PluginCommand::Artist(commands) => execute_artists(commands, &context).await, + PluginCommand::Album(commands) => execute_albums(commands, &context).await, + PluginCommand::AudioSource(commands) => execute_audio_source(commands, &context).await, + PluginCommand::Auth(commands) => execute_auth(commands, &context).await, + PluginCommand::Browse(commands) => execute_browse(commands, &context).await, + PluginCommand::Core(commands) => execute_core(commands, &context).await, + PluginCommand::Playlist(commands) => execute_playlist(commands, &context).await, + PluginCommand::Search(commands) => execute_search(commands, &context).await, + PluginCommand::Track(commands) => execute_track(commands, &context).await, + PluginCommand::User(commands) => execute_user(commands, &context).await, PluginCommand::Shutdown => unreachable!(), }; @@ -148,7 +162,7 @@ impl SpotubePlugin { Ok(()) } - // #[frb(sync)] + #[frb(sync)] pub fn create_context( &self, plugin_script: String, diff --git a/rust/src/api/plugin/senders.rs b/rust/src/api/plugin/senders.rs index 0ee7a413..2e00a4d3 100644 --- a/rust/src/api/plugin/senders.rs +++ b/rust/src/api/plugin/senders.rs @@ -1,4 +1,3 @@ -use std::backtrace::Backtrace; use crate::api::plugin::commands::{ AlbumCommands, ArtistCommands, AudioSourceCommands, AuthCommands, BrowseCommands, CoreCommands, PlaylistCommands, PluginCommand, SearchCommands, TrackCommands, UserCommands, @@ -19,6 +18,7 @@ use crate::api::plugin::models::user::SpotubeUserObject; use crate::api::plugin::plugin::OpaqueSender; use anyhow::anyhow; use flutter_rust_bridge::frb; +use std::backtrace::Backtrace; use tokio::sync::oneshot; #[derive(Debug, Clone, Copy)] @@ -32,7 +32,7 @@ impl PluginArtistSender { pub async fn get_artist( &self, - mpsc_tx: OpaqueSender, + mpsc_tx: &OpaqueSender, id: String, ) -> anyhow::Result { let (tx, rx) = oneshot::channel(); @@ -49,7 +49,7 @@ impl PluginArtistSender { pub async fn top_tracks( &self, - mpsc_tx: OpaqueSender, + mpsc_tx: &OpaqueSender, id: String, offset: Option, limit: Option, @@ -70,7 +70,7 @@ impl PluginArtistSender { pub async fn albums( &self, - mpsc_tx: OpaqueSender, + mpsc_tx: &OpaqueSender, id: String, offset: Option, limit: Option, @@ -91,7 +91,7 @@ impl PluginArtistSender { pub async fn related( &self, - mpsc_tx: OpaqueSender, + mpsc_tx: &OpaqueSender, id: String, offset: Option, limit: Option, @@ -110,7 +110,7 @@ impl PluginArtistSender { rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) } - pub async fn save(&self, mpsc_tx: OpaqueSender, ids: Vec) -> anyhow::Result<()> { + pub async fn save(&self, mpsc_tx: &OpaqueSender, ids: Vec) -> anyhow::Result<()> { let (tx, rx) = oneshot::channel(); mpsc_tx .sender @@ -123,7 +123,7 @@ impl PluginArtistSender { rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) } - pub async fn unsave(&self, mpsc_tx: OpaqueSender, ids: Vec) -> anyhow::Result<()> { + pub async fn unsave(&self, mpsc_tx: &OpaqueSender, ids: Vec) -> anyhow::Result<()> { let (tx, rx) = oneshot::channel(); mpsc_tx .sender @@ -148,7 +148,7 @@ impl PluginAlbumSender { pub async fn get_album( &self, - mpsc_tx: OpaqueSender, + mpsc_tx: &OpaqueSender, id: String, ) -> anyhow::Result { let (tx, rx) = oneshot::channel(); @@ -165,7 +165,7 @@ impl PluginAlbumSender { pub async fn tracks( &self, - mpsc_tx: OpaqueSender, + mpsc_tx: &OpaqueSender, id: String, offset: Option, limit: Option, @@ -186,7 +186,7 @@ impl PluginAlbumSender { pub async fn releases( &self, - mpsc_tx: OpaqueSender, + mpsc_tx: &OpaqueSender, offset: Option, limit: Option, ) -> anyhow::Result { @@ -203,7 +203,7 @@ impl PluginAlbumSender { rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) } - pub async fn save(&self, mpsc_tx: OpaqueSender, ids: Vec) -> anyhow::Result<()> { + pub async fn save(&self, mpsc_tx: &OpaqueSender, ids: Vec) -> anyhow::Result<()> { let (tx, rx) = oneshot::channel(); mpsc_tx .sender @@ -216,7 +216,7 @@ impl PluginAlbumSender { rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) } - pub async fn unsave(&self, mpsc_tx: OpaqueSender, ids: Vec) -> anyhow::Result<()> { + pub async fn unsave(&self, mpsc_tx: &OpaqueSender, ids: Vec) -> anyhow::Result<()> { let (tx, rx) = oneshot::channel(); mpsc_tx .sender @@ -241,7 +241,7 @@ impl PluginAudioSourceSender { pub async fn matches( &self, - mpsc_tx: OpaqueSender, + mpsc_tx: &OpaqueSender, track: SpotubeTrackObject, ) -> anyhow::Result> { let (tx, rx) = oneshot::channel(); @@ -258,7 +258,7 @@ impl PluginAudioSourceSender { pub async fn streams( &self, - mpsc_tx: OpaqueSender, + mpsc_tx: &OpaqueSender, matched: SpotubeAudioSourceMatchObject, ) -> anyhow::Result> { let (tx, rx) = oneshot::channel(); @@ -283,7 +283,7 @@ impl PluginAuthSender { Self {} } - pub async fn authenticate(&self, mpsc_tx: OpaqueSender) -> anyhow::Result<()> { + pub async fn authenticate(&self, mpsc_tx: &OpaqueSender) -> anyhow::Result<()> { let (tx, rx) = oneshot::channel(); mpsc_tx .sender @@ -295,7 +295,7 @@ impl PluginAuthSender { rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) } - pub async fn logout(&self, mpsc_tx: OpaqueSender) -> anyhow::Result<()> { + pub async fn logout(&self, mpsc_tx: &OpaqueSender) -> anyhow::Result<()> { let (tx, rx) = oneshot::channel(); mpsc_tx .sender @@ -307,7 +307,7 @@ impl PluginAuthSender { rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) } - pub async fn is_authenticated(&self, mpsc_tx: OpaqueSender) -> anyhow::Result { + pub async fn is_authenticated(&self, mpsc_tx: &OpaqueSender) -> anyhow::Result { let (tx, rx) = oneshot::channel(); mpsc_tx .sender @@ -331,7 +331,7 @@ impl PluginBrowseSender { pub async fn sections( &self, - mpsc_tx: OpaqueSender, + mpsc_tx: &OpaqueSender, offset: Option, limit: Option, ) -> anyhow::Result { @@ -350,7 +350,7 @@ impl PluginBrowseSender { pub async fn section_items( &self, - mpsc_tx: OpaqueSender, + mpsc_tx: &OpaqueSender, id: String, offset: Option, limit: Option, @@ -381,10 +381,9 @@ impl PluginCoreSender { pub async fn check_update( &self, - mpsc_tx: OpaqueSender, + mpsc_tx: &OpaqueSender, plugin_config: PluginConfiguration, ) -> anyhow::Result> { - let (tx, rx) = oneshot::channel(); mpsc_tx .sender @@ -394,14 +393,16 @@ impl PluginCoreSender { })) .await?; - rx.await.map_err(|e| { - eprintln!("RecvError: {}", e); - eprintln!("Stack trace:\n{:?}", Backtrace::capture()); - anyhow!("{e}") - }).and_then(|o| o) + rx.await + .map_err(|e| { + eprintln!("RecvError: {}", e); + eprintln!("Stack trace:\n{:?}", Backtrace::capture()); + anyhow!("{e}") + }) + .and_then(|o| o) } - pub async fn support(&self, mpsc_tx: OpaqueSender) -> anyhow::Result { + pub async fn support(&self, mpsc_tx: &OpaqueSender) -> anyhow::Result { let (tx, rx) = oneshot::channel(); mpsc_tx .sender @@ -415,7 +416,7 @@ impl PluginCoreSender { pub async fn scrobble( &self, - mpsc_tx: OpaqueSender, + mpsc_tx: &OpaqueSender, details: ScrobbleDetails, ) -> anyhow::Result<()> { let (tx, rx) = oneshot::channel(); @@ -442,7 +443,7 @@ impl PluginPlaylistSender { pub async fn get_playlist( &self, - mpsc_tx: OpaqueSender, + mpsc_tx: &OpaqueSender, id: String, ) -> anyhow::Result { let (tx, rx) = oneshot::channel(); @@ -459,7 +460,7 @@ impl PluginPlaylistSender { pub async fn tracks( &self, - mpsc_tx: OpaqueSender, + mpsc_tx: &OpaqueSender, id: String, offset: Option, limit: Option, @@ -480,7 +481,7 @@ impl PluginPlaylistSender { pub async fn create_playlist( &self, - mpsc_tx: OpaqueSender, + mpsc_tx: &OpaqueSender, user_id: String, name: String, description: Option, @@ -505,7 +506,7 @@ impl PluginPlaylistSender { pub async fn update_playlist( &self, - mpsc_tx: OpaqueSender, + mpsc_tx: &OpaqueSender, playlist_id: String, name: Option, description: Option, @@ -530,7 +531,7 @@ impl PluginPlaylistSender { pub async fn delete_playlist( &self, - mpsc_tx: OpaqueSender, + mpsc_tx: &OpaqueSender, playlist_id: String, ) -> anyhow::Result<()> { let (tx, rx) = oneshot::channel(); @@ -547,7 +548,7 @@ impl PluginPlaylistSender { pub async fn add_tracks( &self, - mpsc_tx: OpaqueSender, + mpsc_tx: &OpaqueSender, playlist_id: String, track_ids: Vec, position: Option, @@ -568,7 +569,7 @@ impl PluginPlaylistSender { pub async fn remove_tracks( &self, - mpsc_tx: OpaqueSender, + mpsc_tx: &OpaqueSender, playlist_id: String, track_ids: Vec, ) -> anyhow::Result<()> { @@ -585,7 +586,7 @@ impl PluginPlaylistSender { rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) } - pub async fn save(&self, mpsc_tx: OpaqueSender, playlist_id: String) -> anyhow::Result<()> { + pub async fn save(&self, mpsc_tx: &OpaqueSender, playlist_id: String) -> anyhow::Result<()> { let (tx, rx) = oneshot::channel(); mpsc_tx .sender @@ -598,7 +599,7 @@ impl PluginPlaylistSender { rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) } - pub async fn unsave(&self, mpsc_tx: OpaqueSender, playlist_id: String) -> anyhow::Result<()> { + pub async fn unsave(&self, mpsc_tx: &OpaqueSender, playlist_id: String) -> anyhow::Result<()> { let (tx, rx) = oneshot::channel(); mpsc_tx .sender @@ -621,7 +622,7 @@ impl PluginSearchSender { Self {} } - pub async fn chips(&self, mpsc_tx: OpaqueSender) -> anyhow::Result> { + pub async fn chips(&self, mpsc_tx: &OpaqueSender) -> anyhow::Result> { let (tx, rx) = oneshot::channel(); mpsc_tx .sender @@ -635,7 +636,7 @@ impl PluginSearchSender { pub async fn all( &self, - mpsc_tx: OpaqueSender, + mpsc_tx: &OpaqueSender, query: String, ) -> anyhow::Result { let (tx, rx) = oneshot::channel(); @@ -652,7 +653,7 @@ impl PluginSearchSender { pub async fn tracks( &self, - mpsc_tx: OpaqueSender, + mpsc_tx: &OpaqueSender, query: String, offset: Option, limit: Option, @@ -673,7 +674,7 @@ impl PluginSearchSender { pub async fn albums( &self, - mpsc_tx: OpaqueSender, + mpsc_tx: &OpaqueSender, query: String, offset: Option, limit: Option, @@ -694,7 +695,7 @@ impl PluginSearchSender { pub async fn artists( &self, - mpsc_tx: OpaqueSender, + mpsc_tx: &OpaqueSender, query: String, offset: Option, limit: Option, @@ -715,7 +716,7 @@ impl PluginSearchSender { pub async fn playlists( &self, - mpsc_tx: OpaqueSender, + mpsc_tx: &OpaqueSender, query: String, offset: Option, limit: Option, @@ -746,7 +747,7 @@ impl PluginTrackSender { pub async fn get_track( &self, - mpsc_tx: OpaqueSender, + mpsc_tx: &OpaqueSender, id: String, ) -> anyhow::Result { let (tx, rx) = oneshot::channel(); @@ -761,7 +762,7 @@ impl PluginTrackSender { rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) } - pub async fn save(&self, mpsc_tx: OpaqueSender, ids: Vec) -> anyhow::Result<()> { + pub async fn save(&self, mpsc_tx: &OpaqueSender, ids: Vec) -> anyhow::Result<()> { let (tx, rx) = oneshot::channel(); mpsc_tx .sender @@ -774,7 +775,7 @@ impl PluginTrackSender { rx.await.map_err(|e| anyhow!("{e}")).and_then(|o| o) } - pub async fn unsave(&self, mpsc_tx: OpaqueSender, ids: Vec) -> anyhow::Result<()> { + pub async fn unsave(&self, mpsc_tx: &OpaqueSender, ids: Vec) -> anyhow::Result<()> { let (tx, rx) = oneshot::channel(); mpsc_tx .sender @@ -789,7 +790,7 @@ impl PluginTrackSender { pub async fn radio( &self, - mpsc_tx: OpaqueSender, + mpsc_tx: &OpaqueSender, id: String, ) -> anyhow::Result> { let (tx, rx) = oneshot::channel(); @@ -814,7 +815,7 @@ impl PluginUserSender { Self {} } - pub async fn me(&self, mpsc_tx: OpaqueSender) -> anyhow::Result { + pub async fn me(&self, mpsc_tx: &OpaqueSender) -> anyhow::Result { let (tx, rx) = oneshot::channel(); mpsc_tx .sender @@ -826,7 +827,7 @@ impl PluginUserSender { pub async fn saved_tracks( &self, - mpsc_tx: OpaqueSender, + mpsc_tx: &OpaqueSender, offset: Option, limit: Option, ) -> anyhow::Result { @@ -845,7 +846,7 @@ impl PluginUserSender { pub async fn saved_albums( &self, - mpsc_tx: OpaqueSender, + mpsc_tx: &OpaqueSender, offset: Option, limit: Option, ) -> anyhow::Result { @@ -864,7 +865,7 @@ impl PluginUserSender { pub async fn saved_artists( &self, - mpsc_tx: OpaqueSender, + mpsc_tx: &OpaqueSender, offset: Option, limit: Option, ) -> anyhow::Result { @@ -883,7 +884,7 @@ impl PluginUserSender { pub async fn saved_playlists( &self, - mpsc_tx: OpaqueSender, + mpsc_tx: &OpaqueSender, offset: Option, limit: Option, ) -> anyhow::Result { diff --git a/rust/src/frb_generated.rs b/rust/src/frb_generated.rs index 6132d4ff..08cc1503 100644 --- a/rust/src/frb_generated.rs +++ b/rust/src/frb_generated.rs @@ -25,6 +25,7 @@ // Section: imports +use crate::api::host_api::webview::*; use crate::api::plugin::commands::*; use crate::api::plugin::plugin::*; use crate::*; @@ -42,7 +43,7 @@ flutter_rust_bridge::frb_generated_boilerplate!( default_rust_auto_opaque = RustAutoOpaqueMoi, ); pub(crate) const FLUTTER_RUST_BRIDGE_CODEGEN_VERSION: &str = "2.11.1"; -pub(crate) const FLUTTER_RUST_BRIDGE_CODEGEN_CONTENT_HASH: i32 = 1716120288; +pub(crate) const FLUTTER_RUST_BRIDGE_CODEGEN_CONTENT_HASH: i32 = 1149066488; // Section: executor @@ -1253,16 +1254,15 @@ fn wire__crate__api__plugin__plugin__SpotubePlugin_close_impl( ) } fn wire__crate__api__plugin__plugin__SpotubePlugin_create_context_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_normal::( +) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse { + FLUTTER_RUST_BRIDGE_HANDLER.wrap_sync::( flutter_rust_bridge::for_generated::TaskInfo { debug_name: "SpotubePlugin_create_context", - port: Some(port_), - mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal, + port: None, + mode: flutter_rust_bridge::for_generated::FfiCallMode::Sync, }, move || { let message = unsafe { @@ -1283,32 +1283,30 @@ fn wire__crate__api__plugin__plugin__SpotubePlugin_create_context_impl( &mut deserializer, ); deserializer.end(); - move |context| { - transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( - (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_sync_ref()), - _ => unreachable!(), - } + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (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_sync_ref()), + _ => unreachable!(), } - let api_that_guard = api_that_guard.unwrap(); - let output_ok = crate::api::plugin::plugin::SpotubePlugin::create_context( - &*api_that_guard, - api_plugin_script, - api_plugin_config, - )?; - Ok(output_ok) - })(), - ) - } + } + let api_that_guard = api_that_guard.unwrap(); + let output_ok = crate::api::plugin::plugin::SpotubePlugin::create_context( + &*api_that_guard, + api_plugin_script, + api_plugin_config, + )?; + Ok(output_ok) + })(), + ) }, ) } @@ -1376,6 +1374,24 @@ fn wire__crate__api__init_app_impl( }, ) } +fn wire__crate__api__host_api__webview__initialize_webview_callbacks_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: "initialize_webview_callbacks", 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_create_webview = decode_DartFn_Inputs_String_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBroadcastSenderString_Output_DartOpaque_AnyhowException(::sse_decode(&mut deserializer)); +let api_open_webview = decode_DartFn_Inputs_DartOpaque_Output_unit_AnyhowException(::sse_decode(&mut deserializer)); +let api_close_webview = decode_DartFn_Inputs_DartOpaque_Output_unit_AnyhowException(::sse_decode(&mut deserializer)); +let api_get_cookies = decode_DartFn_Inputs_DartOpaque_String_Output_String_AnyhowException(::sse_decode(&mut deserializer));deserializer.end(); move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>((move || async move { + let output_ok = crate::api::host_api::webview::initialize_webview_callbacks(api_create_webview, api_open_webview, api_close_webview, api_get_cookies).await?; Ok(output_ok) + })().await) + } }) +} fn wire__crate__api__plugin__senders__plugin_album_sender_get_album_impl( port_: flutter_rust_bridge::for_generated::MessagePort, ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, @@ -1400,15 +1416,36 @@ fn wire__crate__api__plugin__senders__plugin_album_sender_get_album_impl( flutter_rust_bridge::for_generated::SseDeserializer::new(message); let api_that = ::sse_decode(&mut deserializer); - let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_mpsc_tx = , + >>::sse_decode(&mut deserializer); let api_id = ::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_mpsc_tx_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_mpsc_tx, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_mpsc_tx_guard = + Some(api_mpsc_tx.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_mpsc_tx_guard = api_mpsc_tx_guard.unwrap(); let output_ok = crate::api::plugin::senders::PluginAlbumSender::get_album( &api_that, - api_mpsc_tx, + &*api_mpsc_tx_guard, api_id, ) .await?; @@ -1444,16 +1481,37 @@ fn wire__crate__api__plugin__senders__plugin_album_sender_releases_impl( flutter_rust_bridge::for_generated::SseDeserializer::new(message); let api_that = ::sse_decode(&mut deserializer); - let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_mpsc_tx = , + >>::sse_decode(&mut deserializer); let api_offset = >::sse_decode(&mut deserializer); let api_limit = >::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_mpsc_tx_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_mpsc_tx, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_mpsc_tx_guard = + Some(api_mpsc_tx.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_mpsc_tx_guard = api_mpsc_tx_guard.unwrap(); let output_ok = crate::api::plugin::senders::PluginAlbumSender::releases( &api_that, - api_mpsc_tx, + &*api_mpsc_tx_guard, api_offset, api_limit, ) @@ -1490,15 +1548,36 @@ fn wire__crate__api__plugin__senders__plugin_album_sender_save_impl( flutter_rust_bridge::for_generated::SseDeserializer::new(message); let api_that = ::sse_decode(&mut deserializer); - let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_mpsc_tx = , + >>::sse_decode(&mut deserializer); let api_ids = >::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_mpsc_tx_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_mpsc_tx, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_mpsc_tx_guard = + Some(api_mpsc_tx.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_mpsc_tx_guard = api_mpsc_tx_guard.unwrap(); let output_ok = crate::api::plugin::senders::PluginAlbumSender::save( &api_that, - api_mpsc_tx, + &*api_mpsc_tx_guard, api_ids, ) .await?; @@ -1534,7 +1613,9 @@ fn wire__crate__api__plugin__senders__plugin_album_sender_tracks_impl( flutter_rust_bridge::for_generated::SseDeserializer::new(message); let api_that = ::sse_decode(&mut deserializer); - let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_mpsc_tx = , + >>::sse_decode(&mut deserializer); let api_id = ::sse_decode(&mut deserializer); let api_offset = >::sse_decode(&mut deserializer); let api_limit = >::sse_decode(&mut deserializer); @@ -1542,9 +1623,28 @@ fn wire__crate__api__plugin__senders__plugin_album_sender_tracks_impl( move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { + let mut api_mpsc_tx_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_mpsc_tx, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_mpsc_tx_guard = + Some(api_mpsc_tx.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_mpsc_tx_guard = api_mpsc_tx_guard.unwrap(); let output_ok = crate::api::plugin::senders::PluginAlbumSender::tracks( &api_that, - api_mpsc_tx, + &*api_mpsc_tx_guard, api_id, api_offset, api_limit, @@ -1582,15 +1682,36 @@ fn wire__crate__api__plugin__senders__plugin_album_sender_unsave_impl( flutter_rust_bridge::for_generated::SseDeserializer::new(message); let api_that = ::sse_decode(&mut deserializer); - let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_mpsc_tx = , + >>::sse_decode(&mut deserializer); let api_ids = >::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_mpsc_tx_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_mpsc_tx, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_mpsc_tx_guard = + Some(api_mpsc_tx.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_mpsc_tx_guard = api_mpsc_tx_guard.unwrap(); let output_ok = crate::api::plugin::senders::PluginAlbumSender::unsave( &api_that, - api_mpsc_tx, + &*api_mpsc_tx_guard, api_ids, ) .await?; @@ -1626,7 +1747,9 @@ fn wire__crate__api__plugin__senders__plugin_artist_sender_albums_impl( flutter_rust_bridge::for_generated::SseDeserializer::new(message); let api_that = ::sse_decode(&mut deserializer); - let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_mpsc_tx = , + >>::sse_decode(&mut deserializer); let api_id = ::sse_decode(&mut deserializer); let api_offset = >::sse_decode(&mut deserializer); let api_limit = >::sse_decode(&mut deserializer); @@ -1634,9 +1757,28 @@ fn wire__crate__api__plugin__senders__plugin_artist_sender_albums_impl( move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { + let mut api_mpsc_tx_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_mpsc_tx, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_mpsc_tx_guard = + Some(api_mpsc_tx.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_mpsc_tx_guard = api_mpsc_tx_guard.unwrap(); let output_ok = crate::api::plugin::senders::PluginArtistSender::albums( &api_that, - api_mpsc_tx, + &*api_mpsc_tx_guard, api_id, api_offset, api_limit, @@ -1674,16 +1816,37 @@ fn wire__crate__api__plugin__senders__plugin_artist_sender_get_artist_impl( flutter_rust_bridge::for_generated::SseDeserializer::new(message); let api_that = ::sse_decode(&mut deserializer); - let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_mpsc_tx = , + >>::sse_decode(&mut deserializer); let api_id = ::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_mpsc_tx_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_mpsc_tx, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_mpsc_tx_guard = + Some(api_mpsc_tx.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_mpsc_tx_guard = api_mpsc_tx_guard.unwrap(); let output_ok = crate::api::plugin::senders::PluginArtistSender::get_artist( &api_that, - api_mpsc_tx, + &*api_mpsc_tx_guard, api_id, ) .await?; @@ -1719,7 +1882,9 @@ fn wire__crate__api__plugin__senders__plugin_artist_sender_related_impl( flutter_rust_bridge::for_generated::SseDeserializer::new(message); let api_that = ::sse_decode(&mut deserializer); - let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_mpsc_tx = , + >>::sse_decode(&mut deserializer); let api_id = ::sse_decode(&mut deserializer); let api_offset = >::sse_decode(&mut deserializer); let api_limit = >::sse_decode(&mut deserializer); @@ -1727,9 +1892,28 @@ fn wire__crate__api__plugin__senders__plugin_artist_sender_related_impl( move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { + let mut api_mpsc_tx_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_mpsc_tx, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_mpsc_tx_guard = + Some(api_mpsc_tx.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_mpsc_tx_guard = api_mpsc_tx_guard.unwrap(); let output_ok = crate::api::plugin::senders::PluginArtistSender::related( &api_that, - api_mpsc_tx, + &*api_mpsc_tx_guard, api_id, api_offset, api_limit, @@ -1767,15 +1951,36 @@ fn wire__crate__api__plugin__senders__plugin_artist_sender_save_impl( flutter_rust_bridge::for_generated::SseDeserializer::new(message); let api_that = ::sse_decode(&mut deserializer); - let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_mpsc_tx = , + >>::sse_decode(&mut deserializer); let api_ids = >::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_mpsc_tx_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_mpsc_tx, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_mpsc_tx_guard = + Some(api_mpsc_tx.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_mpsc_tx_guard = api_mpsc_tx_guard.unwrap(); let output_ok = crate::api::plugin::senders::PluginArtistSender::save( &api_that, - api_mpsc_tx, + &*api_mpsc_tx_guard, api_ids, ) .await?; @@ -1811,7 +2016,9 @@ fn wire__crate__api__plugin__senders__plugin_artist_sender_top_tracks_impl( flutter_rust_bridge::for_generated::SseDeserializer::new(message); let api_that = ::sse_decode(&mut deserializer); - let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_mpsc_tx = , + >>::sse_decode(&mut deserializer); let api_id = ::sse_decode(&mut deserializer); let api_offset = >::sse_decode(&mut deserializer); let api_limit = >::sse_decode(&mut deserializer); @@ -1819,10 +2026,29 @@ fn wire__crate__api__plugin__senders__plugin_artist_sender_top_tracks_impl( move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { + let mut api_mpsc_tx_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_mpsc_tx, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_mpsc_tx_guard = + Some(api_mpsc_tx.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_mpsc_tx_guard = api_mpsc_tx_guard.unwrap(); let output_ok = crate::api::plugin::senders::PluginArtistSender::top_tracks( &api_that, - api_mpsc_tx, + &*api_mpsc_tx_guard, api_id, api_offset, api_limit, @@ -1860,15 +2086,36 @@ fn wire__crate__api__plugin__senders__plugin_artist_sender_unsave_impl( flutter_rust_bridge::for_generated::SseDeserializer::new(message); let api_that = ::sse_decode(&mut deserializer); - let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_mpsc_tx = , + >>::sse_decode(&mut deserializer); let api_ids = >::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_mpsc_tx_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_mpsc_tx, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_mpsc_tx_guard = + Some(api_mpsc_tx.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_mpsc_tx_guard = api_mpsc_tx_guard.unwrap(); let output_ok = crate::api::plugin::senders::PluginArtistSender::unsave( &api_that, - api_mpsc_tx, + &*api_mpsc_tx_guard, api_ids, ) .await?; @@ -1905,7 +2152,9 @@ fn wire__crate__api__plugin__senders__plugin_audio_source_sender_matches_impl( let api_that = ::sse_decode( &mut deserializer, ); - let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_mpsc_tx = , + >>::sse_decode(&mut deserializer); let api_track = ::sse_decode( &mut deserializer, ); @@ -1913,10 +2162,29 @@ fn wire__crate__api__plugin__senders__plugin_audio_source_sender_matches_impl( move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { + let mut api_mpsc_tx_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_mpsc_tx, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_mpsc_tx_guard = + Some(api_mpsc_tx.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_mpsc_tx_guard = api_mpsc_tx_guard.unwrap(); let output_ok = crate::api::plugin::senders::PluginAudioSourceSender::matches( &api_that, - api_mpsc_tx, + &*api_mpsc_tx_guard, api_track, ) .await?; @@ -1938,10 +2206,19 @@ fn wire__crate__api__plugin__senders__plugin_audio_source_sender_streams_impl( 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); -let api_mpsc_tx = ::sse_decode(&mut deserializer); +let api_mpsc_tx = >>::sse_decode(&mut deserializer); let api_matched = ::sse_decode(&mut deserializer);deserializer.end(); move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>((move || async move { - let output_ok = crate::api::plugin::senders::PluginAudioSourceSender::streams(&api_that, api_mpsc_tx, api_matched).await?; Ok(output_ok) + let mut api_mpsc_tx_guard = None; +let decode_indices_ = flutter_rust_bridge::for_generated::lockable_compute_decode_order(vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new(&api_mpsc_tx, 0, false)]); + for i in decode_indices_ { + match i { + 0 => api_mpsc_tx_guard = Some(api_mpsc_tx.lockable_decode_async_ref().await), + _ => unreachable!(), + } + } + let api_mpsc_tx_guard = api_mpsc_tx_guard.unwrap(); + let output_ok = crate::api::plugin::senders::PluginAudioSourceSender::streams(&api_that, &*api_mpsc_tx_guard, api_matched).await?; Ok(output_ok) })().await) } }) } @@ -1969,15 +2246,36 @@ fn wire__crate__api__plugin__senders__plugin_auth_sender_authenticate_impl( flutter_rust_bridge::for_generated::SseDeserializer::new(message); let api_that = ::sse_decode(&mut deserializer); - let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_mpsc_tx = , + >>::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_mpsc_tx_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_mpsc_tx, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_mpsc_tx_guard = + Some(api_mpsc_tx.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_mpsc_tx_guard = api_mpsc_tx_guard.unwrap(); let output_ok = crate::api::plugin::senders::PluginAuthSender::authenticate( &api_that, - api_mpsc_tx, + &*api_mpsc_tx_guard, ) .await?; Ok(output_ok) @@ -2012,15 +2310,36 @@ fn wire__crate__api__plugin__senders__plugin_auth_sender_is_authenticated_impl( flutter_rust_bridge::for_generated::SseDeserializer::new(message); let api_that = ::sse_decode(&mut deserializer); - let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_mpsc_tx = , + >>::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_mpsc_tx_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_mpsc_tx, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_mpsc_tx_guard = + Some(api_mpsc_tx.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_mpsc_tx_guard = api_mpsc_tx_guard.unwrap(); let output_ok = crate::api::plugin::senders::PluginAuthSender::is_authenticated( &api_that, - api_mpsc_tx, + &*api_mpsc_tx_guard, ) .await?; Ok(output_ok) @@ -2055,14 +2374,35 @@ fn wire__crate__api__plugin__senders__plugin_auth_sender_logout_impl( flutter_rust_bridge::for_generated::SseDeserializer::new(message); let api_that = ::sse_decode(&mut deserializer); - let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_mpsc_tx = , + >>::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_mpsc_tx_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_mpsc_tx, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_mpsc_tx_guard = + Some(api_mpsc_tx.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_mpsc_tx_guard = api_mpsc_tx_guard.unwrap(); let output_ok = crate::api::plugin::senders::PluginAuthSender::logout( &api_that, - api_mpsc_tx, + &*api_mpsc_tx_guard, ) .await?; Ok(output_ok) @@ -2097,7 +2437,9 @@ fn wire__crate__api__plugin__senders__plugin_browse_sender_section_items_impl( flutter_rust_bridge::for_generated::SseDeserializer::new(message); let api_that = ::sse_decode(&mut deserializer); - let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_mpsc_tx = , + >>::sse_decode(&mut deserializer); let api_id = ::sse_decode(&mut deserializer); let api_offset = >::sse_decode(&mut deserializer); let api_limit = >::sse_decode(&mut deserializer); @@ -2105,10 +2447,29 @@ fn wire__crate__api__plugin__senders__plugin_browse_sender_section_items_impl( move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { + let mut api_mpsc_tx_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_mpsc_tx, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_mpsc_tx_guard = + Some(api_mpsc_tx.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_mpsc_tx_guard = api_mpsc_tx_guard.unwrap(); let output_ok = crate::api::plugin::senders::PluginBrowseSender::section_items( &api_that, - api_mpsc_tx, + &*api_mpsc_tx_guard, api_id, api_offset, api_limit, @@ -2146,16 +2507,37 @@ fn wire__crate__api__plugin__senders__plugin_browse_sender_sections_impl( flutter_rust_bridge::for_generated::SseDeserializer::new(message); let api_that = ::sse_decode(&mut deserializer); - let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_mpsc_tx = , + >>::sse_decode(&mut deserializer); let api_offset = >::sse_decode(&mut deserializer); let api_limit = >::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_mpsc_tx_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_mpsc_tx, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_mpsc_tx_guard = + Some(api_mpsc_tx.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_mpsc_tx_guard = api_mpsc_tx_guard.unwrap(); let output_ok = crate::api::plugin::senders::PluginBrowseSender::sections( &api_that, - api_mpsc_tx, + &*api_mpsc_tx_guard, api_offset, api_limit, ) @@ -2229,7 +2611,9 @@ fn wire__crate__api__plugin__senders__plugin_core_sender_check_update_impl( flutter_rust_bridge::for_generated::SseDeserializer::new(message); let api_that = ::sse_decode(&mut deserializer); - let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_mpsc_tx = , + >>::sse_decode(&mut deserializer); let api_plugin_config = ::sse_decode( &mut deserializer, @@ -2238,10 +2622,29 @@ fn wire__crate__api__plugin__senders__plugin_core_sender_check_update_impl( move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { + let mut api_mpsc_tx_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_mpsc_tx, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_mpsc_tx_guard = + Some(api_mpsc_tx.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_mpsc_tx_guard = api_mpsc_tx_guard.unwrap(); let output_ok = crate::api::plugin::senders::PluginCoreSender::check_update( &api_that, - api_mpsc_tx, + &*api_mpsc_tx_guard, api_plugin_config, ) .await?; @@ -2277,16 +2680,37 @@ fn wire__crate__api__plugin__senders__plugin_core_sender_scrobble_impl( flutter_rust_bridge::for_generated::SseDeserializer::new(message); let api_that = ::sse_decode(&mut deserializer); - let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_mpsc_tx = , + >>::sse_decode(&mut deserializer); let api_details = ::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_mpsc_tx_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_mpsc_tx, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_mpsc_tx_guard = + Some(api_mpsc_tx.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_mpsc_tx_guard = api_mpsc_tx_guard.unwrap(); let output_ok = crate::api::plugin::senders::PluginCoreSender::scrobble( &api_that, - api_mpsc_tx, + &*api_mpsc_tx_guard, api_details, ) .await?; @@ -2322,14 +2746,35 @@ fn wire__crate__api__plugin__senders__plugin_core_sender_support_impl( flutter_rust_bridge::for_generated::SseDeserializer::new(message); let api_that = ::sse_decode(&mut deserializer); - let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_mpsc_tx = , + >>::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_mpsc_tx_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_mpsc_tx, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_mpsc_tx_guard = + Some(api_mpsc_tx.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_mpsc_tx_guard = api_mpsc_tx_guard.unwrap(); let output_ok = crate::api::plugin::senders::PluginCoreSender::support( &api_that, - api_mpsc_tx, + &*api_mpsc_tx_guard, ) .await?; Ok(output_ok) @@ -2364,7 +2809,9 @@ fn wire__crate__api__plugin__senders__plugin_playlist_sender_add_tracks_impl( flutter_rust_bridge::for_generated::SseDeserializer::new(message); let api_that = ::sse_decode(&mut deserializer); - let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_mpsc_tx = , + >>::sse_decode(&mut deserializer); let api_playlist_id = ::sse_decode(&mut deserializer); let api_track_ids = >::sse_decode(&mut deserializer); let api_position = >::sse_decode(&mut deserializer); @@ -2372,10 +2819,29 @@ fn wire__crate__api__plugin__senders__plugin_playlist_sender_add_tracks_impl( move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { + let mut api_mpsc_tx_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_mpsc_tx, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_mpsc_tx_guard = + Some(api_mpsc_tx.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_mpsc_tx_guard = api_mpsc_tx_guard.unwrap(); let output_ok = crate::api::plugin::senders::PluginPlaylistSender::add_tracks( &api_that, - api_mpsc_tx, + &*api_mpsc_tx_guard, api_playlist_id, api_track_ids, api_position, @@ -2413,7 +2879,9 @@ fn wire__crate__api__plugin__senders__plugin_playlist_sender_create_playlist_imp flutter_rust_bridge::for_generated::SseDeserializer::new(message); let api_that = ::sse_decode(&mut deserializer); - let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_mpsc_tx = , + >>::sse_decode(&mut deserializer); let api_user_id = ::sse_decode(&mut deserializer); let api_name = ::sse_decode(&mut deserializer); let api_description = >::sse_decode(&mut deserializer); @@ -2423,10 +2891,29 @@ fn wire__crate__api__plugin__senders__plugin_playlist_sender_create_playlist_imp move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { + let mut api_mpsc_tx_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_mpsc_tx, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_mpsc_tx_guard = + Some(api_mpsc_tx.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_mpsc_tx_guard = api_mpsc_tx_guard.unwrap(); let output_ok = crate::api::plugin::senders::PluginPlaylistSender::create_playlist( &api_that, - api_mpsc_tx, + &*api_mpsc_tx_guard, api_user_id, api_name, api_description, @@ -2466,16 +2953,37 @@ fn wire__crate__api__plugin__senders__plugin_playlist_sender_delete_playlist_imp flutter_rust_bridge::for_generated::SseDeserializer::new(message); let api_that = ::sse_decode(&mut deserializer); - let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_mpsc_tx = , + >>::sse_decode(&mut deserializer); let api_playlist_id = ::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_mpsc_tx_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_mpsc_tx, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_mpsc_tx_guard = + Some(api_mpsc_tx.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_mpsc_tx_guard = api_mpsc_tx_guard.unwrap(); let output_ok = crate::api::plugin::senders::PluginPlaylistSender::delete_playlist( &api_that, - api_mpsc_tx, + &*api_mpsc_tx_guard, api_playlist_id, ) .await?; @@ -2511,16 +3019,37 @@ fn wire__crate__api__plugin__senders__plugin_playlist_sender_get_playlist_impl( flutter_rust_bridge::for_generated::SseDeserializer::new(message); let api_that = ::sse_decode(&mut deserializer); - let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_mpsc_tx = , + >>::sse_decode(&mut deserializer); let api_id = ::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_mpsc_tx_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_mpsc_tx, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_mpsc_tx_guard = + Some(api_mpsc_tx.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_mpsc_tx_guard = api_mpsc_tx_guard.unwrap(); let output_ok = crate::api::plugin::senders::PluginPlaylistSender::get_playlist( &api_that, - api_mpsc_tx, + &*api_mpsc_tx_guard, api_id, ) .await?; @@ -2556,17 +3085,38 @@ fn wire__crate__api__plugin__senders__plugin_playlist_sender_remove_tracks_impl( flutter_rust_bridge::for_generated::SseDeserializer::new(message); let api_that = ::sse_decode(&mut deserializer); - let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_mpsc_tx = , + >>::sse_decode(&mut deserializer); let api_playlist_id = ::sse_decode(&mut deserializer); let api_track_ids = >::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_mpsc_tx_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_mpsc_tx, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_mpsc_tx_guard = + Some(api_mpsc_tx.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_mpsc_tx_guard = api_mpsc_tx_guard.unwrap(); let output_ok = crate::api::plugin::senders::PluginPlaylistSender::remove_tracks( &api_that, - api_mpsc_tx, + &*api_mpsc_tx_guard, api_playlist_id, api_track_ids, ) @@ -2603,15 +3153,36 @@ fn wire__crate__api__plugin__senders__plugin_playlist_sender_save_impl( flutter_rust_bridge::for_generated::SseDeserializer::new(message); let api_that = ::sse_decode(&mut deserializer); - let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_mpsc_tx = , + >>::sse_decode(&mut deserializer); let api_playlist_id = ::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_mpsc_tx_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_mpsc_tx, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_mpsc_tx_guard = + Some(api_mpsc_tx.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_mpsc_tx_guard = api_mpsc_tx_guard.unwrap(); let output_ok = crate::api::plugin::senders::PluginPlaylistSender::save( &api_that, - api_mpsc_tx, + &*api_mpsc_tx_guard, api_playlist_id, ) .await?; @@ -2647,7 +3218,9 @@ fn wire__crate__api__plugin__senders__plugin_playlist_sender_tracks_impl( flutter_rust_bridge::for_generated::SseDeserializer::new(message); let api_that = ::sse_decode(&mut deserializer); - let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_mpsc_tx = , + >>::sse_decode(&mut deserializer); let api_id = ::sse_decode(&mut deserializer); let api_offset = >::sse_decode(&mut deserializer); let api_limit = >::sse_decode(&mut deserializer); @@ -2655,9 +3228,28 @@ fn wire__crate__api__plugin__senders__plugin_playlist_sender_tracks_impl( move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { + let mut api_mpsc_tx_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_mpsc_tx, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_mpsc_tx_guard = + Some(api_mpsc_tx.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_mpsc_tx_guard = api_mpsc_tx_guard.unwrap(); let output_ok = crate::api::plugin::senders::PluginPlaylistSender::tracks( &api_that, - api_mpsc_tx, + &*api_mpsc_tx_guard, api_id, api_offset, api_limit, @@ -2695,15 +3287,36 @@ fn wire__crate__api__plugin__senders__plugin_playlist_sender_unsave_impl( flutter_rust_bridge::for_generated::SseDeserializer::new(message); let api_that = ::sse_decode(&mut deserializer); - let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_mpsc_tx = , + >>::sse_decode(&mut deserializer); let api_playlist_id = ::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_mpsc_tx_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_mpsc_tx, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_mpsc_tx_guard = + Some(api_mpsc_tx.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_mpsc_tx_guard = api_mpsc_tx_guard.unwrap(); let output_ok = crate::api::plugin::senders::PluginPlaylistSender::unsave( &api_that, - api_mpsc_tx, + &*api_mpsc_tx_guard, api_playlist_id, ) .await?; @@ -2739,7 +3352,9 @@ fn wire__crate__api__plugin__senders__plugin_playlist_sender_update_playlist_imp flutter_rust_bridge::for_generated::SseDeserializer::new(message); let api_that = ::sse_decode(&mut deserializer); - let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_mpsc_tx = , + >>::sse_decode(&mut deserializer); let api_playlist_id = ::sse_decode(&mut deserializer); let api_name = >::sse_decode(&mut deserializer); let api_description = >::sse_decode(&mut deserializer); @@ -2749,10 +3364,29 @@ fn wire__crate__api__plugin__senders__plugin_playlist_sender_update_playlist_imp move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { + let mut api_mpsc_tx_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_mpsc_tx, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_mpsc_tx_guard = + Some(api_mpsc_tx.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_mpsc_tx_guard = api_mpsc_tx_guard.unwrap(); let output_ok = crate::api::plugin::senders::PluginPlaylistSender::update_playlist( &api_that, - api_mpsc_tx, + &*api_mpsc_tx_guard, api_playlist_id, api_name, api_description, @@ -2792,7 +3426,9 @@ fn wire__crate__api__plugin__senders__plugin_search_sender_albums_impl( flutter_rust_bridge::for_generated::SseDeserializer::new(message); let api_that = ::sse_decode(&mut deserializer); - let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_mpsc_tx = , + >>::sse_decode(&mut deserializer); let api_query = ::sse_decode(&mut deserializer); let api_offset = >::sse_decode(&mut deserializer); let api_limit = >::sse_decode(&mut deserializer); @@ -2800,9 +3436,28 @@ fn wire__crate__api__plugin__senders__plugin_search_sender_albums_impl( move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { + let mut api_mpsc_tx_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_mpsc_tx, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_mpsc_tx_guard = + Some(api_mpsc_tx.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_mpsc_tx_guard = api_mpsc_tx_guard.unwrap(); let output_ok = crate::api::plugin::senders::PluginSearchSender::albums( &api_that, - api_mpsc_tx, + &*api_mpsc_tx_guard, api_query, api_offset, api_limit, @@ -2840,15 +3495,36 @@ fn wire__crate__api__plugin__senders__plugin_search_sender_all_impl( flutter_rust_bridge::for_generated::SseDeserializer::new(message); let api_that = ::sse_decode(&mut deserializer); - let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_mpsc_tx = , + >>::sse_decode(&mut deserializer); let api_query = ::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_mpsc_tx_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_mpsc_tx, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_mpsc_tx_guard = + Some(api_mpsc_tx.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_mpsc_tx_guard = api_mpsc_tx_guard.unwrap(); let output_ok = crate::api::plugin::senders::PluginSearchSender::all( &api_that, - api_mpsc_tx, + &*api_mpsc_tx_guard, api_query, ) .await?; @@ -2884,7 +3560,9 @@ fn wire__crate__api__plugin__senders__plugin_search_sender_artists_impl( flutter_rust_bridge::for_generated::SseDeserializer::new(message); let api_that = ::sse_decode(&mut deserializer); - let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_mpsc_tx = , + >>::sse_decode(&mut deserializer); let api_query = ::sse_decode(&mut deserializer); let api_offset = >::sse_decode(&mut deserializer); let api_limit = >::sse_decode(&mut deserializer); @@ -2892,9 +3570,28 @@ fn wire__crate__api__plugin__senders__plugin_search_sender_artists_impl( move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { + let mut api_mpsc_tx_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_mpsc_tx, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_mpsc_tx_guard = + Some(api_mpsc_tx.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_mpsc_tx_guard = api_mpsc_tx_guard.unwrap(); let output_ok = crate::api::plugin::senders::PluginSearchSender::artists( &api_that, - api_mpsc_tx, + &*api_mpsc_tx_guard, api_query, api_offset, api_limit, @@ -2932,14 +3629,35 @@ fn wire__crate__api__plugin__senders__plugin_search_sender_chips_impl( flutter_rust_bridge::for_generated::SseDeserializer::new(message); let api_that = ::sse_decode(&mut deserializer); - let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_mpsc_tx = , + >>::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_mpsc_tx_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_mpsc_tx, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_mpsc_tx_guard = + Some(api_mpsc_tx.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_mpsc_tx_guard = api_mpsc_tx_guard.unwrap(); let output_ok = crate::api::plugin::senders::PluginSearchSender::chips( &api_that, - api_mpsc_tx, + &*api_mpsc_tx_guard, ) .await?; Ok(output_ok) @@ -2974,7 +3692,9 @@ fn wire__crate__api__plugin__senders__plugin_search_sender_playlists_impl( flutter_rust_bridge::for_generated::SseDeserializer::new(message); let api_that = ::sse_decode(&mut deserializer); - let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_mpsc_tx = , + >>::sse_decode(&mut deserializer); let api_query = ::sse_decode(&mut deserializer); let api_offset = >::sse_decode(&mut deserializer); let api_limit = >::sse_decode(&mut deserializer); @@ -2982,9 +3702,28 @@ fn wire__crate__api__plugin__senders__plugin_search_sender_playlists_impl( move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { + let mut api_mpsc_tx_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_mpsc_tx, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_mpsc_tx_guard = + Some(api_mpsc_tx.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_mpsc_tx_guard = api_mpsc_tx_guard.unwrap(); let output_ok = crate::api::plugin::senders::PluginSearchSender::playlists( &api_that, - api_mpsc_tx, + &*api_mpsc_tx_guard, api_query, api_offset, api_limit, @@ -3022,7 +3761,9 @@ fn wire__crate__api__plugin__senders__plugin_search_sender_tracks_impl( flutter_rust_bridge::for_generated::SseDeserializer::new(message); let api_that = ::sse_decode(&mut deserializer); - let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_mpsc_tx = , + >>::sse_decode(&mut deserializer); let api_query = ::sse_decode(&mut deserializer); let api_offset = >::sse_decode(&mut deserializer); let api_limit = >::sse_decode(&mut deserializer); @@ -3030,9 +3771,28 @@ fn wire__crate__api__plugin__senders__plugin_search_sender_tracks_impl( move |context| async move { transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( (move || async move { + let mut api_mpsc_tx_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_mpsc_tx, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_mpsc_tx_guard = + Some(api_mpsc_tx.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_mpsc_tx_guard = api_mpsc_tx_guard.unwrap(); let output_ok = crate::api::plugin::senders::PluginSearchSender::tracks( &api_that, - api_mpsc_tx, + &*api_mpsc_tx_guard, api_query, api_offset, api_limit, @@ -3070,15 +3830,36 @@ fn wire__crate__api__plugin__senders__plugin_track_sender_get_track_impl( flutter_rust_bridge::for_generated::SseDeserializer::new(message); let api_that = ::sse_decode(&mut deserializer); - let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_mpsc_tx = , + >>::sse_decode(&mut deserializer); let api_id = ::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_mpsc_tx_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_mpsc_tx, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_mpsc_tx_guard = + Some(api_mpsc_tx.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_mpsc_tx_guard = api_mpsc_tx_guard.unwrap(); let output_ok = crate::api::plugin::senders::PluginTrackSender::get_track( &api_that, - api_mpsc_tx, + &*api_mpsc_tx_guard, api_id, ) .await?; @@ -3114,15 +3895,36 @@ fn wire__crate__api__plugin__senders__plugin_track_sender_radio_impl( flutter_rust_bridge::for_generated::SseDeserializer::new(message); let api_that = ::sse_decode(&mut deserializer); - let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_mpsc_tx = , + >>::sse_decode(&mut deserializer); let api_id = ::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_mpsc_tx_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_mpsc_tx, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_mpsc_tx_guard = + Some(api_mpsc_tx.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_mpsc_tx_guard = api_mpsc_tx_guard.unwrap(); let output_ok = crate::api::plugin::senders::PluginTrackSender::radio( &api_that, - api_mpsc_tx, + &*api_mpsc_tx_guard, api_id, ) .await?; @@ -3158,15 +3960,36 @@ fn wire__crate__api__plugin__senders__plugin_track_sender_save_impl( flutter_rust_bridge::for_generated::SseDeserializer::new(message); let api_that = ::sse_decode(&mut deserializer); - let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_mpsc_tx = , + >>::sse_decode(&mut deserializer); let api_ids = >::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_mpsc_tx_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_mpsc_tx, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_mpsc_tx_guard = + Some(api_mpsc_tx.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_mpsc_tx_guard = api_mpsc_tx_guard.unwrap(); let output_ok = crate::api::plugin::senders::PluginTrackSender::save( &api_that, - api_mpsc_tx, + &*api_mpsc_tx_guard, api_ids, ) .await?; @@ -3202,15 +4025,36 @@ fn wire__crate__api__plugin__senders__plugin_track_sender_unsave_impl( flutter_rust_bridge::for_generated::SseDeserializer::new(message); let api_that = ::sse_decode(&mut deserializer); - let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_mpsc_tx = , + >>::sse_decode(&mut deserializer); let api_ids = >::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_mpsc_tx_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_mpsc_tx, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_mpsc_tx_guard = + Some(api_mpsc_tx.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_mpsc_tx_guard = api_mpsc_tx_guard.unwrap(); let output_ok = crate::api::plugin::senders::PluginTrackSender::unsave( &api_that, - api_mpsc_tx, + &*api_mpsc_tx_guard, api_ids, ) .await?; @@ -3246,14 +4090,35 @@ fn wire__crate__api__plugin__senders__plugin_user_sender_me_impl( flutter_rust_bridge::for_generated::SseDeserializer::new(message); let api_that = ::sse_decode(&mut deserializer); - let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_mpsc_tx = , + >>::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_mpsc_tx_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_mpsc_tx, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_mpsc_tx_guard = + Some(api_mpsc_tx.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_mpsc_tx_guard = api_mpsc_tx_guard.unwrap(); let output_ok = crate::api::plugin::senders::PluginUserSender::me( &api_that, - api_mpsc_tx, + &*api_mpsc_tx_guard, ) .await?; Ok(output_ok) @@ -3288,17 +4153,38 @@ fn wire__crate__api__plugin__senders__plugin_user_sender_saved_albums_impl( flutter_rust_bridge::for_generated::SseDeserializer::new(message); let api_that = ::sse_decode(&mut deserializer); - let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_mpsc_tx = , + >>::sse_decode(&mut deserializer); let api_offset = >::sse_decode(&mut deserializer); let api_limit = >::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_mpsc_tx_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_mpsc_tx, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_mpsc_tx_guard = + Some(api_mpsc_tx.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_mpsc_tx_guard = api_mpsc_tx_guard.unwrap(); let output_ok = crate::api::plugin::senders::PluginUserSender::saved_albums( &api_that, - api_mpsc_tx, + &*api_mpsc_tx_guard, api_offset, api_limit, ) @@ -3335,17 +4221,38 @@ fn wire__crate__api__plugin__senders__plugin_user_sender_saved_artists_impl( flutter_rust_bridge::for_generated::SseDeserializer::new(message); let api_that = ::sse_decode(&mut deserializer); - let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_mpsc_tx = , + >>::sse_decode(&mut deserializer); let api_offset = >::sse_decode(&mut deserializer); let api_limit = >::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_mpsc_tx_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_mpsc_tx, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_mpsc_tx_guard = + Some(api_mpsc_tx.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_mpsc_tx_guard = api_mpsc_tx_guard.unwrap(); let output_ok = crate::api::plugin::senders::PluginUserSender::saved_artists( &api_that, - api_mpsc_tx, + &*api_mpsc_tx_guard, api_offset, api_limit, ) @@ -3382,17 +4289,38 @@ fn wire__crate__api__plugin__senders__plugin_user_sender_saved_playlists_impl( flutter_rust_bridge::for_generated::SseDeserializer::new(message); let api_that = ::sse_decode(&mut deserializer); - let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_mpsc_tx = , + >>::sse_decode(&mut deserializer); let api_offset = >::sse_decode(&mut deserializer); let api_limit = >::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_mpsc_tx_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_mpsc_tx, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_mpsc_tx_guard = + Some(api_mpsc_tx.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_mpsc_tx_guard = api_mpsc_tx_guard.unwrap(); let output_ok = crate::api::plugin::senders::PluginUserSender::saved_playlists( &api_that, - api_mpsc_tx, + &*api_mpsc_tx_guard, api_offset, api_limit, ) @@ -3429,17 +4357,38 @@ fn wire__crate__api__plugin__senders__plugin_user_sender_saved_tracks_impl( flutter_rust_bridge::for_generated::SseDeserializer::new(message); let api_that = ::sse_decode(&mut deserializer); - let api_mpsc_tx = ::sse_decode(&mut deserializer); + let api_mpsc_tx = , + >>::sse_decode(&mut deserializer); let api_offset = >::sse_decode(&mut deserializer); let api_limit = >::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_mpsc_tx_guard = None; + let decode_indices_ = + flutter_rust_bridge::for_generated::lockable_compute_decode_order( + vec![flutter_rust_bridge::for_generated::LockableOrderInfo::new( + &api_mpsc_tx, + 0, + false, + )], + ); + for i in decode_indices_ { + match i { + 0 => { + api_mpsc_tx_guard = + Some(api_mpsc_tx.lockable_decode_async_ref().await) + } + _ => unreachable!(), + } + } + let api_mpsc_tx_guard = api_mpsc_tx_guard.unwrap(); let output_ok = crate::api::plugin::senders::PluginUserSender::saved_tracks( &api_that, - api_mpsc_tx, + &*api_mpsc_tx_guard, api_offset, api_limit, ) @@ -3452,6 +4401,45 @@ fn wire__crate__api__plugin__senders__plugin_user_sender_saved_tracks_impl( }, ) } +fn wire__crate__api__host_api__webview__send_webview_events_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: "send_webview_events", + 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_tx = >::sse_decode(&mut deserializer); + let api_event = ::sse_decode(&mut deserializer); + deserializer.end(); + move |context| async move { + transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>( + (move || async move { + let output_ok = + crate::api::host_api::webview::send_webview_events(api_tx, api_event) + .await?; + Ok(output_ok) + })() + .await, + ) + } + }, + ) +} fn wire__crate__api__plugin__models__audio_source__spotube_audio_lossless_container_quality_to_string_fmt_impl( ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr, rust_vec_len_: i32, @@ -3496,6 +4484,129 @@ fn wire__crate__api__plugin__models__audio_source__spotube_audio_source_containe // Section: related_funcs +fn decode_DartFn_Inputs_DartOpaque_Output_unit_AnyhowException( + dart_opaque: flutter_rust_bridge::DartOpaque, +) -> impl Fn(flutter_rust_bridge::DartOpaque) -> flutter_rust_bridge::DartFnFuture<()> { + use flutter_rust_bridge::IntoDart; + + async fn body( + dart_opaque: flutter_rust_bridge::DartOpaque, + arg0: flutter_rust_bridge::DartOpaque, + ) -> () { + let args = vec![arg0.into_into_dart().into_dart()]; + let message = FLUTTER_RUST_BRIDGE_HANDLER + .dart_fn_invoke(dart_opaque, args) + .await; + + let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let action = deserializer.cursor.read_u8().unwrap(); + let ans = match action { + 0 => std::result::Result::Ok(<()>::sse_decode(&mut deserializer)), + 1 => std::result::Result::Err( + ::sse_decode(&mut deserializer), + ), + _ => unreachable!(), + }; + deserializer.end(); + let ans = ans.expect("Dart throws exception but Rust side assume it is not failable"); + ans + } + + move |arg0: flutter_rust_bridge::DartOpaque| { + flutter_rust_bridge::for_generated::convert_into_dart_fn_future(body( + dart_opaque.clone(), + arg0, + )) + } +} +fn decode_DartFn_Inputs_DartOpaque_String_Output_String_AnyhowException( + dart_opaque: flutter_rust_bridge::DartOpaque, +) -> impl Fn(flutter_rust_bridge::DartOpaque, String) -> flutter_rust_bridge::DartFnFuture { + use flutter_rust_bridge::IntoDart; + + async fn body( + dart_opaque: flutter_rust_bridge::DartOpaque, + arg0: flutter_rust_bridge::DartOpaque, + arg1: String, + ) -> String { + let args = vec![ + arg0.into_into_dart().into_dart(), + arg1.into_into_dart().into_dart(), + ]; + let message = FLUTTER_RUST_BRIDGE_HANDLER + .dart_fn_invoke(dart_opaque, args) + .await; + + let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let action = deserializer.cursor.read_u8().unwrap(); + let ans = match action { + 0 => std::result::Result::Ok(::sse_decode(&mut deserializer)), + 1 => std::result::Result::Err( + ::sse_decode(&mut deserializer), + ), + _ => unreachable!(), + }; + deserializer.end(); + let ans = ans.expect("Dart throws exception but Rust side assume it is not failable"); + ans + } + + move |arg0: flutter_rust_bridge::DartOpaque, arg1: String| { + flutter_rust_bridge::for_generated::convert_into_dart_fn_future(body( + dart_opaque.clone(), + arg0, + arg1, + )) + } +} +fn decode_DartFn_Inputs_String_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBroadcastSenderString_Output_DartOpaque_AnyhowException( + dart_opaque: flutter_rust_bridge::DartOpaque, +) -> impl Fn( + String, + BroadcastSender, +) -> flutter_rust_bridge::DartFnFuture { + use flutter_rust_bridge::IntoDart; + + async fn body( + dart_opaque: flutter_rust_bridge::DartOpaque, + arg0: String, + arg1: BroadcastSender, + ) -> flutter_rust_bridge::DartOpaque { + let args = vec![ + arg0.into_into_dart().into_dart(), + arg1.into_into_dart().into_dart(), + ]; + let message = FLUTTER_RUST_BRIDGE_HANDLER + .dart_fn_invoke(dart_opaque, args) + .await; + + let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message); + let action = deserializer.cursor.read_u8().unwrap(); + let ans = match action { + 0 => std::result::Result::Ok(::sse_decode( + &mut deserializer, + )), + 1 => std::result::Result::Err( + ::sse_decode(&mut deserializer), + ), + _ => unreachable!(), + }; + deserializer.end(); + let ans = ans.expect("Dart throws exception but Rust side assume it is not failable"); + ans + } + + move |arg0: String, arg1: BroadcastSender| { + flutter_rust_bridge::for_generated::convert_into_dart_fn_future(body( + dart_opaque.clone(), + arg0, + arg1, + )) + } +} +flutter_rust_bridge::frb_generated_moi_arc_impl_value!( + flutter_rust_bridge::for_generated::RustAutoOpaqueInner> +); flutter_rust_bridge::frb_generated_moi_arc_impl_value!( flutter_rust_bridge::for_generated::RustAutoOpaqueInner ); @@ -3519,6 +4630,16 @@ impl SseDecode for flutter_rust_bridge::for_generated::anyhow::Error { } } +impl SseDecode for BroadcastSender { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = >, + >>::sse_decode(deserializer); + return flutter_rust_bridge::for_generated::rust_auto_opaque_decode_owned(inner); + } +} + impl SseDecode for OpaqueSender { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { @@ -3559,6 +4680,26 @@ impl SseDecode for SpotubePlugin { } } +impl SseDecode for flutter_rust_bridge::DartOpaque { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return unsafe { flutter_rust_bridge::for_generated::sse_decode_dart_opaque(inner) }; + } +} + +impl SseDecode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner>, + > +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut inner = ::sse_decode(deserializer); + return decode_rust_opaque_moi(inner); + } +} + impl SseDecode for RustOpaqueMoi> { @@ -3674,6 +4815,13 @@ impl SseDecode for i64 { } } +impl SseDecode for isize { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + deserializer.cursor.read_i64::().unwrap() as _ + } +} + impl SseDecode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { @@ -4821,55 +5969,56 @@ fn pde_ffi_dispatcher_primary_impl( match func_id { 3 => wire__crate__api__plugin__plugin__SpotubePlugin_auth_state_impl(port, ptr, rust_vec_len, data_len), 24 => wire__crate__api__plugin__plugin__SpotubePlugin_close_impl(port, ptr, rust_vec_len, data_len), -25 => wire__crate__api__plugin__plugin__SpotubePlugin_create_context_impl(port, ptr, rust_vec_len, data_len), 27 => wire__crate__api__init_app_impl(port, ptr, rust_vec_len, data_len), -28 => wire__crate__api__plugin__senders__plugin_album_sender_get_album_impl(port, ptr, rust_vec_len, data_len), -29 => wire__crate__api__plugin__senders__plugin_album_sender_releases_impl(port, ptr, rust_vec_len, data_len), -30 => wire__crate__api__plugin__senders__plugin_album_sender_save_impl(port, ptr, rust_vec_len, data_len), -31 => wire__crate__api__plugin__senders__plugin_album_sender_tracks_impl(port, ptr, rust_vec_len, data_len), -32 => wire__crate__api__plugin__senders__plugin_album_sender_unsave_impl(port, ptr, rust_vec_len, data_len), -33 => wire__crate__api__plugin__senders__plugin_artist_sender_albums_impl(port, ptr, rust_vec_len, data_len), -34 => wire__crate__api__plugin__senders__plugin_artist_sender_get_artist_impl(port, ptr, rust_vec_len, data_len), -35 => wire__crate__api__plugin__senders__plugin_artist_sender_related_impl(port, ptr, rust_vec_len, data_len), -36 => wire__crate__api__plugin__senders__plugin_artist_sender_save_impl(port, ptr, rust_vec_len, data_len), -37 => wire__crate__api__plugin__senders__plugin_artist_sender_top_tracks_impl(port, ptr, rust_vec_len, data_len), -38 => wire__crate__api__plugin__senders__plugin_artist_sender_unsave_impl(port, ptr, rust_vec_len, data_len), -39 => wire__crate__api__plugin__senders__plugin_audio_source_sender_matches_impl(port, ptr, rust_vec_len, data_len), -40 => wire__crate__api__plugin__senders__plugin_audio_source_sender_streams_impl(port, ptr, rust_vec_len, data_len), -41 => wire__crate__api__plugin__senders__plugin_auth_sender_authenticate_impl(port, ptr, rust_vec_len, data_len), -42 => wire__crate__api__plugin__senders__plugin_auth_sender_is_authenticated_impl(port, ptr, rust_vec_len, data_len), -43 => wire__crate__api__plugin__senders__plugin_auth_sender_logout_impl(port, ptr, rust_vec_len, data_len), -44 => wire__crate__api__plugin__senders__plugin_browse_sender_section_items_impl(port, ptr, rust_vec_len, data_len), -45 => wire__crate__api__plugin__senders__plugin_browse_sender_sections_impl(port, ptr, rust_vec_len, data_len), -46 => wire__crate__api__plugin__models__core__plugin_configuration_slug_impl(port, ptr, rust_vec_len, data_len), -47 => wire__crate__api__plugin__senders__plugin_core_sender_check_update_impl(port, ptr, rust_vec_len, data_len), -48 => wire__crate__api__plugin__senders__plugin_core_sender_scrobble_impl(port, ptr, rust_vec_len, data_len), -49 => wire__crate__api__plugin__senders__plugin_core_sender_support_impl(port, ptr, rust_vec_len, data_len), -50 => wire__crate__api__plugin__senders__plugin_playlist_sender_add_tracks_impl(port, ptr, rust_vec_len, data_len), -51 => wire__crate__api__plugin__senders__plugin_playlist_sender_create_playlist_impl(port, ptr, rust_vec_len, data_len), -52 => wire__crate__api__plugin__senders__plugin_playlist_sender_delete_playlist_impl(port, ptr, rust_vec_len, data_len), -53 => wire__crate__api__plugin__senders__plugin_playlist_sender_get_playlist_impl(port, ptr, rust_vec_len, data_len), -54 => wire__crate__api__plugin__senders__plugin_playlist_sender_remove_tracks_impl(port, ptr, rust_vec_len, data_len), -55 => wire__crate__api__plugin__senders__plugin_playlist_sender_save_impl(port, ptr, rust_vec_len, data_len), -56 => wire__crate__api__plugin__senders__plugin_playlist_sender_tracks_impl(port, ptr, rust_vec_len, data_len), -57 => wire__crate__api__plugin__senders__plugin_playlist_sender_unsave_impl(port, ptr, rust_vec_len, data_len), -58 => wire__crate__api__plugin__senders__plugin_playlist_sender_update_playlist_impl(port, ptr, rust_vec_len, data_len), -59 => wire__crate__api__plugin__senders__plugin_search_sender_albums_impl(port, ptr, rust_vec_len, data_len), -60 => wire__crate__api__plugin__senders__plugin_search_sender_all_impl(port, ptr, rust_vec_len, data_len), -61 => wire__crate__api__plugin__senders__plugin_search_sender_artists_impl(port, ptr, rust_vec_len, data_len), -62 => wire__crate__api__plugin__senders__plugin_search_sender_chips_impl(port, ptr, rust_vec_len, data_len), -63 => wire__crate__api__plugin__senders__plugin_search_sender_playlists_impl(port, ptr, rust_vec_len, data_len), -64 => wire__crate__api__plugin__senders__plugin_search_sender_tracks_impl(port, ptr, rust_vec_len, data_len), -65 => wire__crate__api__plugin__senders__plugin_track_sender_get_track_impl(port, ptr, rust_vec_len, data_len), -66 => wire__crate__api__plugin__senders__plugin_track_sender_radio_impl(port, ptr, rust_vec_len, data_len), -67 => wire__crate__api__plugin__senders__plugin_track_sender_save_impl(port, ptr, rust_vec_len, data_len), -68 => wire__crate__api__plugin__senders__plugin_track_sender_unsave_impl(port, ptr, rust_vec_len, data_len), -69 => wire__crate__api__plugin__senders__plugin_user_sender_me_impl(port, ptr, rust_vec_len, data_len), -70 => wire__crate__api__plugin__senders__plugin_user_sender_saved_albums_impl(port, ptr, rust_vec_len, data_len), -71 => wire__crate__api__plugin__senders__plugin_user_sender_saved_artists_impl(port, ptr, rust_vec_len, data_len), -72 => wire__crate__api__plugin__senders__plugin_user_sender_saved_playlists_impl(port, ptr, rust_vec_len, data_len), -73 => wire__crate__api__plugin__senders__plugin_user_sender_saved_tracks_impl(port, ptr, rust_vec_len, data_len), -75 => wire__crate__api__plugin__models__audio_source__spotube_audio_lossy_container_quality_to_string_fmt_impl(port, ptr, rust_vec_len, data_len), +28 => wire__crate__api__host_api__webview__initialize_webview_callbacks_impl(port, ptr, rust_vec_len, data_len), +29 => wire__crate__api__plugin__senders__plugin_album_sender_get_album_impl(port, ptr, rust_vec_len, data_len), +30 => wire__crate__api__plugin__senders__plugin_album_sender_releases_impl(port, ptr, rust_vec_len, data_len), +31 => wire__crate__api__plugin__senders__plugin_album_sender_save_impl(port, ptr, rust_vec_len, data_len), +32 => wire__crate__api__plugin__senders__plugin_album_sender_tracks_impl(port, ptr, rust_vec_len, data_len), +33 => wire__crate__api__plugin__senders__plugin_album_sender_unsave_impl(port, ptr, rust_vec_len, data_len), +34 => wire__crate__api__plugin__senders__plugin_artist_sender_albums_impl(port, ptr, rust_vec_len, data_len), +35 => wire__crate__api__plugin__senders__plugin_artist_sender_get_artist_impl(port, ptr, rust_vec_len, data_len), +36 => wire__crate__api__plugin__senders__plugin_artist_sender_related_impl(port, ptr, rust_vec_len, data_len), +37 => wire__crate__api__plugin__senders__plugin_artist_sender_save_impl(port, ptr, rust_vec_len, data_len), +38 => wire__crate__api__plugin__senders__plugin_artist_sender_top_tracks_impl(port, ptr, rust_vec_len, data_len), +39 => wire__crate__api__plugin__senders__plugin_artist_sender_unsave_impl(port, ptr, rust_vec_len, data_len), +40 => wire__crate__api__plugin__senders__plugin_audio_source_sender_matches_impl(port, ptr, rust_vec_len, data_len), +41 => wire__crate__api__plugin__senders__plugin_audio_source_sender_streams_impl(port, ptr, rust_vec_len, data_len), +42 => wire__crate__api__plugin__senders__plugin_auth_sender_authenticate_impl(port, ptr, rust_vec_len, data_len), +43 => wire__crate__api__plugin__senders__plugin_auth_sender_is_authenticated_impl(port, ptr, rust_vec_len, data_len), +44 => wire__crate__api__plugin__senders__plugin_auth_sender_logout_impl(port, ptr, rust_vec_len, data_len), +45 => wire__crate__api__plugin__senders__plugin_browse_sender_section_items_impl(port, ptr, rust_vec_len, data_len), +46 => wire__crate__api__plugin__senders__plugin_browse_sender_sections_impl(port, ptr, rust_vec_len, data_len), +47 => wire__crate__api__plugin__models__core__plugin_configuration_slug_impl(port, ptr, rust_vec_len, data_len), +48 => wire__crate__api__plugin__senders__plugin_core_sender_check_update_impl(port, ptr, rust_vec_len, data_len), +49 => wire__crate__api__plugin__senders__plugin_core_sender_scrobble_impl(port, ptr, rust_vec_len, data_len), +50 => wire__crate__api__plugin__senders__plugin_core_sender_support_impl(port, ptr, rust_vec_len, data_len), +51 => wire__crate__api__plugin__senders__plugin_playlist_sender_add_tracks_impl(port, ptr, rust_vec_len, data_len), +52 => wire__crate__api__plugin__senders__plugin_playlist_sender_create_playlist_impl(port, ptr, rust_vec_len, data_len), +53 => wire__crate__api__plugin__senders__plugin_playlist_sender_delete_playlist_impl(port, ptr, rust_vec_len, data_len), +54 => wire__crate__api__plugin__senders__plugin_playlist_sender_get_playlist_impl(port, ptr, rust_vec_len, data_len), +55 => wire__crate__api__plugin__senders__plugin_playlist_sender_remove_tracks_impl(port, ptr, rust_vec_len, data_len), +56 => wire__crate__api__plugin__senders__plugin_playlist_sender_save_impl(port, ptr, rust_vec_len, data_len), +57 => wire__crate__api__plugin__senders__plugin_playlist_sender_tracks_impl(port, ptr, rust_vec_len, data_len), +58 => wire__crate__api__plugin__senders__plugin_playlist_sender_unsave_impl(port, ptr, rust_vec_len, data_len), +59 => wire__crate__api__plugin__senders__plugin_playlist_sender_update_playlist_impl(port, ptr, rust_vec_len, data_len), +60 => wire__crate__api__plugin__senders__plugin_search_sender_albums_impl(port, ptr, rust_vec_len, data_len), +61 => wire__crate__api__plugin__senders__plugin_search_sender_all_impl(port, ptr, rust_vec_len, data_len), +62 => wire__crate__api__plugin__senders__plugin_search_sender_artists_impl(port, ptr, rust_vec_len, data_len), +63 => wire__crate__api__plugin__senders__plugin_search_sender_chips_impl(port, ptr, rust_vec_len, data_len), +64 => wire__crate__api__plugin__senders__plugin_search_sender_playlists_impl(port, ptr, rust_vec_len, data_len), +65 => wire__crate__api__plugin__senders__plugin_search_sender_tracks_impl(port, ptr, rust_vec_len, data_len), +66 => wire__crate__api__plugin__senders__plugin_track_sender_get_track_impl(port, ptr, rust_vec_len, data_len), +67 => wire__crate__api__plugin__senders__plugin_track_sender_radio_impl(port, ptr, rust_vec_len, data_len), +68 => wire__crate__api__plugin__senders__plugin_track_sender_save_impl(port, ptr, rust_vec_len, data_len), +69 => wire__crate__api__plugin__senders__plugin_track_sender_unsave_impl(port, ptr, rust_vec_len, data_len), +70 => wire__crate__api__plugin__senders__plugin_user_sender_me_impl(port, ptr, rust_vec_len, data_len), +71 => wire__crate__api__plugin__senders__plugin_user_sender_saved_albums_impl(port, ptr, rust_vec_len, data_len), +72 => wire__crate__api__plugin__senders__plugin_user_sender_saved_artists_impl(port, ptr, rust_vec_len, data_len), +73 => wire__crate__api__plugin__senders__plugin_user_sender_saved_playlists_impl(port, ptr, rust_vec_len, data_len), +74 => wire__crate__api__plugin__senders__plugin_user_sender_saved_tracks_impl(port, ptr, rust_vec_len, data_len), +75 => wire__crate__api__host_api__webview__send_webview_events_impl(port, ptr, rust_vec_len, data_len), +77 => wire__crate__api__plugin__models__audio_source__spotube_audio_lossy_container_quality_to_string_fmt_impl(port, ptr, rust_vec_len, data_len), _ => unreachable!(), } } @@ -4904,15 +6053,36 @@ fn pde_ffi_dispatcher_sync_impl( 21 => wire__crate__api__plugin__plugin__SpotubePlugin_auto_accessor_set_search_impl(ptr, rust_vec_len, data_len), 22 => wire__crate__api__plugin__plugin__SpotubePlugin_auto_accessor_set_track_impl(ptr, rust_vec_len, data_len), 23 => wire__crate__api__plugin__plugin__SpotubePlugin_auto_accessor_set_user_impl(ptr, rust_vec_len, data_len), +25 => wire__crate__api__plugin__plugin__SpotubePlugin_create_context_impl(ptr, rust_vec_len, data_len), 26 => wire__crate__api__plugin__plugin__SpotubePlugin_new_impl(ptr, rust_vec_len, data_len), -74 => wire__crate__api__plugin__models__audio_source__spotube_audio_lossless_container_quality_to_string_fmt_impl(ptr, rust_vec_len, data_len), -76 => wire__crate__api__plugin__models__audio_source__spotube_audio_source_container_preset_file_extension_impl(ptr, rust_vec_len, data_len), +76 => wire__crate__api__plugin__models__audio_source__spotube_audio_lossless_container_quality_to_string_fmt_impl(ptr, rust_vec_len, data_len), +78 => wire__crate__api__plugin__models__audio_source__spotube_audio_source_container_preset_file_extension_impl(ptr, rust_vec_len, data_len), _ => unreachable!(), } } // Section: rust2dart +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for FrbWrapper> { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self.0) + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for FrbWrapper> +{ +} + +impl flutter_rust_bridge::IntoIntoDart>> + for BroadcastSender +{ + fn into_into_dart(self) -> FrbWrapper> { + self.into() + } +} + // Codec=Dco (DartCObject based), see doc to use other codecs impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { @@ -5964,6 +7134,18 @@ impl SseEncode for flutter_rust_bridge::for_generated::anyhow::Error { } } +impl SseEncode for BroadcastSender { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + >, + >>::sse_encode( + flutter_rust_bridge::for_generated::rust_auto_opaque_encode::<_, MoiArc<_>>(self), + serializer, + ); + } +} + impl SseEncode for OpaqueSender { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { @@ -5997,6 +7179,26 @@ impl SseEncode for SpotubePlugin { } } +impl SseEncode for flutter_rust_bridge::DartOpaque { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.encode(), serializer); + } +} + +impl SseEncode + for RustOpaqueMoi< + flutter_rust_bridge::for_generated::RustAutoOpaqueInner>, + > +{ + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + let (ptr, size) = self.sse_encode_raw(); + ::sse_encode(ptr, serializer); + ::sse_encode(size, serializer); + } +} + impl SseEncode for RustOpaqueMoi> { @@ -6114,6 +7316,16 @@ impl SseEncode for i64 { } } +impl SseEncode for isize { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + serializer + .cursor + .write_i64::(self as _) + .unwrap(); + } +} + impl SseEncode for Vec { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { @@ -6952,6 +8164,7 @@ mod io { // Section: imports use super::*; + use crate::api::host_api::webview::*; use crate::api::plugin::commands::*; use crate::api::plugin::plugin::*; use crate::*; @@ -6967,6 +8180,20 @@ mod io { flutter_rust_bridge::frb_generated_boilerplate_io!(); + #[unsafe(no_mangle)] + pub extern "C" fn frbgen_spotube_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBroadcastSenderString( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>>::increment_strong_count(ptr as _); + } + + #[unsafe(no_mangle)] + pub extern "C" fn frbgen_spotube_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerBroadcastSenderString( + ptr: *const std::ffi::c_void, + ) { + MoiArc::>>::decrement_strong_count(ptr as _); + } + #[unsafe(no_mangle)] pub extern "C" fn frbgen_spotube_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedRustAutoOpaqueInnerOpaqueSender( ptr: *const std::ffi::c_void, diff --git a/rust/src/main.rs b/rust/src/main.rs index 1781ebae..524e3765 100644 --- a/rust/src/main.rs +++ b/rust/src/main.rs @@ -102,8 +102,8 @@ async fn plugin() -> anyhow::Result<()> { }; let sender = plugin.create_context(PLUGIN_JS.to_string(), config.clone())?; let (r1, r2) = tokio::join!( - plugin.core.check_update(sender.clone(), config.clone()), - plugin.core.check_update(sender.clone(), config.clone()) + plugin.core.check_update(&sender, config.clone()), + plugin.core.check_update(&sender, config.clone()) ); r1?; r2?;