Skip to content

Commit 5155b61

Browse files
committed
engine v2
1 parent 8cddec4 commit 5155b61

14 files changed

Lines changed: 1598 additions & 2 deletions

lib/src/core/engine_config.dart

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import '../models/core_type.dart';
2+
import '../models/driver_type.dart';
3+
import '../models/tun_options.dart';
4+
import '../models/config.dart';
5+
import 'engine_manager.dart';
6+
7+
/// Конфигурация движка с учетом необходимости драйверов
8+
class EngineConfig {
9+
final CoreType coreType;
10+
final String configJson;
11+
final TunOptions? tunOptions;
12+
final bool useNativeTun; // true для SingBox (встроенный TUN)
13+
final DriverType? driverType; // null если не нужен драйвер
14+
15+
const EngineConfig({
16+
required this.coreType,
17+
required this.configJson,
18+
this.tunOptions,
19+
required this.useNativeTun,
20+
this.driverType,
21+
});
22+
23+
/// Создание из VpnEngineConfig с автоматической оптимизацией
24+
factory EngineConfig.fromVpnEngineConfig(
25+
VpnEngineConfig config, {
26+
TunOptions? tunOptions,
27+
}) {
28+
final needsDriver = EngineManager.requiresDriver(config.core.type);
29+
30+
return EngineConfig(
31+
coreType: config.core.type,
32+
configJson: config.core.configJson,
33+
tunOptions: tunOptions ?? TunOptions.fromDriverConfig(config.driver),
34+
useNativeTun: !needsDriver,
35+
driverType: needsDriver ? config.driver.type : null,
36+
);
37+
}
38+
39+
/// Преобразование в VpnEngineConfig (для обратной совместимости)
40+
VpnEngineConfig toVpnEngineConfig() {
41+
return EngineManager.createOptimalConfig(
42+
core: coreType,
43+
configJson: configJson,
44+
tunOptions: tunOptions,
45+
explicitDriver: driverType,
46+
);
47+
}
48+
}
49+

