feat(useragent): initial connection impl

This commit is contained in:
hdbg
2026-03-15 16:53:49 +01:00
parent 27836beb75
commit c61a9e30ac
28 changed files with 688 additions and 225 deletions

View File

@@ -10,14 +10,10 @@
// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
// ignore_for_file: non_constant_identifier_names, prefer_relative_imports
import 'dart:async' as $async;
import 'dart:core' as $core;
import 'package:protobuf/protobuf.dart' as $pb;
import 'client.pb.dart' as $0;
import 'user_agent.pb.dart' as $1;
export 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions;
class ServerInfo extends $pb.GeneratedMessage {
@@ -86,21 +82,6 @@ class ServerInfo extends $pb.GeneratedMessage {
void clearCertPublicKey() => $_clearField(2);
}
class ArbiterServiceApi {
final $pb.RpcClient _client;
ArbiterServiceApi(this._client);
$async.Future<$0.ClientResponse> client(
$pb.ClientContext? ctx, $0.ClientRequest request) =>
_client.invoke<$0.ClientResponse>(
ctx, 'ArbiterService', 'Client', request, $0.ClientResponse());
$async.Future<$1.UserAgentResponse> userAgent(
$pb.ClientContext? ctx, $1.UserAgentRequest request) =>
_client.invoke<$1.UserAgentResponse>(
ctx, 'ArbiterService', 'UserAgent', request, $1.UserAgentResponse());
}
const $core.bool _omitFieldNames =
$core.bool.fromEnvironment('protobuf.omit_field_names');
const $core.bool _omitMessageNames =

View File

@@ -0,0 +1,90 @@
// This is a generated file - do not edit.
//
// Generated from arbiter.proto.
// @dart = 3.3
// ignore_for_file: annotate_overrides, camel_case_types, comment_references
// ignore_for_file: constant_identifier_names
// ignore_for_file: curly_braces_in_flow_control_structures
// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
// ignore_for_file: non_constant_identifier_names, prefer_relative_imports
import 'dart:async' as $async;
import 'dart:core' as $core;
import 'package:grpc/service_api.dart' as $grpc;
import 'package:protobuf/protobuf.dart' as $pb;
import 'client.pb.dart' as $0;
import 'user_agent.pb.dart' as $1;
export 'arbiter.pb.dart';
@$pb.GrpcServiceName('arbiter.ArbiterService')
class ArbiterServiceClient extends $grpc.Client {
/// The hostname for this service.
static const $core.String defaultHost = '';
/// OAuth scopes needed for the client.
static const $core.List<$core.String> oauthScopes = [
'',
];
ArbiterServiceClient(super.channel, {super.options, super.interceptors});
$grpc.ResponseStream<$0.ClientResponse> client(
$async.Stream<$0.ClientRequest> request, {
$grpc.CallOptions? options,
}) {
return $createStreamingCall(_$client, request, options: options);
}
$grpc.ResponseStream<$1.UserAgentResponse> userAgent(
$async.Stream<$1.UserAgentRequest> request, {
$grpc.CallOptions? options,
}) {
return $createStreamingCall(_$userAgent, request, options: options);
}
// method descriptors
static final _$client =
$grpc.ClientMethod<$0.ClientRequest, $0.ClientResponse>(
'/arbiter.ArbiterService/Client',
($0.ClientRequest value) => value.writeToBuffer(),
$0.ClientResponse.fromBuffer);
static final _$userAgent =
$grpc.ClientMethod<$1.UserAgentRequest, $1.UserAgentResponse>(
'/arbiter.ArbiterService/UserAgent',
($1.UserAgentRequest value) => value.writeToBuffer(),
$1.UserAgentResponse.fromBuffer);
}
@$pb.GrpcServiceName('arbiter.ArbiterService')
abstract class ArbiterServiceBase extends $grpc.Service {
$core.String get $name => 'arbiter.ArbiterService';
ArbiterServiceBase() {
$addMethod($grpc.ServiceMethod<$0.ClientRequest, $0.ClientResponse>(
'Client',
client,
true,
true,
($core.List<$core.int> value) => $0.ClientRequest.fromBuffer(value),
($0.ClientResponse value) => value.writeToBuffer()));
$addMethod($grpc.ServiceMethod<$1.UserAgentRequest, $1.UserAgentResponse>(
'UserAgent',
userAgent,
true,
true,
($core.List<$core.int> value) => $1.UserAgentRequest.fromBuffer(value),
($1.UserAgentResponse value) => value.writeToBuffer()));
}
$async.Stream<$0.ClientResponse> client(
$grpc.ServiceCall call, $async.Stream<$0.ClientRequest> request);
$async.Stream<$1.UserAgentResponse> userAgent(
$grpc.ServiceCall call, $async.Stream<$1.UserAgentRequest> request);
}

View File

@@ -15,15 +15,6 @@ import 'dart:convert' as $convert;
import 'dart:core' as $core;
import 'dart:typed_data' as $typed_data;
import 'package:protobuf/well_known_types/google/protobuf/empty.pbjson.dart'
as $3;
import 'package:protobuf/well_known_types/google/protobuf/timestamp.pbjson.dart'
as $4;
import 'client.pbjson.dart' as $0;
import 'evm.pbjson.dart' as $2;
import 'user_agent.pbjson.dart' as $1;
@$core.Deprecated('Use serverInfoDescriptor instead')
const ServerInfo$json = {
'1': 'ServerInfo',
@@ -37,88 +28,3 @@ const ServerInfo$json = {
final $typed_data.Uint8List serverInfoDescriptor = $convert.base64Decode(
'CgpTZXJ2ZXJJbmZvEhgKB3ZlcnNpb24YASABKAlSB3ZlcnNpb24SJgoPY2VydF9wdWJsaWNfa2'
'V5GAIgASgMUg1jZXJ0UHVibGljS2V5');
const $core.Map<$core.String, $core.dynamic> ArbiterServiceBase$json = {
'1': 'ArbiterService',
'2': [
{
'1': 'Client',
'2': '.arbiter.client.ClientRequest',
'3': '.arbiter.client.ClientResponse',
'5': true,
'6': true
},
{
'1': 'UserAgent',
'2': '.arbiter.user_agent.UserAgentRequest',
'3': '.arbiter.user_agent.UserAgentResponse',
'5': true,
'6': true
},
],
};
@$core.Deprecated('Use arbiterServiceDescriptor instead')
const $core.Map<$core.String, $core.Map<$core.String, $core.dynamic>>
ArbiterServiceBase$messageJson = {
'.arbiter.client.ClientRequest': $0.ClientRequest$json,
'.arbiter.client.AuthChallengeRequest': $0.AuthChallengeRequest$json,
'.arbiter.client.AuthChallengeSolution': $0.AuthChallengeSolution$json,
'.arbiter.client.ClientResponse': $0.ClientResponse$json,
'.arbiter.client.AuthChallenge': $0.AuthChallenge$json,
'.arbiter.client.AuthOk': $0.AuthOk$json,
'.arbiter.evm.EvmSignTransactionResponse': $2.EvmSignTransactionResponse$json,
'.arbiter.evm.TransactionEvalError': $2.TransactionEvalError$json,
'.google.protobuf.Empty': $3.Empty$json,
'.arbiter.evm.NoMatchingGrantError': $2.NoMatchingGrantError$json,
'.arbiter.evm.SpecificMeaning': $2.SpecificMeaning$json,
'.arbiter.evm.EtherTransferMeaning': $2.EtherTransferMeaning$json,
'.arbiter.evm.TokenTransferMeaning': $2.TokenTransferMeaning$json,
'.arbiter.evm.TokenInfo': $2.TokenInfo$json,
'.arbiter.evm.PolicyViolationsError': $2.PolicyViolationsError$json,
'.arbiter.evm.EvalViolation': $2.EvalViolation$json,
'.arbiter.evm.GasLimitExceededViolation': $2.GasLimitExceededViolation$json,
'.arbiter.evm.EvmAnalyzeTransactionResponse':
$2.EvmAnalyzeTransactionResponse$json,
'.arbiter.client.ClientConnectError': $0.ClientConnectError$json,
'.arbiter.user_agent.UserAgentRequest': $1.UserAgentRequest$json,
'.arbiter.user_agent.AuthChallengeRequest': $1.AuthChallengeRequest$json,
'.arbiter.user_agent.AuthChallengeSolution': $1.AuthChallengeSolution$json,
'.arbiter.user_agent.UnsealStart': $1.UnsealStart$json,
'.arbiter.user_agent.UnsealEncryptedKey': $1.UnsealEncryptedKey$json,
'.arbiter.evm.EvmGrantCreateRequest': $2.EvmGrantCreateRequest$json,
'.arbiter.evm.SharedSettings': $2.SharedSettings$json,
'.google.protobuf.Timestamp': $4.Timestamp$json,
'.arbiter.evm.TransactionRateLimit': $2.TransactionRateLimit$json,
'.arbiter.evm.SpecificGrant': $2.SpecificGrant$json,
'.arbiter.evm.EtherTransferSettings': $2.EtherTransferSettings$json,
'.arbiter.evm.VolumeRateLimit': $2.VolumeRateLimit$json,
'.arbiter.evm.TokenTransferSettings': $2.TokenTransferSettings$json,
'.arbiter.evm.EvmGrantDeleteRequest': $2.EvmGrantDeleteRequest$json,
'.arbiter.evm.EvmGrantListRequest': $2.EvmGrantListRequest$json,
'.arbiter.user_agent.ClientConnectionResponse':
$1.ClientConnectionResponse$json,
'.arbiter.user_agent.UserAgentResponse': $1.UserAgentResponse$json,
'.arbiter.user_agent.AuthChallenge': $1.AuthChallenge$json,
'.arbiter.user_agent.AuthOk': $1.AuthOk$json,
'.arbiter.user_agent.UnsealStartResponse': $1.UnsealStartResponse$json,
'.arbiter.evm.WalletCreateResponse': $2.WalletCreateResponse$json,
'.arbiter.evm.WalletEntry': $2.WalletEntry$json,
'.arbiter.evm.WalletListResponse': $2.WalletListResponse$json,
'.arbiter.evm.WalletList': $2.WalletList$json,
'.arbiter.evm.EvmGrantCreateResponse': $2.EvmGrantCreateResponse$json,
'.arbiter.evm.EvmGrantDeleteResponse': $2.EvmGrantDeleteResponse$json,
'.arbiter.evm.EvmGrantListResponse': $2.EvmGrantListResponse$json,
'.arbiter.evm.EvmGrantList': $2.EvmGrantList$json,
'.arbiter.evm.GrantEntry': $2.GrantEntry$json,
'.arbiter.user_agent.ClientConnectionRequest':
$1.ClientConnectionRequest$json,
'.arbiter.user_agent.ClientConnectionCancel': $1.ClientConnectionCancel$json,
};
/// Descriptor for `ArbiterService`. Decode as a `google.protobuf.ServiceDescriptorProto`.
final $typed_data.Uint8List arbiterServiceDescriptor = $convert.base64Decode(
'Cg5BcmJpdGVyU2VydmljZRJLCgZDbGllbnQSHS5hcmJpdGVyLmNsaWVudC5DbGllbnRSZXF1ZX'
'N0Gh4uYXJiaXRlci5jbGllbnQuQ2xpZW50UmVzcG9uc2UoATABElwKCVVzZXJBZ2VudBIkLmFy'
'Yml0ZXIudXNlcl9hZ2VudC5Vc2VyQWdlbnRSZXF1ZXN0GiUuYXJiaXRlci51c2VyX2FnZW50Ll'
'VzZXJBZ2VudFJlc3BvbnNlKAEwAQ==');

View File

@@ -1,56 +0,0 @@
// This is a generated file - do not edit.
//
// Generated from arbiter.proto.
// @dart = 3.3
// ignore_for_file: annotate_overrides, camel_case_types, comment_references
// ignore_for_file: constant_identifier_names
// ignore_for_file: curly_braces_in_flow_control_structures
// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
// ignore_for_file: non_constant_identifier_names, prefer_relative_imports
import 'dart:async' as $async;
import 'dart:core' as $core;
import 'package:protobuf/protobuf.dart' as $pb;
import 'arbiter.pbjson.dart';
import 'client.pb.dart' as $0;
import 'user_agent.pb.dart' as $1;
export 'arbiter.pb.dart';
abstract class ArbiterServiceBase extends $pb.GeneratedService {
$async.Future<$0.ClientResponse> client(
$pb.ServerContext ctx, $0.ClientRequest request);
$async.Future<$1.UserAgentResponse> userAgent(
$pb.ServerContext ctx, $1.UserAgentRequest request);
$pb.GeneratedMessage createRequest($core.String methodName) {
switch (methodName) {
case 'Client':
return $0.ClientRequest();
case 'UserAgent':
return $1.UserAgentRequest();
default:
throw $core.ArgumentError('Unknown method: $methodName');
}
}
$async.Future<$pb.GeneratedMessage> handleCall($pb.ServerContext ctx,
$core.String methodName, $pb.GeneratedMessage request) {
switch (methodName) {
case 'Client':
return client(ctx, request as $0.ClientRequest);
case 'UserAgent':
return userAgent(ctx, request as $1.UserAgentRequest);
default:
throw $core.ArgumentError('Unknown method: $methodName');
}
}
$core.Map<$core.String, $core.dynamic> get $json => ArbiterServiceBase$json;
$core.Map<$core.String, $core.Map<$core.String, $core.dynamic>>
get $messageJson => ArbiterServiceBase$messageJson;
}

View File

@@ -26,10 +26,12 @@ class AuthChallengeRequest extends $pb.GeneratedMessage {
factory AuthChallengeRequest({
$core.List<$core.int>? pubkey,
$core.String? bootstrapToken,
KeyType? keyType,
}) {
final result = create();
if (pubkey != null) result.pubkey = pubkey;
if (bootstrapToken != null) result.bootstrapToken = bootstrapToken;
if (keyType != null) result.keyType = keyType;
return result;
}
@@ -50,6 +52,8 @@ class AuthChallengeRequest extends $pb.GeneratedMessage {
..a<$core.List<$core.int>>(
1, _omitFieldNames ? '' : 'pubkey', $pb.PbFieldType.OY)
..aOS(2, _omitFieldNames ? '' : 'bootstrapToken')
..aE<KeyType>(3, _omitFieldNames ? '' : 'keyType',
enumValues: KeyType.values)
..hasRequiredFields = false;
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
@@ -88,6 +92,15 @@ class AuthChallengeRequest extends $pb.GeneratedMessage {
$core.bool hasBootstrapToken() => $_has(1);
@$pb.TagNumber(2)
void clearBootstrapToken() => $_clearField(2);
@$pb.TagNumber(3)
KeyType get keyType => $_getN(2);
@$pb.TagNumber(3)
set keyType(KeyType value) => $_setField(3, value);
@$pb.TagNumber(3)
$core.bool hasKeyType() => $_has(2);
@$pb.TagNumber(3)
void clearKeyType() => $_clearField(3);
}
class AuthChallenge extends $pb.GeneratedMessage {

View File

@@ -14,6 +14,31 @@ import 'dart:core' as $core;
import 'package:protobuf/protobuf.dart' as $pb;
class KeyType extends $pb.ProtobufEnum {
static const KeyType KEY_TYPE_UNSPECIFIED =
KeyType._(0, _omitEnumNames ? '' : 'KEY_TYPE_UNSPECIFIED');
static const KeyType KEY_TYPE_ED25519 =
KeyType._(1, _omitEnumNames ? '' : 'KEY_TYPE_ED25519');
static const KeyType KEY_TYPE_ECDSA_SECP256K1 =
KeyType._(2, _omitEnumNames ? '' : 'KEY_TYPE_ECDSA_SECP256K1');
static const KeyType KEY_TYPE_RSA =
KeyType._(3, _omitEnumNames ? '' : 'KEY_TYPE_RSA');
static const $core.List<KeyType> values = <KeyType>[
KEY_TYPE_UNSPECIFIED,
KEY_TYPE_ED25519,
KEY_TYPE_ECDSA_SECP256K1,
KEY_TYPE_RSA,
];
static final $core.List<KeyType?> _byValue =
$pb.ProtobufEnum.$_initByValueList(values, 3);
static KeyType? valueOf($core.int value) =>
value < 0 || value >= _byValue.length ? null : _byValue[value];
const KeyType._(super.value, super.name);
}
class UnsealResult extends $pb.ProtobufEnum {
static const UnsealResult UNSEAL_RESULT_UNSPECIFIED =
UnsealResult._(0, _omitEnumNames ? '' : 'UNSEAL_RESULT_UNSPECIFIED');

View File

@@ -15,6 +15,22 @@ import 'dart:convert' as $convert;
import 'dart:core' as $core;
import 'dart:typed_data' as $typed_data;
@$core.Deprecated('Use keyTypeDescriptor instead')
const KeyType$json = {
'1': 'KeyType',
'2': [
{'1': 'KEY_TYPE_UNSPECIFIED', '2': 0},
{'1': 'KEY_TYPE_ED25519', '2': 1},
{'1': 'KEY_TYPE_ECDSA_SECP256K1', '2': 2},
{'1': 'KEY_TYPE_RSA', '2': 3},
],
};
/// Descriptor for `KeyType`. Decode as a `google.protobuf.EnumDescriptorProto`.
final $typed_data.Uint8List keyTypeDescriptor = $convert.base64Decode(
'CgdLZXlUeXBlEhgKFEtFWV9UWVBFX1VOU1BFQ0lGSUVEEAASFAoQS0VZX1RZUEVfRUQyNTUxOR'
'ABEhwKGEtFWV9UWVBFX0VDRFNBX1NFQ1AyNTZLMRACEhAKDEtFWV9UWVBFX1JTQRAD');
@$core.Deprecated('Use unsealResultDescriptor instead')
const UnsealResult$json = {
'1': 'UnsealResult',
@@ -64,6 +80,14 @@ const AuthChallengeRequest$json = {
'10': 'bootstrapToken',
'17': true
},
{
'1': 'key_type',
'3': 3,
'4': 1,
'5': 14,
'6': '.arbiter.user_agent.KeyType',
'10': 'keyType'
},
],
'8': [
{'1': '_bootstrap_token'},
@@ -73,8 +97,9 @@ const AuthChallengeRequest$json = {
/// Descriptor for `AuthChallengeRequest`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List authChallengeRequestDescriptor = $convert.base64Decode(
'ChRBdXRoQ2hhbGxlbmdlUmVxdWVzdBIWCgZwdWJrZXkYASABKAxSBnB1YmtleRIsCg9ib290c3'
'RyYXBfdG9rZW4YAiABKAlIAFIOYm9vdHN0cmFwVG9rZW6IAQFCEgoQX2Jvb3RzdHJhcF90b2tl'
'bg==');
'RyYXBfdG9rZW4YAiABKAlIAFIOYm9vdHN0cmFwVG9rZW6IAQESNgoIa2V5X3R5cGUYAyABKA4y'
'Gy5hcmJpdGVyLnVzZXJfYWdlbnQuS2V5VHlwZVIHa2V5VHlwZUISChBfYm9vdHN0cmFwX3Rva2'
'Vu');
@$core.Deprecated('Use authChallengeDescriptor instead')
const AuthChallenge$json = {