使用 DNS 分流

This commit is contained in:
2024-02-07 22:19:43 +08:00
parent 95b4b8b947
commit 9ee02e9312
13 changed files with 247 additions and 70 deletions

View File

@ -74,6 +74,8 @@ abstract class RustLibApi extends BaseApi {
required int connectionCount,
dynamic hint});
Future<List<String>> dnsLookupTxt({required String host, dynamic hint});
Future<RustHttpResponse> fetch(
{required MyMethod method,
required String url,
@ -160,6 +162,31 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
argNames: ["url", "savePath", "fileName", "connectionCount"],
);
@override
Future<List<String>> dnsLookupTxt({required String host, dynamic hint}) {
return handler.executeNormal(NormalTask(
callFfi: (port_) {
final serializer = SseSerializer(generalizedFrbRustBinding);
sse_encode_String(host, serializer);
pdeCallFfi(generalizedFrbRustBinding, serializer,
funcId: 5, port: port_);
},
codec: SseCodec(
decodeSuccessData: sse_decode_list_String,
decodeErrorData: null,
),
constMeta: kDnsLookupTxtConstMeta,
argValues: [host],
apiImpl: this,
hint: hint,
));
}
TaskConstMeta get kDnsLookupTxtConstMeta => const TaskConstMeta(
debugName: "dns_lookup_txt",
argNames: ["host"],
);
@override
Future<RustHttpResponse> fetch(
{required MyMethod method,
@ -283,6 +310,12 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
return raw as int;
}
@protected
List<String> dco_decode_list_String(dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs
return (raw as List<dynamic>).map(dco_decode_String).toList();
}
@protected
Uint8List dco_decode_list_prim_u_8_strict(dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs
@ -473,6 +506,18 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
return deserializer.buffer.getInt32();
}
@protected
List<String> sse_decode_list_String(SseDeserializer deserializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
var len_ = sse_decode_i_32(deserializer);
var ans_ = <String>[];
for (var idx_ = 0; idx_ < len_; ++idx_) {
ans_.add(sse_decode_String(deserializer));
}
return ans_;
}
@protected
Uint8List sse_decode_list_prim_u_8_strict(SseDeserializer deserializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
@ -685,6 +730,15 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
serializer.buffer.putInt32(self);
}
@protected
void sse_encode_list_String(List<String> self, SseSerializer serializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
sse_encode_i_32(self.length, serializer);
for (final item in self) {
sse_encode_String(item, serializer);
}
}
@protected
void sse_encode_list_prim_u_8_strict(
Uint8List self, SseSerializer serializer) {