diff --git a/pkg/rest/server.go b/pkg/rest/server.go index 280c6821..5ca23c20 100644 --- a/pkg/rest/server.go +++ b/pkg/rest/server.go @@ -19,31 +19,42 @@ import ( ) var ( - srv *http.Server + srv *http.Server + runningPort int Downloader *download.Downloader ) -func Start(startCfg *model.StartConfig) (int, error) { - srv, listener, err := BuildServer(startCfg) +func Start(startCfg *model.StartConfig) (port int, err error) { + // avoid repeat start + if srv != nil { + return runningPort, nil + } + + var listener net.Listener + srv, listener, err = BuildServer(startCfg) if err != nil { - return 0, err + return } go func() { - if err := srv.Serve(listener); err != nil && err != http.ErrServerClosed { + if err := srv.Serve(listener); err != nil && !errors.Is(err, http.ErrServerClosed) { panic(err) } }() - port := 0 if addr, ok := listener.Addr().(*net.TCPAddr); ok { port = addr.Port + runningPort = port } - return port, nil + return } func Stop() { + defer func() { + srv = nil + }() + if srv != nil { if err := srv.Shutdown(context.TODO()); err != nil { Downloader.Logger.Warn().Err(err).Msg("shutdown server failed") diff --git a/ui/flutter/lib/database/database.dart b/ui/flutter/lib/database/database.dart index b9526beb..a0867e21 100644 --- a/ui/flutter/lib/database/database.dart +++ b/ui/flutter/lib/database/database.dart @@ -54,15 +54,6 @@ class Database { _startConfig, (json) => StartConfigEntity.fromJson(json)); } - void saveLastRunningConfig(StartConfigEntity entity) { - save(_lastRunningConfig, entity); - } - - StartConfigEntity? getLastRunningConfig() { - return get( - _lastRunningConfig, (json) => StartConfigEntity.fromJson(json)); - } - /// Patch non-null fields with the original value void saveWindowState(WindowStateEntity entity) { final state = getWindowState(); diff --git a/ui/flutter/lib/main.dart b/ui/flutter/lib/main.dart index b8230605..06b14f4f 100644 --- a/ui/flutter/lib/main.dart +++ b/ui/flutter/lib/main.dart @@ -1,7 +1,6 @@ import 'package:args/args.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_foreground_task/flutter_foreground_task.dart'; import 'package:get/get.dart'; import 'package:window_manager/window_manager.dart'; @@ -10,7 +9,6 @@ import 'app/modules/app/controllers/app_controller.dart'; import 'app/modules/app/views/app_view.dart'; import 'core/libgopeed_boot.dart'; import 'database/database.dart'; -import 'database/entity.dart'; import 'i18n/message.dart'; import 'util/locale_manager.dart'; import 'util/log_util.dart'; @@ -77,23 +75,8 @@ Future init(Args args) async { try { await controller.loadStartConfig(); final startCfg = controller.startConfig.value; - // When the app is closed by swiping on the mobile, the backend server is actually still running, don't need to start again. - final isRunning = - Util.isMobile() && (await FlutterForegroundTask.isRunningService); - if (!isRunning) { - controller.runningPort.value = - await LibgopeedBoot.instance.start(startCfg); - api.init( - startCfg.network, controller.runningAddress(), startCfg.apiToken); - Database.instance.saveLastRunningConfig(StartConfigEntity( - network: startCfg.network, - address: controller.runningAddress(), - apiToken: startCfg.apiToken)); - } else { - final lastRunningConfig = Database.instance.getLastRunningConfig()!; - api.init(lastRunningConfig.network, lastRunningConfig.address, - lastRunningConfig.apiToken); - } + controller.runningPort.value = await LibgopeedBoot.instance.start(startCfg); + api.init(startCfg.network, controller.runningAddress(), startCfg.apiToken); } catch (e) { logger.e("libgopeed init fail", e); }