lib/src/core/engine_manager.dart

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
import '../models/core_type.dart';
2+
import '../models/driver_type.dart';
3+
import '../models/config.dart';
4+
import '../models/tun_options.dart';
5+
6+
/// Управление движками VPN
7+
/// Определяет оптимальную конфигурацию для каждого типа ядра
8+
class EngineManager {
9+
/// Определяет, требуется ли драйвер для указанного ядра
10+
///
11+
/// SingBox имеет встроенную поддержку TUN и не требует внешних драйверов
12+
/// LibXray и V2Ray требуют SOCKS драйвер для работы с TUN
13+
static bool requiresDriver(CoreType core) {
14+
switch (core) {
15+
case CoreType.singbox:
16+
return false; // SingBox имеет встроенный TUN
17+
case CoreType.libxray:
18+
case CoreType.v2ray:
19+
return true; // Требуют SOCKS драйвер
20+
case CoreType.wireguard:
21+
return false; // WireGuard имеет встроенный TUN (через wireguard-go)
22+
}
23+
}
24+
25+
/// Создает оптимальную конфигурацию для указанного ядра
26+
///
27+
/// Автоматически определяет необходимость драйвера и создает
28+
/// оптимальную конфигурацию
29+
static VpnEngineConfig createOptimalConfig({
30+
required CoreType core,
31+
required String configJson,
32+
TunOptions? tunOptions,
33+
DriverType? explicitDriver,
34+
}) {
35+
final needsDriver = requiresDriver(core);
36+
37+
// Если явно указан драйвер, используем его
38+
// Иначе используем оптимальный по умолчанию
39+
DriverType driverType;
40+
if (explicitDriver != null && explicitDriver != DriverType.none) {
41+
driverType = explicitDriver;
42+
} else if (needsDriver) {
43+
driverType = DriverType.hevSocks5; // Используем hev-socks5 по умолчанию
44+
} else {
45+
driverType = DriverType.none;
46+
}
47+
48+
// Создаем DriverConfig из TunOptions если нужно
49+
final driverConfig = _createDriverConfigFromTunOptions(
50+
tunOptions,
51+
driverType,
52+
needsDriver,
53+
);
54+
55+
return VpnEngineConfig(
56+
core: CoreConfig(
57+
type: core,
58+
configJson: configJson,
59+
),
60+
driver: driverConfig,
61+
);
62+
}
63+
64+
/// Создает DriverConfig из TunOptions
65+
static DriverConfig _createDriverConfigFromTunOptions(
66+
TunOptions? tunOptions,
67+
DriverType driverType,
68+
bool needsDriver,
69+
) {
70+
if (!needsDriver || driverType == DriverType.none) {
71+
return const DriverConfig(type: DriverType.none);
72+
}
73+
74+
if (tunOptions == null) {
75+
return DriverConfig(type: driverType);
76+
}
77+
78+
return DriverConfig(
79+
type: driverType,
80+
mtu: tunOptions.mtu,
81+
tunName: tunOptions.tunName,
82+
tunAddress: tunOptions.ipv4Address ?? '10.0.0.2',
83+
tunGateway: tunOptions.ipv4Gateway ?? '10.0.0.1',
84+
tunNetmask: tunOptions.ipv4Netmask ?? '255.255.255.0',
85+
dnsServer: tunOptions.dnsServer ?? '8.8.8.8',
86+
);
87+
}
88+
89+
/// Получить рекомендуемый драйвер для ядра
90+
static DriverType? getRecommendedDriver(CoreType core) {
91+
if (requiresDriver(core)) {
92+
return DriverType.hevSocks5; // Рекомендуем hev-socks5
93+
}
94+
return null; // Драйвер не нужен
95+
}
96+
97+
/// Проверить совместимость ядра и драйвера
98+
static bool isCompatible(CoreType core, DriverType driver) {
99+
if (driver == DriverType.none) {
100+
return !requiresDriver(core); // None драйвер только для ядер без необходимости драйвера
101+
}
102+
return requiresDriver(core); // SOCKS драйверы только для ядер, которые их требуют
103+
}
104+
}
105+
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
/// Handle для платформенного TUN интерфейса
2+
/// Абстракция над file descriptor/handle для разных платформ
3+
abstract class PlatformTunHandle {
4+
/// Получить file descriptor (для нативного кода)
5+
int get fileDescriptor;
6+
7+
/// Платформа
8+
String get platform;
9+
10+
/// Закрыть handle
11+
void close();
12+
}
13+
14+
/// Android TUN Handle (использует ParcelFileDescriptor)
15+
class AndroidTunHandle implements PlatformTunHandle {
16+
final int _fd;
17+
18+
AndroidTunHandle(this._fd);
19+
20+
@override
21+
int get fileDescriptor => _fd;
22+
23+
@override
24+
String get platform => 'android';
25+
26+
@override
27+
void close() {
28+
// Закрытие обрабатывается на платформе
29+
}
30+
}
31+
32+
/// iOS TUN Handle (использует NEPacketTunnelProvider packetFlow)
33+
class IOSTunHandle implements PlatformTunHandle {
34+
final int _fd;
35+
36+
IOSTunHandle(this._fd);
37+
38+
@override
39+
int get fileDescriptor => _fd;
40+
41+
@override
42+
String get platform => 'ios';
43+
44+
@override
45+
void close() {
46+
// Закрытие обрабатывается на платформе
47+
}
48+
}
49+
50+
/// Linux TUN Handle (прямой file descriptor)
51+
class LinuxTunHandle implements PlatformTunHandle {
52+
final int _fd;
53+
54+
LinuxTunHandle(this._fd);
55+
56+
@override
57+
int get fileDescriptor => _fd;
58+
59+
@override
60+
String get platform => 'linux';
61+
62+
@override
63+
void close() {
64+
// Закрытие обрабатывается на платформе
65+
}
66+
}
67+
68+
/// macOS TUN Handle (utun device)
69+
class MacOSTunHandle implements PlatformTunHandle {
70+
final int _fd;
71+
72+
MacOSTunHandle(this._fd);
73+
74+
@override
75+
int get fileDescriptor => _fd;
76+
77+
@override
78+
String get platform => 'macos';
79+
80+
@override
81+
void close() {
82+
// Закрытие обрабатывается на платформе
83+
}
84+
}
85+
86+
/// Windows TUN Handle (TAP adapter handle)
87+
class WindowsTunHandle implements PlatformTunHandle {
88+
final int _handle;
89+
90+
WindowsTunHandle(this._handle);
91+
92+
@override
93+
int get fileDescriptor => _handle; // На Windows это handle, но используем тот же интерфейс
94+
95+
@override
96+
String get platform => 'windows';
97+
98+
@override
99+
void close() {
100+
// Закрытие обрабатывается на платформе
101+
}
102+
}
103+

