From 74c3d0ae2555c3ac1f73f2f2714adc849faac823 Mon Sep 17 00:00:00 2001 From: chen08209 Date: Sun, 5 May 2024 02:40:35 +0800 Subject: [PATCH] New Async UpdateConfig --- core/common.go | 6 +--- core/dart-bridge/lib.go | 2 +- core/dart-bridge/message.go | 2 +- core/hub.go | 34 +++++++++++-------- lib/application.dart | 1 - lib/clash/core.dart | 20 +++++++---- lib/clash/generated/clash_ffi.dart | 13 ++++--- lib/controller.dart | 14 ++++---- lib/fragments/dashboard/core_info.dart | 1 - .../dashboard/network_detection.dart | 2 -- lib/fragments/dashboard/start_button.dart | 1 - lib/fragments/profiles/profiles.dart | 1 - lib/fragments/proxies.dart | 1 - lib/pages/home.dart | 1 - lib/state.dart | 5 +-- lib/widgets/app_state_container.dart | 2 -- lib/widgets/open_container.dart | 1 - lib/widgets/tray_container.dart | 1 - 18 files changed, 53 insertions(+), 55 deletions(-) diff --git a/core/common.go b/core/common.go index 55e8a537..e00bb112 100644 --- a/core/common.go +++ b/core/common.go @@ -164,10 +164,7 @@ func patchConfig(general *config.General) { resolver.DisableIPv6 = !general.IPv6 } -func applyConfig(isPatch bool) bool { - if currentConfig == nil { - return false - } +func applyConfig(isPatch bool) { cfg, err := config.ParseRawConfig(currentConfig) if err != nil { cfg, _ = config.ParseRawConfig(config.DefaultRawConfig()) @@ -177,5 +174,4 @@ func applyConfig(isPatch bool) bool { } else { executor.ApplyConfig(cfg, true) } - return true } diff --git a/core/dart-bridge/lib.go b/core/dart-bridge/lib.go index ca162a33..28f33c36 100644 --- a/core/dart-bridge/lib.go +++ b/core/dart-bridge/lib.go @@ -24,7 +24,7 @@ func InitDartApi(api unsafe.Pointer) { } } -func sendToPort(port int64, msg string) { +func SendToPort(port int64, msg string) { var obj C.Dart_CObject obj._type = C.Dart_CObject_kString msgString := C.CString(msg) diff --git a/core/dart-bridge/message.go b/core/dart-bridge/message.go index 8fc52270..59f43286 100644 --- a/core/dart-bridge/message.go +++ b/core/dart-bridge/message.go @@ -24,5 +24,5 @@ func (message *Message) toJson() string { } func SendMessage(message Message) { - sendToPort(*Port, message.toJson()) + SendToPort(*Port, message.toJson()) } diff --git a/core/hub.go b/core/hub.go index ac5b3823..b25e8e3f 100644 --- a/core/hub.go +++ b/core/hub.go @@ -63,21 +63,25 @@ func validateConfig(s *C.char) bool { } //export updateConfig -func updateConfig(s *C.char) bool { - paramsString := C.GoString(s) - var params = &GenerateConfigParams{} - err := json.Unmarshal([]byte(paramsString), params) - if err != nil { - log.Errorln("generateConfig Unmarshal error %v", err) - return false - } - prof := decorationConfig(params.ProfilePath, *params.Config) - currentConfig = prof - if *params.IsPatch { - return applyConfig(true) - } else { - return applyConfig(false) - } +func updateConfig(s *C.char, port C.longlong) { + i := int64(port) + go func() { + paramsString := C.GoString(s) + var params = &GenerateConfigParams{} + err := json.Unmarshal([]byte(paramsString), params) + if err != nil { + bridge.SendToPort(i, err.Error()) + return + } + prof := decorationConfig(params.ProfilePath, *params.Config) + currentConfig = prof + if *params.IsPatch { + applyConfig(true) + } else { + applyConfig(false) + } + bridge.SendToPort(i, "") + }() } //export getProxies diff --git a/lib/application.dart b/lib/application.dart index e1f6e540..bec8a948 100644 --- a/lib/application.dart +++ b/lib/application.dart @@ -112,7 +112,6 @@ class ApplicationState extends State { primaryColor: config.primaryColor, ), builder: (_, state, child) { - debugPrint("[Application] update===>"); return DynamicColorBuilder( builder: (lightDynamic, darkDynamic) { _updateSystemColorSchemes(lightDynamic, darkDynamic); diff --git a/lib/clash/core.dart b/lib/clash/core.dart index 13de312a..ac9c1ec1 100644 --- a/lib/clash/core.dart +++ b/lib/clash/core.dart @@ -19,7 +19,6 @@ class ClashCore { late final DynamicLibrary lib; DynamicLibrary _getClashLib() { - debugPrint("OpenClash"); if (Platform.isWindows) { return DynamicLibrary.open("libclash.dll"); } @@ -67,12 +66,21 @@ class ClashCore { 1; } - bool updateConfig(UpdateConfigParams updateConfigParams) { + Future updateConfig(UpdateConfigParams updateConfigParams) { + final completer = Completer(); + final receiver = ReceivePort(); + receiver.listen((message) { + if(!completer.isCompleted){ + completer.complete(message); + receiver.close(); + } + }); final params = json.encode(updateConfigParams); - return clashFFI.updateConfig( - params.toNativeUtf8().cast(), - ) == - 1; + clashFFI.updateConfig( + params.toNativeUtf8().cast(), + receiver.sendPort.nativePort, + ); + return completer.future; } Future> getProxiesGroups() { diff --git a/lib/clash/generated/clash_ffi.dart b/lib/clash/generated/clash_ffi.dart index c01c6ccd..658c8f58 100644 --- a/lib/clash/generated/clash_ffi.dart +++ b/lib/clash/generated/clash_ffi.dart @@ -907,19 +907,22 @@ class ClashFFI { late final _validateConfig = _validateConfigPtr.asFunction)>(); - int updateConfig( + void updateConfig( ffi.Pointer s, + int port, ) { return _updateConfig( s, + port, ); } - late final _updateConfigPtr = - _lookup)>>( - 'updateConfig'); + late final _updateConfigPtr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, ffi.LongLong)>>('updateConfig'); late final _updateConfig = - _updateConfigPtr.asFunction)>(); + _updateConfigPtr.asFunction, int)>(); ffi.Pointer getProxies() { return _getProxies(); diff --git a/lib/controller.dart b/lib/controller.dart index 4d1a4a22..979063ab 100644 --- a/lib/controller.dart +++ b/lib/controller.dart @@ -117,7 +117,7 @@ class AppController { } } - Future updateClashConfig({bool isPatch = true}) async { + Future updateClashConfig({bool isPatch = true}) async { return await globalState.updateClashConfig( clashConfig: clashConfig, config: config, @@ -125,8 +125,8 @@ class AppController { ); } - applyProfile() { - globalState.applyProfile( + applyProfile() async { + await globalState.applyProfile( appState: appState, config: config, clashConfig: clashConfig, @@ -139,11 +139,9 @@ class AppController { if (profileId == config.currentProfileId) return; config.currentProfileId = profileId; _changeProfileDebounce ??= debounce((profileId) async { - if (context.mounted) { - await applyProfile(); - appState.delayMap = {}; - saveConfigPreferences(); - } + await applyProfile(); + appState.delayMap = {}; + saveConfigPreferences(); }); _changeProfileDebounce!([profileId]); } diff --git a/lib/fragments/dashboard/core_info.dart b/lib/fragments/dashboard/core_info.dart index f10303ff..4101975e 100644 --- a/lib/fragments/dashboard/core_info.dart +++ b/lib/fragments/dashboard/core_info.dart @@ -12,7 +12,6 @@ class CoreInfo extends StatelessWidget { return Selector( selector: (_, appState) => appState.versionInfo, builder: (_, versionInfo, __) { - debugPrint("[CoreInfo] update===>"); return CommonCard( info: Info( label: appLocalizations.coreInfo, diff --git a/lib/fragments/dashboard/network_detection.dart b/lib/fragments/dashboard/network_detection.dart index 9bb0f8f4..b17b2126 100644 --- a/lib/fragments/dashboard/network_detection.dart +++ b/lib/fragments/dashboard/network_detection.dart @@ -111,7 +111,6 @@ class _NetworkDetectionState extends State { ); }, builder: (_, state, __) { - debugPrint("[UpdateCurrentDelay] update===>"); _updateCurrentDelay( state.currentProxyName, state.delay, @@ -145,7 +144,6 @@ class _NetworkDetectionState extends State { ); }, builder: (_, state, __) { - debugPrint("[NetworkDetection] update===>"); return Container( padding: const EdgeInsets.all(16).copyWith(top: 0), child: Column( diff --git a/lib/fragments/dashboard/start_button.dart b/lib/fragments/dashboard/start_button.dart index b88ed7aa..3b3cc009 100644 --- a/lib/fragments/dashboard/start_button.dart +++ b/lib/fragments/dashboard/start_button.dart @@ -63,7 +63,6 @@ class _StartButtonState extends State hasProfile: config.profiles.isNotEmpty, ), builder: (_, state, child) { - debugPrint("[StartButton] update===>"); if (!state.isInit || !state.hasProfile) { return Container(); } diff --git a/lib/fragments/profiles/profiles.dart b/lib/fragments/profiles/profiles.dart index a7b459f3..879abb43 100644 --- a/lib/fragments/profiles/profiles.dart +++ b/lib/fragments/profiles/profiles.dart @@ -235,7 +235,6 @@ class _ProfilesFragmentState extends State { currentProfileId: config.currentProfileId, ), builder: (context, state, child) { - debugPrint("[Profiles] update===>"); if (state.profiles.isEmpty) { return NullStatus( label: appLocalizations.nullProfileDesc, diff --git a/lib/fragments/proxies.dart b/lib/fragments/proxies.dart index e72a8b59..03e3b633 100644 --- a/lib/fragments/proxies.dart +++ b/lib/fragments/proxies.dart @@ -91,7 +91,6 @@ class _ProxiesFragmentState extends State vsync: this, initialIndex: state.currentIndex, ); - debugPrint("[Proxies] update===>"); return Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, diff --git a/lib/pages/home.dart b/lib/pages/home.dart index a1209935..cd21c517 100644 --- a/lib/pages/home.dart +++ b/lib/pages/home.dart @@ -140,7 +140,6 @@ class HomePage extends StatelessWidget { child: Selector>( selector: (_, appState) => appState.navigationItems, builder: (_, navigationItems, __) { - debugPrint("[Home] update===>"); final desktopNavigationItems = navigationItems .where( (element) => diff --git a/lib/state.dart b/lib/state.dart index f3364f07..e1261a67 100644 --- a/lib/state.dart +++ b/lib/state.dart @@ -38,7 +38,7 @@ class GlobalState { timer?.cancel(); } - Future updateClashConfig({ + Future updateClashConfig({ required ClashConfig clashConfig, required Config config, bool isPatch = true, @@ -92,11 +92,12 @@ class GlobalState { required Config config, required ClashConfig clashConfig, }) async { - await updateClashConfig( + final res = await updateClashConfig( clashConfig: clashConfig, config: config, isPatch: false, ); + if (res.isNotEmpty) return Result.error(message: res); await updateGroups(appState); changeProxy( appState: appState, diff --git a/lib/widgets/app_state_container.dart b/lib/widgets/app_state_container.dart index 37f0d602..68898267 100644 --- a/lib/widgets/app_state_container.dart +++ b/lib/widgets/app_state_container.dart @@ -15,7 +15,6 @@ class AppStateContainer extends StatelessWidget { return Selector( selector: (_, config) => config.autoLaunch, builder: (_, isAutoLaunch, child) { - debugPrint("[autoLaunchContainer] update===>"); autoLaunch?.updateStatus(isAutoLaunch); return child!; }, @@ -35,7 +34,6 @@ class AppStateContainer extends StatelessWidget { ); }, builder: (context, state, child) { - debugPrint("[NavigationsContainer] update===>"); WidgetsBinding.instance.addPostFrameCallback( (_) { context.appController.appState.navigationItems = diff --git a/lib/widgets/open_container.dart b/lib/widgets/open_container.dart index 9fc37104..5f952d78 100644 --- a/lib/widgets/open_container.dart +++ b/lib/widgets/open_container.dart @@ -446,7 +446,6 @@ class _OpenContainerRoute extends ModalRoute { return Selector( selector: (_, config) => config.themeMode, builder: (_, __, ___) { - debugPrint("[OpenContainerTheme] update===>"); _colorTween = _getColorTween( transitionType: transitionType, closedColor: Theme.of(context).colorScheme.background, diff --git a/lib/widgets/tray_container.dart b/lib/widgets/tray_container.dart index e2ae9035..12c37f19 100644 --- a/lib/widgets/tray_container.dart +++ b/lib/widgets/tray_container.dart @@ -144,7 +144,6 @@ class _TrayContainerState extends State with TrayListener { locale: config.locale, ), builder: (_, state, child) { - debugPrint("[TrayContainer] update===>"); WidgetsBinding.instance.addPostFrameCallback((timeStamp) { updateMenu(state); });