import 'dart:async'; import 'dart:js' as js; import 'dart:convert'; import 'dart:typed_data'; import 'package:flutter/foundation.dart'; import 'package:uuid/uuid.dart'; import 'dart:html' as html; import 'package:flutter_hbb/consts.dart'; final _privateConstructorUsedError = UnsupportedError( 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); mixin _$EventToUI { Object get field0 => throw _privateConstructorUsedError; } sealed class EventToUI { const factory EventToUI.event( String field0, ) = EventToUI_Event; const factory EventToUI.rgba( int field0, ) = EventToUI_Rgba; const factory EventToUI.texture( int field0, bool field1, ) = EventToUI_Texture; } class EventToUI_Event implements EventToUI { const EventToUI_Event(final String field0) : this.field = field0; final String field; String get field0 => field; } class EventToUI_Rgba implements EventToUI { const EventToUI_Rgba(final int field0) : field = field0; final int field; int get field0 => field; } class EventToUI_Texture implements EventToUI { const EventToUI_Texture(final int field0, final bool field1) : f0 = field0, f1 = field1; final int f0; final bool f1; int get field0 => f0; bool get field1 => f1; } class RustdeskImpl { Future stopGlobalEventStream({required String appType, dynamic hint}) { throw UnimplementedError("stopGlobalEventStream"); } Future hostStopSystemKeyPropagate( {required bool stopped, dynamic hint}) { throw UnimplementedError("hostStopSystemKeyPropagate"); } int peerGetDefaultSessionsCount({required String id, dynamic hint}) { return 0; } String sessionAddExistedSync( {required String id, required UuidValue sessionId, required Int32List displays, dynamic hint}) { return ''; } String sessionAddSync( {required UuidValue sessionId, required String id, required bool isFileTransfer, required bool isPortForward, required bool isRdp, required String switchUuid, required bool forceRelay, required String password, required bool isSharedPassword, String? connToken, dynamic hint}) { return js.context.callMethod('setByName', [ 'session_add_sync', jsonEncode({ 'id': id, 'password': password, 'is_shared_password': isSharedPassword, 'isFileTransfer': isFileTransfer }) ]); } Stream sessionStart( {required UuidValue sessionId, required String id, dynamic hint}) { js.context.callMethod('setByName', [ 'session_start', jsonEncode({'id': id}) ]); return Stream.empty(); } Stream sessionStartWithDisplays( {required UuidValue sessionId, required String id, required Int32List displays, dynamic hint}) { throw UnimplementedError("sessionStartWithDisplays"); } Future sessionGetRemember( {required UuidValue sessionId, dynamic hint}) { return Future( () => js.context.callMethod('getByName', ['remember']) == 'true'); } Future sessionGetToggleOption( {required UuidValue sessionId, required String arg, dynamic hint}) { return Future( () => sessionGetToggleOptionSync(sessionId: sessionId, arg: arg)); } bool sessionGetToggleOptionSync( {required UuidValue sessionId, required String arg, dynamic hint}) { return 'true' == js.context.callMethod('getByName', ['option:toggle', arg]); } Future sessionGetOption( {required UuidValue sessionId, required String arg, dynamic hint}) { return Future( () => js.context.callMethod('getByName', ['option:session', arg])); } Future sessionLogin( {required UuidValue sessionId, required String osUsername, required String osPassword, required String password, required bool remember, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'login', jsonEncode({ 'os_username': osUsername, 'os_password': osPassword, 'password': password, 'remember': remember }) ])); } Future sessionSend2Fa( {required UuidValue sessionId, required String code, required bool trustThisDevice, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'send_2fa', jsonEncode({'code': code, 'trust_this_device': trustThisDevice}) ])); } Future sessionClose({required UuidValue sessionId, dynamic hint}) { return Future(() => js.context.callMethod('setByName', ['session_close'])); } Future sessionRefresh( {required UuidValue sessionId, required int display, dynamic hint}) { return Future(() => js.context.callMethod('setByName', ['refresh'])); } Future sessionRecordScreen( {required UuidValue sessionId, required bool start, dynamic hint}) { throw UnimplementedError("sessionRecordScreen"); } bool sessionGetIsRecording({required UuidValue sessionId, dynamic hint}) { return false; } Future sessionReconnect( {required UuidValue sessionId, required bool forceRelay, dynamic hint}) { return Future(() => js.context.callMethod('setByName', ['reconnect'])); } Future sessionToggleOption( {required UuidValue sessionId, required String value, dynamic hint}) { return Future( () => js.context.callMethod('setByName', ['option:toggle', value])); } Future sessionTogglePrivacyMode( {required UuidValue sessionId, required String implKey, required bool on, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'toggle_privacy_mode', jsonEncode({'impl_key': implKey, 'on': on}) ])); } Future sessionGetFlutterOption( {required UuidValue sessionId, required String k, dynamic hint}) { return Future( () => js.context.callMethod('getByName', ['option:flutter:peer', k])); } Future sessionSetFlutterOption( {required UuidValue sessionId, required String k, required String v, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'option:flutter:peer', jsonEncode({'name': k, 'value': v}) ])); } int getNextTextureKey({dynamic hint}) { return 0; } String getLocalFlutterOption({required String k, dynamic hint}) { return js.context.callMethod('getByName', ['option:flutter:local', k]); } Future setLocalFlutterOption( {required String k, required String v, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'option:flutter:local', jsonEncode({'name': k, 'value': v}) ])); } String getLocalKbLayoutType({dynamic hint}) { return js.context.callMethod('getByName', ['option:local', 'kb_layout']); } Future setLocalKbLayoutType( {required String kbLayoutType, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'option:local', jsonEncode({'name': 'kb_layout', 'value': kbLayoutType}) ])); } Future sessionGetViewStyle( {required UuidValue sessionId, dynamic hint}) { return Future(() => js.context.callMethod('getByName', ['option:session', 'view_style'])); } Future sessionSetViewStyle( {required UuidValue sessionId, required String value, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'option:session', jsonEncode({'name': 'view_style', 'value': value}) ])); } Future sessionGetScrollStyle( {required UuidValue sessionId, dynamic hint}) { return Future(() => js.context.callMethod('getByName', ['option:session', 'scroll_style'])); } Future sessionSetScrollStyle( {required UuidValue sessionId, required String value, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'option:session', jsonEncode({'name': 'scroll_style', 'value': value}) ])); } Future sessionGetImageQuality( {required UuidValue sessionId, dynamic hint}) { return Future(() => js.context.callMethod('getByName', ['image_quality'])); } Future sessionSetImageQuality( {required UuidValue sessionId, required String value, dynamic hint}) { print('set image quality: $value'); return Future( () => js.context.callMethod('setByName', ['image_quality', value])); } Future sessionGetKeyboardMode( {required UuidValue sessionId, dynamic hint}) { final mode = js.context.callMethod('getByName', ['option:session', 'keyboard_mode']); return Future(() => mode == '' ? null : mode); } Future sessionSetKeyboardMode( {required UuidValue sessionId, required String value, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'option:session', jsonEncode({'name': 'keyboard_mode', 'value': value}) ])); } String? sessionGetReverseMouseWheelSync( {required UuidValue sessionId, dynamic hint}) { return js.context .callMethod('getByName', ['option:session', 'reverse_mouse_wheel']); } Future sessionSetReverseMouseWheel( {required UuidValue sessionId, required String value, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'option:session', jsonEncode({'name': 'reverse_mouse_wheel', 'value': value}) ])); } String? sessionGetDisplaysAsIndividualWindows( {required UuidValue sessionId, dynamic hint}) { return js.context.callMethod( 'getByName', ['option:session', 'displays_as_individual_windows']); } Future sessionSetDisplaysAsIndividualWindows( {required UuidValue sessionId, required String value, dynamic hint}) { return Future.value(); } String? sessionGetUseAllMyDisplaysForTheRemoteSession( {required UuidValue sessionId, dynamic hint}) { return ''; } Future sessionSetUseAllMyDisplaysForTheRemoteSession( {required UuidValue sessionId, required String value, dynamic hint}) { return Future.value(); } Future sessionGetCustomImageQuality( {required UuidValue sessionId, dynamic hint}) { try { return Future(() => Int32List.fromList([ int.parse(js.context.callMethod( 'getByName', ['option:session', 'custom_image_quality'])) ])); } catch (e) { return Future.value(null); } } bool sessionIsKeyboardModeSupported( {required UuidValue sessionId, required String mode, dynamic hint}) { if (mainGetInputSource(hint: hint) == 'Input source 1') { return [kKeyMapMode, kKeyTranslateMode].contains(mode); } else { return [kKeyLegacyMode, kKeyMapMode].contains(mode); } } bool sessionIsMultiUiSession({required UuidValue sessionId, dynamic hint}) { return false; } Future sessionSetCustomImageQuality( {required UuidValue sessionId, required int value, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'custom_image_quality', value, ])); } Future sessionSetCustomFps( {required UuidValue sessionId, required int fps, dynamic hint}) { return Future( () => js.context.callMethod('setByName', ['custom-fps', fps])); } Future sessionLockScreen({required UuidValue sessionId, dynamic hint}) { return Future(() => js.context.callMethod('setByName', ['lock_screen'])); } Future sessionCtrlAltDel({required UuidValue sessionId, dynamic hint}) { return Future(() => js.context.callMethod('setByName', ['ctrl_alt_del'])); } Future sessionSwitchDisplay( {required bool isDesktop, required UuidValue sessionId, required Int32List value, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'switch_display', jsonEncode({ 'isDesktop': isDesktop, 'sessionId': sessionId.toString(), 'value': value }) ])); } Future sessionHandleFlutterKeyEvent( {required UuidValue sessionId, required String character, required int usbHid, required int lockModes, required bool downOrUp, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'flutter_key_event', jsonEncode({ 'name': character, 'usb_hid': usbHid, 'lock_modes': lockModes, if (downOrUp) 'down': 'true', }) ])); } Future sessionHandleFlutterRawKeyEvent( {required UuidValue sessionId, required String name, required int platformCode, required int positionCode, required int lockModes, required bool downOrUp, dynamic hint}) { throw UnimplementedError("sessionHandleFlutterRawKeyEvent"); } void sessionEnterOrLeave( {required UuidValue sessionId, required bool enter, dynamic hint}) { js.context.callMethod('setByName', ['enter_or_leave', enter]); } Future sessionInputKey( {required UuidValue sessionId, required String name, required bool down, required bool press, required bool alt, required bool ctrl, required bool shift, required bool command, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'input_key', jsonEncode({ 'name': name, if (down) 'down': 'true', if (press) 'press': 'true', if (alt) 'alt': 'true', if (ctrl) 'ctrl': 'true', if (shift) 'shift': 'true', if (command) 'command': 'true' }) ])); } Future sessionInputString( {required UuidValue sessionId, required String value, dynamic hint}) { return Future( () => js.context.callMethod('setByName', ['input_string', value])); } Future sessionSendChat( {required UuidValue sessionId, required String text, dynamic hint}) { return Future( () => js.context.callMethod('setByName', ['send_chat', text])); } Future sessionPeerOption( {required UuidValue sessionId, required String name, required String value, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'option:session', jsonEncode({'name': name, 'value': value}) ])); } Future sessionGetPeerOption( {required UuidValue sessionId, required String name, dynamic hint}) { return Future( () => js.context.callMethod('getByName', ['option:session', name])); } Future sessionInputOsPassword( {required UuidValue sessionId, required String value, dynamic hint}) { return Future( () => js.context.callMethod('setByName', ['input_os_password', value])); } Future sessionReadRemoteDir( {required UuidValue sessionId, required String path, required bool includeHidden, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'read_remote_dir', jsonEncode({'path': path, 'include_hidden': includeHidden}) ])); } Future sessionSendFiles( {required UuidValue sessionId, required int actId, required String path, required String to, required int fileNum, required bool includeHidden, required bool isRemote, required bool isDir, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'send_files', jsonEncode({ 'id': actId, 'path': path, 'to': to, 'file_num': fileNum, 'include_hidden': includeHidden, 'is_remote': isRemote, 'is_dir': isDir, }) ])); } Future sessionSetConfirmOverrideFile( {required UuidValue sessionId, required int actId, required int fileNum, required bool needOverride, required bool remember, required bool isUpload, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'confirm_override_file', jsonEncode({ 'id': actId, 'file_num': fileNum, 'need_override': needOverride, 'remember': remember, 'is_upload': isUpload }) ])); } Future sessionRemoveFile( {required UuidValue sessionId, required int actId, required String path, required int fileNum, required bool isRemote, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'remove_file', jsonEncode({ 'id': actId, 'path': path, 'file_num': fileNum, 'is_remote': isRemote }) ])); } Future sessionReadDirToRemoveRecursive( {required UuidValue sessionId, required int actId, required String path, required bool isRemote, required bool showHidden, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'read_dir_to_remove_recursive', jsonEncode({ 'id': actId, 'path': path, 'is_remote': isRemote, 'show_hidden': showHidden }) ])); } Future sessionRemoveAllEmptyDirs( {required UuidValue sessionId, required int actId, required String path, required bool isRemote, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'remove_all_empty_dirs', jsonEncode({'id': actId, 'path': path, 'is_remote': isRemote}) ])); } Future sessionCancelJob( {required UuidValue sessionId, required int actId, dynamic hint}) { return Future( () => js.context.callMethod('setByName', ['cancel_job', actId])); } Future sessionCreateDir( {required UuidValue sessionId, required int actId, required String path, required bool isRemote, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'create_dir', jsonEncode({'id': actId, 'path': path, 'is_remote': isRemote}) ])); } Future sessionReadLocalDirSync( {required UuidValue sessionId, required String path, required bool showHidden, dynamic hint}) { throw UnimplementedError("sessionReadLocalDirSync"); } Future sessionGetPlatform( {required UuidValue sessionId, required bool isRemote, dynamic hint}) { if (isRemote) { return Future(() => js.context.callMethod('getByName', ['platform'])); } else { return Future(() => 'Web'); } } Future sessionLoadLastTransferJobs( {required UuidValue sessionId, dynamic hint}) { throw UnimplementedError("sessionLoadLastTransferJobs"); } Future sessionAddJob( {required UuidValue sessionId, required int actId, required String path, required String to, required int fileNum, required bool includeHidden, required bool isRemote, dynamic hint}) { throw UnimplementedError("sessionAddJob"); } Future sessionResumeJob( {required UuidValue sessionId, required int actId, required bool isRemote, dynamic hint}) { throw UnimplementedError("sessionResumeJob"); } Future sessionElevateDirect( {required UuidValue sessionId, dynamic hint}) { return Future(() => js.context.callMethod('setByName', ['elevate_direct'])); } Future sessionElevateWithLogon( {required UuidValue sessionId, required String username, required String password, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'elevate_with_logon', jsonEncode({'username': username, 'password': password}) ])); } Future sessionSwitchSides( {required UuidValue sessionId, dynamic hint}) { throw UnimplementedError("sessionSwitchSides"); } Future sessionChangeResolution( {required UuidValue sessionId, required int display, required int width, required int height, dynamic hint}) { // note: restore on disconnected return Future(() => js.context.callMethod('setByName', [ 'change_resolution', jsonEncode({'display': display, 'width': width, 'height': height}) ])); } Future sessionSetSize( {required UuidValue sessionId, required int display, required int width, required int height, dynamic hint}) { return Future.value(); } Future sessionSendSelectedSessionId( {required UuidValue sessionId, required String sid, dynamic hint}) { return Future( () => js.context.callMethod('setByName', ['selected_sid', sid])); } Future> mainGetSoundInputs({dynamic hint}) { throw UnimplementedError("mainGetSoundInputs"); } Future mainGetDefaultSoundInput({dynamic hint}) { throw UnimplementedError("mainGetDefaultSoundInput"); } String mainGetLoginDeviceInfo({dynamic hint}) { String userAgent = html.window.navigator.userAgent; String appName = html.window.navigator.appName; String appVersion = html.window.navigator.appVersion; String? platform = html.window.navigator.platform; return jsonEncode({ 'os': '$userAgent, $appName $appVersion ($platform)', 'type': 'Web client', 'name': js.context.callMethod('getByName', ['my_name']), }); } Future mainChangeId({required String newId, dynamic hint}) { throw UnimplementedError("mainChangeId"); } Future mainGetAsyncStatus({dynamic hint}) { throw UnimplementedError("mainGetAsyncStatus"); } Future mainGetOption({required String key, dynamic hint}) { return Future.value(mainGetOptionSync(key: key)); } String mainGetOptionSync({required String key, dynamic hint}) { return js.context.callMethod('getByName', ['option', key]); } Future mainGetError({dynamic hint}) { throw UnimplementedError("mainGetError"); } bool mainShowOption({required String key, dynamic hint}) { throw UnimplementedError("mainShowOption"); } Future mainSetOption( {required String key, required String value, dynamic hint}) { js.context.callMethod('setByName', [ 'option', jsonEncode({'name': key, 'value': value}) ]); return Future.value(); } // get server settings Future mainGetOptions({dynamic hint}) { return Future(() => mainGetOptionsSync()); } // get server settings String mainGetOptionsSync({dynamic hint}) { return js.context.callMethod('getByName', ['options']); } Future mainSetOptions({required String json, dynamic hint}) { return Future(() => js.context.callMethod('setByName', ['options', json])); } Future mainTestIfValidServer( {required String server, required bool testWithProxy, dynamic hint}) { // TODO: implement return Future.value(''); } Future mainSetSocks( {required String proxy, required String username, required String password, dynamic hint}) { throw UnimplementedError("mainSetSocks"); } Future> mainGetSocks({dynamic hint}) { throw UnimplementedError("mainGetSocks"); } Future mainGetAppName({dynamic hint}) { return Future.value(mainGetAppNameSync(hint: hint)); } String mainGetAppNameSync({dynamic hint}) { return 'RustDesk'; } String mainUriPrefixSync({dynamic hint}) { throw UnimplementedError("mainUriPrefixSync"); } Future mainGetLicense({dynamic hint}) { // TODO: implement return Future(() => ''); } Future mainGetVersion({dynamic hint}) { return Future(() => js.context.callMethod('getByName', ['version'])); } Future> mainGetFav({dynamic hint}) { List favs = []; try { favs = (jsonDecode(js.context.callMethod('getByName', ['fav'])) as List) .map((e) => e.toString()) .toList(); } catch (e) { debugPrint('Failed to load favs: $e'); } return Future.value(favs); } Future mainStoreFav({required List favs, dynamic hint}) { return Future( () => js.context.callMethod('setByName', ['fav', jsonEncode(favs)])); } String mainGetPeerSync({required String id, dynamic hint}) { // TODO: throw UnimplementedError("mainGetPeerSync"); } Future mainGetLanPeers({dynamic hint}) { throw UnimplementedError("mainGetLanPeers"); } Future mainGetConnectStatus({dynamic hint}) { return Future( () => js.context.callMethod('getByName', ["get_conn_status"])); } Future mainCheckConnectStatus({dynamic hint}) { throw UnimplementedError("mainCheckConnectStatus"); } Future mainIsUsingPublicServer({dynamic hint}) { return Future(() => js.context.callMethod('getByName', ["is_using_public_server"]) == 'true'); } Future mainDiscover({dynamic hint}) { throw UnimplementedError("mainDiscover"); } Future mainGetApiServer({dynamic hint}) { return Future(() => js.context.callMethod('getByName', ['api_server'])); } Future mainPostRequest( {required String url, required String body, required String header, dynamic hint}) { throw UnimplementedError("mainPostRequest"); } Future mainGetProxyStatus({dynamic hint}) { return Future(() => false); } Future mainHttpRequest({ required String url, required String method, String? body, required String header, dynamic hint, }) { throw UnimplementedError("mainHttpRequest"); } Future mainGetHttpStatus({required String url, dynamic hint}) { throw UnimplementedError("mainGetHttpStatus"); } String mainGetLocalOption({required String key, dynamic hint}) { return js.context.callMethod('getByName', ['option:local', key]); } String mainGetEnv({required String key, dynamic hint}) { throw UnimplementedError("mainGetEnv"); } Future mainSetLocalOption( {required String key, required String value, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'option:local', jsonEncode({'name': key, 'value': value}) ])); } String mainGetInputSource({dynamic hint}) { final inputSource = js.context.callMethod('getByName', ['option:local', 'input-source']); // // js grab mode // export const CONFIG_INPUT_SOURCE_1 = "Input source 1"; // // flutter grab mode // export const CONFIG_INPUT_SOURCE_2 = "Input source 2"; return inputSource != '' ? inputSource : 'Input source 1'; } Future mainSetInputSource( {required UuidValue sessionId, required String value, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'option:local', jsonEncode({'name': 'input-source', 'value': value}) ])); } Future mainGetMyId({dynamic hint}) { return Future(() => js.context.callMethod('getByName', ['my_id'])); } Future mainGetUuid({dynamic hint}) { return Future(() => js.context.callMethod('getByName', ['uuid'])); } Future mainGetPeerOption( {required String id, required String key, dynamic hint}) { return Future(() => mainGetPeerOptionSync(id: id, key: key, hint: hint)); } String mainGetPeerOptionSync( {required String id, required String key, dynamic hint}) { return js.context.callMethod('getByName', [ 'option:peer', jsonEncode({'id': id, 'name': key}) ]); } String mainGetPeerFlutterOptionSync( {required String id, required String k, dynamic hint}) { return js.context.callMethod('getByName', ['option:flutter:peer', k]); } void mainSetPeerFlutterOptionSync( {required String id, required String k, required String v, dynamic hint}) { js.context.callMethod('setByName', [ 'option:flutter:peer', jsonEncode({'name': k, 'value': v}) ]); } Future mainSetPeerOption( {required String id, required String key, required String value, dynamic hint}) { mainSetPeerOptionSync(id: id, key: key, value: value, hint: hint); return Future.value(); } bool mainSetPeerOptionSync( {required String id, required String key, required String value, dynamic hint}) { js.context.callMethod('setByName', [ 'option:peer', jsonEncode({'id': id, 'name': key, 'value': value}) ]); return true; } Future mainSetPeerAlias( {required String id, required String alias, dynamic hint}) { mainSetPeerOptionSync(id: id, key: 'alias', value: alias, hint: hint); return Future.value(); } Future mainGetNewStoredPeers({dynamic hint}) { throw UnimplementedError("mainGetNewStoredPeers"); } Future mainForgetPassword({required String id, dynamic hint}) { return mainSetPeerOption(id: id, key: 'password', value: ''); } Future mainPeerHasPassword({required String id, dynamic hint}) { return Future(() => js.context.callMethod('getByName', ['peer_has_password', id]) == 'true'); } Future mainPeerExists({required String id, dynamic hint}) { return Future( () => js.context.callMethod('getByName', ['peer_exists', id])); } Future mainLoadRecentPeers({dynamic hint}) { return Future( () => js.context.callMethod('getByName', ['load_recent_peers'])); } String mainLoadRecentPeersSync({dynamic hint}) { return js.context.callMethod('getByName', ['load_recent_peers_sync']); } String mainLoadLanPeersSync({dynamic hint}) { return '{}'; } Future mainLoadRecentPeersForAb( {required String filter, dynamic hint}) { throw UnimplementedError("mainLoadRecentPeersForAb"); } Future mainLoadFavPeers({dynamic hint}) { return Future(() => js.context.callMethod('getByName', ['load_fav_peers'])); } Future mainLoadLanPeers({dynamic hint}) { throw UnimplementedError("mainLoadLanPeers"); } Future mainRemoveDiscovered({required String id, dynamic hint}) { throw UnimplementedError("mainRemoveDiscovered"); } Future mainChangeTheme({required String dark, dynamic hint}) { throw UnimplementedError("mainChangeTheme"); } Future mainChangeLanguage({required String lang, dynamic hint}) { throw UnimplementedError("mainChangeLanguage"); } String mainVideoSaveDirectory({required bool root, dynamic hint}) { throw UnimplementedError("mainVideoSaveDirectory"); } Future mainSetUserDefaultOption( {required String key, required String value, dynamic hint}) { js.context.callMethod('setByName', [ 'option:user:default', jsonEncode({'name': key, 'value': value}) ]); return Future.value(); } String mainGetUserDefaultOption({required String key, dynamic hint}) { return js.context.callMethod('getByName', ['option:user:default', key]); } Future mainHandleRelayId({required String id, dynamic hint}) { var newId = id; if (id.endsWith("\\r") || id.endsWith("/r")) { newId = id.substring(0, id.length - 2); } return Future.value(newId); } String mainGetMainDisplay({dynamic hint}) { return js.context.callMethod('getByName', ['main_display']); } String mainGetDisplays({dynamic hint}) { throw UnimplementedError("mainGetDisplays"); } Future sessionAddPortForward( {required UuidValue sessionId, required int localPort, required String remoteHost, required int remotePort, dynamic hint}) { throw UnimplementedError("sessionAddPortForward"); } Future sessionRemovePortForward( {required UuidValue sessionId, required int localPort, dynamic hint}) { throw UnimplementedError("sessionRemovePortForward"); } Future sessionNewRdp({required UuidValue sessionId, dynamic hint}) { throw UnimplementedError("sessionNewRdp"); } Future sessionRequestVoiceCall( {required UuidValue sessionId, dynamic hint}) { throw UnimplementedError("sessionRequestVoiceCall"); } Future sessionCloseVoiceCall( {required UuidValue sessionId, dynamic hint}) { throw UnimplementedError("sessionCloseVoiceCall"); } Future cmHandleIncomingVoiceCall( {required int id, required bool accept, dynamic hint}) { throw UnimplementedError("cmHandleIncomingVoiceCall"); } Future cmCloseVoiceCall({required int id, dynamic hint}) { throw UnimplementedError("cmCloseVoiceCall"); } Future mainGetLastRemoteId({dynamic hint}) { return Future(() => mainGetLocalOption(key: 'last_remote_id')); } Future mainGetSoftwareUpdateUrl({dynamic hint}) { throw UnimplementedError("mainGetSoftwareUpdateUrl"); } Future mainGetHomeDir({dynamic hint}) { return Future.value(''); } Future mainGetLangs({dynamic hint}) { return Future(() => js.context.callMethod('getByName', ['langs'])); } Future mainGetTemporaryPassword({dynamic hint}) { return Future.value(''); } Future mainGetPermanentPassword({dynamic hint}) { return Future.value(''); } Future mainGetFingerprint({dynamic hint}) { return Future.value(''); } Future cmGetClientsState({dynamic hint}) { throw UnimplementedError("cmGetClientsState"); } Future cmCheckClientsLength({required int length, dynamic hint}) { throw UnimplementedError("cmCheckClientsLength"); } Future cmGetClientsLength({dynamic hint}) { throw UnimplementedError("cmCheckClientsLength"); } Future mainInit({required String appDir, dynamic hint}) { return Future.value(); } Future mainDeviceId({required String id, dynamic hint}) { // TODO: ? throw UnimplementedError("mainDeviceId"); } Future mainDeviceName({required String name, dynamic hint}) { // TODO: ? throw UnimplementedError("mainDeviceName"); } Future mainRemovePeer({required String id, dynamic hint}) { return Future( () => js.context.callMethod('setByName', ['remove_peer', id])); } bool mainHasHwcodec({dynamic hint}) { throw UnimplementedError("mainHasHwcodec"); } bool mainHasVram({dynamic hint}) { throw UnimplementedError("mainHasVram"); } String mainSupportedHwdecodings({dynamic hint}) { return '{}'; } Future mainIsRoot({dynamic hint}) { throw UnimplementedError("mainIsRoot"); } int getDoubleClickTime({dynamic hint}) { return 500; } Future mainStartDbusServer({dynamic hint}) { throw UnimplementedError("mainStartDbusServer"); } Future mainSaveAb({required String json, dynamic hint}) { return Future(() => js.context.callMethod('setByName', ['save_ab', json])); } Future mainClearAb({dynamic hint}) { return Future(() => js.context.callMethod('setByName', ['clear_ab'])); } Future mainLoadAb({dynamic hint}) { Completer completer = Completer(); Future timeoutFuture = completer.future.timeout( Duration(seconds: 2), onTimeout: () { completer.completeError(TimeoutException('Load ab timed out')); return 'Timeout'; }, ); js.context["onLoadAbFinished"] = (String s) { completer.complete(s); }; js.context.callMethod('setByName', ['load_ab']); return timeoutFuture; } Future mainSaveGroup({required String json, dynamic hint}) { return Future( () => js.context.callMethod('setByName', ['save_group', json])); } Future mainClearGroup({dynamic hint}) { return Future(() => js.context.callMethod('setByName', ['clear_group'])); } Future mainLoadGroup({dynamic hint}) { Completer completer = Completer(); Future timeoutFuture = completer.future.timeout( Duration(seconds: 2), onTimeout: () { completer.completeError(TimeoutException('Load group timed out')); return 'Timeout'; }, ); js.context["onLoadGroupFinished"] = (String s) { completer.complete(s); }; js.context.callMethod('setByName', ['load_group']); return timeoutFuture; } Future sessionSendPointer( {required UuidValue sessionId, required String msg, dynamic hint}) { throw UnimplementedError("sessionSendPointer"); } Future sessionSendMouse( {required UuidValue sessionId, required String msg, dynamic hint}) { return Future( () => js.context.callMethod('setByName', ['send_mouse', msg])); } Future sessionRestartRemoteDevice( {required UuidValue sessionId, dynamic hint}) { return Future(() => js.context.callMethod('setByName', ['restart'])); } String sessionGetAuditServerSync( {required UuidValue sessionId, required String typ, dynamic hint}) { return js.context.callMethod('getByName', ['audit_server', typ]); } Future sessionSendNote( {required UuidValue sessionId, required String note, dynamic hint}) { return Future( () => js.context.callMethod('setByName', ['send_note', note])); } Future sessionAlternativeCodecs( {required UuidValue sessionId, dynamic hint}) { return Future( () => js.context.callMethod('getByName', ['alternative_codecs'])); } Future sessionChangePreferCodec( {required UuidValue sessionId, dynamic hint}) { return Future( () => js.context.callMethod('setByName', ['change_prefer_codec'])); } Future sessionOnWaitingForImageDialogShow( {required UuidValue sessionId, dynamic hint}) { return Future.value(); } Future sessionToggleVirtualDisplay( {required UuidValue sessionId, required int index, required bool on, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'toggle_virtual_display', jsonEncode({'index': index, 'on': on}) ])); } Future mainSetHomeDir({required String home, dynamic hint}) { throw UnimplementedError("mainSetHomeDir"); } String mainGetDataDirIos({dynamic hint}) { throw UnimplementedError("mainGetDataDirIos"); } Future mainStopService({dynamic hint}) { throw UnimplementedError("mainStopService"); } Future mainStartService({dynamic hint}) { throw UnimplementedError("mainStartService"); } Future mainUpdateTemporaryPassword({dynamic hint}) { throw UnimplementedError("mainUpdateTemporaryPassword"); } Future mainSetPermanentPassword( {required String password, dynamic hint}) { throw UnimplementedError("mainSetPermanentPassword"); } Future mainCheckSuperUserPermission({dynamic hint}) { throw UnimplementedError("mainCheckSuperUserPermission"); } Future mainCheckMouseTime({dynamic hint}) { throw UnimplementedError("mainCheckMouseTime"); } Future mainGetMouseTime({dynamic hint}) { throw UnimplementedError("mainGetMouseTime"); } Future mainWol({required String id, dynamic hint}) { throw UnimplementedError("mainWol"); } Future mainCreateShortcut({required String id, dynamic hint}) { throw UnimplementedError("mainCreateShortcut"); } Future cmSendChat( {required int connId, required String msg, dynamic hint}) { throw UnimplementedError("cmSendChat"); } Future cmLoginRes( {required int connId, required bool res, dynamic hint}) { throw UnimplementedError("cmLoginRes"); } Future cmCloseConnection({required int connId, dynamic hint}) { throw UnimplementedError("cmCloseConnection"); } Future cmRemoveDisconnectedConnection( {required int connId, dynamic hint}) { throw UnimplementedError("cmRemoveDisconnectedConnection"); } Future cmCheckClickTime({required int connId, dynamic hint}) { throw UnimplementedError("cmCheckClickTime"); } Future cmGetClickTime({dynamic hint}) { throw UnimplementedError("cmGetClickTime"); } Future cmSwitchPermission( {required int connId, required String name, required bool enabled, dynamic hint}) { throw UnimplementedError("cmSwitchPermission"); } bool cmCanElevate({dynamic hint}) { throw UnimplementedError("cmCanElevate"); } Future cmElevatePortable({required int connId, dynamic hint}) { throw UnimplementedError("cmElevatePortable"); } Future cmSwitchBack({required int connId, dynamic hint}) { throw UnimplementedError("cmSwitchBack"); } Future cmGetConfig({required String name, dynamic hint}) { throw UnimplementedError("cmGetConfig"); } Future mainGetBuildDate({dynamic hint}) { return Future(() => js.context.callMethod('getByName', ['build_date'])); } String translate( {required String name, required String locale, dynamic hint}) { return js.context.callMethod('getByName', [ 'translate', jsonEncode({'locale': locale, 'text': name}) ]); } int sessionGetRgbaSize( {required UuidValue sessionId, required int display, dynamic hint}) { return 0; } void sessionNextRgba( {required UuidValue sessionId, required int display, dynamic hint}) {} void sessionRegisterPixelbufferTexture( {required UuidValue sessionId, required int display, required int ptr, dynamic hint}) {} void sessionRegisterGpuTexture( {required UuidValue sessionId, required int display, required int ptr, dynamic hint}) {} Future queryOnlines({required List ids, dynamic hint}) { return Future(() => js.context.callMethod('setByName', ['query_onlines', jsonEncode(ids)])); } // Dup to the function in hbb_common, lib.rs // Maybe we need to move this function to js part. int versionToNumber({required String v, dynamic hint}) { return int.tryParse( js.context.callMethod('getByName', ['get_version_number', v])) ?? 0; } Future optionSynced({dynamic hint}) { return Future.value(true); } bool mainIsInstalled({dynamic hint}) { throw UnimplementedError("mainIsInstalled"); } void mainInitInputSource({dynamic hint}) { throw UnimplementedError("mainIsInstalled"); } bool mainIsInstalledLowerVersion({dynamic hint}) { throw UnimplementedError("mainIsInstalledLowerVersion"); } bool mainIsInstalledDaemon({required bool prompt, dynamic hint}) { throw UnimplementedError("mainIsInstalledDaemon"); } bool mainIsProcessTrusted({required bool prompt, dynamic hint}) { throw UnimplementedError("mainIsProcessTrusted"); } bool mainIsCanScreenRecording({required bool prompt, dynamic hint}) { throw UnimplementedError("mainIsCanScreenRecording"); } bool mainIsCanInputMonitoring({required bool prompt, dynamic hint}) { throw UnimplementedError("mainIsCanInputMonitoring"); } bool mainIsShareRdp({dynamic hint}) { throw UnimplementedError("mainIsShareRdp"); } Future mainSetShareRdp({required bool enable, dynamic hint}) { throw UnimplementedError("mainSetShareRdp"); } bool mainGotoInstall({dynamic hint}) { throw UnimplementedError("mainGotoInstall"); } String mainGetNewVersion({dynamic hint}) { throw UnimplementedError("mainGetNewVersion"); } bool mainUpdateMe({dynamic hint}) { throw UnimplementedError("mainUpdateMe"); } Future setCurSessionId({required UuidValue sessionId, dynamic hint}) { throw UnimplementedError("setCurSessionId"); } bool installShowRunWithoutInstall({dynamic hint}) { throw UnimplementedError("installShowRunWithoutInstall"); } Future installRunWithoutInstall({dynamic hint}) { throw UnimplementedError("installRunWithoutInstall"); } Future installInstallMe( {required String options, required String path, dynamic hint}) { throw UnimplementedError("installInstallMe"); } String installInstallPath({dynamic hint}) { throw UnimplementedError("installInstallPath"); } Future mainAccountAuth( {required String op, required bool rememberMe, dynamic hint}) { throw UnimplementedError("mainAccountAuth"); } Future mainAccountAuthCancel({dynamic hint}) { throw UnimplementedError("mainAccountAuthCancel"); } Future mainAccountAuthResult({dynamic hint}) { throw UnimplementedError("mainAccountAuthResult"); } Future mainOnMainWindowClose({dynamic hint}) { throw UnimplementedError("mainOnMainWindowClose"); } bool mainCurrentIsWayland({dynamic hint}) { return false; } bool mainIsLoginWayland({dynamic hint}) { return false; } bool mainHideDock({dynamic hint}) { throw UnimplementedError("mainHideDock"); } bool mainHasFileClipboard({dynamic hint}) { return false; } bool mainHasGpuTextureRender({dynamic hint}) { return false; } Future cmInit({dynamic hint}) { throw UnimplementedError("cmInit"); } Future mainStartIpcUrlServer({dynamic hint}) { throw UnimplementedError("mainStartIpcUrlServer"); } Future mainTestWallpaper({required int second, dynamic hint}) { // TODO: implement mainTestWallpaper return Future.value(); } Future mainSupportRemoveWallpaper({dynamic hint}) { // TODO: implement mainSupportRemoveWallpaper return Future.value(false); } bool isIncomingOnly({dynamic hint}) { return false; } bool isOutgoingOnly({dynamic hint}) { return false; } bool isCustomClient({dynamic hint}) { return false; } bool isDisableSettings({dynamic hint}) { return false; } bool isDisableAb({dynamic hint}) { return false; } bool isDisableGroupPanel({dynamic hint}) { return false; } bool isDisableAccount({dynamic hint}) { return false; } bool isDisableInstallation({dynamic hint}) { return false; } Future isPresetPassword({dynamic hint}) { return Future.value(false); } Future sendUrlScheme({required String url, dynamic hint}) { throw UnimplementedError("sendUrlScheme"); } Future pluginEvent( {required String id, required String peer, required Uint8List event, dynamic hint}) { throw UnimplementedError("pluginEvent"); } Stream pluginRegisterEventStream( {required String id, dynamic hint}) { throw UnimplementedError("pluginRegisterEventStream"); } String? pluginGetSessionOption( {required String id, required String peer, required String key, dynamic hint}) { throw UnimplementedError("pluginGetSessionOption"); } Future pluginSetSessionOption( {required String id, required String peer, required String key, required String value, dynamic hint}) { throw UnimplementedError("pluginSetSessionOption"); } String? pluginGetSharedOption( {required String id, required String key, dynamic hint}) { throw UnimplementedError("pluginGetSharedOption"); } Future pluginSetSharedOption( {required String id, required String key, required String value, dynamic hint}) { throw UnimplementedError("pluginSetSharedOption"); } Future pluginReload({required String id, dynamic hint}) { throw UnimplementedError("pluginReload"); } void pluginEnable({required String id, required bool v, dynamic hint}) { throw UnimplementedError("pluginEnable"); } bool pluginIsEnabled({required String id, dynamic hint}) { throw UnimplementedError("pluginIsEnabled"); } bool pluginFeatureIsEnabled({dynamic hint}) { throw UnimplementedError("pluginFeatureIsEnabled"); } Future pluginSyncUi({required String syncTo, dynamic hint}) { throw UnimplementedError("pluginSyncUi"); } Future pluginListReload({dynamic hint}) { throw UnimplementedError("pluginListReload"); } Future pluginInstall( {required String id, required bool b, dynamic hint}) { throw UnimplementedError("pluginInstall"); } bool isSupportMultiUiSession({required String version, dynamic hint}) { return versionToNumber(v: version) > versionToNumber(v: '1.2.4'); } bool isSelinuxEnforcing({dynamic hint}) { return false; } String mainDefaultPrivacyModeImpl({dynamic hint}) { throw UnimplementedError("mainDefaultPrivacyModeImpl"); } String mainSupportedPrivacyModeImpls({dynamic hint}) { throw UnimplementedError("mainSupportedPrivacyModeImpls"); } String mainSupportedInputSource({dynamic hint}) { return jsonEncode([ ['Input source 1', 'input_source_1_tip'], ['Input source 2', 'input_source_2_tip'] ]); } Future mainGenerate2Fa({dynamic hint}) { throw UnimplementedError("mainGenerate2Fa"); } Future mainVerify2Fa({required String code, dynamic hint}) { throw UnimplementedError("mainVerify2Fa"); } bool mainHasValid2FaSync({dynamic hint}) { throw UnimplementedError("mainHasValid2FaSync"); } String mainGetHardOption({required String key, dynamic hint}) { throw UnimplementedError("mainGetHardOption"); } Future mainCheckHwcodec({dynamic hint}) { throw UnimplementedError("mainCheckHwcodec"); } Future sessionRequestNewDisplayInitMsgs( {required UuidValue sessionId, required int display, dynamic hint}) { throw UnimplementedError("sessionRequestNewDisplayInitMsgs"); } Future mainHandleWaylandScreencastRestoreToken( {required String key, required String value, dynamic hint}) { throw UnimplementedError("mainHandleWaylandScreencastRestoreToken"); } bool mainIsOptionFixed({required String key, dynamic hint}) { return false; } bool mainGetUseTextureRender({dynamic hint}) { throw UnimplementedError("mainGetUseTextureRender"); } bool mainHasValidBotSync({dynamic hint}) { throw UnimplementedError("mainHasValidBotSync"); } Future mainVerifyBot({required String token, dynamic hint}) { throw UnimplementedError("mainVerifyBot"); } String mainGetUnlockPin({dynamic hint}) { throw UnimplementedError("mainGetUnlockPin"); } String mainSetUnlockPin({required String pin, dynamic hint}) { throw UnimplementedError("mainSetUnlockPin"); } bool sessionGetEnableTrustedDevices( {required UuidValue sessionId, dynamic hint}) { return js.context.callMethod('getByName', ['enable_trusted_devices']) == 'Y'; } Future mainGetTrustedDevices({dynamic hint}) { throw UnimplementedError("mainGetTrustedDevices"); } Future mainRemoveTrustedDevices({required String json, dynamic hint}) { throw UnimplementedError("mainRemoveTrustedDevices"); } Future mainClearTrustedDevices({dynamic hint}) { throw UnimplementedError("mainClearTrustedDevices"); } Future getVoiceCallInputDevice({required bool isCm, dynamic hint}) { throw UnimplementedError("getVoiceCallInputDevice"); } Future setVoiceCallInputDevice( {required bool isCm, required String device, dynamic hint}) { throw UnimplementedError("setVoiceCallInputDevice"); } bool isPresetPasswordMobileOnly({dynamic hint}) { throw UnimplementedError("isPresetPasswordMobileOnly"); } String mainGetBuildinOption({required String key, dynamic hint}) { return ''; } String installInstallOptions({dynamic hint}) { throw UnimplementedError("installInstallOptions"); } int mainMaxEncryptLen({dynamic hint}) { throw UnimplementedError("mainMaxEncryptLen"); } Future sessionRenameFile( {required UuidValue sessionId, required int actId, required String path, required String newName, required bool isRemote, dynamic hint}) { return Future(() => js.context.callMethod('setByName', [ 'rename_file', jsonEncode({ 'id': actId, 'path': path, 'new_name': newName, 'is_remote': isRemote }) ])); } Future sessionSelectFiles( {required UuidValue sessionId, dynamic hint}) { return Future(() => js.context.callMethod('setByName', ['select_files'])); } String? sessionGetConnToken({required UuidValue sessionId, dynamic hint}) { throw UnimplementedError("sessionGetConnToken"); } void dispose() {} }