lib/src/models/tun_options.dart

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
// Импортируем для обратной совместимости
2+
import 'config.dart';
3+
4+
/// Опции для настройки TUN интерфейса
5+
class TunOptions {
6+
/// MTU (Maximum Transmission Unit)
7+
final int mtu;
8+
9+
/// Имя TUN устройства
10+
final String tunName;
11+
12+
/// IPv4 адрес TUN устройства (например, "10.0.0.2")
13+
final String? ipv4Address;
14+
15+
/// IPv4 маска сети (например, "255.255.255.0")
16+
final String? ipv4Netmask;
17+
18+
/// IPv4 шлюз (например, "10.0.0.1")
19+
final String? ipv4Gateway;
20+
21+
/// IPv6 адрес (например, "2001:db8::1")
22+
final String? ipv6Address;
23+
24+
/// IPv6 префикс (например, 64)
25+
final int? ipv6Prefix;
26+
27+
/// DNS сервер (IPv4)
28+
final String? dnsServer;
29+
30+
/// DNS серверы (список)
31+
final List<String>? dnsServers;
32+
33+
/// Автоматическая маршрутизация
34+
final bool autoRoute;
35+
36+
/// Строгая маршрутизация
37+
final bool strictRoute;
38+
39+
/// Включить IPv6
40+
final bool enableIPv6;
41+
42+
/// Включить per-app proxy (Android)
43+
final bool enablePerAppProxy;
44+
45+
/// Список приложений для включения в per-app proxy (Android)
46+
final List<String>? includePackages;
47+
48+
/// Список приложений для исключения из per-app proxy (Android)
49+
final List<String>? excludePackages;
50+
51+
const TunOptions({
52+
this.mtu = 1500,
53+
this.tunName = 'tun0',
54+
this.ipv4Address,
55+
this.ipv4Netmask,
56+
this.ipv4Gateway,
57+
this.ipv6Address,
58+
this.ipv6Prefix,
59+
this.dnsServer,
60+
this.dnsServers,
61+
this.autoRoute = true,
62+
this.strictRoute = false,
63+
this.enableIPv6 = false,
64+
this.enablePerAppProxy = false,
65+
this.includePackages,
66+
this.excludePackages,
67+
});
68+
69+
/// Создание из DriverConfig (для обратной совместимости)
70+
factory TunOptions.fromDriverConfig(DriverConfig config) {
71+
return TunOptions(
72+
mtu: config.mtu,
73+
tunName: config.tunName,
74+
ipv4Address: config.tunAddress,
75+
ipv4Netmask: config.tunNetmask,
76+
ipv4Gateway: config.tunGateway,
77+
dnsServer: config.dnsServer,
78+
autoRoute: true,
79+
);
80+
}
81+
82+
/// Преобразование в Map
83+
Map<String, dynamic> toMap() {
84+
return {
85+
'mtu': mtu,
86+
'tunName': tunName,
87+
'ipv4Address': ipv4Address,
88+
'ipv4Netmask': ipv4Netmask,
89+
'ipv4Gateway': ipv4Gateway,
90+
'ipv6Address': ipv6Address,
91+
'ipv6Prefix': ipv6Prefix,
92+
'dnsServer': dnsServer,
93+
'dnsServers': dnsServers,
94+
'autoRoute': autoRoute,
95+
'strictRoute': strictRoute,
96+
'enableIPv6': enableIPv6,
97+
'enablePerAppProxy': enablePerAppProxy,
98+
'includePackages': includePackages,
99+
'excludePackages': excludePackages,
100+
};
101+
}
102+
103+
/// Создание из Map
104+
factory TunOptions.fromMap(Map<String, dynamic> map) {
105+
return TunOptions(
106+
mtu: map['mtu'] as int? ?? 1500,
107+
tunName: map['tunName'] as String? ?? 'tun0',
108+
ipv4Address: map['ipv4Address'] as String?,
109+
ipv4Netmask: map['ipv4Netmask'] as String?,
110+
ipv4Gateway: map['ipv4Gateway'] as String?,
111+
ipv6Address: map['ipv6Address'] as String?,
112+
ipv6Prefix: map['ipv6Prefix'] as int?,
113+
dnsServer: map['dnsServer'] as String?,
114+
dnsServers: map['dnsServers'] != null
115+
? List<String>.from(map['dnsServers'] as List)
116+
: null,
117+
autoRoute: map['autoRoute'] as bool? ?? true,
118+
strictRoute: map['strictRoute'] as bool? ?? false,
119+
enableIPv6: map['enableIPv6'] as bool? ?? false,
120+
enablePerAppProxy: map['enablePerAppProxy'] as bool? ?? false,
121+
includePackages: map['includePackages'] != null
122+
? List<String>.from(map['includePackages'] as List)
123+
: null,
124+
excludePackages: map['excludePackages'] != null
125+
? List<String>.from(map['excludePackages'] as List)
126+
: null,
127+
);
128+
}
129+
}
130+

0 commit comments

Comments
 (0)