finished implementation

This commit is contained in:
Fabian Freund
2025-09-14 11:41:01 +02:00
parent ac0f3b5dcc
commit a8334ae684
30 changed files with 848 additions and 83 deletions
@@ -1,2 +1,3 @@
export 'src/data/models/moat.dart';
export 'src/data/service/moat_service.dart';
export 'src/pigeons/proxy.g.dart' show IPtProxyController, ProxyType;
@@ -83,13 +83,19 @@ class Setting {
@JsonSerializable()
class Bridge {
final String type;
@JsonKey(toJson: _transportToJson, fromJson: _transportFromJson)
final TransportType type;
final String source;
@JsonKey(name: 'bridge_strings')
final List<String>? bridges;
const Bridge({required this.type, required this.source, this.bridges});
static String _transportToJson(TransportType transport) => transport.value;
static TransportType _transportFromJson(dynamic json) =>
TransportType.fromString(json as String)!;
factory Bridge.fromJson(Map<String, dynamic> json) => _$BridgeFromJson(json);
Map<String, dynamic> toJson() => _$BridgeToJson(this);
@@ -50,7 +50,7 @@ Map<String, dynamic> _$SettingToJson(Setting instance) => <String, dynamic>{
};
Bridge _$BridgeFromJson(Map<String, dynamic> json) => Bridge(
type: json['type'] as String,
type: Bridge._transportFromJson(json['type']),
source: json['source'] as String,
bridges: (json['bridge_strings'] as List<dynamic>?)
?.map((e) => e as String)
@@ -58,7 +58,7 @@ Bridge _$BridgeFromJson(Map<String, dynamic> json) => Bridge(
);
Map<String, dynamic> _$BridgeToJson(Bridge instance) => <String, dynamic>{
'type': instance.type,
'type': Bridge._transportToJson(instance.type),
'source': instance.source,
'bridge_strings': instance.bridges,
};
@@ -9,6 +9,8 @@ import 'package:socks5_proxy/socks_client.dart';
const String _meekParameters =
'url=https://1723079976.rsc.cdn77.org;front=www.phpmyadmin.net';
const defaultBridges = [TransportType.obfs4, TransportType.snowflake];
/// Manages MOAT API connections with persistent proxy setup.
class MoatService {
MoatApi? _api;
@@ -66,10 +68,10 @@ class MoatService {
}
/// Converts BuiltInBridges to Settings for requested transports.
List<Setting> _convertBuiltinToSettings(
BuiltInBridges builtinBridges,
List<TransportType> transports,
) {
static List<Setting> convertBuiltinToSettings(
BuiltInBridges builtinBridges, {
List<TransportType> transports = defaultBridges,
}) {
final settings = <Setting>[];
for (final transport in transports) {
@@ -85,7 +87,7 @@ class MoatService {
settings.add(
Setting(
bridge: Bridge(
type: transport.value,
type: transport,
source: 'builtin',
bridges: bridgeStrings,
),
@@ -98,29 +100,20 @@ class MoatService {
}
/// Gets built-in bridges from the MOAT service endpoint.
Future<List<Setting>?> getBuiltinBridges({
List<TransportType> transports = const [
TransportType.obfs4,
TransportType.snowflake,
TransportType.meek,
],
Future<BuiltInBridges> getBuiltinBridges({
List<TransportType> transports = defaultBridges,
}) async {
_ensureInitialized();
final builtinBridges = await _api!.builtin();
final settings = _convertBuiltinToSettings(builtinBridges, transports);
return settings.isEmpty ? null : settings;
return builtinBridges;
}
/// Tries to automatically configure Pluggable Transports.
Future<List<Setting>?> autoConf({
String? country,
bool cannotConnectWithoutPt = false,
List<TransportType> transports = const [
TransportType.obfs4,
TransportType.snowflake,
TransportType.webtunnel,
],
List<TransportType> transports = defaultBridges,
}) async {
_ensureInitialized();
@@ -146,6 +139,18 @@ class MoatService {
return response.settings;
}
Future<List<Setting>?> getDefaultBridges({
List<TransportType> transports = defaultBridges,
}) async {
_ensureInitialized();
final response = await _api!.defaults(
SettingsRequest(transports: transports),
);
return response.settings;
}
/// Gets the list of supported countries from the MOAT service.
Future<List<String>> getCountries() async {
_ensureInitialized();
@@ -13,10 +13,7 @@ dependencies:
sdk: flutter
http: ^1.5.0
json_annotation: ^4.9.0
socks5_proxy:
git:
url: https://github.com/sylvieon/socks_dart.git
ref: 04550bc08f42cc1a35f1e870f651b93a4f9aceab
socks5_proxy: ^2.1.1
dev_dependencies:
build_runner: ^2.4.15