42 lines
1.5 KiB
Dart
42 lines
1.5 KiB
Dart
// vpn_bridge_provider.dart — VpnBridge 平台分派
|
||
//
|
||
// macOS / Linux / Windows → DesktopVpnBridge(真实子进程)
|
||
// Android / iOS → VpnNativeBridge(内嵌 libbox,走 pangolin/vpn 通道)
|
||
// 其他平台(Web / 测试)→ VpnBridgeMock
|
||
import 'package:flutter/foundation.dart';
|
||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||
|
||
import 'desktop_vpn_bridge.dart';
|
||
import 'vpn_bridge.dart';
|
||
import 'vpn_bridge_mock.dart';
|
||
|
||
// 通过 dart:io Platform 按平台选择实现。
|
||
// Web 平台须先检查 kIsWeb(dart:io 在 Web 上不可用)。
|
||
import 'dart:io' show Platform;
|
||
|
||
/// P1 方案B 开关:macOS 是否走原生 System Extension(VpnNativeBridge)而非 PoC 的
|
||
/// sudo 子进程(DesktopVpnBridge)。默认 false——待 PacketTunnel target/签名就绪、
|
||
/// 原生侧联调通过后置 true。见 docs/p1-macos-system-extension.md。
|
||
const bool kUseNativeVpnMacOS = true;
|
||
|
||
/// 全局单例 VpnBridge。Ref 生命周期内不变。
|
||
final vpnBridgeProvider = Provider<VpnBridge>((ref) {
|
||
if (!kIsWeb) {
|
||
if (Platform.isMacOS && kUseNativeVpnMacOS) {
|
||
return VpnNativeBridge();
|
||
}
|
||
if (Platform.isAndroid) {
|
||
return VpnNativeBridge();
|
||
}
|
||
// iOS:NEPacketTunnelProvider 内嵌 libbox(B1/C1 已打通)。走原生 MethodChannel
|
||
// (pangolin/vpn → AppDelegate → VpnManager),不再用 mock。
|
||
if (Platform.isIOS) {
|
||
return VpnNativeBridge();
|
||
}
|
||
if (Platform.isMacOS || Platform.isLinux || Platform.isWindows) {
|
||
return DesktopVpnBridge();
|
||
}
|
||
}
|
||
return VpnBridgeMock();
|
||
});
|