import 'dart:async'; import 'package:fl_clash/common/common.dart'; import 'package:fl_clash/controller.dart'; import 'package:fl_clash/enum/enum.dart'; import 'package:fl_clash/models/core.dart'; import 'package:fl_clash/plugins/service.dart'; import 'interface.dart'; class CoreLib extends CoreHandlerInterface { static CoreLib? _instance; Completer _connectedCompleter = Completer(); CoreLib._internal(); @override Future preload() async { final res = await service?.init(); if (res?.isEmpty != true) { return res ?? ''; } _connectedCompleter.complete(true); final syncRes = await service?.syncState(appController.sharedState); return syncRes ?? ''; } factory CoreLib() { _instance ??= CoreLib._internal(); return _instance!; } @override destroy() async { return true; } @override Future shutdown(_) async { if (!_connectedCompleter.isCompleted) { return false; } _connectedCompleter = Completer(); return service?.shutdown() ?? true; } @override Future invoke({ required ActionMethod method, dynamic data, Duration? timeout, }) async { final id = '${method.name}#${utils.id}'; final result = await service ?.invokeAction(Action(id: id, method: method, data: data)) .withTimeout(onTimeout: () => null); if (result == null) { return null; } return parasResult(result); } @override Completer get completer => _connectedCompleter; } CoreLib? get coreLib => system.isAndroid ? CoreLib() : null;