From d49c631fac1e4a5c73a4a320d185dadfb05a8f24 Mon Sep 17 00:00:00 2001 From: Christien Rioux Date: Wed, 26 Jul 2023 15:12:28 -0400 Subject: [PATCH] lint cleanup --- veilid-flutter/lib/veilid.dart | 17 +- veilid-flutter/lib/veilid_api_exception.dart | 44 +-- veilid-flutter/lib/veilid_js.dart | 381 +++++++++++-------- 3 files changed, 243 insertions(+), 199 deletions(-) diff --git a/veilid-flutter/lib/veilid.dart b/veilid-flutter/lib/veilid.dart index 296f976b..b65ac68d 100644 --- a/veilid-flutter/lib/veilid.dart +++ b/veilid-flutter/lib/veilid.dart @@ -39,26 +39,15 @@ Object? veilidApiToEncodable(Object? value) { throw UnsupportedError('Cannot convert to JSON: $value'); } -T? Function(dynamic) optFromJson( - T Function(Map) jsonConstructor) => (dynamic j) { - if (j == null) { - return null; - } else { - return jsonConstructor(j); - } - }; - List Function(dynamic) jsonListConstructor( - T Function(Map) jsonConstructor) => (dynamic j) => (j as List>) - .map((e) => jsonConstructor(e)) - .toList(); + T Function(dynamic) jsonConstructor) => + (dynamic j) => (j as List).map((e) => jsonConstructor(e)).toList(); ////////////////////////////////////// /// VeilidVersion @immutable class VeilidVersion extends Equatable { - const VeilidVersion(this.major, this.minor, this.patch); final int major; final int minor; @@ -71,7 +60,6 @@ class VeilidVersion extends Equatable { /// Timestamp @immutable class Timestamp extends Equatable { - const Timestamp({required this.value}); factory Timestamp.fromString(String s) => Timestamp(value: BigInt.parse(s)); factory Timestamp.fromJson(dynamic json) => @@ -94,7 +82,6 @@ class Timestamp extends Equatable { @immutable class TimestampDuration extends Equatable { - const TimestampDuration({required this.value}); factory TimestampDuration.fromString(String s) => TimestampDuration(value: BigInt.parse(s)); diff --git a/veilid-flutter/lib/veilid_api_exception.dart b/veilid-flutter/lib/veilid_api_exception.dart index bc0deb7d..b61886d7 100644 --- a/veilid-flutter/lib/veilid_api_exception.dart +++ b/veilid-flutter/lib/veilid_api_exception.dart @@ -5,8 +5,9 @@ import 'package:freezed_annotation/freezed_annotation.dart'; @immutable abstract class VeilidAPIException implements Exception { - factory VeilidAPIException.fromJson(dynamic json) { - switch (json['kind']) { + factory VeilidAPIException.fromJson(dynamic j) { + final json = j as Map; + switch (json['kind']! as String) { case 'NotInitialized': { return VeilidAPIExceptionNotInitialized(); @@ -33,42 +34,44 @@ abstract class VeilidAPIException implements Exception { } case 'NoConnection': { - return VeilidAPIExceptionNoConnection(json['message']); + return VeilidAPIExceptionNoConnection(json['message']! as String); } case 'KeyNotFound': { - return VeilidAPIExceptionKeyNotFound(json['key']); + return VeilidAPIExceptionKeyNotFound(json['key']! as String); } case 'Internal': { - return VeilidAPIExceptionInternal(json['message']); + return VeilidAPIExceptionInternal(json['message']! as String); } case 'Unimplemented': { - return VeilidAPIExceptionUnimplemented(json['unimplemented']); + return VeilidAPIExceptionUnimplemented( + json['unimplemented']! as String); } case 'ParseError': { - return VeilidAPIExceptionParseError(json['message'], json['value']); + return VeilidAPIExceptionParseError( + json['message']! as String, json['value']! as String); } case 'InvalidArgument': { - return VeilidAPIExceptionInvalidArgument( - json['context'], json['argument'], json['value']); + return VeilidAPIExceptionInvalidArgument(json['context']! as String, + json['argument']! as String, json['value']! as String); } case 'MissingArgument': { return VeilidAPIExceptionMissingArgument( - json['context'], json['argument']); + json['context']! as String, json['argument']! as String); } case 'Generic': { - return VeilidAPIExceptionGeneric(json['message']); + return VeilidAPIExceptionGeneric(json['message']! as String); } default: { throw VeilidAPIExceptionInternal( - "Invalid VeilidAPIException type: ${json['kind']}"); + "Invalid VeilidAPIException type: ${json['kind']! as String}"); } } } @@ -132,7 +135,6 @@ class VeilidAPIExceptionInvalidTarget implements VeilidAPIException { @immutable class VeilidAPIExceptionNoConnection implements VeilidAPIException { - // const VeilidAPIExceptionNoConnection(this.message); final String message; @@ -145,7 +147,6 @@ class VeilidAPIExceptionNoConnection implements VeilidAPIException { @immutable class VeilidAPIExceptionKeyNotFound implements VeilidAPIException { - // const VeilidAPIExceptionKeyNotFound(this.key); final String key; @@ -158,7 +159,6 @@ class VeilidAPIExceptionKeyNotFound implements VeilidAPIException { @immutable class VeilidAPIExceptionInternal implements VeilidAPIException { - // const VeilidAPIExceptionInternal(this.message); final String message; @@ -172,7 +172,6 @@ class VeilidAPIExceptionInternal implements VeilidAPIException { @immutable class VeilidAPIExceptionUnimplemented implements VeilidAPIException { - // const VeilidAPIExceptionUnimplemented(this.message); final String message; @@ -186,14 +185,14 @@ class VeilidAPIExceptionUnimplemented implements VeilidAPIException { @immutable class VeilidAPIExceptionParseError implements VeilidAPIException { - // const VeilidAPIExceptionParseError(this.message, this.value); final String message; final String value; @override - String toString() => 'VeilidAPIException: ParseError ($message)\n value: $value'; + String toString() => + 'VeilidAPIException: ParseError ($message)\n value: $value'; @override String toDisplayError() => 'Parse error: $message'; @@ -201,7 +200,6 @@ class VeilidAPIExceptionParseError implements VeilidAPIException { @immutable class VeilidAPIExceptionInvalidArgument implements VeilidAPIException { - // const VeilidAPIExceptionInvalidArgument( this.context, this.argument, this.value); @@ -210,7 +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'; @@ -218,14 +217,14 @@ class VeilidAPIExceptionInvalidArgument implements VeilidAPIException { @immutable class VeilidAPIExceptionMissingArgument implements VeilidAPIException { - // const VeilidAPIExceptionMissingArgument(this.context, this.argument); final String context; final String argument; @override - String toString() => 'VeilidAPIException: MissingArgument ($context:$argument)'; + String toString() => + 'VeilidAPIException: MissingArgument ($context:$argument)'; @override String toDisplayError() => 'Missing argument for $context: $argument'; @@ -233,7 +232,6 @@ class VeilidAPIExceptionMissingArgument implements VeilidAPIException { @immutable class VeilidAPIExceptionGeneric implements VeilidAPIException { - // const VeilidAPIExceptionGeneric(this.message); final String message; diff --git a/veilid-flutter/lib/veilid_js.dart b/veilid-flutter/lib/veilid_js.dart index 17ff2161..c50c8a2d 100644 --- a/veilid-flutter/lib/veilid_js.dart +++ b/veilid-flutter/lib/veilid_js.dart @@ -13,9 +13,12 @@ Veilid getVeilid() => VeilidJS(); Object wasm = js_util.getProperty(html.window, 'veilid_wasm'); -Future _wrapApiPromise(Object p) => js_util.promiseToFuture(p).then((value) => value as T).catchError( - (error) => Future.error( - VeilidAPIException.fromJson(jsonDecode(error as String)))); +Future _wrapApiPromise(Object p) => js_util + .promiseToFuture(p) + .then((value) => value) + // ignore: inference_failure_on_untyped_parameter + .catchError((error) => Future.error( + VeilidAPIException.fromJson(jsonDecode(error as String)))); class _Ctx { _Ctx(int this.id, this.js); @@ -29,7 +32,7 @@ class _Ctx { void close() { if (id != null) { - js_util.callMethod(wasm, 'release_routing_context', [id!]); + js_util.callMethod(wasm, 'release_routing_context', [id]); id = null; } } @@ -37,7 +40,6 @@ class _Ctx { // JS implementation of VeilidRoutingContext class VeilidRoutingContextJS extends VeilidRoutingContext { - VeilidRoutingContextJS._(this._ctx) { _finalizer.attach(this, _ctx, detach: this); } @@ -60,10 +62,11 @@ class VeilidRoutingContextJS extends VeilidRoutingContext { @override VeilidRoutingContextJS withCustomPrivacy(SafetySelection safetySelection) { _ctx.ensureValid(); - final newId = js_util.callMethod( + final id = _ctx.id!; + final newId = js_util.callMethod( wasm, 'routing_context_with_custom_privacy', - [_ctx.id!, jsonEncode(safetySelection)]); + [id, jsonEncode(safetySelection)]); return VeilidRoutingContextJS._(_Ctx(newId, _ctx.js)); } @@ -71,45 +74,50 @@ class VeilidRoutingContextJS extends VeilidRoutingContext { @override VeilidRoutingContextJS withSequencing(Sequencing sequencing) { _ctx.ensureValid(); - final newId = js_util.callMethod(wasm, 'routing_context_with_sequencing', - [_ctx.id!, jsonEncode(sequencing)]); + final id = _ctx.id!; + final newId = js_util.callMethod( + wasm, 'routing_context_with_sequencing', [id, jsonEncode(sequencing)]); return VeilidRoutingContextJS._(_Ctx(newId, _ctx.js)); } @override Future appCall(String target, Uint8List request) async { _ctx.ensureValid(); + final id = _ctx.id!; final encodedRequest = base64UrlNoPadEncode(request); return base64UrlNoPadDecode(await _wrapApiPromise(js_util.callMethod( - wasm, 'routing_context_app_call', [_ctx.id!, target, encodedRequest]))); + wasm, 'routing_context_app_call', [id, target, encodedRequest]))); } @override Future appMessage(String target, Uint8List message) { _ctx.ensureValid(); + final id = _ctx.id!; final encodedMessage = base64UrlNoPadEncode(message); - return _wrapApiPromise(js_util.callMethod(wasm, - 'routing_context_app_message', [_ctx.id!, target, encodedMessage])); + return _wrapApiPromise(js_util.callMethod( + wasm, 'routing_context_app_message', [id, target, encodedMessage])); } @override Future createDHTRecord(DHTSchema schema, {CryptoKind kind = 0}) async { _ctx.ensureValid(); + final id = _ctx.id!; return DHTRecordDescriptor.fromJson(jsonDecode(await _wrapApiPromise(js_util .callMethod(wasm, 'routing_context_create_dht_record', - [_ctx.id!, jsonEncode(schema), kind])))); + [id, jsonEncode(schema), kind])))); } @override Future openDHTRecord( TypedKey key, KeyPair? writer) async { _ctx.ensureValid(); + final id = _ctx.id!; return DHTRecordDescriptor.fromJson(jsonDecode(await _wrapApiPromise(js_util .callMethod(wasm, 'routing_context_open_dht_record', [ - _ctx.id!, + id, jsonEncode(key), if (writer != null) jsonEncode(writer) else null ])))); @@ -118,25 +126,28 @@ class VeilidRoutingContextJS extends VeilidRoutingContext { @override Future closeDHTRecord(TypedKey key) { _ctx.ensureValid(); + final id = _ctx.id!; return _wrapApiPromise(js_util.callMethod( - wasm, 'routing_context_close_dht_record', [_ctx.id!, jsonEncode(key)])); + wasm, 'routing_context_close_dht_record', [id, jsonEncode(key)])); } @override Future deleteDHTRecord(TypedKey key) { _ctx.ensureValid(); - return _wrapApiPromise(js_util.callMethod(wasm, - 'routing_context_delete_dht_record', [_ctx.id!, jsonEncode(key)])); + final id = _ctx.id!; + return _wrapApiPromise(js_util.callMethod( + wasm, 'routing_context_delete_dht_record', [id, jsonEncode(key)])); } @override Future getDHTValue( TypedKey key, int subkey, bool forceRefresh) async { _ctx.ensureValid(); - final opt = await _wrapApiPromise(js_util.callMethod( + final id = _ctx.id!; + final opt = await _wrapApiPromise(js_util.callMethod( wasm, 'routing_context_get_dht_value', - [_ctx.id!, jsonEncode(key), subkey, forceRefresh])); + [id, jsonEncode(key), subkey, forceRefresh])); return opt == null ? null : ValueData.fromJson(jsonDecode(opt)); } @@ -144,10 +155,11 @@ class VeilidRoutingContextJS extends VeilidRoutingContext { Future setDHTValue( TypedKey key, int subkey, Uint8List data) async { _ctx.ensureValid(); - final opt = await _wrapApiPromise(js_util.callMethod( + final id = _ctx.id!; + final opt = await _wrapApiPromise(js_util.callMethod( wasm, 'routing_context_set_dht_value', - [_ctx.id!, jsonEncode(key), subkey, base64UrlNoPadEncode(data)])); + [id, jsonEncode(key), subkey, base64UrlNoPadEncode(data)])); return opt == null ? null : ValueData.fromJson(jsonDecode(opt)); } @@ -155,9 +167,10 @@ class VeilidRoutingContextJS extends VeilidRoutingContext { Future watchDHTValues(TypedKey key, List subkeys, Timestamp expiration, int count) async { _ctx.ensureValid(); - final ts = await _wrapApiPromise(js_util.callMethod( + final id = _ctx.id!; + final ts = await _wrapApiPromise(js_util.callMethod( wasm, 'routing_context_watch_dht_values', [ - _ctx.id!, + id, jsonEncode(key), jsonEncode(subkeys), expiration.toString(), @@ -169,16 +182,16 @@ class VeilidRoutingContextJS extends VeilidRoutingContext { @override Future cancelDHTWatch(TypedKey key, List subkeys) { _ctx.ensureValid(); + final id = _ctx.id!; return _wrapApiPromise(js_util.callMethod( wasm, 'routing_context_cancel_dht_watch', - [_ctx.id!, jsonEncode(key), jsonEncode(subkeys)])); + [id, jsonEncode(key), jsonEncode(subkeys)])); } } // JS implementation of VeilidCryptoSystem class VeilidCryptoSystemJS extends VeilidCryptoSystem { - VeilidCryptoSystemJS._(this._js, this._kind) { // Keep the reference _js; @@ -190,127 +203,151 @@ class VeilidCryptoSystemJS extends VeilidCryptoSystem { CryptoKind kind() => _kind; @override - Future cachedDH(PublicKey key, SecretKey secret) async => SharedSecret.fromJson(jsonDecode(await _wrapApiPromise(js_util - .callMethod(wasm, 'crypto_cached_dh', - [_kind, jsonEncode(key), jsonEncode(secret)])))); + Future cachedDH(PublicKey key, SecretKey secret) async => + SharedSecret.fromJson(jsonDecode(await _wrapApiPromise(js_util.callMethod( + wasm, + 'crypto_cached_dh', + [_kind, jsonEncode(key), jsonEncode(secret)])))); @override - Future computeDH(PublicKey key, SecretKey secret) async => SharedSecret.fromJson(jsonDecode(await _wrapApiPromise(js_util - .callMethod(wasm, 'crypto_compute_dh', - [_kind, jsonEncode(key), jsonEncode(secret)])))); + Future computeDH(PublicKey key, SecretKey secret) async => + SharedSecret.fromJson(jsonDecode(await _wrapApiPromise(js_util.callMethod( + wasm, + 'crypto_compute_dh', + [_kind, jsonEncode(key), jsonEncode(secret)])))); @override - Future randomBytes(int len) async => base64UrlNoPadDecode(await _wrapApiPromise( - js_util.callMethod(wasm, 'crypto_random_bytes', [_kind, len]))); + Future randomBytes(int len) async => + base64UrlNoPadDecode(await _wrapApiPromise( + js_util.callMethod(wasm, 'crypto_random_bytes', [_kind, len]))); @override Future defaultSaltLength() => _wrapApiPromise( - js_util.callMethod(wasm, 'crypto_default_salt_length', [_kind])); + js_util.callMethod(wasm, 'crypto_default_salt_length', [_kind])); @override - Future hashPassword(Uint8List password, Uint8List salt) => _wrapApiPromise(js_util.callMethod(wasm, 'crypto_hash_password', - [_kind, base64UrlNoPadEncode(password), base64UrlNoPadEncode(salt)])); + Future hashPassword(Uint8List password, Uint8List salt) => + _wrapApiPromise(js_util.callMethod(wasm, 'crypto_hash_password', + [_kind, base64UrlNoPadEncode(password), base64UrlNoPadEncode(salt)])); @override - Future verifyPassword(Uint8List password, String passwordHash) => _wrapApiPromise(js_util.callMethod(wasm, 'crypto_verify_password', - [_kind, base64UrlNoPadEncode(password), passwordHash])); + Future verifyPassword(Uint8List password, String passwordHash) => + _wrapApiPromise(js_util.callMethod(wasm, 'crypto_verify_password', + [_kind, base64UrlNoPadEncode(password), passwordHash])); @override Future deriveSharedSecret( - Uint8List password, Uint8List salt) async => SharedSecret.fromJson(jsonDecode(await _wrapApiPromise(js_util - .callMethod(wasm, 'crypto_derive_shared_secret', [ - _kind, - base64UrlNoPadEncode(password), - base64UrlNoPadEncode(salt) - ])))); + Uint8List password, Uint8List salt) async => + SharedSecret.fromJson(jsonDecode(await _wrapApiPromise(js_util.callMethod( + wasm, 'crypto_derive_shared_secret', [ + _kind, + base64UrlNoPadEncode(password), + base64UrlNoPadEncode(salt) + ])))); @override - Future randomNonce() async => Nonce.fromJson(jsonDecode(await _wrapApiPromise( - js_util.callMethod(wasm, 'crypto_random_nonce', [_kind])))); + Future randomNonce() async => + Nonce.fromJson(jsonDecode(await _wrapApiPromise( + js_util.callMethod(wasm, 'crypto_random_nonce', [_kind])))); @override - Future randomSharedSecret() async => SharedSecret.fromJson(jsonDecode(await _wrapApiPromise( - js_util.callMethod(wasm, 'crypto_random_shared_secret', [_kind])))); + Future randomSharedSecret() async => + SharedSecret.fromJson(jsonDecode(await _wrapApiPromise( + js_util.callMethod(wasm, 'crypto_random_shared_secret', [_kind])))); @override - Future generateKeyPair() async => KeyPair.fromJson(jsonDecode(await _wrapApiPromise( - js_util.callMethod(wasm, 'crypto_generate_key_pair', [_kind])))); + Future generateKeyPair() async => + KeyPair.fromJson(jsonDecode(await _wrapApiPromise( + js_util.callMethod(wasm, 'crypto_generate_key_pair', [_kind])))); @override - Future generateHash(Uint8List data) async => HashDigest.fromJson(jsonDecode(await _wrapApiPromise(js_util - .callMethod(wasm, 'crypto_generate_hash', - [_kind, base64UrlNoPadEncode(data)])))); + Future generateHash(Uint8List data) async => + HashDigest.fromJson(jsonDecode(await _wrapApiPromise(js_util.callMethod( + wasm, 'crypto_generate_hash', [_kind, base64UrlNoPadEncode(data)])))); @override - Future validateKeyPair(PublicKey key, SecretKey secret) => _wrapApiPromise(js_util.callMethod(wasm, 'crypto_validate_key_pair', - [_kind, jsonEncode(key), jsonEncode(secret)])); + Future validateKeyPair(PublicKey key, SecretKey secret) => + _wrapApiPromise(js_util.callMethod(wasm, 'crypto_validate_key_pair', + [_kind, jsonEncode(key), jsonEncode(secret)])); @override - Future validateHash(Uint8List data, HashDigest hash) => _wrapApiPromise(js_util.callMethod(wasm, 'crypto_validate_hash', - [_kind, base64UrlNoPadEncode(data), jsonEncode(hash)])); + Future validateHash(Uint8List data, HashDigest hash) => + _wrapApiPromise(js_util.callMethod(wasm, 'crypto_validate_hash', + [_kind, base64UrlNoPadEncode(data), jsonEncode(hash)])); @override - Future distance(CryptoKey key1, CryptoKey key2) async => CryptoKeyDistance.fromJson(jsonDecode(await _wrapApiPromise(js_util - .callMethod(wasm, 'crypto_distance', - [_kind, jsonEncode(key1), jsonEncode(key2)])))); + Future distance(CryptoKey key1, CryptoKey key2) async => + CryptoKeyDistance.fromJson(jsonDecode(await _wrapApiPromise(js_util + .callMethod(wasm, 'crypto_distance', + [_kind, jsonEncode(key1), jsonEncode(key2)])))); @override Future sign( - PublicKey key, SecretKey secret, Uint8List data) async => Signature.fromJson(jsonDecode(await _wrapApiPromise(js_util - .callMethod(wasm, 'crypto_sign', [ - _kind, - jsonEncode(key), - jsonEncode(secret), - base64UrlNoPadEncode(data) - ])))); + PublicKey key, SecretKey secret, Uint8List data) async => + Signature.fromJson(jsonDecode(await _wrapApiPromise(js_util.callMethod( + wasm, 'crypto_sign', [ + _kind, + jsonEncode(key), + jsonEncode(secret), + base64UrlNoPadEncode(data) + ])))); @override - Future verify(PublicKey key, Uint8List data, Signature signature) => _wrapApiPromise(js_util.callMethod(wasm, 'crypto_verify', [ - _kind, - jsonEncode(key), - base64UrlNoPadEncode(data), - jsonEncode(signature), - ])); + Future verify(PublicKey key, Uint8List data, Signature signature) => + _wrapApiPromise(js_util.callMethod(wasm, 'crypto_verify', [ + _kind, + jsonEncode(key), + base64UrlNoPadEncode(data), + jsonEncode(signature), + ])); @override Future aeadOverhead() => _wrapApiPromise( - js_util.callMethod(wasm, 'crypto_aead_overhead', [_kind])); + js_util.callMethod(wasm, 'crypto_aead_overhead', [_kind])); @override Future decryptAead(Uint8List body, Nonce nonce, - SharedSecret sharedSecret, Uint8List? associatedData) async => base64UrlNoPadDecode( - await _wrapApiPromise(js_util.callMethod(wasm, 'crypto_decrypt_aead', [ - _kind, - base64UrlNoPadEncode(body), - jsonEncode(nonce), - jsonEncode(sharedSecret), - if (associatedData != null) base64UrlNoPadEncode(associatedData) else null - ]))); + SharedSecret sharedSecret, Uint8List? associatedData) async => + base64UrlNoPadDecode(await _wrapApiPromise( + js_util.callMethod(wasm, 'crypto_decrypt_aead', [ + _kind, + base64UrlNoPadEncode(body), + jsonEncode(nonce), + jsonEncode(sharedSecret), + if (associatedData != null) + base64UrlNoPadEncode(associatedData) + else + null + ]))); @override Future encryptAead(Uint8List body, Nonce nonce, - SharedSecret sharedSecret, Uint8List? associatedData) async => base64UrlNoPadDecode( - await _wrapApiPromise(js_util.callMethod(wasm, 'crypto_encrypt_aead', [ - _kind, - base64UrlNoPadEncode(body), - jsonEncode(nonce), - jsonEncode(sharedSecret), - if (associatedData != null) base64UrlNoPadEncode(associatedData) else null - ]))); + SharedSecret sharedSecret, Uint8List? associatedData) async => + base64UrlNoPadDecode(await _wrapApiPromise( + js_util.callMethod(wasm, 'crypto_encrypt_aead', [ + _kind, + base64UrlNoPadEncode(body), + jsonEncode(nonce), + jsonEncode(sharedSecret), + if (associatedData != null) + base64UrlNoPadEncode(associatedData) + else + null + ]))); @override Future cryptNoAuth( - Uint8List body, Nonce nonce, SharedSecret sharedSecret) async => base64UrlNoPadDecode(await _wrapApiPromise(js_util.callMethod( - wasm, 'crypto_crypt_no_auth', [ - _kind, - base64UrlNoPadEncode(body), - jsonEncode(nonce), - jsonEncode(sharedSecret) - ]))); + Uint8List body, Nonce nonce, SharedSecret sharedSecret) async => + base64UrlNoPadDecode(await _wrapApiPromise(js_util.callMethod( + wasm, 'crypto_crypt_no_auth', [ + _kind, + base64UrlNoPadEncode(body), + jsonEncode(nonce), + jsonEncode(sharedSecret) + ]))); } class _TDBT { - _TDBT(this.id, this.tdbjs, this.js); int? id; final VeilidTableDBJS tdbjs; @@ -323,7 +360,7 @@ class _TDBT { void close() { if (id != null) { - js_util.callMethod(wasm, 'release_table_db_transaction', [id!]); + js_util.callMethod(wasm, 'release_table_db_transaction', [id]); id = null; } } @@ -331,7 +368,6 @@ class _TDBT { // JS implementation of VeilidTableDBTransaction class VeilidTableDBTransactionJS extends VeilidTableDBTransaction { - VeilidTableDBTransactionJS._(this._tdbt) { _finalizer.attach(this, _tdbt, detach: this); } @@ -344,41 +380,44 @@ class VeilidTableDBTransactionJS extends VeilidTableDBTransaction { @override Future commit() async { _tdbt.ensureValid(); - await _wrapApiPromise( - js_util.callMethod(wasm, 'table_db_transaction_commit', [_tdbt.id!])); + final id = _tdbt.id!; + await _wrapApiPromise( + js_util.callMethod(wasm, 'table_db_transaction_commit', [id])); _tdbt.close(); } @override Future rollback() async { _tdbt.ensureValid(); - await _wrapApiPromise( - js_util.callMethod(wasm, 'table_db_transaction_rollback', [_tdbt.id!])); + final id = _tdbt.id!; + await _wrapApiPromise( + js_util.callMethod(wasm, 'table_db_transaction_rollback', [id])); _tdbt.close(); } @override Future store(int col, Uint8List key, Uint8List value) async { _tdbt.ensureValid(); + final id = _tdbt.id!; final encodedKey = base64UrlNoPadEncode(key); final encodedValue = base64UrlNoPadEncode(value); - await _wrapApiPromise(js_util.callMethod(wasm, 'table_db_transaction_store', - [_tdbt.id!, col, encodedKey, encodedValue])); + await _wrapApiPromise(js_util.callMethod(wasm, + 'table_db_transaction_store', [id, col, encodedKey, encodedValue])); } @override Future delete(int col, Uint8List key) async { _tdbt.ensureValid(); + final id = _tdbt.id!; final encodedKey = base64UrlNoPadEncode(key); - await _wrapApiPromise(js_util.callMethod( - wasm, 'table_db_transaction_delete', [_tdbt.id!, col, encodedKey])); + await _wrapApiPromise(js_util.callMethod( + wasm, 'table_db_transaction_delete', [id, col, encodedKey])); } } class _TDB { - _TDB(int this.id, this.js); int? id; final VeilidJS js; @@ -390,7 +429,7 @@ class _TDB { void close() { if (id != null) { - js_util.callMethod(wasm, 'release_table_db', [id!]); + js_util.callMethod(wasm, 'release_table_db', [id]); id = null; } } @@ -398,7 +437,6 @@ class _TDB { // JS implementation of VeilidTableDB class VeilidTableDBJS extends VeilidTableDB { - VeilidTableDBJS._(this._tdb) { _finalizer.attach(this, _tdb, detach: this); } @@ -419,35 +457,39 @@ class VeilidTableDBJS extends VeilidTableDB { @override Future> getKeys(int col) async { _tdb.ensureValid(); + final id = _tdb.id!; return jsonListConstructor(base64UrlNoPadDecodeDynamic)(jsonDecode( - await js_util.callMethod(wasm, 'table_db_get_keys', [_tdb.id!, col]))); + await js_util.callMethod(wasm, 'table_db_get_keys', [id, col]))); } @override VeilidTableDBTransaction transact() { _tdb.ensureValid(); - final id = js_util.callMethod(wasm, 'table_db_transact', [_tdb.id!]); + final id = _tdb.id!; + final xid = js_util.callMethod(wasm, 'table_db_transact', [id]); - return VeilidTableDBTransactionJS._(_TDBT(id, this, _tdb.js)); + return VeilidTableDBTransactionJS._(_TDBT(xid, this, _tdb.js)); } @override Future store(int col, Uint8List key, Uint8List value) { _tdb.ensureValid(); + final id = _tdb.id!; final encodedKey = base64UrlNoPadEncode(key); final encodedValue = base64UrlNoPadEncode(value); return _wrapApiPromise(js_util.callMethod( - wasm, 'table_db_store', [_tdb.id!, col, encodedKey, encodedValue])); + wasm, 'table_db_store', [id, col, encodedKey, encodedValue])); } @override Future load(int col, Uint8List key) async { _tdb.ensureValid(); + final id = _tdb.id!; final encodedKey = base64UrlNoPadEncode(key); - final out = await _wrapApiPromise( - js_util.callMethod(wasm, 'table_db_load', [_tdb.id!, col, encodedKey])); + final out = await _wrapApiPromise( + js_util.callMethod(wasm, 'table_db_load', [id, col, encodedKey])); if (out == null) { return null; } @@ -455,12 +497,17 @@ class VeilidTableDBJS extends VeilidTableDB { } @override - Future delete(int col, Uint8List key) { + Future delete(int col, Uint8List key) async { _tdb.ensureValid(); + final id = _tdb.id!; final encodedKey = base64UrlNoPadEncode(key); - return _wrapApiPromise(js_util - .callMethod(wasm, 'table_db_delete', [_tdb.id!, col, encodedKey])); + final out = await _wrapApiPromise( + js_util.callMethod(wasm, 'table_db_delete', [id, col, encodedKey])); + if (out == null) { + return null; + } + return base64UrlNoPadDecode(out); } } @@ -470,48 +517,52 @@ class VeilidJS extends Veilid { @override void initializeVeilidCore(Map platformConfigJson) { final platformConfigJsonString = jsonEncode(platformConfigJson); - js_util - .callMethod(wasm, 'initialize_veilid_core', [platformConfigJsonString]); + js_util.callMethod( + wasm, 'initialize_veilid_core', [platformConfigJsonString]); } @override void changeLogLevel(String layer, VeilidConfigLogLevel logLevel) { final logLevelJsonString = jsonEncode(logLevel); - js_util.callMethod(wasm, 'change_log_level', [layer, logLevelJsonString]); + js_util.callMethod( + wasm, 'change_log_level', [layer, logLevelJsonString]); } @override Future> startupVeilidCore(VeilidConfig config) async { final streamController = StreamController(); - updateCallback(String update) { - final updateJson = jsonDecode(update); + void updateCallback(String update) { + final updateJson = jsonDecode(update) as Map; if (updateJson['kind'] == 'Shutdown') { - streamController.close(); + unawaited(streamController.close()); } else { final update = VeilidUpdate.fromJson(updateJson); streamController.add(update); } } - await _wrapApiPromise(js_util.callMethod(wasm, 'startup_veilid_core', + await _wrapApiPromise(js_util.callMethod(wasm, 'startup_veilid_core', [js.allowInterop(updateCallback), jsonEncode(config)])); return streamController.stream; } @override - Future getVeilidState() async => VeilidState.fromJson(jsonDecode(await _wrapApiPromise( - js_util.callMethod(wasm, 'get_veilid_state', [])))); + Future getVeilidState() async => + VeilidState.fromJson(jsonDecode(await _wrapApiPromise( + js_util.callMethod(wasm, 'get_veilid_state', [])))); @override - Future attach() => _wrapApiPromise(js_util.callMethod(wasm, 'attach', [])); + Future attach() => + _wrapApiPromise(js_util.callMethod(wasm, 'attach', [])); @override - Future detach() => _wrapApiPromise(js_util.callMethod(wasm, 'detach', [])); + Future detach() => + _wrapApiPromise(js_util.callMethod(wasm, 'detach', [])); @override - Future shutdownVeilidCore() => _wrapApiPromise( - js_util.callMethod(wasm, 'shutdown_veilid_core', [])); + Future shutdownVeilidCore() => + _wrapApiPromise(js_util.callMethod(wasm, 'shutdown_veilid_core', [])); @override List validCryptoKinds() { @@ -530,37 +581,41 @@ class VeilidJS extends Veilid { @override Future bestCryptoSystem() async => VeilidCryptoSystemJS._( - this, js_util.callMethod(wasm, 'best_crypto_kind', [])); + this, js_util.callMethod(wasm, 'best_crypto_kind', [])); @override Future> verifySignatures(List nodeIds, - Uint8List data, List signatures) async => jsonListConstructor(TypedKey.fromJson)(jsonDecode( - await _wrapApiPromise(js_util.callMethod(wasm, 'verify_signatures', [ - jsonEncode(nodeIds), - base64UrlNoPadEncode(data), - jsonEncode(signatures) - ])))); + Uint8List data, List signatures) async => + jsonListConstructor(TypedKey.fromJson)(jsonDecode(await _wrapApiPromise( + js_util.callMethod(wasm, 'verify_signatures', [ + jsonEncode(nodeIds), + base64UrlNoPadEncode(data), + jsonEncode(signatures) + ])))); @override Future> generateSignatures( - Uint8List data, List keyPairs) async => jsonListConstructor(TypedSignature.fromJson)(jsonDecode( - await _wrapApiPromise(js_util.callMethod(wasm, 'generate_signatures', - [base64UrlNoPadEncode(data), jsonEncode(keyPairs)])))); + Uint8List data, List keyPairs) async => + jsonListConstructor(TypedSignature.fromJson)(jsonDecode( + await _wrapApiPromise(js_util.callMethod(wasm, 'generate_signatures', + [base64UrlNoPadEncode(data), jsonEncode(keyPairs)])))); @override - Future generateKeyPair(CryptoKind kind) async => TypedKeyPair.fromJson(jsonDecode(await _wrapApiPromise( - js_util.callMethod(wasm, 'generate_key_pair', [kind])))); + Future generateKeyPair(CryptoKind kind) async => + TypedKeyPair.fromJson(jsonDecode(await _wrapApiPromise( + js_util.callMethod(wasm, 'generate_key_pair', [kind])))); @override Future routingContext() async { - final var id = - await _wrapApiPromise(js_util.callMethod(wasm, 'routing_context', [])); - return VeilidRoutingContextJS._(_Ctx(id, this)); + final rcid = await _wrapApiPromise( + js_util.callMethod(wasm, 'routing_context', [])); + return VeilidRoutingContextJS._(_Ctx(rcid, this)); } @override - Future newPrivateRoute() async => RouteBlob.fromJson(jsonDecode(await _wrapApiPromise( - js_util.callMethod(wasm, 'new_private_route', [])))); + Future newPrivateRoute() async => + RouteBlob.fromJson(jsonDecode(await _wrapApiPromise( + js_util.callMethod(wasm, 'new_private_route', [])))); @override Future newCustomPrivateRoute( @@ -581,8 +636,8 @@ class VeilidJS extends Veilid { } @override - Future releasePrivateRoute(String key) => _wrapApiPromise( - js_util.callMethod(wasm, 'release_private_route', [key])); + Future releasePrivateRoute(String key) => + _wrapApiPromise(js_util.callMethod(wasm, 'release_private_route', [key])); @override Future appCallReply(String callId, Uint8List message) { @@ -593,28 +648,32 @@ class VeilidJS extends Veilid { @override Future openTableDB(String name, int columnCount) async { - final id = await _wrapApiPromise( + final dbid = await _wrapApiPromise( js_util.callMethod(wasm, 'open_table_db', [name, columnCount])); - return VeilidTableDBJS._(_TDB(id, this)); + return VeilidTableDBJS._(_TDB(dbid, this)); } @override - Future deleteTableDB(String name) => _wrapApiPromise(js_util.callMethod(wasm, 'delete_table_db', [name])); + Future deleteTableDB(String name) => + _wrapApiPromise(js_util.callMethod(wasm, 'delete_table_db', [name])); @override Timestamp now() => Timestamp.fromString(js_util.callMethod(wasm, 'now', [])); @override - Future debug(String command) async => await _wrapApiPromise(js_util.callMethod(wasm, 'debug', [command])); + Future debug(String command) async => + _wrapApiPromise(js_util.callMethod(wasm, 'debug', [command])); @override - String veilidVersionString() => js_util.callMethod(wasm, 'veilid_version_string', []); + String veilidVersionString() => + js_util.callMethod(wasm, 'veilid_version_string', []); @override VeilidVersion veilidVersion() { - Map jsonVersion = - jsonDecode(js_util.callMethod(wasm, 'veilid_version', [])); - return VeilidVersion( - jsonVersion['major'], jsonVersion['minor'], jsonVersion['patch']); + final jsonVersion = + jsonDecode(js_util.callMethod(wasm, 'veilid_version', [])) + as Map; + return VeilidVersion(jsonVersion['major'] as int, + jsonVersion['minor'] as int, jsonVersion['patch'] as int); } }