diff --git a/veilid-flutter/analysis_options.yaml b/veilid-flutter/analysis_options.yaml index adefccd2..d262dc94 100644 --- a/veilid-flutter/analysis_options.yaml +++ b/veilid-flutter/analysis_options.yaml @@ -2,3 +2,10 @@ include: package:lint_hard/all.yaml analyzer: errors: invalid_annotation_target: ignore + exclude: + - '**/*.g.dart' + - '**/*.freezed.dart' + +linter: + rules: + avoid_positional_boolean_parameters: false \ No newline at end of file diff --git a/veilid-flutter/lib/default_config.dart b/veilid-flutter/lib/default_config.dart index ad27e415..9b877dbc 100644 --- a/veilid-flutter/lib/default_config.dart +++ b/veilid-flutter/lib/default_config.dart @@ -58,127 +58,129 @@ int getRemoteMaxStorageSpaceMb() { return 256; } -Future getDefaultVeilidConfig(String programName) async => VeilidConfig( - programName: programName, - namespace: '', - capabilities: const VeilidConfigCapabilities(disable: []), - protectedStore: const VeilidConfigProtectedStore( - allowInsecureFallback: false, - alwaysUseInsecureStorage: false, - directory: '', - delete: false, - deviceEncryptionKeyPassword: '', - ), - tableStore: VeilidConfigTableStore( - directory: kIsWeb - ? '' - : p.join((await getApplicationSupportDirectory()).absolute.path, - 'table_store'), - delete: false, - ), - blockStore: VeilidConfigBlockStore( - directory: kIsWeb - ? '' - : p.join((await getApplicationSupportDirectory()).absolute.path, - 'block_store'), - delete: false, - ), - network: VeilidConfigNetwork( - connectionInitialTimeoutMs: 2000, - connectionInactivityTimeoutMs: 60000, - maxConnectionsPerIp4: 32, - maxConnectionsPerIp6Prefix: 32, - maxConnectionsPerIp6PrefixSize: 56, - maxConnectionFrequencyPerMin: 128, - clientWhitelistTimeoutMs: 300000, - reverseConnectionReceiptTimeMs: 5000, - holePunchReceiptTimeMs: 5000, - routingTable: const VeilidConfigRoutingTable( - nodeId: [], - nodeIdSecret: [], - bootstrap: kIsWeb - ? ['ws://bootstrap.veilid.net:5150/ws'] - : ['bootstrap.veilid.net'], - limitOverAttached: 64, - limitFullyAttached: 32, - limitAttachedStrong: 16, - limitAttachedGood: 8, - limitAttachedWeak: 4, +Future getDefaultVeilidConfig(String programName) async => + VeilidConfig( + programName: programName, + namespace: '', + capabilities: const VeilidConfigCapabilities(disable: []), + protectedStore: const VeilidConfigProtectedStore( + allowInsecureFallback: false, + alwaysUseInsecureStorage: false, + directory: '', + delete: false, + deviceEncryptionKeyPassword: '', ), - rpc: const VeilidConfigRPC( - concurrency: 0, - queueSize: 1024, - maxTimestampBehindMs: 10000, - maxTimestampAheadMs: 10000, - timeoutMs: 5000, - maxRouteHopCount: 4, - defaultRouteHopCount: 1, + tableStore: VeilidConfigTableStore( + directory: kIsWeb + ? '' + : p.join((await getApplicationSupportDirectory()).absolute.path, + 'table_store'), + delete: false, ), - dht: VeilidConfigDHT( - resolveNodeTimeoutMs: 10000, - resolveNodeCount: 20, - resolveNodeFanout: 3, - maxFindNodeCount: 20, - getValueTimeoutMs: 10000, - getValueCount: 20, - getValueFanout: 3, - setValueTimeoutMs: 10000, - setValueCount: 20, - setValueFanout: 5, - minPeerCount: 20, - minPeerRefreshTimeMs: 60000, - validateDialInfoReceiptTimeMs: 2000, - localSubkeyCacheSize: getLocalSubkeyCacheSize(), - localMaxSubkeyCacheMemoryMb: await getLocalMaxSubkeyCacheMemoryMb(), - remoteSubkeyCacheSize: getRemoteSubkeyCacheSize(), - remoteMaxRecords: getRemoteMaxRecords(), - remoteMaxSubkeyCacheMemoryMb: await getRemoteMaxSubkeyCacheMemoryMb(), - remoteMaxStorageSpaceMb: getRemoteMaxStorageSpaceMb()), - upnp: true, - detectAddressChanges: true, - restrictedNatRetries: 0, - tls: const VeilidConfigTLS( - certificatePath: '', - privateKeyPath: '', + blockStore: VeilidConfigBlockStore( + directory: kIsWeb + ? '' + : p.join((await getApplicationSupportDirectory()).absolute.path, + 'block_store'), + delete: false, + ), + network: VeilidConfigNetwork( connectionInitialTimeoutMs: 2000, - ), - application: const VeilidConfigApplication( - https: VeilidConfigHTTPS( - enabled: false, + connectionInactivityTimeoutMs: 60000, + maxConnectionsPerIp4: 32, + maxConnectionsPerIp6Prefix: 32, + maxConnectionsPerIp6PrefixSize: 56, + maxConnectionFrequencyPerMin: 128, + clientWhitelistTimeoutMs: 300000, + reverseConnectionReceiptTimeMs: 5000, + holePunchReceiptTimeMs: 5000, + routingTable: const VeilidConfigRoutingTable( + nodeId: [], + nodeIdSecret: [], + bootstrap: kIsWeb + ? ['ws://bootstrap.veilid.net:5150/ws'] + : ['bootstrap.veilid.net'], + limitOverAttached: 64, + limitFullyAttached: 32, + limitAttachedStrong: 16, + limitAttachedGood: 8, + limitAttachedWeak: 4, + ), + rpc: const VeilidConfigRPC( + concurrency: 0, + queueSize: 1024, + maxTimestampBehindMs: 10000, + maxTimestampAheadMs: 10000, + timeoutMs: 5000, + maxRouteHopCount: 4, + defaultRouteHopCount: 1, + ), + dht: VeilidConfigDHT( + resolveNodeTimeoutMs: 10000, + resolveNodeCount: 20, + resolveNodeFanout: 3, + maxFindNodeCount: 20, + getValueTimeoutMs: 10000, + getValueCount: 20, + getValueFanout: 3, + setValueTimeoutMs: 10000, + setValueCount: 20, + setValueFanout: 5, + minPeerCount: 20, + minPeerRefreshTimeMs: 60000, + validateDialInfoReceiptTimeMs: 2000, + localSubkeyCacheSize: getLocalSubkeyCacheSize(), + localMaxSubkeyCacheMemoryMb: await getLocalMaxSubkeyCacheMemoryMb(), + remoteSubkeyCacheSize: getRemoteSubkeyCacheSize(), + remoteMaxRecords: getRemoteMaxRecords(), + remoteMaxSubkeyCacheMemoryMb: + await getRemoteMaxSubkeyCacheMemoryMb(), + remoteMaxStorageSpaceMb: getRemoteMaxStorageSpaceMb()), + upnp: true, + detectAddressChanges: true, + restrictedNatRetries: 0, + tls: const VeilidConfigTLS( + certificatePath: '', + privateKeyPath: '', + connectionInitialTimeoutMs: 2000, + ), + application: const VeilidConfigApplication( + https: VeilidConfigHTTPS( + enabled: false, + listenAddress: '', + path: '', + ), + http: VeilidConfigHTTP( + enabled: false, + listenAddress: '', + path: '', + )), + protocol: const VeilidConfigProtocol( + udp: VeilidConfigUDP( + enabled: !kIsWeb, + socketPoolSize: 0, listenAddress: '', - path: '', ), - http: VeilidConfigHTTP( - enabled: false, + tcp: VeilidConfigTCP( + connect: !kIsWeb, + listen: !kIsWeb, + maxConnections: 32, listenAddress: '', - path: '', - )), - protocol: const VeilidConfigProtocol( - udp: VeilidConfigUDP( - enabled: !kIsWeb, - socketPoolSize: 0, - listenAddress: '', - ), - tcp: VeilidConfigTCP( - connect: !kIsWeb, - listen: !kIsWeb, - maxConnections: 32, - listenAddress: '', - ), - ws: VeilidConfigWS( - connect: true, - listen: !kIsWeb, - maxConnections: 16, - listenAddress: '', - path: 'ws', - ), - wss: VeilidConfigWSS( - connect: true, - listen: false, - maxConnections: 16, - listenAddress: '', - path: 'ws', + ), + ws: VeilidConfigWS( + connect: true, + listen: !kIsWeb, + maxConnections: 16, + listenAddress: '', + path: 'ws', + ), + wss: VeilidConfigWSS( + connect: true, + listen: false, + maxConnections: 16, + listenAddress: '', + path: 'ws', + ), ), ), - ), - ); + ); diff --git a/veilid-flutter/lib/routing_context.dart b/veilid-flutter/lib/routing_context.dart index eda071bb..5060e98e 100644 --- a/veilid-flutter/lib/routing_context.dart +++ b/veilid-flutter/lib/routing_context.dart @@ -76,7 +76,8 @@ class DHTRecordDescriptor with _$DHTRecordDescriptor { const factory DHTRecordDescriptor({ required TypedKey key, required PublicKey owner, - required DHTSchema schema, PublicKey? ownerSecret, + required DHTSchema schema, + PublicKey? ownerSecret, }) = _DHTRecordDescriptor; factory DHTRecordDescriptor.fromJson(dynamic json) => _$DHTRecordDescriptorFromJson(json as Map); @@ -137,9 +138,9 @@ enum Stability { lowLatency, reliable; - String toJson() => name.toPascalCase(); factory Stability.fromJson(dynamic j) => Stability.values.byName((j as String).toCamelCase()); + String toJson() => name.toPascalCase(); } ////////////////////////////////////// @@ -150,16 +151,16 @@ enum Sequencing { preferOrdered, ensureOrdered; - String toJson() => name.toPascalCase(); factory Sequencing.fromJson(dynamic j) => Sequencing.values.byName((j as String).toCamelCase()); + String toJson() => name.toPascalCase(); } ////////////////////////////////////// /// SafetySelection @immutable -abstract class SafetySelection extends Equatable { +abstract class SafetySelection { factory SafetySelection.fromJson(dynamic jsond) { final json = jsond as Map; if (json.containsKey('Unsafe')) { @@ -175,8 +176,7 @@ abstract class SafetySelection extends Equatable { } @immutable -class SafetySelectionUnsafe implements SafetySelection { - +class SafetySelectionUnsafe extends Equatable implements SafetySelection { // const SafetySelectionUnsafe({ required this.sequencing, @@ -192,8 +192,7 @@ class SafetySelectionUnsafe implements SafetySelection { } @immutable -class SafetySelectionSafe implements SafetySelection { - +class SafetySelectionSafe extends Equatable implements SafetySelection { // const SafetySelectionSafe({ required this.safetySpec, @@ -212,7 +211,10 @@ class SafetySelectionSafe implements SafetySelection { @freezed class SafetySpec with _$SafetySpec { const factory SafetySpec({ - required int hopCount, required Stability stability, required Sequencing sequencing, String? preferredRoute, + required int hopCount, + required Stability stability, + required Sequencing sequencing, + String? preferredRoute, }) = _SafetySpec; factory SafetySpec.fromJson(dynamic json) => diff --git a/veilid-flutter/lib/veilid_api_exception.dart b/veilid-flutter/lib/veilid_api_exception.dart index b61886d7..433114e9 100644 --- a/veilid-flutter/lib/veilid_api_exception.dart +++ b/veilid-flutter/lib/veilid_api_exception.dart @@ -208,8 +208,8 @@ class VeilidAPIExceptionInvalidArgument implements VeilidAPIException { final String value; @override - String toString() => - 'VeilidAPIException: InvalidArgument ($context:$argument)\n value: $value'; + String toString() => 'VeilidAPIException: InvalidArgument' + ' ($context:$argument)\n value: $value'; @override String toDisplayError() => 'Invalid argument for $context: $argument'; diff --git a/veilid-flutter/lib/veilid_config.dart b/veilid-flutter/lib/veilid_config.dart index ab6b2ba2..09de9ac6 100644 --- a/veilid-flutter/lib/veilid_config.dart +++ b/veilid-flutter/lib/veilid_config.dart @@ -125,9 +125,9 @@ enum VeilidConfigLogLevel { debug, trace; + factory VeilidConfigLogLevel.fromJson(dynamic j) => + VeilidConfigLogLevel.values.byName((j as String).toCamelCase()); String toJson() => name.toPascalCase(); - - factory VeilidConfigLogLevel.fromJson(dynamic j) => VeilidConfigLogLevel.values.byName((j as String).toCamelCase()); } ////////////////////////////////////// @@ -295,7 +295,10 @@ class VeilidConfigRPC with _$VeilidConfigRPC { const factory VeilidConfigRPC( {required int concurrency, required int queueSize, - required int timeoutMs, required int maxRouteHopCount, required int defaultRouteHopCount, int? maxTimestampBehindMs, + required int timeoutMs, + required int maxRouteHopCount, + required int defaultRouteHopCount, + int? maxTimestampBehindMs, int? maxTimestampAheadMs}) = _VeilidConfigRPC; factory VeilidConfigRPC.fromJson(dynamic json) => @@ -335,7 +338,16 @@ class VeilidConfigNetwork with _$VeilidConfigNetwork { required int clientWhitelistTimeoutMs, required int reverseConnectionReceiptTimeMs, required int holePunchReceiptTimeMs, - required VeilidConfigRoutingTable routingTable, required VeilidConfigRPC rpc, required VeilidConfigDHT dht, required bool upnp, required bool detectAddressChanges, required int restrictedNatRetries, required VeilidConfigTLS tls, required VeilidConfigApplication application, required VeilidConfigProtocol protocol, String? networkKeyPassword, + required VeilidConfigRoutingTable routingTable, + required VeilidConfigRPC rpc, + required VeilidConfigDHT dht, + required bool upnp, + required bool detectAddressChanges, + required int restrictedNatRetries, + required VeilidConfigTLS tls, + required VeilidConfigApplication application, + required VeilidConfigProtocol protocol, + String? networkKeyPassword, }) = _VeilidConfigNetwork; factory VeilidConfigNetwork.fromJson(dynamic json) => diff --git a/veilid-flutter/lib/veilid_crypto.dart b/veilid-flutter/lib/veilid_crypto.dart index 8a267b42..97686ec7 100644 --- a/veilid-flutter/lib/veilid_crypto.dart +++ b/veilid-flutter/lib/veilid_crypto.dart @@ -16,7 +16,8 @@ const CryptoKind cryptoKindVLD0 = const CryptoKind cryptoKindNONE = $N << 0 | $O << 8 | $N << 16 | $E << 24; // "NONE" -String cryptoKindToString(CryptoKind kind) => cryptoKindToBytes(kind).map(String.fromCharCode).join(); +String cryptoKindToString(CryptoKind kind) => + cryptoKindToBytes(kind).map(String.fromCharCode).join(); const CryptoKind bestCryptoKind = cryptoKindVLD0; @@ -30,8 +31,8 @@ CryptoKind cryptoKindFromString(String s) { if (s.codeUnits.length != 4) { throw const FormatException('malformed string'); } - final kind = ByteData.sublistView(Uint8List.fromList(s.codeUnits)) - .getUint32(0); + final kind = + ByteData.sublistView(Uint8List.fromList(s.codeUnits)).getUint32(0); return kind; } @@ -40,7 +41,6 @@ CryptoKind cryptoKindFromString(String s) { @immutable class Typed extends Equatable { - const Typed({required this.kind, required this.value}); factory Typed.fromString(String s) { @@ -62,9 +62,9 @@ class Typed extends Equatable { String toString() => '${cryptoKindToString(kind)}:$value'; Uint8List decode() { - final b = BytesBuilder(); - b.add(cryptoKindToBytes(kind)); - b.add(value.decode()); + final b = BytesBuilder() + ..add(cryptoKindToBytes(kind)) + ..add(value.decode()); return b.toBytes(); } @@ -73,7 +73,6 @@ class Typed extends Equatable { @immutable class KeyPair extends Equatable { - const KeyPair({required this.key, required this.secret}); factory KeyPair.fromString(String s) { @@ -101,7 +100,6 @@ class KeyPair extends Equatable { @immutable class TypedKeyPair extends Equatable { - const TypedKeyPair( {required this.kind, required this.key, required this.secret}); @@ -129,8 +127,7 @@ class TypedKeyPair extends Equatable { List get props => [kind, key, secret]; @override - String toString() => - '${cryptoKindToString(kind)}:$key:$secret'; + String toString() => '${cryptoKindToString(kind)}:$key:$secret'; String toJson() => toString(); } @@ -169,13 +166,15 @@ abstract class VeilidCryptoSystem { Future generateHash(Uint8List data); //Future generateHashReader(Stream> reader); Future validateKeyPair(PublicKey key, SecretKey secret); - Future validateKeyPairWithKeyPair(KeyPair keyPair) => validateKeyPair(keyPair.key, keyPair.secret); + Future validateKeyPairWithKeyPair(KeyPair keyPair) => + validateKeyPair(keyPair.key, keyPair.secret); Future validateHash(Uint8List data, HashDigest hash); //Future validateHashReader(Stream> reader, HashDigest hash); Future distance(CryptoKey key1, CryptoKey key2); Future sign(PublicKey key, SecretKey secret, Uint8List data); - Future signWithKeyPair(KeyPair keyPair, Uint8List data) => sign(keyPair.key, keyPair.secret, data); + Future signWithKeyPair(KeyPair keyPair, Uint8List data) => + sign(keyPair.key, keyPair.secret, data); Future verify(PublicKey key, Uint8List data, Signature signature); Future aeadOverhead(); diff --git a/veilid-flutter/lib/veilid_ffi.dart b/veilid-flutter/lib/veilid_ffi.dart index 0db5b9a1..cf899832 100644 --- a/veilid-flutter/lib/veilid_ffi.dart +++ b/veilid-flutter/lib/veilid_ffi.dart @@ -26,7 +26,8 @@ typedef _DartPostCObject = NativeFunction)>; // fn free_string(s: *mut std::os::raw::c_char) typedef _FreeStringDart = void Function(Pointer); -// fn initialize_veilid_flutter(dart_post_c_object_ptr: ffi::DartPostCObjectFnType) +// fn initialize_veilid_flutter( +// dart_post_c_object_ptr: ffi::DartPostCObjectFnType) // fn initialize_veilid_core(platform_config: FfiStr) typedef _InitializeVeilidCoreDart = void Function(Pointer); // fn change_log_level(layer: FfiStr, log_level: FfiStr) @@ -50,16 +51,20 @@ typedef _RoutingContextWithPrivacyDart = int Function(int); typedef _RoutingContextWithCustomPrivacyDart = int Function(int, Pointer); // fn routing_context_with_sequencing(id: u32, sequencing: FfiStr) typedef _RoutingContextWithSequencingDart = int Function(int, Pointer); -// fn routing_context_app_call(port: i64, id: u32, target: FfiStr, request: FfiStr) +// fn routing_context_app_call(port: i64, +// id: u32, target: FfiStr, request: FfiStr) typedef _RoutingContextAppCallDart = void Function( int, int, Pointer, Pointer); -// fn routing_context_app_message(port: i64, id: u32, target: FfiStr, request: FfiStr) +// fn routing_context_app_message(port: i64, +// id: u32, target: FfiStr, request: FfiStr) typedef _RoutingContextAppMessageDart = void Function( int, int, Pointer, Pointer); -// fn routing_context_create_dht_record(port: i64, id: u32, kind: u32, schema: FfiStr) +// fn routing_context_create_dht_record(port: i64, +// id: u32, kind: u32, schema: FfiStr) typedef _RoutingContextCreateDHTRecordDart = void Function( int, int, Pointer, int); -// fn routing_context_open_dht_record(port: i64, id: u32, key: FfiStr, writer: FfiStr) +// fn routing_context_open_dht_record(port: i64, +// id: u32, key: FfiStr, writer: FfiStr) typedef _RoutingContextOpenDHTRecordDart = void Function( int, int, Pointer, Pointer); // fn routing_context_close_dht_record(port: i64, id: u32, key: FfiStr) @@ -68,16 +73,20 @@ typedef _RoutingContextCloseDHTRecordDart = void Function( // fn routing_context_delete_dht_record(port: i64, id: u32, key: FfiStr) typedef _RoutingContextDeleteDHTRecordDart = void Function( int, int, Pointer); -// fn routing_context_get_dht_value(port: i64, id: u32, key: FfiStr, subkey: u32, force_refresh: bool) +// fn routing_context_get_dht_value(port: i64, +// id: u32, key: FfiStr, subkey: u32, force_refresh: bool) typedef _RoutingContextGetDHTValueDart = void Function( int, int, Pointer, int, bool); -// fn routing_context_set_dht_value(port: i64, id: u32, key: FfiStr, subkey: u32, data: FfiStr) +// fn routing_context_set_dht_value(port: i64, +// id: u32, key: FfiStr, subkey: u32, data: FfiStr) typedef _RoutingContextSetDHTValueDart = void Function( int, int, Pointer, int, Pointer); -// fn routing_context_watch_dht_values(port: i64, id: u32, key: FfiStr, subkeys: FfiStr, expiration: FfiStr, count: u32) +// fn routing_context_watch_dht_values(port: i64, +// id: u32, key: FfiStr, subkeys: FfiStr, expiration: FfiStr, count: u32) typedef _RoutingContextWatchDHTValuesDart = void Function( int, int, Pointer, Pointer, int, int); -// fn routing_context_cancel_dht_watch(port: i64, id: u32, key: FfiStr, subkeys: FfiStr) +// fn routing_context_cancel_dht_watch(port: i64, +// id: u32, key: FfiStr, subkeys: FfiStr) typedef _RoutingContextCancelDHTWatchDart = void Function( int, int, Pointer, Pointer); @@ -119,7 +128,8 @@ typedef _ReleaseTableDbTransactionDart = int Function(int); typedef _TableDbTransactionCommitDart = void Function(int, int); // fn table_db_transaction_rollback(port: i64, id: u32) typedef _TableDbTransactionRollbackDart = void Function(int, int); -// fn table_db_transaction_store(port: i64, id: u32, col: u32, key: FfiStr, value: FfiStr) +// fn table_db_transaction_store(port: i64, +// id: u32, col: u32, key: FfiStr, value: FfiStr) typedef _TableDbTransactionStoreDart = void Function( int, int, int, Pointer, Pointer); // fn table_db_transaction_delete(port: i64, id: u32, col: u32, key: FfiStr) @@ -129,7 +139,8 @@ typedef _TableDbTransactionDeleteDart = void Function( typedef _ValidCryptoKindsDart = Pointer Function(); // fn best_crypto_kind() -> u32 typedef _BestCryptoKindDart = int Function(); -// fn verify_signatures(port: i64, node_ids: FfiStr, data: FfiStr, signatures: FfiStr) +// fn verify_signatures(port: i64, +// node_ids: FfiStr, data: FfiStr, signatures: FfiStr) typedef _VerifySignaturesDart = void Function( int, Pointer, Pointer, Pointer); // fn generate_signatures(port: i64, data: FfiStr, key_pairs: FfiStr) @@ -147,13 +158,15 @@ typedef _CryptoComputeDHDart = void Function( typedef _CryptoRandomBytesDart = void Function(int, int, int); // fn crypto_default_salt_length(port: i64, kind: u32) typedef _CryptoDefaultSaltLengthDart = void Function(int, int); -// fn crypto_hash_password(port: i64, kind: u32, password: FfiStr, salt: FfiStr ) +// fn crypto_hash_password(port: i64, kind: u32, password: FfiStr, salt: FfiStr) typedef _CryptoHashPasswordDart = void Function( int, int, Pointer, Pointer); -// fn crypto_verify_password(port: i64, kind: u32, password: FfiStr, password_hash: FfiStr ) +// fn crypto_verify_password(port: i64, +// kind: u32, password: FfiStr, password_hash: FfiStr ) typedef _CryptoVerifyPasswordDart = void Function( int, int, Pointer, Pointer); -// fn crypto_derive_shared_secret(port: i64, kind: u32, password: FfiStr, salt: FfiStr ) +// fn crypto_derive_shared_secret(port: i64, +// kind: u32, password: FfiStr, salt: FfiStr ) // fn crypto_random_nonce(port: i64, kind: u32) typedef _CryptoRandomNonceDart = void Function(int, int); @@ -163,7 +176,8 @@ typedef _CryptoRandomSharedSecretDart = void Function(int, int); typedef _CryptoGenerateKeyPairDart = void Function(int, int); // fn crypto_generate_hash(port: i64, kind: u32, data: FfiStr) typedef _CryptoGenerateHashDart = void Function(int, int, Pointer); -// fn crypto_validate_key_pair(port: i64, kind: u32, key: FfiStr, secret: FfiStr) +// fn crypto_validate_key_pair(port: i64, +// kind: u32, key: FfiStr, secret: FfiStr) typedef _CryptoValidateKeyPairDart = void Function( int, int, Pointer, Pointer); // fn crypto_validate_hash(port: i64, kind: u32, data: FfiStr, hash: FfiStr) @@ -172,21 +186,28 @@ typedef _CryptoValidateHashDart = void Function( // fn crypto_distance(port: i64, kind: u32, key1: FfiStr, key2: FfiStr) typedef _CryptoDistanceDart = void Function( int, int, Pointer, Pointer); -// fn crypto_sign(port: i64, kind: u32, key: FfiStr, secret: FfiStr, data: FfiStr) +// fn crypto_sign(port: i64, +// kind: u32, key: FfiStr, secret: FfiStr, data: FfiStr) typedef _CryptoSignDart = void Function( int, int, Pointer, Pointer, Pointer); -// fn crypto_verify(port: i64, kind: u32, key: FfiStr, data: FfiStr, signature: FfiStr) +// fn crypto_verify(port: i64, +// kind: u32, key: FfiStr, data: FfiStr, signature: FfiStr) typedef _CryptoVerifyDart = void Function( int, int, Pointer, Pointer, Pointer); // fn crypto_aead_overhead(port: i64, kind: u32) typedef _CryptoAeadOverheadDart = void Function(int, int); -// fn crypto_decrypt_aead(port: i64, kind: u32, body: FfiStr, nonce: FfiStr, shared_secret: FfiStr, associated_data: FfiStr) +// fn crypto_decrypt_aead(port: i64, +// kind: u32, body: FfiStr, nonce: FfiStr, +// shared_secret: FfiStr, associated_data: FfiStr) typedef _CryptoDecryptAeadDart = void Function( int, int, Pointer, Pointer, Pointer, Pointer); -// fn crypto_encrypt_aead(port: i64, kind: u32, body: FfiStr, nonce: FfiStr, shared_secret: FfiStr, associated_data: FfiStr) +// fn crypto_encrypt_aead(port: i64, +// kind: u32, body: FfiStr, nonce: FfiStr, +// shared_secret: FfiStr, associated_data: FfiStr) typedef _CryptoEncryptAeadDart = void Function( int, int, Pointer, Pointer, Pointer, Pointer); -// fn crypto_crypt_no_auth(port: i64, kind: u32, body: FfiStr, nonce: FfiStr, shared_secret: FfiStr) +// fn crypto_crypt_no_auth(port: i64, +// kind: u32, body: FfiStr, nonce: FfiStr, shared_secret: FfiStr) typedef _CryptoCryptNoAuthDart = void Function( int, int, Pointer, Pointer, Pointer); @@ -343,8 +364,8 @@ Future processFutureVoid(Future future) async => case messageOk: { if (list[1] != null) { - throw VeilidAPIExceptionInternal( - "Unexpected MESSAGE_OK value '${list[1]}' where null expected"); + throw VeilidAPIExceptionInternal('Unexpected MESSAGE_OK value' + ' "${list[1]}" where null expected'); } return; } @@ -357,7 +378,8 @@ Future processFutureVoid(Future future) async => final ret = jsonDecode(list[1] as String); if (ret != null) { throw VeilidAPIExceptionInternal( - "Unexpected MESSAGE_OK_JSON value '$ret' where null expected"); + 'Unexpected MESSAGE_OK_JSON value' + ' "$ret" where null expected'); } return; } @@ -385,8 +407,8 @@ Future> processFutureStream( case messageOk: { if (list[1] != null) { - throw VeilidAPIExceptionInternal( - "Unexpected MESSAGE_OK value '${list[1]}' where null expected"); + throw VeilidAPIExceptionInternal('Unexpected MESSAGE_OK value' + ' "${list[1]}" where null expected'); } return returnStream; } @@ -399,7 +421,8 @@ Future> processFutureStream( final ret = jsonDecode(list[1] as String); if (ret != null) { throw VeilidAPIExceptionInternal( - "Unexpected MESSAGE_OK_JSON value '$ret' where null expected"); + 'Unexpected MESSAGE_OK_JSON value' + ' "$ret" where null expected'); } return returnStream; } diff --git a/veilid-flutter/lib/veilid_js.dart b/veilid-flutter/lib/veilid_js.dart index 0beb71c3..3ef1f283 100644 --- a/veilid-flutter/lib/veilid_js.dart +++ b/veilid-flutter/lib/veilid_js.dart @@ -23,19 +23,20 @@ Future _wrapApiPromise(Object p) => js_util }, test: (e) => e is! VeilidAPIException); class _Ctx { - _Ctx(int this.id, this.js); - int? id; + _Ctx(int id, this.js) : _id = id; + int? _id; final VeilidJS js; - void ensureValid() { - if (id == null) { + int requireId() { + if (_id == null) { throw VeilidAPIExceptionNotInitialized(); } + return _id!; } void close() { - if (id != null) { - js_util.callMethod(wasm, 'release_routing_context', [id]); - id = null; + if (_id != null) { + js_util.callMethod(wasm, 'release_routing_context', [_id]); + _id = null; } } } @@ -55,16 +56,15 @@ class VeilidRoutingContextJS extends VeilidRoutingContext { @override VeilidRoutingContextJS withPrivacy() { - _ctx.ensureValid(); + final id = _ctx.requireId(); final int newId = - js_util.callMethod(wasm, 'routing_context_with_privacy', [_ctx.id!]); + js_util.callMethod(wasm, 'routing_context_with_privacy', [id]); return VeilidRoutingContextJS._(_Ctx(newId, _ctx.js)); } @override VeilidRoutingContextJS withCustomPrivacy(SafetySelection safetySelection) { - _ctx.ensureValid(); - final id = _ctx.id!; + final id = _ctx.requireId(); final newId = js_util.callMethod( wasm, 'routing_context_with_custom_privacy', @@ -75,8 +75,7 @@ class VeilidRoutingContextJS extends VeilidRoutingContext { @override VeilidRoutingContextJS withSequencing(Sequencing sequencing) { - _ctx.ensureValid(); - final id = _ctx.id!; + final id = _ctx.requireId(); final newId = js_util.callMethod( wasm, 'routing_context_with_sequencing', [id, jsonEncode(sequencing)]); return VeilidRoutingContextJS._(_Ctx(newId, _ctx.js)); @@ -84,8 +83,7 @@ class VeilidRoutingContextJS extends VeilidRoutingContext { @override Future appCall(String target, Uint8List request) async { - _ctx.ensureValid(); - final id = _ctx.id!; + final id = _ctx.requireId(); final encodedRequest = base64UrlNoPadEncode(request); return base64UrlNoPadDecode(await _wrapApiPromise(js_util.callMethod( @@ -94,8 +92,7 @@ class VeilidRoutingContextJS extends VeilidRoutingContext { @override Future appMessage(String target, Uint8List message) { - _ctx.ensureValid(); - final id = _ctx.id!; + final id = _ctx.requireId(); final encodedMessage = base64UrlNoPadEncode(message); return _wrapApiPromise(js_util.callMethod( @@ -105,8 +102,7 @@ class VeilidRoutingContextJS extends VeilidRoutingContext { @override Future createDHTRecord(DHTSchema schema, {CryptoKind kind = 0}) async { - _ctx.ensureValid(); - final id = _ctx.id!; + final id = _ctx.requireId(); return DHTRecordDescriptor.fromJson(jsonDecode(await _wrapApiPromise(js_util .callMethod(wasm, 'routing_context_create_dht_record', [id, jsonEncode(schema), kind])))); @@ -115,8 +111,7 @@ class VeilidRoutingContextJS extends VeilidRoutingContext { @override Future openDHTRecord( TypedKey key, KeyPair? writer) async { - _ctx.ensureValid(); - final id = _ctx.id!; + final id = _ctx.requireId(); return DHTRecordDescriptor.fromJson(jsonDecode(await _wrapApiPromise(js_util .callMethod(wasm, 'routing_context_open_dht_record', [ id, @@ -127,16 +122,14 @@ class VeilidRoutingContextJS extends VeilidRoutingContext { @override Future closeDHTRecord(TypedKey key) { - _ctx.ensureValid(); - final id = _ctx.id!; + final id = _ctx.requireId(); return _wrapApiPromise(js_util.callMethod( wasm, 'routing_context_close_dht_record', [id, jsonEncode(key)])); } @override Future deleteDHTRecord(TypedKey key) { - _ctx.ensureValid(); - final id = _ctx.id!; + final id = _ctx.requireId(); return _wrapApiPromise(js_util.callMethod( wasm, 'routing_context_delete_dht_record', [id, jsonEncode(key)])); } @@ -144,8 +137,7 @@ class VeilidRoutingContextJS extends VeilidRoutingContext { @override Future getDHTValue( TypedKey key, int subkey, bool forceRefresh) async { - _ctx.ensureValid(); - final id = _ctx.id!; + final id = _ctx.requireId(); final opt = await _wrapApiPromise(js_util.callMethod( wasm, 'routing_context_get_dht_value', @@ -156,8 +148,7 @@ class VeilidRoutingContextJS extends VeilidRoutingContext { @override Future setDHTValue( TypedKey key, int subkey, Uint8List data) async { - _ctx.ensureValid(); - final id = _ctx.id!; + final id = _ctx.requireId(); final opt = await _wrapApiPromise(js_util.callMethod( wasm, 'routing_context_set_dht_value', @@ -168,8 +159,7 @@ class VeilidRoutingContextJS extends VeilidRoutingContext { @override Future watchDHTValues(TypedKey key, List subkeys, Timestamp expiration, int count) async { - _ctx.ensureValid(); - final id = _ctx.id!; + final id = _ctx.requireId(); final ts = await _wrapApiPromise(js_util.callMethod( wasm, 'routing_context_watch_dht_values', [ id, @@ -183,8 +173,7 @@ class VeilidRoutingContextJS extends VeilidRoutingContext { @override Future cancelDHTWatch(TypedKey key, List subkeys) { - _ctx.ensureValid(); - final id = _ctx.id!; + final id = _ctx.requireId(); return _wrapApiPromise(js_util.callMethod( wasm, 'routing_context_cancel_dht_watch', @@ -194,11 +183,11 @@ class VeilidRoutingContextJS extends VeilidRoutingContext { // JS implementation of VeilidCryptoSystem class VeilidCryptoSystemJS extends VeilidCryptoSystem { - VeilidCryptoSystemJS._(this._js, this._kind) { - // Keep the reference - _js; - } + VeilidCryptoSystemJS._(this._js, this._kind); + final CryptoKind _kind; + // Keep the reference + // ignore: unused_field final VeilidJS _js; @override @@ -420,19 +409,22 @@ class VeilidTableDBTransactionJS extends VeilidTableDBTransaction { } class _TDB { - _TDB(int this.id, this.js); - int? id; + _TDB(int id, this.js) : _id = id; + + int? _id; + final VeilidJS js; - void ensureValid() { - if (id == null) { + int requireId() { + if (_id == null) { throw VeilidAPIExceptionNotInitialized(); } + return _id!; } void close() { - if (id != null) { - js_util.callMethod(wasm, 'release_table_db', [id]); - id = null; + if (_id != null) { + js_util.callMethod(wasm, 'release_table_db', [_id]); + _id = null; } } } @@ -452,22 +444,20 @@ class VeilidTableDBJS extends VeilidTableDB { @override int getColumnCount() { - _tdb.ensureValid(); - return js_util.callMethod(wasm, 'table_db_get_column_count', [_tdb.id!]); + final id = _tdb.requireId(); + return js_util.callMethod(wasm, 'table_db_get_column_count', [id]); } @override Future> getKeys(int col) async { - _tdb.ensureValid(); - final id = _tdb.id!; + final id = _tdb.requireId(); return jsonListConstructor(base64UrlNoPadDecodeDynamic)(jsonDecode( await js_util.callMethod(wasm, 'table_db_get_keys', [id, col]))); } @override VeilidTableDBTransaction transact() { - _tdb.ensureValid(); - final id = _tdb.id!; + final id = _tdb.requireId(); final xid = js_util.callMethod(wasm, 'table_db_transact', [id]); return VeilidTableDBTransactionJS._(_TDBT(xid, this, _tdb.js)); @@ -475,8 +465,7 @@ class VeilidTableDBJS extends VeilidTableDB { @override Future store(int col, Uint8List key, Uint8List value) { - _tdb.ensureValid(); - final id = _tdb.id!; + final id = _tdb.requireId(); final encodedKey = base64UrlNoPadEncode(key); final encodedValue = base64UrlNoPadEncode(value); @@ -486,8 +475,7 @@ class VeilidTableDBJS extends VeilidTableDB { @override Future load(int col, Uint8List key) async { - _tdb.ensureValid(); - final id = _tdb.id!; + final id = _tdb.requireId(); final encodedKey = base64UrlNoPadEncode(key); final out = await _wrapApiPromise( @@ -500,8 +488,7 @@ class VeilidTableDBJS extends VeilidTableDB { @override Future delete(int col, Uint8List key) async { - _tdb.ensureValid(); - final id = _tdb.id!; + final id = _tdb.requireId(); final encodedKey = base64UrlNoPadEncode(key); final out = await _wrapApiPromise( diff --git a/veilid-flutter/lib/veilid_state.dart b/veilid-flutter/lib/veilid_state.dart index 835a786a..9ed85a5d 100644 --- a/veilid-flutter/lib/veilid_state.dart +++ b/veilid-flutter/lib/veilid_state.dart @@ -21,9 +21,10 @@ enum AttachmentState { overAttached, detaching; - String toJson() => name.toPascalCase(); factory AttachmentState.fromJson(dynamic j) => AttachmentState.values.byName((j as String).toCamelCase()); + + String toJson() => name.toPascalCase(); } ////////////////////////////////////// @@ -36,9 +37,10 @@ enum VeilidLogLevel { debug, trace; - String toJson() => name.toPascalCase(); factory VeilidLogLevel.fromJson(dynamic j) => VeilidLogLevel.values.byName((j as String).toCamelCase()); + + String toJson() => name.toPascalCase(); } //////////// @@ -109,7 +111,8 @@ class PeerStats with _$PeerStats { const factory PeerStats({ required Timestamp timeAdded, required RPCStats rpcStats, - required TransferStatsDownUp transfer, LatencyStats? latency, + required TransferStatsDownUp transfer, + LatencyStats? latency, }) = _PeerStats; factory PeerStats.fromJson(dynamic json) => @@ -141,10 +144,13 @@ sealed class VeilidUpdate with _$VeilidUpdate { String? backtrace, }) = VeilidLog; const factory VeilidUpdate.appMessage({ - @Uint8ListJsonConverter() required Uint8List message, TypedKey? sender, + @Uint8ListJsonConverter() required Uint8List message, + TypedKey? sender, }) = VeilidAppMessage; const factory VeilidUpdate.appCall({ - @Uint8ListJsonConverter() required Uint8List message, required String callId, TypedKey? sender, + @Uint8ListJsonConverter() required Uint8List message, + required String callId, + TypedKey? sender, }) = VeilidAppCall; const factory VeilidUpdate.attachment( {required AttachmentState state, diff --git a/veilid-flutter/lib/veilid_table_db.dart b/veilid-flutter/lib/veilid_table_db.dart index cf7b34c6..a78569bb 100644 --- a/veilid-flutter/lib/veilid_table_db.dart +++ b/veilid-flutter/lib/veilid_table_db.dart @@ -12,12 +12,14 @@ abstract class VeilidTableDBTransaction { Future delete(int col, Uint8List key); Future storeJson(int col, Uint8List key, Object? object, - {Object? Function(Object? nonEncodable)? toEncodable}) async => store(col, key, - utf8.encoder.convert(jsonEncode(object, toEncodable: toEncodable))); + {Object? Function(Object? nonEncodable)? toEncodable}) async => + store(col, key, + utf8.encoder.convert(jsonEncode(object, toEncodable: toEncodable))); Future storeStringJson(int col, String key, Object? object, - {Object? Function(Object? nonEncodable)? toEncodable}) => storeJson(col, utf8.encoder.convert(key), object, - toEncodable: toEncodable); + {Object? Function(Object? nonEncodable)? toEncodable}) => + storeJson(col, utf8.encoder.convert(key), object, + toEncodable: toEncodable); } abstract class VeilidTableDB { @@ -30,12 +32,14 @@ abstract class VeilidTableDB { Future delete(int col, Uint8List key); Future storeJson(int col, Uint8List key, Object? object, - {Object? Function(Object? nonEncodable)? toEncodable}) => store(col, key, - utf8.encoder.convert(jsonEncode(object, toEncodable: toEncodable))); + {Object? Function(Object? nonEncodable)? toEncodable}) => + store(col, key, + utf8.encoder.convert(jsonEncode(object, toEncodable: toEncodable))); Future storeStringJson(int col, String key, Object? object, - {Object? Function(Object? nonEncodable)? toEncodable}) => storeJson(col, utf8.encoder.convert(key), object, - toEncodable: toEncodable); + {Object? Function(Object? nonEncodable)? toEncodable}) => + storeJson(col, utf8.encoder.convert(key), object, + toEncodable: toEncodable); Future loadJson(int col, Uint8List key, {Object? Function(Object? key, Object? value)? reviver}) async { @@ -47,7 +51,8 @@ abstract class VeilidTableDB { } Future loadStringJson(int col, String key, - {Object? Function(Object? key, Object? value)? reviver}) => loadJson(col, utf8.encoder.convert(key), reviver: reviver); + {Object? Function(Object? key, Object? value)? reviver}) => + loadJson(col, utf8.encoder.convert(key), reviver: reviver); Future deleteJson(int col, Uint8List key, {Object? Function(Object? key, Object? value)? reviver}) async { @@ -59,5 +64,6 @@ abstract class VeilidTableDB { } Future deleteStringJson(int col, String key, - {Object? Function(Object? key, Object? value)? reviver}) => deleteJson(col, utf8.encoder.convert(key), reviver: reviver); + {Object? Function(Object? key, Object? value)? reviver}) => + deleteJson(col, utf8.encoder.convert(key), reviver: reviver); } diff --git a/veilid-flutter/pubspec.yaml b/veilid-flutter/pubspec.yaml index ec1052ac..daea35ca 100644 --- a/veilid-flutter/pubspec.yaml +++ b/veilid-flutter/pubspec.yaml @@ -18,11 +18,11 @@ dependencies: sdk: flutter freezed_annotation: ^2.2.0 json_annotation: ^4.8.1 - path_provider: ^2.0.9 path: ^1.8.0 + path_provider: ^2.0.9 system_info2: ^3.0.2 system_info_plus: ^0.0.5 - + dev_dependencies: build_runner: ^2.4.6 flutter_test: