mirror of
https://github.com/EasyTier/astral.git
synced 2025-05-19 10:30:24 +00:00
1. 将原有的Provider状态管理替换为Riverpod,提升状态管理效率
2. 重构AppConfig类,使用Hive进行持久化存储 3. 新增AdvancedConfig类,用于管理高级配置项 4. 优化服务器列表和节点状态的管理逻辑 5. 添加多个Provider来管理不同模块的状态 6. 更新依赖项,添加Riverpod及相关依赖
This commit is contained in:
+3
-3
@@ -4,7 +4,7 @@ import 'package:flutter_localizations/flutter_localizations.dart';
|
|||||||
import 'package:system_tray/system_tray.dart';
|
import 'package:system_tray/system_tray.dart';
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
import 'screens/Home.dart';
|
import 'screens/Home.dart';
|
||||||
import 'config/themeconfiguration.dart';
|
import 'config/themeconfiguration.dart' as theme_config;
|
||||||
import 'config/app_config.dart';
|
import 'config/app_config.dart';
|
||||||
|
|
||||||
// 定义应用程序的主要StatefulWidget
|
// 定义应用程序的主要StatefulWidget
|
||||||
@@ -114,7 +114,7 @@ class _MyAppState extends State<MyApp> {
|
|||||||
],
|
],
|
||||||
// Insert this line
|
// Insert this line
|
||||||
supportedLocales: const [Locale("zh", "CN"), Locale("en", "US")],
|
supportedLocales: const [Locale("zh", "CN"), Locale("en", "US")],
|
||||||
theme: ThemeConfig.getLightTheme(
|
theme: theme_config.ThemeConfig.getLightTheme(
|
||||||
useMaterial3: useMaterial3,
|
useMaterial3: useMaterial3,
|
||||||
seedColor: _seedColor,
|
seedColor: _seedColor,
|
||||||
).copyWith(
|
).copyWith(
|
||||||
@@ -124,7 +124,7 @@ class _MyAppState extends State<MyApp> {
|
|||||||
primaryTextTheme: Typography.material2021().black.apply(
|
primaryTextTheme: Typography.material2021().black.apply(
|
||||||
fontFamily: 'MiSans',
|
fontFamily: 'MiSans',
|
||||||
)),
|
)),
|
||||||
darkTheme: ThemeConfig.getDarkTheme(
|
darkTheme: theme_config.ThemeConfig.getDarkTheme(
|
||||||
useMaterial3: useMaterial3,
|
useMaterial3: useMaterial3,
|
||||||
seedColor: _seedColor,
|
seedColor: _seedColor,
|
||||||
).copyWith(
|
).copyWith(
|
||||||
|
|||||||
+805
-230
File diff suppressed because it is too large
Load Diff
+2
-3
@@ -3,9 +3,9 @@ import 'package:astral/src/rust/frb_generated.dart';
|
|||||||
import 'package:window_manager/window_manager.dart';
|
import 'package:window_manager/window_manager.dart';
|
||||||
import 'app.dart';
|
import 'app.dart';
|
||||||
import 'config/windowconfiguration.dart';
|
import 'config/windowconfiguration.dart';
|
||||||
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||||
import 'config/app_config.dart';
|
import 'config/app_config.dart';
|
||||||
import 'utils/kv_state.dart';
|
import 'utils/kv_state.dart';
|
||||||
import 'package:provider/provider.dart'; // 添加这一行
|
|
||||||
import 'package:astral/utils/app_info.dart';
|
import 'package:astral/utils/app_info.dart';
|
||||||
|
|
||||||
Future<void> main() async {
|
Future<void> main() async {
|
||||||
@@ -19,8 +19,7 @@ Future<void> main() async {
|
|||||||
// 初始化应用信息
|
// 初始化应用信息
|
||||||
await RustLib.init();
|
await RustLib.init();
|
||||||
runApp(
|
runApp(
|
||||||
ChangeNotifierProvider(
|
ProviderScope(
|
||||||
create: (context) => KM(),
|
|
||||||
child: const MyApp(),
|
child: const MyApp(),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|||||||
+162
-94
@@ -1,13 +1,16 @@
|
|||||||
// 导入必要的包
|
// 导入必要的包
|
||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
|
|
||||||
|
import 'package:astral/config/app_config.dart';
|
||||||
import 'package:astral/src/rust/api/simple.dart';
|
import 'package:astral/src/rust/api/simple.dart';
|
||||||
|
import 'package:astral/src/rust/frb_generated.dart';
|
||||||
import 'package:astral/utils/kv_state.dart';
|
import 'package:astral/utils/kv_state.dart';
|
||||||
import 'package:astral/utils/app_info.dart';
|
import 'package:astral/utils/app_info.dart';
|
||||||
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:fl_chart/fl_chart.dart';
|
import 'package:fl_chart/fl_chart.dart';
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:flutter_riverpod/flutter_riverpod.dart'; // 替换 provider 导入
|
||||||
import '../widgets/card.dart';
|
import '../widgets/card.dart';
|
||||||
import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
|
import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
|
||||||
import '../utils/runin.dart';
|
import '../utils/runin.dart';
|
||||||
@@ -31,7 +34,7 @@ String _intToIpv4String(int addr) {
|
|||||||
|
|
||||||
/// 首页组件
|
/// 首页组件
|
||||||
/// 用于显示应用的主页面,包含主题切换和问候功能
|
/// 用于显示应用的主页面,包含主题切换和问候功能
|
||||||
class HomePage extends StatefulWidget {
|
class HomePage extends ConsumerStatefulWidget {
|
||||||
// 主题模式切换回调函数
|
// 主题模式切换回调函数
|
||||||
final Function toggleThemeMode;
|
final Function toggleThemeMode;
|
||||||
// 主题色更改回调函数
|
// 主题色更改回调函数
|
||||||
@@ -48,10 +51,10 @@ class HomePage extends StatefulWidget {
|
|||||||
});
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
State<HomePage> createState() => _HomePageState();
|
ConsumerState<HomePage> createState() => _HomePageState();
|
||||||
}
|
}
|
||||||
|
|
||||||
class _HomePageState extends State<HomePage> {
|
class _HomePageState extends ConsumerState<HomePage> {
|
||||||
int connectionTimeoutCounter = 0;
|
int connectionTimeoutCounter = 0;
|
||||||
// 当前连接状态
|
// 当前连接状态
|
||||||
ConnectionState _connectionState = ConnectionState.notStarted;
|
ConnectionState _connectionState = ConnectionState.notStarted;
|
||||||
@@ -74,6 +77,7 @@ class _HomePageState extends State<HomePage> {
|
|||||||
bool _isAutoIP = true; // 只用于控制IP自动/手动模式
|
bool _isAutoIP = true; // 只用于控制IP自动/手动模式
|
||||||
|
|
||||||
List<String> Serverip = [""];
|
List<String> Serverip = [""];
|
||||||
|
List<ServerConfig> Serveripz = [];
|
||||||
int _uploadBytes = 0;
|
int _uploadBytes = 0;
|
||||||
int _downloadBytes = 0;
|
int _downloadBytes = 0;
|
||||||
int _lastUploadBytes = 0;
|
int _lastUploadBytes = 0;
|
||||||
@@ -129,32 +133,32 @@ class _HomePageState extends State<HomePage> {
|
|||||||
void _onVirtualIPFocusChange() {
|
void _onVirtualIPFocusChange() {
|
||||||
if (!_virtualIPFocusNode.hasFocus && !_isAutoIP) {
|
if (!_virtualIPFocusNode.hasFocus && !_isAutoIP) {
|
||||||
// 当失去焦点且不是自动IP模式时更新值
|
// 当失去焦点且不是自动IP模式时更新值
|
||||||
Provider.of<KM>(context, listen: false).virtualIP =
|
ref
|
||||||
_virtualIPController.text;
|
.read(virtualIPProvider.notifier)
|
||||||
|
.setVirtualIP(_virtualIPController.text);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 添加用户名焦点变化监听方法
|
// 添加用户名焦点变化监听方法
|
||||||
void _onUsernameFocusChange() {
|
void _onUsernameFocusChange() {
|
||||||
if (!_usernameControllerFocusNode.hasFocus) {
|
if (!_usernameControllerFocusNode.hasFocus) {
|
||||||
Provider.of<KM>(context, listen: false).username =
|
ref.read(usernameProvider.notifier).setUsername(_usernameController.text);
|
||||||
_usernameController.text;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 添加房间名焦点变化监听方法
|
// 添加房间名焦点变化监听方法
|
||||||
void _onRoomNameFocusChange() {
|
void _onRoomNameFocusChange() {
|
||||||
if (!_roomNameControllerFocusNode.hasFocus) {
|
if (!_roomNameControllerFocusNode.hasFocus) {
|
||||||
Provider.of<KM>(context, listen: false).roomName =
|
ref.read(roomNameProvider.notifier).setRoomName(_roomNameController.text);
|
||||||
_roomNameController.text;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 添加房间密码焦点变化监听方法
|
// 添加房间密码焦点变化监听方法
|
||||||
void _onRoomPasswordFocusChange() {
|
void _onRoomPasswordFocusChange() {
|
||||||
if (!_roomPasswordControllerFocusNode.hasFocus) {
|
if (!_roomPasswordControllerFocusNode.hasFocus) {
|
||||||
Provider.of<KM>(context, listen: false).roomPassword =
|
ref
|
||||||
_roomPasswordController.text;
|
.read(roomPasswordProvider.notifier)
|
||||||
|
.setRoomPassword(_roomPasswordController.text);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -186,19 +190,75 @@ class _HomePageState extends State<HomePage> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void toggleRunning() {
|
void toggleRunning() {
|
||||||
final km = Provider.of<KM>(context, listen: false);
|
|
||||||
setState(() {
|
setState(() {
|
||||||
isRunning = !isRunning;
|
isRunning = !isRunning;
|
||||||
if (isRunning) {
|
if (isRunning) {
|
||||||
// 切换到连接中状态
|
// 切换到连接中状态
|
||||||
_connectionState = ConnectionState.connecting;
|
_connectionState = ConnectionState.connecting;
|
||||||
|
|
||||||
|
//利用 Serveripz 重组
|
||||||
|
List<String> ssServerip = [];
|
||||||
|
print(ssServerip);
|
||||||
|
for (var item in Serveripz) {
|
||||||
|
if (item.tcp) {
|
||||||
|
ssServerip.add("tcp://" + item.url);
|
||||||
|
}
|
||||||
|
if (item.udp) {
|
||||||
|
ssServerip.add("udp://" + item.url);
|
||||||
|
}
|
||||||
|
if (item.ws) {
|
||||||
|
ssServerip.add("ws://" + item.url);
|
||||||
|
}
|
||||||
|
if (item.wss) {
|
||||||
|
ssServerip.add("wss://" + item.url);
|
||||||
|
}
|
||||||
|
if (item.quic) {
|
||||||
|
ssServerip.add("quic://" + item.url);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 复制
|
||||||
createServer(
|
createServer(
|
||||||
username: username,
|
username: username,
|
||||||
enableDhcp: _isAutoIP,
|
enableDhcp: _isAutoIP,
|
||||||
specifiedIp: publicIP,
|
specifiedIp: publicIP,
|
||||||
roomName: roomName,
|
roomName: roomName,
|
||||||
roomPassword: roomPassword,
|
roomPassword: roomPassword,
|
||||||
severurl: Serverip);
|
severurl: ssServerip,
|
||||||
|
flag: FlagsC(
|
||||||
|
defaultProtocol: ref.read(advancedConfigProvider)['defaultProtocol'] ??
|
||||||
|
"tcp",
|
||||||
|
devName: ref.read(advancedConfigProvider)['devName'] ?? "",
|
||||||
|
enableEncryption:
|
||||||
|
ref.read(advancedConfigProvider)['enableEncryption'] ??
|
||||||
|
true,
|
||||||
|
enableIpv6:
|
||||||
|
ref.read(advancedConfigProvider)['enableIpv6'] ?? true,
|
||||||
|
mtu: ref.read(advancedConfigProvider)['mtu'] ?? 1380,
|
||||||
|
multiThread:
|
||||||
|
ref.read(advancedConfigProvider)['multiThread'] ?? true,
|
||||||
|
latencyFirst:
|
||||||
|
ref.read(advancedConfigProvider)['latencyFirst'] ?? false,
|
||||||
|
enableExitNode:
|
||||||
|
ref.read(advancedConfigProvider)['enableExitNode'] ?? false,
|
||||||
|
noTun: ref.read(advancedConfigProvider)['noTun'] ?? false,
|
||||||
|
useSmoltcp:
|
||||||
|
ref.read(advancedConfigProvider)['useSmoltcp'] ?? false,
|
||||||
|
relayNetworkWhitelist:
|
||||||
|
ref.read(advancedConfigProvider)['relayNetworkWhitelist'] ??
|
||||||
|
"*",
|
||||||
|
disableP2P:
|
||||||
|
ref.read(advancedConfigProvider)['disableP2p'] ?? false,
|
||||||
|
relayAllPeerRpc:
|
||||||
|
ref.read(advancedConfigProvider)['relayAllPeerRpc'] ??
|
||||||
|
false,
|
||||||
|
disableUdpHolePunching:
|
||||||
|
ref.read(advancedConfigProvider)['disableUdpHolePunching'] ?? false,
|
||||||
|
dataCompressAlgo: ref.read(advancedConfigProvider)['dataCompressAlgo'] ?? "None",
|
||||||
|
bindDevice: ref.read(advancedConfigProvider)['bindDevice'] ?? true,
|
||||||
|
enableKcpProxy: ref.read(advancedConfigProvider)['enableKcpProxy'] ?? false,
|
||||||
|
disableKcpInput: ref.read(advancedConfigProvider)['disableKcpInput'] ?? false,
|
||||||
|
disableRelayKcp: ref.read(advancedConfigProvider)['disableRelayKcp'] ?? true,
|
||||||
|
proxyForwardBySystem: ref.read(advancedConfigProvider)['proxyForwardBySystem'] ?? false));
|
||||||
|
|
||||||
// 不再使用固定延迟模拟连接成功,而是通过定时检查IP来确定连接状态
|
// 不再使用固定延迟模拟连接成功,而是通过定时检查IP来确定连接状态
|
||||||
timer = Timer.periodic(const Duration(seconds: 1), (timer) async {
|
timer = Timer.periodic(const Duration(seconds: 1), (timer) async {
|
||||||
@@ -213,8 +273,7 @@ class _HomePageState extends State<HomePage> {
|
|||||||
|
|
||||||
// 获取网络状态
|
// 获取网络状态
|
||||||
final networkStatus = await getNetworkStatus();
|
final networkStatus = await getNetworkStatus();
|
||||||
final km = Provider.of<KM>(context, listen: false);
|
ref.read(nodesProvider.notifier).setNodes(networkStatus.nodes);
|
||||||
km.nodes = networkStatus.nodes;
|
|
||||||
|
|
||||||
// 更新网络流量数据
|
// 更新网络流量数据
|
||||||
_updateNetworkStats(networkStatus.nodes);
|
_updateNetworkStats(networkStatus.nodes);
|
||||||
@@ -223,7 +282,7 @@ class _HomePageState extends State<HomePage> {
|
|||||||
if (version != null) {
|
if (version != null) {
|
||||||
String ipStr = _intToIpv4String(version);
|
String ipStr = _intToIpv4String(version);
|
||||||
if (publicIP != ipStr) {
|
if (publicIP != ipStr) {
|
||||||
km.virtualIP = ipStr;
|
ref.read(virtualIPProvider.notifier).setVirtualIP(ipStr);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 如果当前状态还是连接中,则更新为已连接
|
// 如果当前状态还是连接中,则更新为已连接
|
||||||
@@ -245,8 +304,8 @@ class _HomePageState extends State<HomePage> {
|
|||||||
});
|
});
|
||||||
|
|
||||||
closeAllServer();
|
closeAllServer();
|
||||||
// 清空玩家列表数据
|
// 清空玩家列表数据
|
||||||
Provider.of<KM>(context, listen: false).nodes = [];
|
ref.read(nodesProvider.notifier).setNodes([]);
|
||||||
if (mounted) {
|
if (mounted) {
|
||||||
ScaffoldMessenger.of(context).showSnackBar(
|
ScaffoldMessenger.of(context).showSnackBar(
|
||||||
const SnackBar(
|
const SnackBar(
|
||||||
@@ -269,13 +328,12 @@ class _HomePageState extends State<HomePage> {
|
|||||||
runningTime += const Duration(seconds: 1);
|
runningTime += const Duration(seconds: 1);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
// 移除原来的Future.delayed模拟连接成功的代码
|
|
||||||
} else {
|
} else {
|
||||||
// 停止时重置状态
|
// 停止时重置状态
|
||||||
_connectionState = ConnectionState.notStarted;
|
_connectionState = ConnectionState.notStarted;
|
||||||
closeAllServer();
|
closeAllServer();
|
||||||
// 清空玩家列表数据
|
// 清空玩家列表数据
|
||||||
Provider.of<KM>(context, listen: false).nodes = [];
|
ref.read(nodesProvider.notifier).setNodes([]);
|
||||||
timer?.cancel();
|
timer?.cancel();
|
||||||
runningTime = Duration.zero;
|
runningTime = Duration.zero;
|
||||||
// 重置网络统计数据
|
// 重置网络统计数据
|
||||||
@@ -285,7 +343,6 @@ class _HomePageState extends State<HomePage> {
|
|||||||
_lastDownloadBytes = 0;
|
_lastDownloadBytes = 0;
|
||||||
uploadSpeed = 0;
|
uploadSpeed = 0;
|
||||||
downloadSpeed = 0;
|
downloadSpeed = 0;
|
||||||
//connectionTimeoutCounter
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -296,7 +353,7 @@ class _HomePageState extends State<HomePage> {
|
|||||||
|
|
||||||
int totalUploadBytes = 0;
|
int totalUploadBytes = 0;
|
||||||
int totalDownloadBytes = 0;
|
int totalDownloadBytes = 0;
|
||||||
String myIP = Provider.of<KM>(context, listen: false).virtualIP;
|
String myIP = ref.read(virtualIPProvider);
|
||||||
|
|
||||||
// 查找本机节点
|
// 查找本机节点
|
||||||
for (var node in nodes) {
|
for (var node in nodes) {
|
||||||
@@ -343,22 +400,22 @@ class _HomePageState extends State<HomePage> {
|
|||||||
@override
|
@override
|
||||||
void didChangeDependencies() {
|
void didChangeDependencies() {
|
||||||
super.didChangeDependencies();
|
super.didChangeDependencies();
|
||||||
final km = Provider.of<KM>(context);
|
// 使用 Riverpod 读取数据
|
||||||
_roomNameController.value = TextEditingValue(
|
_roomNameController.value = TextEditingValue(
|
||||||
text: km.roomName,
|
text: ref.read(roomNameProvider),
|
||||||
selection: _roomNameController.selection,
|
selection: _roomNameController.selection,
|
||||||
);
|
);
|
||||||
_roomPasswordController.value = TextEditingValue(
|
_roomPasswordController.value = TextEditingValue(
|
||||||
text: km.roomPassword,
|
text: ref.read(roomPasswordProvider),
|
||||||
selection: _roomPasswordController.selection,
|
selection: _roomPasswordController.selection,
|
||||||
);
|
);
|
||||||
_usernameController.value = TextEditingValue(
|
_usernameController.value = TextEditingValue(
|
||||||
text: km.username,
|
text: ref.read(usernameProvider),
|
||||||
selection: _usernameController.selection,
|
selection: _usernameController.selection,
|
||||||
);
|
);
|
||||||
// 添加虚拟IP控制器的值同步
|
// 添加虚拟IP控制器的值同步
|
||||||
_virtualIPController.value = TextEditingValue(
|
_virtualIPController.value = TextEditingValue(
|
||||||
text: km.virtualIP,
|
text: ref.read(virtualIPProvider),
|
||||||
selection: _virtualIPController.selection,
|
selection: _virtualIPController.selection,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -366,15 +423,17 @@ class _HomePageState extends State<HomePage> {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final colorScheme = Theme.of(context).colorScheme;
|
final colorScheme = Theme.of(context).colorScheme;
|
||||||
publicIP = Provider.of<KM>(context).virtualIP;
|
// 使用 Riverpod 读取数据
|
||||||
_isAutoIP = Provider.of<KM>(context).dynamicIP; // 更新自动IP状态
|
publicIP = ref.watch(virtualIPProvider);
|
||||||
//我的房间
|
_isAutoIP = ref.watch(dynamicIPProvider);
|
||||||
roomName = Provider.of<KM>(context).roomName;
|
roomName = ref.watch(roomNameProvider);
|
||||||
//我的密码
|
roomPassword = ref.watch(roomPasswordProvider);
|
||||||
roomPassword = Provider.of<KM>(context).roomPassword;
|
username = ref.watch(usernameProvider);
|
||||||
//我的用户名
|
Serverip = ref.watch(serverIPProvider);
|
||||||
username = Provider.of<KM>(context).username;
|
// 从 selectedServerProvider 获取服务器配置列表
|
||||||
Serverip = Provider.of<KM>(context).serverIP;
|
final serverConfigs =
|
||||||
|
ref.watch(selectedServerProvider) as List<ServerConfig>;
|
||||||
|
Serveripz = serverConfigs;
|
||||||
|
|
||||||
// 使用 LayoutBuilder 来处理布局变化,同时保留状态
|
// 使用 LayoutBuilder 来处理布局变化,同时保留状态
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
@@ -576,53 +635,57 @@ class _HomePageState extends State<HomePage> {
|
|||||||
|
|
||||||
// 添加服务器列表卡片
|
// 添加服务器列表卡片
|
||||||
Widget _buildServerListCard(ColorScheme colorScheme) {
|
Widget _buildServerListCard(ColorScheme colorScheme) {
|
||||||
final km = Provider.of<KM>(context);
|
return Consumer(
|
||||||
// 直接使用 serverIP 列表,而不是尝试访问 serverList
|
builder: (context, ref, child) {
|
||||||
final serverUrls = km.serverIP;
|
// 直接使用 serverIP 列表
|
||||||
|
final serverUrls = ref.watch(serverIPProvider);
|
||||||
|
|
||||||
return FloatingCard(
|
return FloatingCard(
|
||||||
colorScheme: colorScheme,
|
colorScheme: colorScheme,
|
||||||
maxWidth: 600,
|
maxWidth: 600,
|
||||||
child: Column(
|
child: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
|
||||||
// 标题栏
|
|
||||||
Row(
|
|
||||||
children: [
|
children: [
|
||||||
Icon(Icons.dns, color: colorScheme.primary, size: 22),
|
// 标题栏
|
||||||
const SizedBox(width: 8),
|
Row(
|
||||||
const Text('当前服务器',
|
children: [
|
||||||
style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold)),
|
Icon(Icons.dns, color: colorScheme.primary, size: 22),
|
||||||
|
const SizedBox(width: 8),
|
||||||
|
const Text('当前服务器',
|
||||||
|
style:
|
||||||
|
TextStyle(fontSize: 18, fontWeight: FontWeight.bold)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
const SizedBox(height: 16),
|
||||||
|
|
||||||
|
// 当前选中的服务器
|
||||||
|
Wrap(
|
||||||
|
spacing: 8,
|
||||||
|
runSpacing: 8,
|
||||||
|
children: serverUrls.isEmpty ||
|
||||||
|
(serverUrls.length == 1 && serverUrls[0].isEmpty)
|
||||||
|
? [
|
||||||
|
Chip(
|
||||||
|
avatar: Icon(Icons.info_outline,
|
||||||
|
size: 16, color: colorScheme.error),
|
||||||
|
label: const Text('未选择服务器'),
|
||||||
|
backgroundColor:
|
||||||
|
colorScheme.errorContainer.withOpacity(0.3),
|
||||||
|
)
|
||||||
|
]
|
||||||
|
: serverUrls
|
||||||
|
.map((url) => Chip(
|
||||||
|
avatar: Icon(Icons.dns,
|
||||||
|
size: 16, color: colorScheme.primary),
|
||||||
|
label: Text(url),
|
||||||
|
backgroundColor: colorScheme.surfaceVariant,
|
||||||
|
))
|
||||||
|
.toList(),
|
||||||
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
const SizedBox(height: 16),
|
);
|
||||||
|
},
|
||||||
// 当前选中的服务器
|
|
||||||
Wrap(
|
|
||||||
spacing: 8,
|
|
||||||
runSpacing: 8,
|
|
||||||
children: serverUrls.isEmpty ||
|
|
||||||
(serverUrls.length == 1 && serverUrls[0].isEmpty)
|
|
||||||
? [
|
|
||||||
Chip(
|
|
||||||
avatar: Icon(Icons.info_outline,
|
|
||||||
size: 16, color: colorScheme.error),
|
|
||||||
label: const Text('未选择服务器'),
|
|
||||||
backgroundColor:
|
|
||||||
colorScheme.errorContainer.withOpacity(0.3),
|
|
||||||
)
|
|
||||||
]
|
|
||||||
: serverUrls
|
|
||||||
.map((url) => Chip(
|
|
||||||
avatar: Icon(Icons.dns,
|
|
||||||
size: 16, color: colorScheme.primary),
|
|
||||||
label: Text(url),
|
|
||||||
backgroundColor: colorScheme.surfaceVariant,
|
|
||||||
))
|
|
||||||
.toList(),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -716,8 +779,7 @@ class _HomePageState extends State<HomePage> {
|
|||||||
|
|
||||||
// 优化用户信息卡片
|
// 优化用户信息卡片
|
||||||
Widget _buildUserInfoCard(ColorScheme colorScheme) {
|
Widget _buildUserInfoCard(ColorScheme colorScheme) {
|
||||||
final km = Provider.of<KM>(context, listen: false);
|
final isValidIP = _isAutoIP || _isValidIPv4(ref.watch(virtualIPProvider));
|
||||||
final isValidIP = _isAutoIP || _isValidIPv4(km.virtualIP);
|
|
||||||
|
|
||||||
return FloatingCard(
|
return FloatingCard(
|
||||||
colorScheme: colorScheme,
|
colorScheme: colorScheme,
|
||||||
@@ -762,8 +824,9 @@ class _HomePageState extends State<HomePage> {
|
|||||||
enabled: _connectionState != ConnectionState.connected,
|
enabled: _connectionState != ConnectionState.connected,
|
||||||
onEditingComplete: () {
|
onEditingComplete: () {
|
||||||
// 改为完成编辑时更新
|
// 改为完成编辑时更新
|
||||||
Provider.of<KM>(context, listen: false).username =
|
ref
|
||||||
_usernameController.text;
|
.read(usernameProvider.notifier)
|
||||||
|
.setUsername(_usernameController.text);
|
||||||
},
|
},
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
labelText: '用户名',
|
labelText: '用户名',
|
||||||
@@ -789,8 +852,9 @@ class _HomePageState extends State<HomePage> {
|
|||||||
onEditingComplete: () {
|
onEditingComplete: () {
|
||||||
// 添加完成编辑回调
|
// 添加完成编辑回调
|
||||||
if (!_isAutoIP) {
|
if (!_isAutoIP) {
|
||||||
Provider.of<KM>(context, listen: false).virtualIP =
|
ref
|
||||||
_virtualIPController.text;
|
.read(virtualIPProvider.notifier)
|
||||||
|
.setVirtualIP(_virtualIPController.text);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
@@ -812,10 +876,14 @@ class _HomePageState extends State<HomePage> {
|
|||||||
setState(() {
|
setState(() {
|
||||||
_isAutoIP = value;
|
_isAutoIP = value;
|
||||||
});
|
});
|
||||||
km.dynamicIP = value;
|
ref
|
||||||
|
.read(dynamicIPProvider.notifier)
|
||||||
|
.setDynamicIP(value);
|
||||||
// 切换模式时同步最新值
|
// 切换模式时同步最新值
|
||||||
if (!value) {
|
if (!value) {
|
||||||
km.virtualIP = _virtualIPController.text;
|
ref
|
||||||
|
.read(virtualIPProvider.notifier)
|
||||||
|
.setVirtualIP(_virtualIPController.text);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
: null,
|
: null,
|
||||||
@@ -846,7 +914,6 @@ class _HomePageState extends State<HomePage> {
|
|||||||
|
|
||||||
// 优化房间信息卡片
|
// 优化房间信息卡片
|
||||||
Widget _buildRoomInfoCard(ColorScheme colorScheme) {
|
Widget _buildRoomInfoCard(ColorScheme colorScheme) {
|
||||||
final km = Provider.of<KM>(context, listen: false);
|
|
||||||
return FloatingCard(
|
return FloatingCard(
|
||||||
colorScheme: colorScheme,
|
colorScheme: colorScheme,
|
||||||
maxWidth: 600,
|
maxWidth: 600,
|
||||||
@@ -890,8 +957,9 @@ class _HomePageState extends State<HomePage> {
|
|||||||
enabled: _connectionState != ConnectionState.connected,
|
enabled: _connectionState != ConnectionState.connected,
|
||||||
onEditingComplete: () {
|
onEditingComplete: () {
|
||||||
// 改为完成编辑时更新
|
// 改为完成编辑时更新
|
||||||
Provider.of<KM>(context, listen: false).roomName =
|
ref
|
||||||
_roomNameController.text;
|
.read(roomNameProvider.notifier)
|
||||||
|
.setRoomName(_roomNameController.text);
|
||||||
},
|
},
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
labelText: '房间名称',
|
labelText: '房间名称',
|
||||||
@@ -908,9 +976,9 @@ class _HomePageState extends State<HomePage> {
|
|||||||
focusNode: _roomPasswordControllerFocusNode, // 添加焦点节点
|
focusNode: _roomPasswordControllerFocusNode, // 添加焦点节点
|
||||||
enabled: _connectionState != ConnectionState.connected,
|
enabled: _connectionState != ConnectionState.connected,
|
||||||
onEditingComplete: () {
|
onEditingComplete: () {
|
||||||
// 改为完成编辑时更新
|
ref
|
||||||
Provider.of<KM>(context, listen: false).roomPassword =
|
.read(roomPasswordProvider.notifier)
|
||||||
_roomPasswordController.text;
|
.setRoomPassword(_roomPasswordController.text);
|
||||||
},
|
},
|
||||||
obscureText: true,
|
obscureText: true,
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
|
|||||||
+15
-12
@@ -3,7 +3,7 @@ import 'package:flutter/services.dart'; // 添加这一行导入剪贴板服务
|
|||||||
|
|
||||||
import 'package:astral/utils/kv_state.dart';
|
import 'package:astral/utils/kv_state.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:flutter_riverpod/flutter_riverpod.dart'; // 替换 provider 导入
|
||||||
import '../widgets/card.dart';
|
import '../widgets/card.dart';
|
||||||
|
|
||||||
/// 玩家信息模型类
|
/// 玩家信息模型类
|
||||||
@@ -37,14 +37,17 @@ class PlayerInfo {
|
|||||||
|
|
||||||
/// 房间页面组件
|
/// 房间页面组件
|
||||||
/// 用于显示所有玩家的信息
|
/// 用于显示所有玩家的信息
|
||||||
class RoomPage extends StatefulWidget {
|
class RoomPage extends ConsumerStatefulWidget {
|
||||||
|
// 修改为 ConsumerStatefulWidget
|
||||||
const RoomPage({super.key});
|
const RoomPage({super.key});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
State<RoomPage> createState() => _RoomPageState();
|
ConsumerState<RoomPage> createState() =>
|
||||||
|
_RoomPageState(); // 修改为 ConsumerState
|
||||||
}
|
}
|
||||||
|
|
||||||
class _RoomPageState extends State<RoomPage> {
|
class _RoomPageState extends ConsumerState<RoomPage> {
|
||||||
|
// 修改为 ConsumerState
|
||||||
List<PlayerInfo> players = [];
|
List<PlayerInfo> players = [];
|
||||||
List<PlayerInfo> filteredPlayers = []; // 添加过滤后的玩家列表
|
List<PlayerInfo> filteredPlayers = []; // 添加过滤后的玩家列表
|
||||||
bool isLoading = true;
|
bool isLoading = true;
|
||||||
@@ -88,6 +91,7 @@ class _RoomPageState extends State<RoomPage> {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final colorScheme = Theme.of(context).colorScheme;
|
final colorScheme = Theme.of(context).colorScheme;
|
||||||
|
// 使用 Riverpod 监听节点数据
|
||||||
|
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
@@ -109,11 +113,10 @@ class _RoomPageState extends State<RoomPage> {
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
body: Consumer<KM>(
|
body: Builder(
|
||||||
builder: (context, km, child) {
|
builder: (context) {
|
||||||
// 当 KM 更新时,这个 builder 会被重新调用
|
|
||||||
// 异步处理数据
|
// 异步处理数据
|
||||||
_processNodeData(km);
|
_processNodeData();
|
||||||
|
|
||||||
if (isLoading) {
|
if (isLoading) {
|
||||||
return Center(
|
return Center(
|
||||||
@@ -203,9 +206,9 @@ class _RoomPageState extends State<RoomPage> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 处理节点数据 - 合并了原来的两个相似方法
|
// 处理节点数据 - 合并了原来的两个相似方法
|
||||||
Future<void> _processNodeData(KM km) async {
|
Future<void> _processNodeData() async {
|
||||||
try {
|
try {
|
||||||
final nodes = await km.nodes; // 获取最新的节点信息
|
final nodes = await ref.read(nodesProvider); // 获取最新的节点信息
|
||||||
|
|
||||||
// 将节点数据转换为PlayerInfo对象
|
// 将节点数据转换为PlayerInfo对象
|
||||||
List<PlayerInfo> nodePlayerInfos = [];
|
List<PlayerInfo> nodePlayerInfos = [];
|
||||||
@@ -216,8 +219,8 @@ class _RoomPageState extends State<RoomPage> {
|
|||||||
int downloadSpeed = 0;
|
int downloadSpeed = 0;
|
||||||
int sentPackets = 0;
|
int sentPackets = 0;
|
||||||
int receivedPackets = 0;
|
int receivedPackets = 0;
|
||||||
String connectionType =
|
String connectionType = _mapConnectionType(
|
||||||
_mapConnectionType(node.cost, node.ipv4, km.virtualIP);
|
node.cost, node.ipv4, ref.read(virtualIPProvider));
|
||||||
|
|
||||||
// 如果有连接信息,计算网络统计数据
|
// 如果有连接信息,计算网络统计数据
|
||||||
if (node.connections.isNotEmpty) {
|
if (node.connections.isNotEmpty) {
|
||||||
|
|||||||
+1399
-203
File diff suppressed because it is too large
Load Diff
@@ -37,14 +37,16 @@ Future<void> createServer(
|
|||||||
required String specifiedIp,
|
required String specifiedIp,
|
||||||
required String roomName,
|
required String roomName,
|
||||||
required String roomPassword,
|
required String roomPassword,
|
||||||
required List<String> severurl}) =>
|
required List<String> severurl,
|
||||||
|
required FlagsC flag}) =>
|
||||||
RustLib.instance.api.crateApiSimpleCreateServer(
|
RustLib.instance.api.crateApiSimpleCreateServer(
|
||||||
username: username,
|
username: username,
|
||||||
enableDhcp: enableDhcp,
|
enableDhcp: enableDhcp,
|
||||||
specifiedIp: specifiedIp,
|
specifiedIp: specifiedIp,
|
||||||
roomName: roomName,
|
roomName: roomName,
|
||||||
roomPassword: roomPassword,
|
roomPassword: roomPassword,
|
||||||
severurl: severurl);
|
severurl: severurl,
|
||||||
|
flag: flag);
|
||||||
|
|
||||||
Future<void> closeAllServer() =>
|
Future<void> closeAllServer() =>
|
||||||
RustLib.instance.api.crateApiSimpleCloseAllServer();
|
RustLib.instance.api.crateApiSimpleCloseAllServer();
|
||||||
@@ -63,6 +65,103 @@ abstract class PeerRoutePair implements RustOpaqueInterface {}
|
|||||||
// Rust type: RustOpaqueMoi<flutter_rust_bridge::for_generated::RustAutoOpaqueInner<Route>>
|
// Rust type: RustOpaqueMoi<flutter_rust_bridge::for_generated::RustAutoOpaqueInner<Route>>
|
||||||
abstract class Route implements RustOpaqueInterface {}
|
abstract class Route implements RustOpaqueInterface {}
|
||||||
|
|
||||||
|
class FlagsC {
|
||||||
|
final String defaultProtocol;
|
||||||
|
final String devName;
|
||||||
|
final bool enableEncryption;
|
||||||
|
final bool enableIpv6;
|
||||||
|
final int mtu;
|
||||||
|
final bool latencyFirst;
|
||||||
|
final bool enableExitNode;
|
||||||
|
final bool noTun;
|
||||||
|
final bool useSmoltcp;
|
||||||
|
final String relayNetworkWhitelist;
|
||||||
|
final bool disableP2P;
|
||||||
|
final bool relayAllPeerRpc;
|
||||||
|
final bool disableUdpHolePunching;
|
||||||
|
|
||||||
|
/// string ipv6_listener = 14; \[deprecated = true\]; use -l udp://\[::\]:12345 instead
|
||||||
|
final bool multiThread;
|
||||||
|
final int dataCompressAlgo;
|
||||||
|
final bool bindDevice;
|
||||||
|
final bool enableKcpProxy;
|
||||||
|
final bool disableKcpInput;
|
||||||
|
final bool disableRelayKcp;
|
||||||
|
final bool proxyForwardBySystem;
|
||||||
|
|
||||||
|
const FlagsC({
|
||||||
|
required this.defaultProtocol,
|
||||||
|
required this.devName,
|
||||||
|
required this.enableEncryption,
|
||||||
|
required this.enableIpv6,
|
||||||
|
required this.mtu,
|
||||||
|
required this.latencyFirst,
|
||||||
|
required this.enableExitNode,
|
||||||
|
required this.noTun,
|
||||||
|
required this.useSmoltcp,
|
||||||
|
required this.relayNetworkWhitelist,
|
||||||
|
required this.disableP2P,
|
||||||
|
required this.relayAllPeerRpc,
|
||||||
|
required this.disableUdpHolePunching,
|
||||||
|
required this.multiThread,
|
||||||
|
required this.dataCompressAlgo,
|
||||||
|
required this.bindDevice,
|
||||||
|
required this.enableKcpProxy,
|
||||||
|
required this.disableKcpInput,
|
||||||
|
required this.disableRelayKcp,
|
||||||
|
required this.proxyForwardBySystem,
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
int get hashCode =>
|
||||||
|
defaultProtocol.hashCode ^
|
||||||
|
devName.hashCode ^
|
||||||
|
enableEncryption.hashCode ^
|
||||||
|
enableIpv6.hashCode ^
|
||||||
|
mtu.hashCode ^
|
||||||
|
latencyFirst.hashCode ^
|
||||||
|
enableExitNode.hashCode ^
|
||||||
|
noTun.hashCode ^
|
||||||
|
useSmoltcp.hashCode ^
|
||||||
|
relayNetworkWhitelist.hashCode ^
|
||||||
|
disableP2P.hashCode ^
|
||||||
|
relayAllPeerRpc.hashCode ^
|
||||||
|
disableUdpHolePunching.hashCode ^
|
||||||
|
multiThread.hashCode ^
|
||||||
|
dataCompressAlgo.hashCode ^
|
||||||
|
bindDevice.hashCode ^
|
||||||
|
enableKcpProxy.hashCode ^
|
||||||
|
disableKcpInput.hashCode ^
|
||||||
|
disableRelayKcp.hashCode ^
|
||||||
|
proxyForwardBySystem.hashCode;
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(Object other) =>
|
||||||
|
identical(this, other) ||
|
||||||
|
other is FlagsC &&
|
||||||
|
runtimeType == other.runtimeType &&
|
||||||
|
defaultProtocol == other.defaultProtocol &&
|
||||||
|
devName == other.devName &&
|
||||||
|
enableEncryption == other.enableEncryption &&
|
||||||
|
enableIpv6 == other.enableIpv6 &&
|
||||||
|
mtu == other.mtu &&
|
||||||
|
latencyFirst == other.latencyFirst &&
|
||||||
|
enableExitNode == other.enableExitNode &&
|
||||||
|
noTun == other.noTun &&
|
||||||
|
useSmoltcp == other.useSmoltcp &&
|
||||||
|
relayNetworkWhitelist == other.relayNetworkWhitelist &&
|
||||||
|
disableP2P == other.disableP2P &&
|
||||||
|
relayAllPeerRpc == other.relayAllPeerRpc &&
|
||||||
|
disableUdpHolePunching == other.disableUdpHolePunching &&
|
||||||
|
multiThread == other.multiThread &&
|
||||||
|
dataCompressAlgo == other.dataCompressAlgo &&
|
||||||
|
bindDevice == other.bindDevice &&
|
||||||
|
enableKcpProxy == other.enableKcpProxy &&
|
||||||
|
disableKcpInput == other.disableKcpInput &&
|
||||||
|
disableRelayKcp == other.disableRelayKcp &&
|
||||||
|
proxyForwardBySystem == other.proxyForwardBySystem;
|
||||||
|
}
|
||||||
|
|
||||||
class KVNetworkStatus {
|
class KVNetworkStatus {
|
||||||
final BigInt totalNodes;
|
final BigInt totalNodes;
|
||||||
final List<KVNodeInfo> nodes;
|
final List<KVNodeInfo> nodes;
|
||||||
|
|||||||
@@ -85,7 +85,8 @@ abstract class RustLibApi extends BaseApi {
|
|||||||
required String specifiedIp,
|
required String specifiedIp,
|
||||||
required String roomName,
|
required String roomName,
|
||||||
required String roomPassword,
|
required String roomPassword,
|
||||||
required List<String> severurl});
|
required List<String> severurl,
|
||||||
|
required FlagsC flag});
|
||||||
|
|
||||||
Future<String> crateApiSimpleEasytierVersion();
|
Future<String> crateApiSimpleEasytierVersion();
|
||||||
|
|
||||||
@@ -174,7 +175,8 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
|
|||||||
required String specifiedIp,
|
required String specifiedIp,
|
||||||
required String roomName,
|
required String roomName,
|
||||||
required String roomPassword,
|
required String roomPassword,
|
||||||
required List<String> severurl}) {
|
required List<String> severurl,
|
||||||
|
required FlagsC flag}) {
|
||||||
return handler.executeNormal(NormalTask(
|
return handler.executeNormal(NormalTask(
|
||||||
callFfi: (port_) {
|
callFfi: (port_) {
|
||||||
final serializer = SseSerializer(generalizedFrbRustBinding);
|
final serializer = SseSerializer(generalizedFrbRustBinding);
|
||||||
@@ -184,6 +186,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
|
|||||||
sse_encode_String(roomName, serializer);
|
sse_encode_String(roomName, serializer);
|
||||||
sse_encode_String(roomPassword, serializer);
|
sse_encode_String(roomPassword, serializer);
|
||||||
sse_encode_list_String(severurl, serializer);
|
sse_encode_list_String(severurl, serializer);
|
||||||
|
sse_encode_box_autoadd_flags_c(flag, serializer);
|
||||||
pdeCallFfi(generalizedFrbRustBinding, serializer,
|
pdeCallFfi(generalizedFrbRustBinding, serializer,
|
||||||
funcId: 2, port: port_);
|
funcId: 2, port: port_);
|
||||||
},
|
},
|
||||||
@@ -198,7 +201,8 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
|
|||||||
specifiedIp,
|
specifiedIp,
|
||||||
roomName,
|
roomName,
|
||||||
roomPassword,
|
roomPassword,
|
||||||
severurl
|
severurl,
|
||||||
|
flag
|
||||||
],
|
],
|
||||||
apiImpl: this,
|
apiImpl: this,
|
||||||
));
|
));
|
||||||
@@ -212,7 +216,8 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
|
|||||||
"specifiedIp",
|
"specifiedIp",
|
||||||
"roomName",
|
"roomName",
|
||||||
"roomPassword",
|
"roomPassword",
|
||||||
"severurl"
|
"severurl",
|
||||||
|
"flag"
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -515,6 +520,12 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
|
|||||||
return raw as bool;
|
return raw as bool;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@protected
|
||||||
|
FlagsC dco_decode_box_autoadd_flags_c(dynamic raw) {
|
||||||
|
// Codec=Dco (DartCObject based), see doc to use other codecs
|
||||||
|
return dco_decode_flags_c(raw);
|
||||||
|
}
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
double dco_decode_f_32(dynamic raw) {
|
double dco_decode_f_32(dynamic raw) {
|
||||||
// Codec=Dco (DartCObject based), see doc to use other codecs
|
// Codec=Dco (DartCObject based), see doc to use other codecs
|
||||||
@@ -527,6 +538,36 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
|
|||||||
return raw as double;
|
return raw as double;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@protected
|
||||||
|
FlagsC dco_decode_flags_c(dynamic raw) {
|
||||||
|
// Codec=Dco (DartCObject based), see doc to use other codecs
|
||||||
|
final arr = raw as List<dynamic>;
|
||||||
|
if (arr.length != 20)
|
||||||
|
throw Exception('unexpected arr length: expect 20 but see ${arr.length}');
|
||||||
|
return FlagsC(
|
||||||
|
defaultProtocol: dco_decode_String(arr[0]),
|
||||||
|
devName: dco_decode_String(arr[1]),
|
||||||
|
enableEncryption: dco_decode_bool(arr[2]),
|
||||||
|
enableIpv6: dco_decode_bool(arr[3]),
|
||||||
|
mtu: dco_decode_u_32(arr[4]),
|
||||||
|
latencyFirst: dco_decode_bool(arr[5]),
|
||||||
|
enableExitNode: dco_decode_bool(arr[6]),
|
||||||
|
noTun: dco_decode_bool(arr[7]),
|
||||||
|
useSmoltcp: dco_decode_bool(arr[8]),
|
||||||
|
relayNetworkWhitelist: dco_decode_String(arr[9]),
|
||||||
|
disableP2P: dco_decode_bool(arr[10]),
|
||||||
|
relayAllPeerRpc: dco_decode_bool(arr[11]),
|
||||||
|
disableUdpHolePunching: dco_decode_bool(arr[12]),
|
||||||
|
multiThread: dco_decode_bool(arr[13]),
|
||||||
|
dataCompressAlgo: dco_decode_i_32(arr[14]),
|
||||||
|
bindDevice: dco_decode_bool(arr[15]),
|
||||||
|
enableKcpProxy: dco_decode_bool(arr[16]),
|
||||||
|
disableKcpInput: dco_decode_bool(arr[17]),
|
||||||
|
disableRelayKcp: dco_decode_bool(arr[18]),
|
||||||
|
proxyForwardBySystem: dco_decode_bool(arr[19]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
int dco_decode_i_32(dynamic raw) {
|
int dco_decode_i_32(dynamic raw) {
|
||||||
// Codec=Dco (DartCObject based), see doc to use other codecs
|
// Codec=Dco (DartCObject based), see doc to use other codecs
|
||||||
@@ -657,6 +698,12 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@protected
|
||||||
|
int dco_decode_u_32(dynamic raw) {
|
||||||
|
// Codec=Dco (DartCObject based), see doc to use other codecs
|
||||||
|
return raw as int;
|
||||||
|
}
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
BigInt dco_decode_u_64(dynamic raw) {
|
BigInt dco_decode_u_64(dynamic raw) {
|
||||||
// Codec=Dco (DartCObject based), see doc to use other codecs
|
// Codec=Dco (DartCObject based), see doc to use other codecs
|
||||||
@@ -766,6 +813,12 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
|
|||||||
return deserializer.buffer.getUint8() != 0;
|
return deserializer.buffer.getUint8() != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@protected
|
||||||
|
FlagsC sse_decode_box_autoadd_flags_c(SseDeserializer deserializer) {
|
||||||
|
// Codec=Sse (Serialization based), see doc to use other codecs
|
||||||
|
return (sse_decode_flags_c(deserializer));
|
||||||
|
}
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
double sse_decode_f_32(SseDeserializer deserializer) {
|
double sse_decode_f_32(SseDeserializer deserializer) {
|
||||||
// Codec=Sse (Serialization based), see doc to use other codecs
|
// Codec=Sse (Serialization based), see doc to use other codecs
|
||||||
@@ -778,6 +831,52 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
|
|||||||
return deserializer.buffer.getFloat64();
|
return deserializer.buffer.getFloat64();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@protected
|
||||||
|
FlagsC sse_decode_flags_c(SseDeserializer deserializer) {
|
||||||
|
// Codec=Sse (Serialization based), see doc to use other codecs
|
||||||
|
var var_defaultProtocol = sse_decode_String(deserializer);
|
||||||
|
var var_devName = sse_decode_String(deserializer);
|
||||||
|
var var_enableEncryption = sse_decode_bool(deserializer);
|
||||||
|
var var_enableIpv6 = sse_decode_bool(deserializer);
|
||||||
|
var var_mtu = sse_decode_u_32(deserializer);
|
||||||
|
var var_latencyFirst = sse_decode_bool(deserializer);
|
||||||
|
var var_enableExitNode = sse_decode_bool(deserializer);
|
||||||
|
var var_noTun = sse_decode_bool(deserializer);
|
||||||
|
var var_useSmoltcp = sse_decode_bool(deserializer);
|
||||||
|
var var_relayNetworkWhitelist = sse_decode_String(deserializer);
|
||||||
|
var var_disableP2P = sse_decode_bool(deserializer);
|
||||||
|
var var_relayAllPeerRpc = sse_decode_bool(deserializer);
|
||||||
|
var var_disableUdpHolePunching = sse_decode_bool(deserializer);
|
||||||
|
var var_multiThread = sse_decode_bool(deserializer);
|
||||||
|
var var_dataCompressAlgo = sse_decode_i_32(deserializer);
|
||||||
|
var var_bindDevice = sse_decode_bool(deserializer);
|
||||||
|
var var_enableKcpProxy = sse_decode_bool(deserializer);
|
||||||
|
var var_disableKcpInput = sse_decode_bool(deserializer);
|
||||||
|
var var_disableRelayKcp = sse_decode_bool(deserializer);
|
||||||
|
var var_proxyForwardBySystem = sse_decode_bool(deserializer);
|
||||||
|
return FlagsC(
|
||||||
|
defaultProtocol: var_defaultProtocol,
|
||||||
|
devName: var_devName,
|
||||||
|
enableEncryption: var_enableEncryption,
|
||||||
|
enableIpv6: var_enableIpv6,
|
||||||
|
mtu: var_mtu,
|
||||||
|
latencyFirst: var_latencyFirst,
|
||||||
|
enableExitNode: var_enableExitNode,
|
||||||
|
noTun: var_noTun,
|
||||||
|
useSmoltcp: var_useSmoltcp,
|
||||||
|
relayNetworkWhitelist: var_relayNetworkWhitelist,
|
||||||
|
disableP2P: var_disableP2P,
|
||||||
|
relayAllPeerRpc: var_relayAllPeerRpc,
|
||||||
|
disableUdpHolePunching: var_disableUdpHolePunching,
|
||||||
|
multiThread: var_multiThread,
|
||||||
|
dataCompressAlgo: var_dataCompressAlgo,
|
||||||
|
bindDevice: var_bindDevice,
|
||||||
|
enableKcpProxy: var_enableKcpProxy,
|
||||||
|
disableKcpInput: var_disableKcpInput,
|
||||||
|
disableRelayKcp: var_disableRelayKcp,
|
||||||
|
proxyForwardBySystem: var_proxyForwardBySystem);
|
||||||
|
}
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
int sse_decode_i_32(SseDeserializer deserializer) {
|
int sse_decode_i_32(SseDeserializer deserializer) {
|
||||||
// Codec=Sse (Serialization based), see doc to use other codecs
|
// Codec=Sse (Serialization based), see doc to use other codecs
|
||||||
@@ -940,6 +1039,12 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
|
|||||||
return (var_field0, var_field1);
|
return (var_field0, var_field1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@protected
|
||||||
|
int sse_decode_u_32(SseDeserializer deserializer) {
|
||||||
|
// Codec=Sse (Serialization based), see doc to use other codecs
|
||||||
|
return deserializer.buffer.getUint32();
|
||||||
|
}
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
BigInt sse_decode_u_64(SseDeserializer deserializer) {
|
BigInt sse_decode_u_64(SseDeserializer deserializer) {
|
||||||
// Codec=Sse (Serialization based), see doc to use other codecs
|
// Codec=Sse (Serialization based), see doc to use other codecs
|
||||||
@@ -1049,6 +1154,12 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
|
|||||||
serializer.buffer.putUint8(self ? 1 : 0);
|
serializer.buffer.putUint8(self ? 1 : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@protected
|
||||||
|
void sse_encode_box_autoadd_flags_c(FlagsC self, SseSerializer serializer) {
|
||||||
|
// Codec=Sse (Serialization based), see doc to use other codecs
|
||||||
|
sse_encode_flags_c(self, serializer);
|
||||||
|
}
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
void sse_encode_f_32(double self, SseSerializer serializer) {
|
void sse_encode_f_32(double self, SseSerializer serializer) {
|
||||||
// Codec=Sse (Serialization based), see doc to use other codecs
|
// Codec=Sse (Serialization based), see doc to use other codecs
|
||||||
@@ -1061,6 +1172,31 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
|
|||||||
serializer.buffer.putFloat64(self);
|
serializer.buffer.putFloat64(self);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@protected
|
||||||
|
void sse_encode_flags_c(FlagsC self, SseSerializer serializer) {
|
||||||
|
// Codec=Sse (Serialization based), see doc to use other codecs
|
||||||
|
sse_encode_String(self.defaultProtocol, serializer);
|
||||||
|
sse_encode_String(self.devName, serializer);
|
||||||
|
sse_encode_bool(self.enableEncryption, serializer);
|
||||||
|
sse_encode_bool(self.enableIpv6, serializer);
|
||||||
|
sse_encode_u_32(self.mtu, serializer);
|
||||||
|
sse_encode_bool(self.latencyFirst, serializer);
|
||||||
|
sse_encode_bool(self.enableExitNode, serializer);
|
||||||
|
sse_encode_bool(self.noTun, serializer);
|
||||||
|
sse_encode_bool(self.useSmoltcp, serializer);
|
||||||
|
sse_encode_String(self.relayNetworkWhitelist, serializer);
|
||||||
|
sse_encode_bool(self.disableP2P, serializer);
|
||||||
|
sse_encode_bool(self.relayAllPeerRpc, serializer);
|
||||||
|
sse_encode_bool(self.disableUdpHolePunching, serializer);
|
||||||
|
sse_encode_bool(self.multiThread, serializer);
|
||||||
|
sse_encode_i_32(self.dataCompressAlgo, serializer);
|
||||||
|
sse_encode_bool(self.bindDevice, serializer);
|
||||||
|
sse_encode_bool(self.enableKcpProxy, serializer);
|
||||||
|
sse_encode_bool(self.disableKcpInput, serializer);
|
||||||
|
sse_encode_bool(self.disableRelayKcp, serializer);
|
||||||
|
sse_encode_bool(self.proxyForwardBySystem, serializer);
|
||||||
|
}
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
void sse_encode_i_32(int self, SseSerializer serializer) {
|
void sse_encode_i_32(int self, SseSerializer serializer) {
|
||||||
// Codec=Sse (Serialization based), see doc to use other codecs
|
// Codec=Sse (Serialization based), see doc to use other codecs
|
||||||
@@ -1183,6 +1319,12 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
|
|||||||
self.$2, serializer);
|
self.$2, serializer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@protected
|
||||||
|
void sse_encode_u_32(int self, SseSerializer serializer) {
|
||||||
|
// Codec=Sse (Serialization based), see doc to use other codecs
|
||||||
|
serializer.buffer.putUint32(self);
|
||||||
|
}
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
void sse_encode_u_64(BigInt self, SseSerializer serializer) {
|
void sse_encode_u_64(BigInt self, SseSerializer serializer) {
|
||||||
// Codec=Sse (Serialization based), see doc to use other codecs
|
// Codec=Sse (Serialization based), see doc to use other codecs
|
||||||
|
|||||||
@@ -77,12 +77,18 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
|
|||||||
@protected
|
@protected
|
||||||
bool dco_decode_bool(dynamic raw);
|
bool dco_decode_bool(dynamic raw);
|
||||||
|
|
||||||
|
@protected
|
||||||
|
FlagsC dco_decode_box_autoadd_flags_c(dynamic raw);
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
double dco_decode_f_32(dynamic raw);
|
double dco_decode_f_32(dynamic raw);
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
double dco_decode_f_64(dynamic raw);
|
double dco_decode_f_64(dynamic raw);
|
||||||
|
|
||||||
|
@protected
|
||||||
|
FlagsC dco_decode_flags_c(dynamic raw);
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
int dco_decode_i_32(dynamic raw);
|
int dco_decode_i_32(dynamic raw);
|
||||||
|
|
||||||
@@ -130,6 +136,9 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
|
|||||||
) dco_decode_record_list_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_peer_info_list_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_route(
|
) dco_decode_record_list_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_peer_info_list_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_route(
|
||||||
dynamic raw);
|
dynamic raw);
|
||||||
|
|
||||||
|
@protected
|
||||||
|
int dco_decode_u_32(dynamic raw);
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
BigInt dco_decode_u_64(dynamic raw);
|
BigInt dco_decode_u_64(dynamic raw);
|
||||||
|
|
||||||
@@ -188,12 +197,18 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
|
|||||||
@protected
|
@protected
|
||||||
bool sse_decode_bool(SseDeserializer deserializer);
|
bool sse_decode_bool(SseDeserializer deserializer);
|
||||||
|
|
||||||
|
@protected
|
||||||
|
FlagsC sse_decode_box_autoadd_flags_c(SseDeserializer deserializer);
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
double sse_decode_f_32(SseDeserializer deserializer);
|
double sse_decode_f_32(SseDeserializer deserializer);
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
double sse_decode_f_64(SseDeserializer deserializer);
|
double sse_decode_f_64(SseDeserializer deserializer);
|
||||||
|
|
||||||
|
@protected
|
||||||
|
FlagsC sse_decode_flags_c(SseDeserializer deserializer);
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
int sse_decode_i_32(SseDeserializer deserializer);
|
int sse_decode_i_32(SseDeserializer deserializer);
|
||||||
|
|
||||||
@@ -242,6 +257,9 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
|
|||||||
) sse_decode_record_list_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_peer_info_list_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_route(
|
) sse_decode_record_list_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_peer_info_list_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_route(
|
||||||
SseDeserializer deserializer);
|
SseDeserializer deserializer);
|
||||||
|
|
||||||
|
@protected
|
||||||
|
int sse_decode_u_32(SseDeserializer deserializer);
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
BigInt sse_decode_u_64(SseDeserializer deserializer);
|
BigInt sse_decode_u_64(SseDeserializer deserializer);
|
||||||
|
|
||||||
@@ -300,12 +318,18 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
|
|||||||
@protected
|
@protected
|
||||||
void sse_encode_bool(bool self, SseSerializer serializer);
|
void sse_encode_bool(bool self, SseSerializer serializer);
|
||||||
|
|
||||||
|
@protected
|
||||||
|
void sse_encode_box_autoadd_flags_c(FlagsC self, SseSerializer serializer);
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
void sse_encode_f_32(double self, SseSerializer serializer);
|
void sse_encode_f_32(double self, SseSerializer serializer);
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
void sse_encode_f_64(double self, SseSerializer serializer);
|
void sse_encode_f_64(double self, SseSerializer serializer);
|
||||||
|
|
||||||
|
@protected
|
||||||
|
void sse_encode_flags_c(FlagsC self, SseSerializer serializer);
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
void sse_encode_i_32(int self, SseSerializer serializer);
|
void sse_encode_i_32(int self, SseSerializer serializer);
|
||||||
|
|
||||||
@@ -355,6 +379,9 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
|
|||||||
sse_encode_record_list_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_peer_info_list_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_route(
|
sse_encode_record_list_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_peer_info_list_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_route(
|
||||||
(List<PeerInfo>, List<Route>) self, SseSerializer serializer);
|
(List<PeerInfo>, List<Route>) self, SseSerializer serializer);
|
||||||
|
|
||||||
|
@protected
|
||||||
|
void sse_encode_u_32(int self, SseSerializer serializer);
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
void sse_encode_u_64(BigInt self, SseSerializer serializer);
|
void sse_encode_u_64(BigInt self, SseSerializer serializer);
|
||||||
|
|
||||||
|
|||||||
@@ -79,12 +79,18 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
|
|||||||
@protected
|
@protected
|
||||||
bool dco_decode_bool(dynamic raw);
|
bool dco_decode_bool(dynamic raw);
|
||||||
|
|
||||||
|
@protected
|
||||||
|
FlagsC dco_decode_box_autoadd_flags_c(dynamic raw);
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
double dco_decode_f_32(dynamic raw);
|
double dco_decode_f_32(dynamic raw);
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
double dco_decode_f_64(dynamic raw);
|
double dco_decode_f_64(dynamic raw);
|
||||||
|
|
||||||
|
@protected
|
||||||
|
FlagsC dco_decode_flags_c(dynamic raw);
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
int dco_decode_i_32(dynamic raw);
|
int dco_decode_i_32(dynamic raw);
|
||||||
|
|
||||||
@@ -132,6 +138,9 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
|
|||||||
) dco_decode_record_list_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_peer_info_list_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_route(
|
) dco_decode_record_list_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_peer_info_list_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_route(
|
||||||
dynamic raw);
|
dynamic raw);
|
||||||
|
|
||||||
|
@protected
|
||||||
|
int dco_decode_u_32(dynamic raw);
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
BigInt dco_decode_u_64(dynamic raw);
|
BigInt dco_decode_u_64(dynamic raw);
|
||||||
|
|
||||||
@@ -190,12 +199,18 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
|
|||||||
@protected
|
@protected
|
||||||
bool sse_decode_bool(SseDeserializer deserializer);
|
bool sse_decode_bool(SseDeserializer deserializer);
|
||||||
|
|
||||||
|
@protected
|
||||||
|
FlagsC sse_decode_box_autoadd_flags_c(SseDeserializer deserializer);
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
double sse_decode_f_32(SseDeserializer deserializer);
|
double sse_decode_f_32(SseDeserializer deserializer);
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
double sse_decode_f_64(SseDeserializer deserializer);
|
double sse_decode_f_64(SseDeserializer deserializer);
|
||||||
|
|
||||||
|
@protected
|
||||||
|
FlagsC sse_decode_flags_c(SseDeserializer deserializer);
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
int sse_decode_i_32(SseDeserializer deserializer);
|
int sse_decode_i_32(SseDeserializer deserializer);
|
||||||
|
|
||||||
@@ -244,6 +259,9 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
|
|||||||
) sse_decode_record_list_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_peer_info_list_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_route(
|
) sse_decode_record_list_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_peer_info_list_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_route(
|
||||||
SseDeserializer deserializer);
|
SseDeserializer deserializer);
|
||||||
|
|
||||||
|
@protected
|
||||||
|
int sse_decode_u_32(SseDeserializer deserializer);
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
BigInt sse_decode_u_64(SseDeserializer deserializer);
|
BigInt sse_decode_u_64(SseDeserializer deserializer);
|
||||||
|
|
||||||
@@ -302,12 +320,18 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
|
|||||||
@protected
|
@protected
|
||||||
void sse_encode_bool(bool self, SseSerializer serializer);
|
void sse_encode_bool(bool self, SseSerializer serializer);
|
||||||
|
|
||||||
|
@protected
|
||||||
|
void sse_encode_box_autoadd_flags_c(FlagsC self, SseSerializer serializer);
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
void sse_encode_f_32(double self, SseSerializer serializer);
|
void sse_encode_f_32(double self, SseSerializer serializer);
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
void sse_encode_f_64(double self, SseSerializer serializer);
|
void sse_encode_f_64(double self, SseSerializer serializer);
|
||||||
|
|
||||||
|
@protected
|
||||||
|
void sse_encode_flags_c(FlagsC self, SseSerializer serializer);
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
void sse_encode_i_32(int self, SseSerializer serializer);
|
void sse_encode_i_32(int self, SseSerializer serializer);
|
||||||
|
|
||||||
@@ -357,6 +381,9 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
|
|||||||
sse_encode_record_list_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_peer_info_list_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_route(
|
sse_encode_record_list_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_peer_info_list_auto_owned_rust_opaque_flutter_rust_bridgefor_generated_rust_auto_opaque_inner_route(
|
||||||
(List<PeerInfo>, List<Route>) self, SseSerializer serializer);
|
(List<PeerInfo>, List<Route>) self, SseSerializer serializer);
|
||||||
|
|
||||||
|
@protected
|
||||||
|
void sse_encode_u_32(int self, SseSerializer serializer);
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
void sse_encode_u_64(BigInt self, SseSerializer serializer);
|
void sse_encode_u_64(BigInt self, SseSerializer serializer);
|
||||||
|
|
||||||
|
|||||||
+401
-69
@@ -1,104 +1,436 @@
|
|||||||
import 'package:astral/src/rust/api/simple.dart';
|
import 'package:astral/src/rust/api/simple.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||||
import '../config/app_config.dart';
|
import '../config/app_config.dart';
|
||||||
|
|
||||||
class KM extends ChangeNotifier {
|
// 全局配置实例
|
||||||
final _config = AppConfig();
|
final appConfigProvider = Provider<AppConfig>((ref) => AppConfig());
|
||||||
int _count = 0;
|
|
||||||
int get count => _count;
|
|
||||||
|
|
||||||
void increment() {
|
// 计数器相关
|
||||||
_count++;
|
class CountNotifier extends StateNotifier<int> {
|
||||||
notifyListeners(); // 通知监听器重建UI
|
CountNotifier() : super(0);
|
||||||
}
|
|
||||||
|
|
||||||
// 房间名
|
void increment() => state++;
|
||||||
String get roomName => _config.roomName;
|
}
|
||||||
set roomName(String value) {
|
|
||||||
|
final countProvider =
|
||||||
|
StateNotifierProvider<CountNotifier, int>((ref) => CountNotifier());
|
||||||
|
|
||||||
|
// 房间名相关
|
||||||
|
class RoomNameNotifier extends StateNotifier<String> {
|
||||||
|
final AppConfig _config;
|
||||||
|
|
||||||
|
RoomNameNotifier(this._config) : super(_config.roomName);
|
||||||
|
|
||||||
|
void setRoomName(String value) {
|
||||||
_config.setRoomName(value);
|
_config.setRoomName(value);
|
||||||
notifyListeners(); // 通知监听器重建UI
|
state = value;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//房间密码设置
|
final roomNameProvider = StateNotifierProvider<RoomNameNotifier, String>((ref) {
|
||||||
String get roomPassword => _config.roomPassword;
|
return RoomNameNotifier(ref.watch(appConfigProvider));
|
||||||
set roomPassword(String value) {
|
});
|
||||||
|
|
||||||
|
// 房间密码相关
|
||||||
|
class RoomPasswordNotifier extends StateNotifier<String> {
|
||||||
|
final AppConfig _config;
|
||||||
|
|
||||||
|
RoomPasswordNotifier(this._config) : super(_config.roomPassword);
|
||||||
|
|
||||||
|
void setRoomPassword(String value) {
|
||||||
_config.setRoomPassword(value);
|
_config.setRoomPassword(value);
|
||||||
notifyListeners();
|
state = value;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//用户名设置
|
final roomPasswordProvider =
|
||||||
String get username => _config.username;
|
StateNotifierProvider<RoomPasswordNotifier, String>((ref) {
|
||||||
set username(String value) {
|
return RoomPasswordNotifier(ref.watch(appConfigProvider));
|
||||||
|
});
|
||||||
|
|
||||||
|
// 用户名相关
|
||||||
|
class UsernameNotifier extends StateNotifier<String> {
|
||||||
|
final AppConfig _config;
|
||||||
|
|
||||||
|
UsernameNotifier(this._config) : super(_config.username);
|
||||||
|
|
||||||
|
void setUsername(String value) {
|
||||||
_config.setUsername(value);
|
_config.setUsername(value);
|
||||||
notifyListeners();
|
state = value;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//虚拟IP设置
|
final usernameProvider = StateNotifierProvider<UsernameNotifier, String>((ref) {
|
||||||
String get virtualIP => _config.virtualIP;
|
return UsernameNotifier(ref.watch(appConfigProvider));
|
||||||
set virtualIP(String value) {
|
});
|
||||||
|
|
||||||
|
// 虚拟IP相关
|
||||||
|
class VirtualIPNotifier extends StateNotifier<String> {
|
||||||
|
final AppConfig _config;
|
||||||
|
|
||||||
|
VirtualIPNotifier(this._config) : super(_config.virtualIP);
|
||||||
|
|
||||||
|
void setVirtualIP(String value) {
|
||||||
_config.setVirtualIP(value);
|
_config.setVirtualIP(value);
|
||||||
notifyListeners();
|
state = value;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//动态获取IP设置
|
final virtualIPProvider =
|
||||||
bool get dynamicIP => _config.dynamicIP;
|
StateNotifierProvider<VirtualIPNotifier, String>((ref) {
|
||||||
set dynamicIP(bool value) {
|
return VirtualIPNotifier(ref.watch(appConfigProvider));
|
||||||
|
});
|
||||||
|
|
||||||
|
// 动态获取IP设置相关
|
||||||
|
class DynamicIPNotifier extends StateNotifier<bool> {
|
||||||
|
final AppConfig _config;
|
||||||
|
|
||||||
|
DynamicIPNotifier(this._config) : super(_config.dynamicIP);
|
||||||
|
|
||||||
|
void setDynamicIP(bool value) {
|
||||||
_config.setDynamicIP(value);
|
_config.setDynamicIP(value);
|
||||||
notifyListeners();
|
state = value;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//服务器列表
|
final dynamicIPProvider = StateNotifierProvider<DynamicIPNotifier, bool>((ref) {
|
||||||
List<Map<String, dynamic>> get serverList => _config.serverList;
|
return DynamicIPNotifier(ref.watch(appConfigProvider));
|
||||||
set serverList(List<Map<String, dynamic>> value) {
|
});
|
||||||
|
|
||||||
|
// 服务器列表相关
|
||||||
|
class ServerListNotifier extends StateNotifier<List<Map<String, dynamic>>> {
|
||||||
|
final AppConfig _config;
|
||||||
|
|
||||||
|
ServerListNotifier(this._config) : super(_config.serverList);
|
||||||
|
|
||||||
|
void setServerList(List<Map<String, dynamic>> value) {
|
||||||
List<Map<String, dynamic>> convertedList = value.map((item) {
|
List<Map<String, dynamic>> convertedList = value.map((item) {
|
||||||
return Map<String, dynamic>.from(item);
|
return Map<String, dynamic>.from(item);
|
||||||
}).toList();
|
}).toList();
|
||||||
_config.setServerList(convertedList);
|
_config.setServerList(convertedList);
|
||||||
notifyListeners();
|
state = convertedList;
|
||||||
}
|
}
|
||||||
|
|
||||||
//获取选中的服务器
|
|
||||||
//获取选中的服务器
|
|
||||||
List<String> get serverIP {
|
|
||||||
try {
|
|
||||||
final selected =
|
|
||||||
serverList.where((server) => server['selected'] == true).toList();
|
|
||||||
|
|
||||||
if (selected.isEmpty && serverList.isNotEmpty) {
|
|
||||||
final firstServer = serverList.first;
|
|
||||||
if (firstServer['url'] is String) {
|
|
||||||
return [firstServer['url'] as String];
|
|
||||||
}
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
return selected
|
|
||||||
.where((server) => server['url'] is String)
|
|
||||||
.map((server) => server['url'] as String)
|
|
||||||
.toList();
|
|
||||||
} catch (e) {
|
|
||||||
debugPrint('获取服务器IP时出错: $e');
|
|
||||||
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//设置服务器选中状态
|
|
||||||
void setServerSelected(String url, bool selected) {
|
void setServerSelected(String url, bool selected) {
|
||||||
final servers = serverList;
|
final servers = [...state];
|
||||||
for (var i = 0; i < servers.length; i++) {
|
for (var i = 0; i < servers.length; i++) {
|
||||||
if (servers[i]['url'] == url) {
|
if (servers[i]['url'] == url) {
|
||||||
servers[i]['selected'] = selected;
|
servers[i]['selected'] = selected;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
serverList = servers;
|
setServerList(servers);
|
||||||
}
|
|
||||||
|
|
||||||
// 节点列表
|
|
||||||
List<KVNodeInfo> _nodes = [];
|
|
||||||
List<KVNodeInfo> get nodes => _nodes;
|
|
||||||
set nodes(List<KVNodeInfo> value) {
|
|
||||||
_nodes = value;
|
|
||||||
notifyListeners();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final serverListProvider =
|
||||||
|
StateNotifierProvider<ServerListNotifier, List<Map<String, dynamic>>>(
|
||||||
|
(ref) {
|
||||||
|
return ServerListNotifier(ref.watch(appConfigProvider));
|
||||||
|
});
|
||||||
|
|
||||||
|
// 选中的服务器IP
|
||||||
|
final serverIPProvider = Provider<List<String>>((ref) {
|
||||||
|
final serverList = ref.watch(serverListProvider);
|
||||||
|
|
||||||
|
try {
|
||||||
|
final selected =
|
||||||
|
serverList.where((server) => server['selected'] == true).toList();
|
||||||
|
|
||||||
|
if (selected.isEmpty && serverList.isNotEmpty) {
|
||||||
|
final firstServer = serverList.first;
|
||||||
|
if (firstServer['url'] is String) {
|
||||||
|
return [firstServer['url'] as String];
|
||||||
|
}
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
return selected
|
||||||
|
.where((server) => server['url'] is String)
|
||||||
|
.map((server) => server['url'] as String)
|
||||||
|
.toList();
|
||||||
|
} catch (e) {
|
||||||
|
debugPrint('获取服务器IP时出错: $e');
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
//返回选中的服务器
|
||||||
|
final selectedServerProvider = Provider<List<ServerConfig>>((ref) {
|
||||||
|
final serverList = ref.watch(serverListProvider);
|
||||||
|
final selected =
|
||||||
|
serverList.where((server) => server['selected'] == true).toList();
|
||||||
|
if (selected.isEmpty) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
// 将选中的服务器转换为ServerConfig对象列表
|
||||||
|
return selected
|
||||||
|
.map((server) => ServerConfig(
|
||||||
|
url: server['url'] ?? '',
|
||||||
|
name: server['name'] ?? '',
|
||||||
|
selected: true,
|
||||||
|
tcp: server['tcp'] ?? true,
|
||||||
|
udp: server['udp'] ?? true,
|
||||||
|
ws: server['ws'] ?? false,
|
||||||
|
wss: server['wss'] ?? false,
|
||||||
|
quic: server['quic'] ?? false,
|
||||||
|
))
|
||||||
|
.toList();
|
||||||
|
});
|
||||||
|
|
||||||
|
// 节点列表相关
|
||||||
|
class NodesNotifier extends StateNotifier<List<KVNodeInfo>> {
|
||||||
|
NodesNotifier() : super([]);
|
||||||
|
|
||||||
|
void setNodes(List<KVNodeInfo> value) {
|
||||||
|
state = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
final nodesProvider = StateNotifierProvider<NodesNotifier, List<KVNodeInfo>>(
|
||||||
|
(ref) => NodesNotifier());
|
||||||
|
|
||||||
|
// 高级配置相关
|
||||||
|
class AdvancedConfigNotifier extends StateNotifier<Map<String, dynamic>> {
|
||||||
|
final AppConfig _config;
|
||||||
|
|
||||||
|
AdvancedConfigNotifier(this._config)
|
||||||
|
: super({
|
||||||
|
'defaultProtocol': _config.advanced.defaultProtocol,
|
||||||
|
'devName': _config.advanced.devName,
|
||||||
|
'enableEncryption': _config.advanced.enableEncryption,
|
||||||
|
'enableIpv6': _config.advanced.enableIpv6,
|
||||||
|
'mtu': _config.advanced.mtu,
|
||||||
|
'latencyFirst': _config.advanced.latencyFirst,
|
||||||
|
'enableExitNode': _config.advanced.enableExitNode,
|
||||||
|
'proxyForwardBySystem': _config.advanced.proxyForwardBySystem,
|
||||||
|
'noTun': _config.advanced.noTun,
|
||||||
|
'useSmoltcp': _config.advanced.useSmoltcp,
|
||||||
|
'relayNetworkWhitelist': _config.advanced.relayNetworkWhitelist,
|
||||||
|
'disableP2p': _config.advanced.disableP2p,
|
||||||
|
'relayAllPeerRpc': _config.advanced.relayAllPeerRpc,
|
||||||
|
'disableUdpHolePunching': _config.advanced.disableUdpHolePunching,
|
||||||
|
'multiThread': _config.advanced.multiThread,
|
||||||
|
'dataCompressAlgo': _config.advanced.dataCompressAlgo,
|
||||||
|
'bindDevice': _config.advanced.bindDevice,
|
||||||
|
'enableKcpProxy': _config.advanced.enableKcpProxy,
|
||||||
|
'disableKcpInput': _config.advanced.disableKcpInput,
|
||||||
|
'disableRelayKcp': _config.advanced.disableRelayKcp,
|
||||||
|
});
|
||||||
|
|
||||||
|
// 更新单个配置项
|
||||||
|
Future<void> updateConfig(String key, dynamic value) async {
|
||||||
|
if (state.containsKey(key) && state[key] != value) {
|
||||||
|
final newState = {...state, key: value};
|
||||||
|
state = newState;
|
||||||
|
|
||||||
|
// 使用通用方法更新配置
|
||||||
|
await _config.updateAdvancedConfig(
|
||||||
|
defaultProtocol: key == 'defaultProtocol' ? value : null,
|
||||||
|
devName: key == 'devName' ? value : null,
|
||||||
|
enableEncryption: key == 'enableEncryption' ? value : null,
|
||||||
|
enableIpv6: key == 'enableIpv6' ? value : null,
|
||||||
|
mtu: key == 'mtu' ? value : null,
|
||||||
|
latencyFirst: key == 'latencyFirst' ? value : null,
|
||||||
|
enableExitNode: key == 'enableExitNode' ? value : null,
|
||||||
|
proxyForwardBySystem: key == 'proxyForwardBySystem' ? value : null,
|
||||||
|
noTun: key == 'noTun' ? value : null,
|
||||||
|
useSmoltcp: key == 'useSmoltcp' ? value : null,
|
||||||
|
relayNetworkWhitelist: key == 'relayNetworkWhitelist' ? value : null,
|
||||||
|
disableP2p: key == 'disableP2p' ? value : null,
|
||||||
|
relayAllPeerRpc: key == 'relayAllPeerRpc' ? value : null,
|
||||||
|
disableUdpHolePunching: key == 'disableUdpHolePunching' ? value : null,
|
||||||
|
multiThread: key == 'multiThread' ? value : null,
|
||||||
|
dataCompressAlgo: key == 'dataCompressAlgo' ? value : null,
|
||||||
|
bindDevice: key == 'bindDevice' ? value : null,
|
||||||
|
enableKcpProxy: key == 'enableKcpProxy' ? value : null,
|
||||||
|
disableKcpInput: key == 'disableKcpInput' ? value : null,
|
||||||
|
disableRelayKcp: key == 'disableRelayKcp' ? value : null,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 批量更新配置
|
||||||
|
Future<void> updateMultipleConfigs(Map<String, dynamic> updates) async {
|
||||||
|
final newState = {...state, ...updates};
|
||||||
|
state = newState;
|
||||||
|
|
||||||
|
// 使用通用方法更新配置
|
||||||
|
await _config.updateAdvancedConfig(
|
||||||
|
defaultProtocol: updates.containsKey('defaultProtocol')
|
||||||
|
? updates['defaultProtocol']
|
||||||
|
: null,
|
||||||
|
devName: updates.containsKey('devName') ? updates['devName'] : null,
|
||||||
|
enableEncryption: updates.containsKey('enableEncryption')
|
||||||
|
? updates['enableEncryption']
|
||||||
|
: null,
|
||||||
|
enableIpv6:
|
||||||
|
updates.containsKey('enableIpv6') ? updates['enableIpv6'] : null,
|
||||||
|
mtu: updates.containsKey('mtu') ? updates['mtu'] : null,
|
||||||
|
latencyFirst:
|
||||||
|
updates.containsKey('latencyFirst') ? updates['latencyFirst'] : null,
|
||||||
|
enableExitNode: updates.containsKey('enableExitNode')
|
||||||
|
? updates['enableExitNode']
|
||||||
|
: null,
|
||||||
|
proxyForwardBySystem: updates.containsKey('proxyForwardBySystem')
|
||||||
|
? updates['proxyForwardBySystem']
|
||||||
|
: null,
|
||||||
|
noTun: updates.containsKey('noTun') ? updates['noTun'] : null,
|
||||||
|
useSmoltcp:
|
||||||
|
updates.containsKey('useSmoltcp') ? updates['useSmoltcp'] : null,
|
||||||
|
relayNetworkWhitelist: updates.containsKey('relayNetworkWhitelist')
|
||||||
|
? updates['relayNetworkWhitelist']
|
||||||
|
: null,
|
||||||
|
disableP2p:
|
||||||
|
updates.containsKey('disableP2p') ? updates['disableP2p'] : null,
|
||||||
|
relayAllPeerRpc: updates.containsKey('relayAllPeerRpc')
|
||||||
|
? updates['relayAllPeerRpc']
|
||||||
|
: null,
|
||||||
|
disableUdpHolePunching: updates.containsKey('disableUdpHolePunching')
|
||||||
|
? updates['disableUdpHolePunching']
|
||||||
|
: null,
|
||||||
|
multiThread:
|
||||||
|
updates.containsKey('multiThread') ? updates['multiThread'] : null,
|
||||||
|
dataCompressAlgo: updates.containsKey('dataCompressAlgo')
|
||||||
|
? updates['dataCompressAlgo']
|
||||||
|
: null,
|
||||||
|
bindDevice:
|
||||||
|
updates.containsKey('bindDevice') ? updates['bindDevice'] : null,
|
||||||
|
enableKcpProxy: updates.containsKey('enableKcpProxy')
|
||||||
|
? updates['enableKcpProxy']
|
||||||
|
: null,
|
||||||
|
disableKcpInput: updates.containsKey('disableKcpInput')
|
||||||
|
? updates['disableKcpInput']
|
||||||
|
: null,
|
||||||
|
disableRelayKcp: updates.containsKey('disableRelayKcp')
|
||||||
|
? updates['disableRelayKcp']
|
||||||
|
: null,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 为每个配置项提供单独的更新方法
|
||||||
|
Future<void> setDefaultProtocol(String value) async =>
|
||||||
|
updateConfig('defaultProtocol', value);
|
||||||
|
Future<void> setDevName(String value) async => updateConfig('devName', value);
|
||||||
|
Future<void> setEnableEncryption(bool value) async =>
|
||||||
|
updateConfig('enableEncryption', value);
|
||||||
|
Future<void> setEnableIpv6(bool value) async =>
|
||||||
|
updateConfig('enableIpv6', value);
|
||||||
|
Future<void> setMtu(int value) async => updateConfig('mtu', value);
|
||||||
|
Future<void> setLatencyFirst(bool value) async =>
|
||||||
|
updateConfig('latencyFirst', value);
|
||||||
|
Future<void> setEnableExitNode(bool value) async =>
|
||||||
|
updateConfig('enableExitNode', value);
|
||||||
|
Future<void> setProxyForwardBySystem(bool value) async =>
|
||||||
|
updateConfig('proxyForwardBySystem', value);
|
||||||
|
Future<void> setNoTun(bool value) async => updateConfig('noTun', value);
|
||||||
|
Future<void> setUseSmoltcp(bool value) async =>
|
||||||
|
updateConfig('useSmoltcp', value);
|
||||||
|
Future<void> setRelayNetworkWhitelist(String value) async =>
|
||||||
|
updateConfig('relayNetworkWhitelist', value);
|
||||||
|
Future<void> setDisableP2p(bool value) async =>
|
||||||
|
updateConfig('disableP2p', value);
|
||||||
|
Future<void> setRelayAllPeerRpc(bool value) async =>
|
||||||
|
updateConfig('relayAllPeerRpc', value);
|
||||||
|
Future<void> setDisableUdpHolePunching(bool value) async =>
|
||||||
|
updateConfig('disableUdpHolePunching', value);
|
||||||
|
Future<void> setMultiThread(bool value) async =>
|
||||||
|
updateConfig('multiThread', value);
|
||||||
|
Future<void> setDataCompressAlgo(String value) async =>
|
||||||
|
updateConfig('dataCompressAlgo', value);
|
||||||
|
Future<void> setBindDevice(bool value) async =>
|
||||||
|
updateConfig('bindDevice', value);
|
||||||
|
Future<void> setEnableKcpProxy(bool value) async =>
|
||||||
|
updateConfig('enableKcpProxy', value);
|
||||||
|
Future<void> setDisableKcpInput(bool value) async =>
|
||||||
|
updateConfig('disableKcpInput', value);
|
||||||
|
Future<void> setDisableRelayKcp(bool value) async =>
|
||||||
|
updateConfig('disableRelayKcp', value);
|
||||||
|
}
|
||||||
|
|
||||||
|
final advancedConfigProvider =
|
||||||
|
StateNotifierProvider<AdvancedConfigNotifier, Map<String, dynamic>>((ref) {
|
||||||
|
return AdvancedConfigNotifier(ref.watch(appConfigProvider));
|
||||||
|
});
|
||||||
|
|
||||||
|
// 为每个高级配置项创建单独的Provider,方便在UI中使用
|
||||||
|
final defaultProtocolProvider = Provider<String>((ref) {
|
||||||
|
return ref.watch(advancedConfigProvider)['defaultProtocol'];
|
||||||
|
});
|
||||||
|
|
||||||
|
final devNameProvider = Provider<String>((ref) {
|
||||||
|
return ref.watch(advancedConfigProvider)['devName'];
|
||||||
|
});
|
||||||
|
|
||||||
|
final enableEncryptionProvider = Provider<bool>((ref) {
|
||||||
|
return ref.watch(advancedConfigProvider)['enableEncryption'];
|
||||||
|
});
|
||||||
|
|
||||||
|
final enableIpv6Provider = Provider<bool>((ref) {
|
||||||
|
return ref.watch(advancedConfigProvider)['enableIpv6'];
|
||||||
|
});
|
||||||
|
|
||||||
|
final mtuProvider = Provider<int>((ref) {
|
||||||
|
return ref.watch(advancedConfigProvider)['mtu'];
|
||||||
|
});
|
||||||
|
|
||||||
|
final latencyFirstProvider = Provider<bool>((ref) {
|
||||||
|
return ref.watch(advancedConfigProvider)['latencyFirst'];
|
||||||
|
});
|
||||||
|
|
||||||
|
final enableExitNodeProvider = Provider<bool>((ref) {
|
||||||
|
return ref.watch(advancedConfigProvider)['enableExitNode'];
|
||||||
|
});
|
||||||
|
|
||||||
|
final proxyForwardBySystemProvider = Provider<bool>((ref) {
|
||||||
|
return ref.watch(advancedConfigProvider)['proxyForwardBySystem'];
|
||||||
|
});
|
||||||
|
|
||||||
|
final noTunProvider = Provider<bool>((ref) {
|
||||||
|
return ref.watch(advancedConfigProvider)['noTun'];
|
||||||
|
});
|
||||||
|
|
||||||
|
final useSmoltcpProvider = Provider<bool>((ref) {
|
||||||
|
return ref.watch(advancedConfigProvider)['useSmoltcp'];
|
||||||
|
});
|
||||||
|
|
||||||
|
final relayNetworkWhitelistProvider = Provider<String>((ref) {
|
||||||
|
return ref.watch(advancedConfigProvider)['relayNetworkWhitelist'];
|
||||||
|
});
|
||||||
|
|
||||||
|
final disableP2pProvider = Provider<bool>((ref) {
|
||||||
|
return ref.watch(advancedConfigProvider)['disableP2p'];
|
||||||
|
});
|
||||||
|
|
||||||
|
final relayAllPeerRpcProvider = Provider<bool>((ref) {
|
||||||
|
return ref.watch(advancedConfigProvider)['relayAllPeerRpc'];
|
||||||
|
});
|
||||||
|
|
||||||
|
final disableUdpHolePunchingProvider = Provider<bool>((ref) {
|
||||||
|
return ref.watch(advancedConfigProvider)['disableUdpHolePunching'];
|
||||||
|
});
|
||||||
|
|
||||||
|
final multiThreadProvider = Provider<bool>((ref) {
|
||||||
|
return ref.watch(advancedConfigProvider)['multiThread'];
|
||||||
|
});
|
||||||
|
|
||||||
|
final dataCompressAlgoProvider = Provider<String>((ref) {
|
||||||
|
return ref.watch(advancedConfigProvider)['dataCompressAlgo'];
|
||||||
|
});
|
||||||
|
|
||||||
|
final bindDeviceProvider = Provider<bool>((ref) {
|
||||||
|
return ref.watch(advancedConfigProvider)['bindDevice'];
|
||||||
|
});
|
||||||
|
|
||||||
|
final enableKcpProxyProvider = Provider<bool>((ref) {
|
||||||
|
return ref.watch(advancedConfigProvider)['enableKcpProxy'];
|
||||||
|
});
|
||||||
|
|
||||||
|
final disableKcpInputProvider = Provider<bool>((ref) {
|
||||||
|
return ref.watch(advancedConfigProvider)['disableKcpInput'];
|
||||||
|
});
|
||||||
|
|
||||||
|
final disableRelayKcpProvider = Provider<bool>((ref) {
|
||||||
|
return ref.watch(advancedConfigProvider)['disableRelayKcp'];
|
||||||
|
});
|
||||||
|
|||||||
@@ -0,0 +1,198 @@
|
|||||||
|
import 'dart:convert';
|
||||||
|
|
||||||
|
// 主入口类
|
||||||
|
class StatusPageData {
|
||||||
|
final Config config;
|
||||||
|
final Incident incident;
|
||||||
|
final List<PublicGroup> publicGroupList;
|
||||||
|
|
||||||
|
StatusPageData({
|
||||||
|
required this.config,
|
||||||
|
required this.incident,
|
||||||
|
required this.publicGroupList,
|
||||||
|
});
|
||||||
|
|
||||||
|
factory StatusPageData.fromJson(Map<String, dynamic> json) => StatusPageData(
|
||||||
|
config: Config.fromJson(json['config']),
|
||||||
|
incident: Incident.fromJson(json['incident']),
|
||||||
|
publicGroupList: List<PublicGroup>.from(
|
||||||
|
json['publicGroupList'].map((x) => PublicGroup.fromJson(x))),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 配置信息
|
||||||
|
class Config {
|
||||||
|
final String slug;
|
||||||
|
final String title;
|
||||||
|
final String description;
|
||||||
|
final String icon;
|
||||||
|
final String theme;
|
||||||
|
final bool published;
|
||||||
|
final bool showTags;
|
||||||
|
final String customCSS;
|
||||||
|
final String footerText;
|
||||||
|
final bool showPoweredBy;
|
||||||
|
final dynamic googleAnalyticsId;
|
||||||
|
final bool showCertificateExpiry;
|
||||||
|
|
||||||
|
Config({
|
||||||
|
required this.slug,
|
||||||
|
required this.title,
|
||||||
|
required this.description,
|
||||||
|
required this.icon,
|
||||||
|
required this.theme,
|
||||||
|
required this.published,
|
||||||
|
required this.showTags,
|
||||||
|
required this.customCSS,
|
||||||
|
required this.footerText,
|
||||||
|
required this.showPoweredBy,
|
||||||
|
this.googleAnalyticsId,
|
||||||
|
required this.showCertificateExpiry,
|
||||||
|
});
|
||||||
|
|
||||||
|
factory Config.fromJson(Map<String, dynamic> json) => Config(
|
||||||
|
slug: json['slug'],
|
||||||
|
title: json['title'],
|
||||||
|
description: json['description'],
|
||||||
|
icon: json['icon'],
|
||||||
|
theme: json['theme'],
|
||||||
|
published: json['published'],
|
||||||
|
showTags: json['showTags'],
|
||||||
|
customCSS: json['customCSS'],
|
||||||
|
footerText: json['footerText'],
|
||||||
|
showPoweredBy: json['showPoweredBy'],
|
||||||
|
googleAnalyticsId: json['googleAnalyticsId'],
|
||||||
|
showCertificateExpiry: json['showCertificateExpiry'],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 事件信息
|
||||||
|
class Incident {
|
||||||
|
final int id;
|
||||||
|
final String style;
|
||||||
|
final String title;
|
||||||
|
final String content;
|
||||||
|
final int pin;
|
||||||
|
final DateTime createdDate;
|
||||||
|
final DateTime lastUpdatedDate;
|
||||||
|
|
||||||
|
Incident({
|
||||||
|
required this.id,
|
||||||
|
required this.style,
|
||||||
|
required this.title,
|
||||||
|
required this.content,
|
||||||
|
required this.pin,
|
||||||
|
required this.createdDate,
|
||||||
|
required this.lastUpdatedDate,
|
||||||
|
});
|
||||||
|
|
||||||
|
factory Incident.fromJson(Map<String, dynamic> json) => Incident(
|
||||||
|
id: json['id'],
|
||||||
|
style: json['style'],
|
||||||
|
title: json['title'],
|
||||||
|
content: json['content'],
|
||||||
|
pin: json['pin'],
|
||||||
|
createdDate: DateTime.parse(json['createdDate']),
|
||||||
|
lastUpdatedDate: DateTime.parse(json['lastUpdatedDate']),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 公共服务器组
|
||||||
|
class PublicGroup {
|
||||||
|
final int id;
|
||||||
|
final String name;
|
||||||
|
final int weight;
|
||||||
|
final List<Monitor> monitorList;
|
||||||
|
|
||||||
|
PublicGroup({
|
||||||
|
required this.id,
|
||||||
|
required this.name,
|
||||||
|
required this.weight,
|
||||||
|
required this.monitorList,
|
||||||
|
});
|
||||||
|
|
||||||
|
factory PublicGroup.fromJson(Map<String, dynamic> json) => PublicGroup(
|
||||||
|
id: json['id'],
|
||||||
|
name: json['name'],
|
||||||
|
weight: json['weight'],
|
||||||
|
monitorList: List<Monitor>.from(
|
||||||
|
json['monitorList'].map((x) => Monitor.fromJson(x))),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 监控项
|
||||||
|
class Monitor {
|
||||||
|
final int id;
|
||||||
|
final String name;
|
||||||
|
final int sendUrl;
|
||||||
|
final String type;
|
||||||
|
final List<Tag> tags;
|
||||||
|
final int? certExpiryDaysRemaining;
|
||||||
|
final bool? validCert;
|
||||||
|
|
||||||
|
Monitor({
|
||||||
|
required this.id,
|
||||||
|
required this.name,
|
||||||
|
required this.sendUrl,
|
||||||
|
required this.type,
|
||||||
|
required this.tags,
|
||||||
|
this.certExpiryDaysRemaining,
|
||||||
|
this.validCert,
|
||||||
|
});
|
||||||
|
|
||||||
|
factory Monitor.fromJson(Map<String, dynamic> json) => Monitor(
|
||||||
|
id: json['id'],
|
||||||
|
name: json['name'],
|
||||||
|
sendUrl: json['sendUrl'],
|
||||||
|
type: json['type'],
|
||||||
|
tags: List<Tag>.from(json['tags'].map((x) => Tag.fromJson(x))),
|
||||||
|
certExpiryDaysRemaining: json['certExpiryDaysRemaining'],
|
||||||
|
validCert: json['validCert'],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 标签
|
||||||
|
class Tag {
|
||||||
|
final int id;
|
||||||
|
final int monitorId;
|
||||||
|
final int tagId;
|
||||||
|
final String value;
|
||||||
|
final String name;
|
||||||
|
final String color;
|
||||||
|
|
||||||
|
Tag({
|
||||||
|
required this.id,
|
||||||
|
required this.monitorId,
|
||||||
|
required this.tagId,
|
||||||
|
required this.value,
|
||||||
|
required this.name,
|
||||||
|
required this.color,
|
||||||
|
});
|
||||||
|
|
||||||
|
factory Tag.fromJson(Map<String, dynamic> json) => Tag(
|
||||||
|
id: json['id'],
|
||||||
|
monitorId: json['monitor_id'],
|
||||||
|
tagId: json['tag_id'],
|
||||||
|
value: json['value'],
|
||||||
|
name: json['name'],
|
||||||
|
color: json['color'],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// // 使用示例
|
||||||
|
// void main() {
|
||||||
|
// final jsonString = '''{/* 你的原始JSON数据 */}''';
|
||||||
|
|
||||||
|
// final data = StatusPageData.fromJson(jsonDecode(jsonString));
|
||||||
|
|
||||||
|
// // 示例:获取第一个服务器组的名称
|
||||||
|
// print('第一组名称: ${data.publicGroupList.first.name}');
|
||||||
|
|
||||||
|
// // 示例:列出所有可中转的服务器
|
||||||
|
// final transferableServers = data.publicGroupList
|
||||||
|
// .expand((group) => group.monitorList)
|
||||||
|
// .where((monitor) => monitor.tags.any((tag) => tag.name == '可中转'))
|
||||||
|
// .toList();
|
||||||
|
|
||||||
|
// print('可中转服务器数量: ${transferableServers.length}');
|
||||||
|
// }
|
||||||
+329
-140
File diff suppressed because it is too large
Load Diff
+10
-1
@@ -52,11 +52,18 @@ dependencies:
|
|||||||
flutter_local_notifications: ^19.0.0
|
flutter_local_notifications: ^19.0.0
|
||||||
windows_notification: ^1.3.0
|
windows_notification: ^1.3.0
|
||||||
fl_chart: ^0.70.2
|
fl_chart: ^0.70.2
|
||||||
|
sqflite: ^2.4.2
|
||||||
|
path: ^1.9.1
|
||||||
|
flutter_riverpod: ^2.6.1
|
||||||
|
floor_generator: ^1.5.0
|
||||||
|
build_runner: ^2.4.15
|
||||||
|
hive: ^2.2.3
|
||||||
|
hive_flutter: ^1.1.0
|
||||||
|
http: ^1.1.0
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
flutter_test:
|
flutter_test:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
build_runner: ^2.4.6
|
|
||||||
json_serializable: ^6.7.1
|
json_serializable: ^6.7.1
|
||||||
# The "flutter_lints" package below contains a set of recommended lints to
|
# The "flutter_lints" package below contains a set of recommended lints to
|
||||||
# encourage good coding practices. The lint set provided by the package is
|
# encourage good coding practices. The lint set provided by the package is
|
||||||
@@ -64,6 +71,8 @@ dev_dependencies:
|
|||||||
# package. See that file for information about deactivating specific lint
|
# package. See that file for information about deactivating specific lint
|
||||||
# rules and activating additional ones.
|
# rules and activating additional ones.
|
||||||
flutter_lints: ^5.0.0
|
flutter_lints: ^5.0.0
|
||||||
|
hive_generator: ^2.0.0
|
||||||
|
build_runner: ^2.3.3
|
||||||
integration_test:
|
integration_test:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
|
|
||||||
|
|||||||
@@ -30,6 +30,6 @@ pub const WIN_SERVICE_WORK_DIR_REG_KEY: &str = "SOFTWARE\\EasyTier\\Service\\Wor
|
|||||||
pub const EASYTIER_VERSION: &str = git_version::git_version!(
|
pub const EASYTIER_VERSION: &str = git_version::git_version!(
|
||||||
args = ["--abbrev=8", "--always", "--dirty=~"],
|
args = ["--abbrev=8", "--always", "--dirty=~"],
|
||||||
prefix = concat!(env!("CARGO_PKG_VERSION"), "-"),
|
prefix = concat!(env!("CARGO_PKG_VERSION"), "-"),
|
||||||
suffix = "",
|
suffix = "-astral",
|
||||||
fallback = "astral"
|
fallback = concat!(env!("CARGO_PKG_VERSION"), "-astral")
|
||||||
);
|
);
|
||||||
|
|||||||
+48
-5
@@ -2,7 +2,7 @@ pub use std::collections::BTreeMap;
|
|||||||
//use BTreeMap
|
//use BTreeMap
|
||||||
use dashmap::DashMap;
|
use dashmap::DashMap;
|
||||||
pub use easytier::common::global_ctx::{EventBusSubscriber, GlobalCtxEvent};
|
pub use easytier::common::global_ctx::{EventBusSubscriber, GlobalCtxEvent};
|
||||||
use easytier::common::scoped_task::ScopedTask;
|
use easytier::common::{config::Flags, scoped_task::ScopedTask};
|
||||||
pub use easytier::{
|
pub use easytier::{
|
||||||
common::config::{ConfigLoader, TomlConfigLoader},
|
common::config::{ConfigLoader, TomlConfigLoader},
|
||||||
launcher::NetworkInstance,
|
launcher::NetworkInstance,
|
||||||
@@ -158,6 +158,7 @@ fn create_config() -> TomlConfigLoader {
|
|||||||
cfg.set_listeners(vec![
|
cfg.set_listeners(vec![
|
||||||
"tcp://0.0.0.0:11010".to_string().parse().unwrap(),
|
"tcp://0.0.0.0:11010".to_string().parse().unwrap(),
|
||||||
"udp://0.0.0.0:11010".to_string().parse().unwrap(),
|
"udp://0.0.0.0:11010".to_string().parse().unwrap(),
|
||||||
|
"tcp://[::]:11010".to_string().parse().unwrap(),
|
||||||
]);
|
]);
|
||||||
// cfg.set_inst_name("default".to_string());
|
// cfg.set_inst_name("default".to_string());
|
||||||
// cfg.set_inst_name(name);
|
// cfg.set_inst_name(name);
|
||||||
@@ -566,6 +567,30 @@ pub fn get_running_info() -> String {
|
|||||||
.unwrap_or_else(|| "{}".to_string())
|
.unwrap_or_else(|| "{}".to_string())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub struct FlagsC {
|
||||||
|
pub default_protocol: String,
|
||||||
|
pub dev_name: String,
|
||||||
|
pub enable_encryption: bool,
|
||||||
|
pub enable_ipv6: bool,
|
||||||
|
pub mtu: u32,
|
||||||
|
pub latency_first: bool,
|
||||||
|
pub enable_exit_node: bool,
|
||||||
|
pub no_tun: bool,
|
||||||
|
pub use_smoltcp: bool,
|
||||||
|
pub relay_network_whitelist: String,
|
||||||
|
pub disable_p2p: bool,
|
||||||
|
pub relay_all_peer_rpc: bool,
|
||||||
|
pub disable_udp_hole_punching: bool,
|
||||||
|
/// string ipv6_listener = 14; \[deprecated = true\]; use -l udp://\[::\]:12345 instead
|
||||||
|
pub multi_thread: bool,
|
||||||
|
pub data_compress_algo: i32,
|
||||||
|
pub bind_device: bool,
|
||||||
|
pub enable_kcp_proxy: bool,
|
||||||
|
pub disable_kcp_input: bool,
|
||||||
|
pub disable_relay_kcp: bool,
|
||||||
|
pub proxy_forward_by_system: bool,
|
||||||
|
}
|
||||||
|
|
||||||
// 创建服务器
|
// 创建服务器
|
||||||
pub fn create_server(
|
pub fn create_server(
|
||||||
username: String,
|
username: String,
|
||||||
@@ -574,6 +599,7 @@ pub fn create_server(
|
|||||||
room_name: String,
|
room_name: String,
|
||||||
room_password: String,
|
room_password: String,
|
||||||
severurl: Vec<String>,
|
severurl: Vec<String>,
|
||||||
|
flag:FlagsC,
|
||||||
) {
|
) {
|
||||||
RT.spawn(async move {
|
RT.spawn(async move {
|
||||||
// 创建一个示例配置
|
// 创建一个示例配置
|
||||||
@@ -581,6 +607,26 @@ pub fn create_server(
|
|||||||
cfg.set_hostname(Option::from(username));
|
cfg.set_hostname(Option::from(username));
|
||||||
cfg.set_dhcp(enable_dhcp);
|
cfg.set_dhcp(enable_dhcp);
|
||||||
let mut flags = cfg.get_flags();
|
let mut flags = cfg.get_flags();
|
||||||
|
flags.default_protocol = flag.default_protocol;
|
||||||
|
flags.dev_name = flag.dev_name;
|
||||||
|
flags.enable_encryption = flag.enable_encryption;
|
||||||
|
flags.enable_ipv6 = flag.enable_ipv6;
|
||||||
|
flags.mtu = flag.mtu;
|
||||||
|
flags.latency_first = flag.latency_first;
|
||||||
|
flags.enable_exit_node = flag.enable_exit_node;
|
||||||
|
flags.no_tun = flag.no_tun;
|
||||||
|
flags.use_smoltcp = flag.use_smoltcp;
|
||||||
|
flags.relay_network_whitelist = flag.relay_network_whitelist;
|
||||||
|
flags.disable_p2p = flag.disable_p2p;
|
||||||
|
flags.relay_all_peer_rpc = flag.relay_all_peer_rpc;
|
||||||
|
flags.disable_udp_hole_punching = flag.disable_udp_hole_punching;
|
||||||
|
flags.multi_thread = flag.multi_thread;
|
||||||
|
flags.data_compress_algo = flag.data_compress_algo;
|
||||||
|
flags.bind_device = flag.bind_device;
|
||||||
|
flags.enable_kcp_proxy = flag.enable_kcp_proxy;
|
||||||
|
flags.disable_kcp_input = flag.disable_kcp_input;
|
||||||
|
flags.disable_relay_kcp = flag.disable_relay_kcp;
|
||||||
|
flags.proxy_forward_by_system = flag.proxy_forward_by_system;
|
||||||
// flags.dev_name = "astral".to_string();
|
// flags.dev_name = "astral".to_string();
|
||||||
cfg.set_flags(flags);
|
cfg.set_flags(flags);
|
||||||
// 创建TCP和UDP连接配置列表
|
// 创建TCP和UDP连接配置列表
|
||||||
@@ -588,10 +634,7 @@ pub fn create_server(
|
|||||||
// 为每个服务器URL创建TCP和UDP配置
|
// 为每个服务器URL创建TCP和UDP配置
|
||||||
for url in severurl {
|
for url in severurl {
|
||||||
peer_configs.push(PeerConfig {
|
peer_configs.push(PeerConfig {
|
||||||
uri: format!("tcp://{}", url).parse().unwrap(),
|
uri: format!("{}", url).parse().unwrap(),
|
||||||
});
|
|
||||||
peer_configs.push(PeerConfig {
|
|
||||||
uri: format!("udp://{}", url).parse().unwrap(),
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -108,6 +108,7 @@ fn wire__crate__api__simple__create_server_impl(
|
|||||||
let api_room_name = <String>::sse_decode(&mut deserializer);
|
let api_room_name = <String>::sse_decode(&mut deserializer);
|
||||||
let api_room_password = <String>::sse_decode(&mut deserializer);
|
let api_room_password = <String>::sse_decode(&mut deserializer);
|
||||||
let api_severurl = <Vec<String>>::sse_decode(&mut deserializer);
|
let api_severurl = <Vec<String>>::sse_decode(&mut deserializer);
|
||||||
|
let api_flag = <crate::api::simple::FlagsC>::sse_decode(&mut deserializer);
|
||||||
deserializer.end();
|
deserializer.end();
|
||||||
move |context| {
|
move |context| {
|
||||||
transform_result_sse::<_, ()>((move || {
|
transform_result_sse::<_, ()>((move || {
|
||||||
@@ -119,6 +120,7 @@ fn wire__crate__api__simple__create_server_impl(
|
|||||||
api_room_name,
|
api_room_name,
|
||||||
api_room_password,
|
api_room_password,
|
||||||
api_severurl,
|
api_severurl,
|
||||||
|
api_flag,
|
||||||
);
|
);
|
||||||
})?;
|
})?;
|
||||||
Ok(output_ok)
|
Ok(output_ok)
|
||||||
@@ -510,6 +512,54 @@ impl SseDecode for f64 {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl SseDecode for crate::api::simple::FlagsC {
|
||||||
|
// Codec=Sse (Serialization based), see doc to use other codecs
|
||||||
|
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {
|
||||||
|
let mut var_defaultProtocol = <String>::sse_decode(deserializer);
|
||||||
|
let mut var_devName = <String>::sse_decode(deserializer);
|
||||||
|
let mut var_enableEncryption = <bool>::sse_decode(deserializer);
|
||||||
|
let mut var_enableIpv6 = <bool>::sse_decode(deserializer);
|
||||||
|
let mut var_mtu = <u32>::sse_decode(deserializer);
|
||||||
|
let mut var_latencyFirst = <bool>::sse_decode(deserializer);
|
||||||
|
let mut var_enableExitNode = <bool>::sse_decode(deserializer);
|
||||||
|
let mut var_noTun = <bool>::sse_decode(deserializer);
|
||||||
|
let mut var_useSmoltcp = <bool>::sse_decode(deserializer);
|
||||||
|
let mut var_relayNetworkWhitelist = <String>::sse_decode(deserializer);
|
||||||
|
let mut var_disableP2P = <bool>::sse_decode(deserializer);
|
||||||
|
let mut var_relayAllPeerRpc = <bool>::sse_decode(deserializer);
|
||||||
|
let mut var_disableUdpHolePunching = <bool>::sse_decode(deserializer);
|
||||||
|
let mut var_multiThread = <bool>::sse_decode(deserializer);
|
||||||
|
let mut var_dataCompressAlgo = <i32>::sse_decode(deserializer);
|
||||||
|
let mut var_bindDevice = <bool>::sse_decode(deserializer);
|
||||||
|
let mut var_enableKcpProxy = <bool>::sse_decode(deserializer);
|
||||||
|
let mut var_disableKcpInput = <bool>::sse_decode(deserializer);
|
||||||
|
let mut var_disableRelayKcp = <bool>::sse_decode(deserializer);
|
||||||
|
let mut var_proxyForwardBySystem = <bool>::sse_decode(deserializer);
|
||||||
|
return crate::api::simple::FlagsC {
|
||||||
|
default_protocol: var_defaultProtocol,
|
||||||
|
dev_name: var_devName,
|
||||||
|
enable_encryption: var_enableEncryption,
|
||||||
|
enable_ipv6: var_enableIpv6,
|
||||||
|
mtu: var_mtu,
|
||||||
|
latency_first: var_latencyFirst,
|
||||||
|
enable_exit_node: var_enableExitNode,
|
||||||
|
no_tun: var_noTun,
|
||||||
|
use_smoltcp: var_useSmoltcp,
|
||||||
|
relay_network_whitelist: var_relayNetworkWhitelist,
|
||||||
|
disable_p2p: var_disableP2P,
|
||||||
|
relay_all_peer_rpc: var_relayAllPeerRpc,
|
||||||
|
disable_udp_hole_punching: var_disableUdpHolePunching,
|
||||||
|
multi_thread: var_multiThread,
|
||||||
|
data_compress_algo: var_dataCompressAlgo,
|
||||||
|
bind_device: var_bindDevice,
|
||||||
|
enable_kcp_proxy: var_enableKcpProxy,
|
||||||
|
disable_kcp_input: var_disableKcpInput,
|
||||||
|
disable_relay_kcp: var_disableRelayKcp,
|
||||||
|
proxy_forward_by_system: var_proxyForwardBySystem,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl SseDecode for i32 {
|
impl SseDecode for i32 {
|
||||||
// Codec=Sse (Serialization based), see doc to use other codecs
|
// Codec=Sse (Serialization based), see doc to use other codecs
|
||||||
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {
|
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {
|
||||||
@@ -667,6 +717,13 @@ impl SseDecode for (Vec<PeerInfo>, Vec<Route>) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl SseDecode for u32 {
|
||||||
|
// 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_u32::<NativeEndian>().unwrap()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl SseDecode for u64 {
|
impl SseDecode for u64 {
|
||||||
// Codec=Sse (Serialization based), see doc to use other codecs
|
// Codec=Sse (Serialization based), see doc to use other codecs
|
||||||
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {
|
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {
|
||||||
@@ -790,6 +847,40 @@ impl flutter_rust_bridge::IntoIntoDart<FrbWrapper<Route>> for Route {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Codec=Dco (DartCObject based), see doc to use other codecs
|
||||||
|
impl flutter_rust_bridge::IntoDart for crate::api::simple::FlagsC {
|
||||||
|
fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi {
|
||||||
|
[
|
||||||
|
self.default_protocol.into_into_dart().into_dart(),
|
||||||
|
self.dev_name.into_into_dart().into_dart(),
|
||||||
|
self.enable_encryption.into_into_dart().into_dart(),
|
||||||
|
self.enable_ipv6.into_into_dart().into_dart(),
|
||||||
|
self.mtu.into_into_dart().into_dart(),
|
||||||
|
self.latency_first.into_into_dart().into_dart(),
|
||||||
|
self.enable_exit_node.into_into_dart().into_dart(),
|
||||||
|
self.no_tun.into_into_dart().into_dart(),
|
||||||
|
self.use_smoltcp.into_into_dart().into_dart(),
|
||||||
|
self.relay_network_whitelist.into_into_dart().into_dart(),
|
||||||
|
self.disable_p2p.into_into_dart().into_dart(),
|
||||||
|
self.relay_all_peer_rpc.into_into_dart().into_dart(),
|
||||||
|
self.disable_udp_hole_punching.into_into_dart().into_dart(),
|
||||||
|
self.multi_thread.into_into_dart().into_dart(),
|
||||||
|
self.data_compress_algo.into_into_dart().into_dart(),
|
||||||
|
self.bind_device.into_into_dart().into_dart(),
|
||||||
|
self.enable_kcp_proxy.into_into_dart().into_dart(),
|
||||||
|
self.disable_kcp_input.into_into_dart().into_dart(),
|
||||||
|
self.disable_relay_kcp.into_into_dart().into_dart(),
|
||||||
|
self.proxy_forward_by_system.into_into_dart().into_dart(),
|
||||||
|
]
|
||||||
|
.into_dart()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for crate::api::simple::FlagsC {}
|
||||||
|
impl flutter_rust_bridge::IntoIntoDart<crate::api::simple::FlagsC> for crate::api::simple::FlagsC {
|
||||||
|
fn into_into_dart(self) -> crate::api::simple::FlagsC {
|
||||||
|
self
|
||||||
|
}
|
||||||
|
}
|
||||||
// Codec=Dco (DartCObject based), see doc to use other codecs
|
// Codec=Dco (DartCObject based), see doc to use other codecs
|
||||||
impl flutter_rust_bridge::IntoDart for crate::api::simple::KVNetworkStatus {
|
impl flutter_rust_bridge::IntoDart for crate::api::simple::KVNetworkStatus {
|
||||||
fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi {
|
fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi {
|
||||||
@@ -964,6 +1055,32 @@ impl SseEncode for f64 {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl SseEncode for crate::api::simple::FlagsC {
|
||||||
|
// Codec=Sse (Serialization based), see doc to use other codecs
|
||||||
|
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {
|
||||||
|
<String>::sse_encode(self.default_protocol, serializer);
|
||||||
|
<String>::sse_encode(self.dev_name, serializer);
|
||||||
|
<bool>::sse_encode(self.enable_encryption, serializer);
|
||||||
|
<bool>::sse_encode(self.enable_ipv6, serializer);
|
||||||
|
<u32>::sse_encode(self.mtu, serializer);
|
||||||
|
<bool>::sse_encode(self.latency_first, serializer);
|
||||||
|
<bool>::sse_encode(self.enable_exit_node, serializer);
|
||||||
|
<bool>::sse_encode(self.no_tun, serializer);
|
||||||
|
<bool>::sse_encode(self.use_smoltcp, serializer);
|
||||||
|
<String>::sse_encode(self.relay_network_whitelist, serializer);
|
||||||
|
<bool>::sse_encode(self.disable_p2p, serializer);
|
||||||
|
<bool>::sse_encode(self.relay_all_peer_rpc, serializer);
|
||||||
|
<bool>::sse_encode(self.disable_udp_hole_punching, serializer);
|
||||||
|
<bool>::sse_encode(self.multi_thread, serializer);
|
||||||
|
<i32>::sse_encode(self.data_compress_algo, serializer);
|
||||||
|
<bool>::sse_encode(self.bind_device, serializer);
|
||||||
|
<bool>::sse_encode(self.enable_kcp_proxy, serializer);
|
||||||
|
<bool>::sse_encode(self.disable_kcp_input, serializer);
|
||||||
|
<bool>::sse_encode(self.disable_relay_kcp, serializer);
|
||||||
|
<bool>::sse_encode(self.proxy_forward_by_system, serializer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl SseEncode for i32 {
|
impl SseEncode for i32 {
|
||||||
// Codec=Sse (Serialization based), see doc to use other codecs
|
// Codec=Sse (Serialization based), see doc to use other codecs
|
||||||
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {
|
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {
|
||||||
@@ -1082,6 +1199,13 @@ impl SseEncode for (Vec<PeerInfo>, Vec<Route>) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl SseEncode for u32 {
|
||||||
|
// 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_u32::<NativeEndian>(self).unwrap();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl SseEncode for u64 {
|
impl SseEncode for u64 {
|
||||||
// Codec=Sse (Serialization based), see doc to use other codecs
|
// Codec=Sse (Serialization based), see doc to use other codecs
|
||||||
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {
|
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: _fe_analyzer_shared
|
name: _fe_analyzer_shared
|
||||||
sha256: "0b2f2bd91ba804e53a61d757b986f89f1f9eaed5b11e4b2f5a2468d86d6c9fc7"
|
sha256: "0b2f2bd91ba804e53a61d757b986f89f1f9eaed5b11e4b2f5a2468d86d6c9fc7"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "67.0.0"
|
version: "67.0.0"
|
||||||
adaptive_number:
|
adaptive_number:
|
||||||
@@ -14,7 +14,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: adaptive_number
|
name: adaptive_number
|
||||||
sha256: "3a567544e9b5c9c803006f51140ad544aedc79604fd4f3f2c1380003f97c1d77"
|
sha256: "3a567544e9b5c9c803006f51140ad544aedc79604fd4f3f2c1380003f97c1d77"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.0.0"
|
version: "1.0.0"
|
||||||
analyzer:
|
analyzer:
|
||||||
@@ -22,7 +22,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: analyzer
|
name: analyzer
|
||||||
sha256: "37577842a27e4338429a1cbc32679d508836510b056f1eedf0c8d20e39c1383d"
|
sha256: "37577842a27e4338429a1cbc32679d508836510b056f1eedf0c8d20e39c1383d"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "6.4.1"
|
version: "6.4.1"
|
||||||
args:
|
args:
|
||||||
@@ -30,7 +30,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: args
|
name: args
|
||||||
sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596
|
sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.4.2"
|
version: "2.4.2"
|
||||||
async:
|
async:
|
||||||
@@ -38,7 +38,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: async
|
name: async
|
||||||
sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb"
|
sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.13.0"
|
version: "2.13.0"
|
||||||
boolean_selector:
|
boolean_selector:
|
||||||
@@ -46,7 +46,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: boolean_selector
|
name: boolean_selector
|
||||||
sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea"
|
sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.2"
|
version: "2.1.2"
|
||||||
collection:
|
collection:
|
||||||
@@ -54,7 +54,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: collection
|
name: collection
|
||||||
sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
|
sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.18.0"
|
version: "1.18.0"
|
||||||
convert:
|
convert:
|
||||||
@@ -62,7 +62,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: convert
|
name: convert
|
||||||
sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592"
|
sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.1.1"
|
version: "3.1.1"
|
||||||
coverage:
|
coverage:
|
||||||
@@ -70,7 +70,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: coverage
|
name: coverage
|
||||||
sha256: e3493833ea012784c740e341952298f1cc77f1f01b1bbc3eb4eecf6984fb7f43
|
sha256: e3493833ea012784c740e341952298f1cc77f1f01b1bbc3eb4eecf6984fb7f43
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.11.1"
|
version: "1.11.1"
|
||||||
crypto:
|
crypto:
|
||||||
@@ -78,7 +78,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: crypto
|
name: crypto
|
||||||
sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab
|
sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.0.3"
|
version: "3.0.3"
|
||||||
ed25519_edwards:
|
ed25519_edwards:
|
||||||
@@ -86,7 +86,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: ed25519_edwards
|
name: ed25519_edwards
|
||||||
sha256: "6ce0112d131327ec6d42beede1e5dfd526069b18ad45dcf654f15074ad9276cd"
|
sha256: "6ce0112d131327ec6d42beede1e5dfd526069b18ad45dcf654f15074ad9276cd"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.3.1"
|
version: "0.3.1"
|
||||||
file:
|
file:
|
||||||
@@ -94,7 +94,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: file
|
name: file
|
||||||
sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d"
|
sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "6.1.4"
|
version: "6.1.4"
|
||||||
fixnum:
|
fixnum:
|
||||||
@@ -102,7 +102,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: fixnum
|
name: fixnum
|
||||||
sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be
|
sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.1.1"
|
version: "1.1.1"
|
||||||
frontend_server_client:
|
frontend_server_client:
|
||||||
@@ -110,7 +110,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: frontend_server_client
|
name: frontend_server_client
|
||||||
sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694
|
sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.0.0"
|
version: "4.0.0"
|
||||||
github:
|
github:
|
||||||
@@ -118,7 +118,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: github
|
name: github
|
||||||
sha256: "9966bc13bf612342e916b0a343e95e5f046c88f602a14476440e9b75d2295411"
|
sha256: "9966bc13bf612342e916b0a343e95e5f046c88f602a14476440e9b75d2295411"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "9.17.0"
|
version: "9.17.0"
|
||||||
glob:
|
glob:
|
||||||
@@ -126,7 +126,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: glob
|
name: glob
|
||||||
sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de
|
sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.3"
|
version: "2.1.3"
|
||||||
hex:
|
hex:
|
||||||
@@ -134,7 +134,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: hex
|
name: hex
|
||||||
sha256: "4e7cd54e4b59ba026432a6be2dd9d96e4c5205725194997193bf871703b82c4a"
|
sha256: "4e7cd54e4b59ba026432a6be2dd9d96e4c5205725194997193bf871703b82c4a"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.2.0"
|
version: "0.2.0"
|
||||||
http:
|
http:
|
||||||
@@ -142,7 +142,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: http
|
name: http
|
||||||
sha256: "759d1a329847dd0f39226c688d3e06a6b8679668e350e2891a6474f8b4bb8525"
|
sha256: "759d1a329847dd0f39226c688d3e06a6b8679668e350e2891a6474f8b4bb8525"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.1.0"
|
version: "1.1.0"
|
||||||
http_multi_server:
|
http_multi_server:
|
||||||
@@ -150,7 +150,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: http_multi_server
|
name: http_multi_server
|
||||||
sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8
|
sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.2.2"
|
version: "3.2.2"
|
||||||
http_parser:
|
http_parser:
|
||||||
@@ -158,7 +158,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: http_parser
|
name: http_parser
|
||||||
sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b"
|
sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.0.2"
|
version: "4.0.2"
|
||||||
io:
|
io:
|
||||||
@@ -166,7 +166,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: io
|
name: io
|
||||||
sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b
|
sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.0.5"
|
version: "1.0.5"
|
||||||
js:
|
js:
|
||||||
@@ -174,7 +174,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: js
|
name: js
|
||||||
sha256: "53385261521cc4a0c4658fd0ad07a7d14591cf8fc33abbceae306ddb974888dc"
|
sha256: "53385261521cc4a0c4658fd0ad07a7d14591cf8fc33abbceae306ddb974888dc"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.7.2"
|
version: "0.7.2"
|
||||||
json_annotation:
|
json_annotation:
|
||||||
@@ -182,7 +182,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: json_annotation
|
name: json_annotation
|
||||||
sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1"
|
sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.9.0"
|
version: "4.9.0"
|
||||||
lints:
|
lints:
|
||||||
@@ -190,7 +190,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: lints
|
name: lints
|
||||||
sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452"
|
sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.1"
|
version: "2.1.1"
|
||||||
logging:
|
logging:
|
||||||
@@ -198,7 +198,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: logging
|
name: logging
|
||||||
sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340"
|
sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.2.0"
|
version: "1.2.0"
|
||||||
matcher:
|
matcher:
|
||||||
@@ -206,7 +206,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: matcher
|
name: matcher
|
||||||
sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2
|
sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.12.17"
|
version: "0.12.17"
|
||||||
meta:
|
meta:
|
||||||
@@ -214,7 +214,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: meta
|
name: meta
|
||||||
sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c
|
sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.16.0"
|
version: "1.16.0"
|
||||||
mime:
|
mime:
|
||||||
@@ -222,7 +222,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: mime
|
name: mime
|
||||||
sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6"
|
sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.0"
|
version: "2.0.0"
|
||||||
node_preamble:
|
node_preamble:
|
||||||
@@ -230,7 +230,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: node_preamble
|
name: node_preamble
|
||||||
sha256: "6e7eac89047ab8a8d26cf16127b5ed26de65209847630400f9aefd7cd5c730db"
|
sha256: "6e7eac89047ab8a8d26cf16127b5ed26de65209847630400f9aefd7cd5c730db"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.2"
|
version: "2.0.2"
|
||||||
package_config:
|
package_config:
|
||||||
@@ -238,7 +238,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: package_config
|
name: package_config
|
||||||
sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc
|
sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.2.0"
|
version: "2.2.0"
|
||||||
path:
|
path:
|
||||||
@@ -246,7 +246,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: path
|
name: path
|
||||||
sha256: "2ad4cddff7f5cc0e2d13069f2a3f7a73ca18f66abd6f5ecf215219cdb3638edb"
|
sha256: "2ad4cddff7f5cc0e2d13069f2a3f7a73ca18f66abd6f5ecf215219cdb3638edb"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.8.0"
|
version: "1.8.0"
|
||||||
petitparser:
|
petitparser:
|
||||||
@@ -254,7 +254,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: petitparser
|
name: petitparser
|
||||||
sha256: cb3798bef7fc021ac45b308f4b51208a152792445cce0448c9a4ba5879dd8750
|
sha256: cb3798bef7fc021ac45b308f4b51208a152792445cce0448c9a4ba5879dd8750
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "5.4.0"
|
version: "5.4.0"
|
||||||
pool:
|
pool:
|
||||||
@@ -262,7 +262,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: pool
|
name: pool
|
||||||
sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a"
|
sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.5.1"
|
version: "1.5.1"
|
||||||
pub_semver:
|
pub_semver:
|
||||||
@@ -270,7 +270,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: pub_semver
|
name: pub_semver
|
||||||
sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585"
|
sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.2.0"
|
version: "2.2.0"
|
||||||
shelf:
|
shelf:
|
||||||
@@ -278,7 +278,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: shelf
|
name: shelf
|
||||||
sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4
|
sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.4.1"
|
version: "1.4.1"
|
||||||
shelf_packages_handler:
|
shelf_packages_handler:
|
||||||
@@ -286,7 +286,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: shelf_packages_handler
|
name: shelf_packages_handler
|
||||||
sha256: "89f967eca29607c933ba9571d838be31d67f53f6e4ee15147d5dc2934fee1b1e"
|
sha256: "89f967eca29607c933ba9571d838be31d67f53f6e4ee15147d5dc2934fee1b1e"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.0.2"
|
version: "3.0.2"
|
||||||
shelf_static:
|
shelf_static:
|
||||||
@@ -294,7 +294,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: shelf_static
|
name: shelf_static
|
||||||
sha256: c87c3875f91262785dade62d135760c2c69cb217ac759485334c5857ad89f6e3
|
sha256: c87c3875f91262785dade62d135760c2c69cb217ac759485334c5857ad89f6e3
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.1.3"
|
version: "1.1.3"
|
||||||
shelf_web_socket:
|
shelf_web_socket:
|
||||||
@@ -302,7 +302,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: shelf_web_socket
|
name: shelf_web_socket
|
||||||
sha256: "3632775c8e90d6c9712f883e633716432a27758216dfb61bd86a8321c0580925"
|
sha256: "3632775c8e90d6c9712f883e633716432a27758216dfb61bd86a8321c0580925"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.0.0"
|
version: "3.0.0"
|
||||||
source_map_stack_trace:
|
source_map_stack_trace:
|
||||||
@@ -310,7 +310,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: source_map_stack_trace
|
name: source_map_stack_trace
|
||||||
sha256: c0713a43e323c3302c2abe2a1cc89aa057a387101ebd280371d6a6c9fa68516b
|
sha256: c0713a43e323c3302c2abe2a1cc89aa057a387101ebd280371d6a6c9fa68516b
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.2"
|
version: "2.1.2"
|
||||||
source_maps:
|
source_maps:
|
||||||
@@ -318,7 +318,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: source_maps
|
name: source_maps
|
||||||
sha256: "190222579a448b03896e0ca6eca5998fa810fda630c1d65e2f78b3f638f54812"
|
sha256: "190222579a448b03896e0ca6eca5998fa810fda630c1d65e2f78b3f638f54812"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.10.13"
|
version: "0.10.13"
|
||||||
source_span:
|
source_span:
|
||||||
@@ -326,7 +326,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: source_span
|
name: source_span
|
||||||
sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c"
|
sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.10.0"
|
version: "1.10.0"
|
||||||
stack_trace:
|
stack_trace:
|
||||||
@@ -334,7 +334,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: stack_trace
|
name: stack_trace
|
||||||
sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1"
|
sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.12.1"
|
version: "1.12.1"
|
||||||
stream_channel:
|
stream_channel:
|
||||||
@@ -342,7 +342,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: stream_channel
|
name: stream_channel
|
||||||
sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d"
|
sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.4"
|
version: "2.1.4"
|
||||||
string_scanner:
|
string_scanner:
|
||||||
@@ -350,7 +350,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: string_scanner
|
name: string_scanner
|
||||||
sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43"
|
sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.4.1"
|
version: "1.4.1"
|
||||||
term_glyph:
|
term_glyph:
|
||||||
@@ -358,7 +358,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: term_glyph
|
name: term_glyph
|
||||||
sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e"
|
sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.2.2"
|
version: "1.2.2"
|
||||||
test:
|
test:
|
||||||
@@ -366,7 +366,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: test
|
name: test
|
||||||
sha256: "301b213cd241ca982e9ba50266bd3f5bd1ea33f1455554c5abb85d1be0e2d87e"
|
sha256: "301b213cd241ca982e9ba50266bd3f5bd1ea33f1455554c5abb85d1be0e2d87e"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.25.15"
|
version: "1.25.15"
|
||||||
test_api:
|
test_api:
|
||||||
@@ -374,7 +374,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: test_api
|
name: test_api
|
||||||
sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd
|
sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.7.4"
|
version: "0.7.4"
|
||||||
test_core:
|
test_core:
|
||||||
@@ -382,7 +382,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: test_core
|
name: test_core
|
||||||
sha256: "84d17c3486c8dfdbe5e12a50c8ae176d15e2a771b96909a9442b40173649ccaa"
|
sha256: "84d17c3486c8dfdbe5e12a50c8ae176d15e2a771b96909a9442b40173649ccaa"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.6.8"
|
version: "0.6.8"
|
||||||
toml:
|
toml:
|
||||||
@@ -390,7 +390,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: toml
|
name: toml
|
||||||
sha256: "157c5dca5160fced243f3ce984117f729c788bb5e475504f3dbcda881accee44"
|
sha256: "157c5dca5160fced243f3ce984117f729c788bb5e475504f3dbcda881accee44"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.14.0"
|
version: "0.14.0"
|
||||||
typed_data:
|
typed_data:
|
||||||
@@ -398,7 +398,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: typed_data
|
name: typed_data
|
||||||
sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006
|
sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.4.0"
|
version: "1.4.0"
|
||||||
version:
|
version:
|
||||||
@@ -406,7 +406,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: version
|
name: version
|
||||||
sha256: "2307e23a45b43f96469eeab946208ed63293e8afca9c28cd8b5241ff31c55f55"
|
sha256: "2307e23a45b43f96469eeab946208ed63293e8afca9c28cd8b5241ff31c55f55"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.0.0"
|
version: "3.0.0"
|
||||||
vm_service:
|
vm_service:
|
||||||
@@ -414,7 +414,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: vm_service
|
name: vm_service
|
||||||
sha256: ddfa8d30d89985b96407efce8acbdd124701f96741f2d981ca860662f1c0dc02
|
sha256: ddfa8d30d89985b96407efce8acbdd124701f96741f2d981ca860662f1c0dc02
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "15.0.0"
|
version: "15.0.0"
|
||||||
watcher:
|
watcher:
|
||||||
@@ -422,7 +422,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: watcher
|
name: watcher
|
||||||
sha256: "69da27e49efa56a15f8afe8f4438c4ec02eff0a117df1b22ea4aad194fe1c104"
|
sha256: "69da27e49efa56a15f8afe8f4438c4ec02eff0a117df1b22ea4aad194fe1c104"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.1.1"
|
version: "1.1.1"
|
||||||
web:
|
web:
|
||||||
@@ -430,7 +430,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: web
|
name: web
|
||||||
sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a"
|
sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.1.1"
|
version: "1.1.1"
|
||||||
web_socket:
|
web_socket:
|
||||||
@@ -438,7 +438,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: web_socket
|
name: web_socket
|
||||||
sha256: "3c12d96c0c9a4eec095246debcea7b86c0324f22df69893d538fcc6f1b8cce83"
|
sha256: "3c12d96c0c9a4eec095246debcea7b86c0324f22df69893d538fcc6f1b8cce83"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.1.6"
|
version: "0.1.6"
|
||||||
web_socket_channel:
|
web_socket_channel:
|
||||||
@@ -446,7 +446,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: web_socket_channel
|
name: web_socket_channel
|
||||||
sha256: "0b8e2457400d8a859b7b2030786835a28a8e80836ef64402abef392ff4f1d0e5"
|
sha256: "0b8e2457400d8a859b7b2030786835a28a8e80836ef64402abef392ff4f1d0e5"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.0.2"
|
version: "3.0.2"
|
||||||
webkit_inspection_protocol:
|
webkit_inspection_protocol:
|
||||||
@@ -454,7 +454,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: webkit_inspection_protocol
|
name: webkit_inspection_protocol
|
||||||
sha256: "87d3f2333bb240704cd3f1c6b5b7acd8a10e7f0bc28c28dcf14e782014f4a572"
|
sha256: "87d3f2333bb240704cd3f1c6b5b7acd8a10e7f0bc28c28dcf14e782014f4a572"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.2.1"
|
version: "1.2.1"
|
||||||
yaml:
|
yaml:
|
||||||
@@ -462,7 +462,7 @@ packages:
|
|||||||
description:
|
description:
|
||||||
name: yaml
|
name: yaml
|
||||||
sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5"
|
sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5"
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.1.2"
|
version: "3.1.2"
|
||||||
sdks:
|
sdks:
|
||||||
|
|||||||
Reference in New Issue
Block a user