wasm work
This commit is contained in:
		| @@ -7,6 +7,119 @@ import 'package:change_case/change_case.dart'; | ||||
| import 'veilid_encoding.dart'; | ||||
| import 'veilid.dart'; | ||||
|  | ||||
| ////////////////////////////////////////////////////////// | ||||
| // FFI Platform-specific config | ||||
|  | ||||
| class VeilidFFIConfigLoggingTerminal { | ||||
|   bool enabled; | ||||
|   VeilidConfigLogLevel level; | ||||
|  | ||||
|   VeilidFFIConfigLoggingTerminal({ | ||||
|     required this.enabled, | ||||
|     required this.level, | ||||
|   }); | ||||
|  | ||||
|   Map<String, dynamic> toJson() { | ||||
|     return { | ||||
|       'enabled': enabled, | ||||
|       'level': level.toJson(), | ||||
|     }; | ||||
|   } | ||||
|  | ||||
|   VeilidFFIConfigLoggingTerminal.fromJson(dynamic json) | ||||
|       : enabled = json['enabled'], | ||||
|         level = veilidConfigLogLevelFromJson(json['level']); | ||||
| } | ||||
|  | ||||
| class VeilidFFIConfigLoggingOtlp { | ||||
|   bool enabled; | ||||
|   VeilidConfigLogLevel level; | ||||
|   String grpcEndpoint; | ||||
|   String serviceName; | ||||
|  | ||||
|   VeilidFFIConfigLoggingOtlp({ | ||||
|     required this.enabled, | ||||
|     required this.level, | ||||
|     required this.grpcEndpoint, | ||||
|     required this.serviceName, | ||||
|   }); | ||||
|  | ||||
|   Map<String, dynamic> toJson() { | ||||
|     return { | ||||
|       'enabled': enabled, | ||||
|       'level': level.toJson(), | ||||
|       'grpc_endpoint': grpcEndpoint, | ||||
|       'service_name': serviceName, | ||||
|     }; | ||||
|   } | ||||
|  | ||||
|   VeilidFFIConfigLoggingOtlp.fromJson(dynamic json) | ||||
|       : enabled = json['enabled'], | ||||
|         level = veilidConfigLogLevelFromJson(json['level']), | ||||
|         grpcEndpoint = json['grpc_endpoint'], | ||||
|         serviceName = json['service_name']; | ||||
| } | ||||
|  | ||||
| class VeilidFFIConfigLoggingApi { | ||||
|   bool enabled; | ||||
|   VeilidConfigLogLevel level; | ||||
|  | ||||
|   VeilidFFIConfigLoggingApi({ | ||||
|     required this.enabled, | ||||
|     required this.level, | ||||
|   }); | ||||
|  | ||||
|   Map<String, dynamic> toJson() { | ||||
|     return { | ||||
|       'enabled': enabled, | ||||
|       'level': level.toJson(), | ||||
|     }; | ||||
|   } | ||||
|  | ||||
|   VeilidFFIConfigLoggingApi.fromJson(dynamic json) | ||||
|       : enabled = json['enabled'], | ||||
|         level = veilidConfigLogLevelFromJson(json['level']); | ||||
| } | ||||
|  | ||||
| class VeilidFFIConfigLogging { | ||||
|   VeilidFFIConfigLoggingTerminal terminal; | ||||
|   VeilidFFIConfigLoggingOtlp otlp; | ||||
|   VeilidFFIConfigLoggingApi api; | ||||
|  | ||||
|   VeilidFFIConfigLogging( | ||||
|       {required this.terminal, required this.otlp, required this.api}); | ||||
|  | ||||
|   Map<String, dynamic> toJson() { | ||||
|     return { | ||||
|       'terminal': terminal.toJson(), | ||||
|       'otlp': otlp.toJson(), | ||||
|       'api': api.toJson(), | ||||
|     }; | ||||
|   } | ||||
|  | ||||
|   VeilidFFIConfigLogging.fromJson(dynamic json) | ||||
|       : terminal = VeilidFFIConfigLoggingTerminal.fromJson(json['terminal']), | ||||
|         otlp = VeilidFFIConfigLoggingOtlp.fromJson(json['otlp']), | ||||
|         api = VeilidFFIConfigLoggingApi.fromJson(json['api']); | ||||
| } | ||||
|  | ||||
| class VeilidFFIConfig { | ||||
|   VeilidFFIConfigLogging logging; | ||||
|  | ||||
|   VeilidFFIConfig({ | ||||
|     required this.logging, | ||||
|   }); | ||||
|  | ||||
|   Map<String, dynamic> toJson() { | ||||
|     return { | ||||
|       'logging': logging.toJson(), | ||||
|     }; | ||||
|   } | ||||
|  | ||||
|   VeilidFFIConfig.fromJson(Map<String, dynamic> json) | ||||
|       : logging = VeilidFFIConfigLogging.fromJson(json['logging']); | ||||
| } | ||||
|  | ||||
| ////////////////////////////////////// | ||||
| /// VeilidConfigLogLevel | ||||
|  | ||||
| @@ -29,6 +142,95 @@ VeilidConfigLogLevel veilidConfigLogLevelFromJson(String j) { | ||||
|   return VeilidConfigLogLevel.values.byName(j.toCamelCase()); | ||||
| } | ||||
|  | ||||
| ////////////////////////////////////////////////////////// | ||||
| // WASM Platform-specific config | ||||
|  | ||||
| class VeilidWASMConfigLoggingPerformance { | ||||
|   bool enabled; | ||||
|   VeilidConfigLogLevel level; | ||||
|   bool logsInTimings; | ||||
|   bool logsInConsole; | ||||
|  | ||||
|   VeilidWASMConfigLoggingPerformance({ | ||||
|     required this.enabled, | ||||
|     required this.level, | ||||
|     required this.logsInTimings, | ||||
|     required this.logsInConsole, | ||||
|   }); | ||||
|  | ||||
|   Map<String, dynamic> toJson() { | ||||
|     return { | ||||
|       'enabled': enabled, | ||||
|       'level': level.toJson(), | ||||
|       'logs_in_timings': logsInTimings, | ||||
|       'logs_in_console': logsInConsole, | ||||
|     }; | ||||
|   } | ||||
|  | ||||
|   VeilidWASMConfigLoggingPerformance.fromJson(dynamic json) | ||||
|       : enabled = json['enabled'], | ||||
|         level = veilidConfigLogLevelFromJson(json['level']), | ||||
|         logsInTimings = json['logs_in_timings'], | ||||
|         logsInConsole = json['logs_in_console']; | ||||
| } | ||||
|  | ||||
| class VeilidWASMConfigLoggingApi { | ||||
|   bool enabled; | ||||
|   VeilidConfigLogLevel level; | ||||
|  | ||||
|   VeilidWASMConfigLoggingApi({ | ||||
|     required this.enabled, | ||||
|     required this.level, | ||||
|   }); | ||||
|  | ||||
|   Map<String, dynamic> toJson() { | ||||
|     return { | ||||
|       'enabled': enabled, | ||||
|       'level': level.toJson(), | ||||
|     }; | ||||
|   } | ||||
|  | ||||
|   VeilidWASMConfigLoggingApi.fromJson(dynamic json) | ||||
|       : enabled = json['enabled'], | ||||
|         level = veilidConfigLogLevelFromJson(json['level']); | ||||
| } | ||||
|  | ||||
| class VeilidWASMConfigLogging { | ||||
|   VeilidWASMConfigLoggingPerformance performance; | ||||
|   VeilidWASMConfigLoggingApi api; | ||||
|  | ||||
|   VeilidWASMConfigLogging({required this.performance, required this.api}); | ||||
|  | ||||
|   Map<String, dynamic> toJson() { | ||||
|     return { | ||||
|       'performance': performance.toJson(), | ||||
|       'api': api.toJson(), | ||||
|     }; | ||||
|   } | ||||
|  | ||||
|   VeilidWASMConfigLogging.fromJson(dynamic json) | ||||
|       : performance = | ||||
|             VeilidWASMConfigLoggingPerformance.fromJson(json['performance']), | ||||
|         api = VeilidWASMConfigLoggingApi.fromJson(json['api']); | ||||
| } | ||||
|  | ||||
| class VeilidWASMConfig { | ||||
|   VeilidWASMConfigLogging logging; | ||||
|  | ||||
|   VeilidWASMConfig({ | ||||
|     required this.logging, | ||||
|   }); | ||||
|  | ||||
|   Map<String, dynamic> toJson() { | ||||
|     return { | ||||
|       'logging': logging.toJson(), | ||||
|     }; | ||||
|   } | ||||
|  | ||||
|   VeilidWASMConfig.fromJson(dynamic json) | ||||
|       : logging = VeilidWASMConfigLogging.fromJson(json['logging']); | ||||
| } | ||||
|  | ||||
| ////////////////////////////////////// | ||||
| /// VeilidConfig | ||||
|  | ||||
|   | ||||
| @@ -145,10 +145,10 @@ abstract class VeilidCryptoSystem { | ||||
|   Future<SharedSecret> randomSharedSecret(); | ||||
|   Future<KeyPair> generateKeyPair(); | ||||
|   Future<HashDigest> generateHash(Uint8List data); | ||||
|   Future<HashDigest> generateHashReader(Stream<List<int>> reader); | ||||
|   //Future<HashDigest> generateHashReader(Stream<List<int>> reader); | ||||
|   Future<bool> validateKeyPair(PublicKey key, SecretKey secret); | ||||
|   Future<bool> validateHash(Uint8List data, HashDigest hash); | ||||
|   Future<bool> validateHashReader(Stream<List<int>> reader, HashDigest hash); | ||||
|   //Future<bool> validateHashReader(Stream<List<int>> reader, HashDigest hash); | ||||
|   Future<CryptoKeyDistance> distance(CryptoKey key1, CryptoKey key2); | ||||
|   Future<Signature> sign(PublicKey key, SecretKey secret, Uint8List data); | ||||
|   Future<void> verify(PublicKey key, Uint8List data, Signature signature); | ||||
|   | ||||
| @@ -10,119 +10,6 @@ import 'package:ffi/ffi.dart'; | ||||
| import 'veilid.dart'; | ||||
| import 'veilid_encoding.dart'; | ||||
|  | ||||
| ////////////////////////////////////////////////////////// | ||||
| // FFI Platform-specific config | ||||
|  | ||||
| class VeilidFFIConfigLoggingTerminal { | ||||
|   bool enabled; | ||||
|   VeilidConfigLogLevel level; | ||||
|  | ||||
|   VeilidFFIConfigLoggingTerminal({ | ||||
|     required this.enabled, | ||||
|     required this.level, | ||||
|   }); | ||||
|  | ||||
|   Map<String, dynamic> toJson() { | ||||
|     return { | ||||
|       'enabled': enabled, | ||||
|       'level': level.toJson(), | ||||
|     }; | ||||
|   } | ||||
|  | ||||
|   VeilidFFIConfigLoggingTerminal.fromJson(dynamic json) | ||||
|       : enabled = json['enabled'], | ||||
|         level = veilidConfigLogLevelFromJson(json['level']); | ||||
| } | ||||
|  | ||||
| class VeilidFFIConfigLoggingOtlp { | ||||
|   bool enabled; | ||||
|   VeilidConfigLogLevel level; | ||||
|   String grpcEndpoint; | ||||
|   String serviceName; | ||||
|  | ||||
|   VeilidFFIConfigLoggingOtlp({ | ||||
|     required this.enabled, | ||||
|     required this.level, | ||||
|     required this.grpcEndpoint, | ||||
|     required this.serviceName, | ||||
|   }); | ||||
|  | ||||
|   Map<String, dynamic> toJson() { | ||||
|     return { | ||||
|       'enabled': enabled, | ||||
|       'level': level.toJson(), | ||||
|       'grpc_endpoint': grpcEndpoint, | ||||
|       'service_name': serviceName, | ||||
|     }; | ||||
|   } | ||||
|  | ||||
|   VeilidFFIConfigLoggingOtlp.fromJson(dynamic json) | ||||
|       : enabled = json['enabled'], | ||||
|         level = veilidConfigLogLevelFromJson(json['level']), | ||||
|         grpcEndpoint = json['grpc_endpoint'], | ||||
|         serviceName = json['service_name']; | ||||
| } | ||||
|  | ||||
| class VeilidFFIConfigLoggingApi { | ||||
|   bool enabled; | ||||
|   VeilidConfigLogLevel level; | ||||
|  | ||||
|   VeilidFFIConfigLoggingApi({ | ||||
|     required this.enabled, | ||||
|     required this.level, | ||||
|   }); | ||||
|  | ||||
|   Map<String, dynamic> toJson() { | ||||
|     return { | ||||
|       'enabled': enabled, | ||||
|       'level': level.toJson(), | ||||
|     }; | ||||
|   } | ||||
|  | ||||
|   VeilidFFIConfigLoggingApi.fromJson(dynamic json) | ||||
|       : enabled = json['enabled'], | ||||
|         level = veilidConfigLogLevelFromJson(json['level']); | ||||
| } | ||||
|  | ||||
| class VeilidFFIConfigLogging { | ||||
|   VeilidFFIConfigLoggingTerminal terminal; | ||||
|   VeilidFFIConfigLoggingOtlp otlp; | ||||
|   VeilidFFIConfigLoggingApi api; | ||||
|  | ||||
|   VeilidFFIConfigLogging( | ||||
|       {required this.terminal, required this.otlp, required this.api}); | ||||
|  | ||||
|   Map<String, dynamic> toJson() { | ||||
|     return { | ||||
|       'terminal': terminal.toJson(), | ||||
|       'otlp': otlp.toJson(), | ||||
|       'api': api.toJson(), | ||||
|     }; | ||||
|   } | ||||
|  | ||||
|   VeilidFFIConfigLogging.fromJson(dynamic json) | ||||
|       : terminal = VeilidFFIConfigLoggingTerminal.fromJson(json['terminal']), | ||||
|         otlp = VeilidFFIConfigLoggingOtlp.fromJson(json['otlp']), | ||||
|         api = VeilidFFIConfigLoggingApi.fromJson(json['api']); | ||||
| } | ||||
|  | ||||
| class VeilidFFIConfig { | ||||
|   VeilidFFIConfigLogging logging; | ||||
|  | ||||
|   VeilidFFIConfig({ | ||||
|     required this.logging, | ||||
|   }); | ||||
|  | ||||
|   Map<String, dynamic> toJson() { | ||||
|     return { | ||||
|       'logging': logging.toJson(), | ||||
|     }; | ||||
|   } | ||||
|  | ||||
|   VeilidFFIConfig.fromJson(Map<String, dynamic> json) | ||||
|       : logging = VeilidFFIConfigLogging.fromJson(json['logging']); | ||||
| } | ||||
|  | ||||
| ////////////////////////////////////////////////////////// | ||||
|  | ||||
| // Load the veilid_flutter library once | ||||
| @@ -961,8 +848,9 @@ class VeilidTableDBFFI extends VeilidTableDB { | ||||
| // FFI implementation of VeilidCryptoSystem | ||||
| class VeilidCryptoSystemFFI implements VeilidCryptoSystem { | ||||
|   final CryptoKind _kind; | ||||
|   VeilidFFI _ffi; | ||||
|  | ||||
|   VeilidCryptoSystemFFI._(this._kind); | ||||
|   VeilidCryptoSystemFFI._(this._ffi, this._kind); | ||||
|  | ||||
|   @override | ||||
|   CryptoKind kind() { | ||||
| @@ -970,42 +858,183 @@ class VeilidCryptoSystemFFI implements VeilidCryptoSystem { | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   Future<SharedSecret> cachedDH(PublicKey key, SecretKey secret) {} | ||||
|   Future<SharedSecret> cachedDH(PublicKey key, SecretKey secret) { | ||||
|     final nativeKey = jsonEncode(key).toNativeUtf8(); | ||||
|     final nativeSecret = jsonEncode(secret).toNativeUtf8(); | ||||
|  | ||||
|     final recvPort = ReceivePort("crypto_cached_dh"); | ||||
|     final sendPort = recvPort.sendPort; | ||||
|     _ffi._cryptoCachedDH(sendPort.nativePort, _kind, nativeKey, nativeSecret); | ||||
|     return processFutureJson(SharedSecret.fromJson, recvPort.first); | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   Future<SharedSecret> computeDH(PublicKey key, SecretKey secret) {} | ||||
|   Future<SharedSecret> computeDH(PublicKey key, SecretKey secret) { | ||||
|     final nativeKey = jsonEncode(key).toNativeUtf8(); | ||||
|     final nativeSecret = jsonEncode(secret).toNativeUtf8(); | ||||
|  | ||||
|     final recvPort = ReceivePort("crypto_compute_dh"); | ||||
|     final sendPort = recvPort.sendPort; | ||||
|     _ffi._cryptoComputeDH(sendPort.nativePort, _kind, nativeKey, nativeSecret); | ||||
|     return processFutureJson(SharedSecret.fromJson, recvPort.first); | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   Future<Nonce> randomNonce() {} | ||||
|   Future<Nonce> randomNonce() { | ||||
|     final recvPort = ReceivePort("crypto_random_nonce"); | ||||
|     final sendPort = recvPort.sendPort; | ||||
|     _ffi._cryptoRandomNonce(sendPort.nativePort, _kind); | ||||
|     return processFutureJson(Nonce.fromJson, recvPort.first); | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   Future<SharedSecret> randomSharedSecret() {} | ||||
|   Future<SharedSecret> randomSharedSecret() { | ||||
|     final recvPort = ReceivePort("crypto_random_shared_secret"); | ||||
|     final sendPort = recvPort.sendPort; | ||||
|     _ffi._cryptoRandomSharedSecret(sendPort.nativePort, _kind); | ||||
|     return processFutureJson(SharedSecret.fromJson, recvPort.first); | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   Future<KeyPair> generateKeyPair() {} | ||||
|   Future<KeyPair> generateKeyPair() { | ||||
|     final recvPort = ReceivePort("crypto_generate_key_pair"); | ||||
|     final sendPort = recvPort.sendPort; | ||||
|     _ffi._cryptoGenerateKeyPair(sendPort.nativePort, _kind); | ||||
|     return processFutureJson(KeyPair.fromJson, recvPort.first); | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   Future<HashDigest> generateHash(Uint8List data) {} | ||||
|   Future<HashDigest> generateHash(Uint8List data) { | ||||
|     final nativeEncodedData = base64UrlNoPadEncode(data).toNativeUtf8(); | ||||
|  | ||||
|     final recvPort = ReceivePort("crypto_generate_hash"); | ||||
|     final sendPort = recvPort.sendPort; | ||||
|     _ffi._cryptoGenerateHash(sendPort.nativePort, _kind, nativeEncodedData); | ||||
|     return processFutureJson(HashDigest.fromJson, recvPort.first); | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   Future<HashDigest> generateHashReader(Stream<List<int>> reader) {} | ||||
|   Future<bool> validateKeyPair(PublicKey key, SecretKey secret) { | ||||
|     final nativeKey = jsonEncode(key).toNativeUtf8(); | ||||
|     final nativeSecret = jsonEncode(secret).toNativeUtf8(); | ||||
|  | ||||
|     final recvPort = ReceivePort("crypto_validate_key_pair"); | ||||
|     final sendPort = recvPort.sendPort; | ||||
|     _ffi._cryptoValidateKeyPair( | ||||
|         sendPort.nativePort, _kind, nativeKey, nativeSecret); | ||||
|     return processFuturePlain(recvPort.first); | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   Future<bool> validateKeyPair(PublicKey key, SecretKey secret) {} | ||||
|   Future<bool> validateHash(Uint8List data, HashDigest hash) { | ||||
|     final nativeEncodedData = base64UrlNoPadEncode(data).toNativeUtf8(); | ||||
|     final nativeHash = jsonEncode(hash).toNativeUtf8(); | ||||
|  | ||||
|     final recvPort = ReceivePort("crypto_validate_hash"); | ||||
|     final sendPort = recvPort.sendPort; | ||||
|     _ffi._cryptoValidateHash( | ||||
|         sendPort.nativePort, _kind, nativeEncodedData, nativeHash); | ||||
|     return processFuturePlain(recvPort.first); | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   Future<bool> validateHash(Uint8List data, HashDigest hash) {} | ||||
|   Future<CryptoKeyDistance> distance(CryptoKey key1, CryptoKey key2) { | ||||
|     final nativeKey1 = jsonEncode(key1).toNativeUtf8(); | ||||
|     final nativeKey2 = jsonEncode(key2).toNativeUtf8(); | ||||
|  | ||||
|     final recvPort = ReceivePort("crypto_distance"); | ||||
|     final sendPort = recvPort.sendPort; | ||||
|     _ffi._cryptoDistance(sendPort.nativePort, _kind, nativeKey1, nativeKey2); | ||||
|     return processFutureJson(CryptoKeyDistance.fromJson, recvPort.first); | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   Future<bool> validateHashReader(Stream<List<int>> reader, HashDigest hash) {} | ||||
|   Future<Signature> sign(PublicKey key, SecretKey secret, Uint8List data) { | ||||
|     final nativeKey = jsonEncode(key).toNativeUtf8(); | ||||
|     final nativeSecret = jsonEncode(secret).toNativeUtf8(); | ||||
|     final nativeEncodedData = base64UrlNoPadEncode(data).toNativeUtf8(); | ||||
|  | ||||
|     final recvPort = ReceivePort("crypto_sign"); | ||||
|     final sendPort = recvPort.sendPort; | ||||
|     _ffi._cryptoSign( | ||||
|         sendPort.nativePort, _kind, nativeKey, nativeSecret, nativeEncodedData); | ||||
|     return processFutureJson(Signature.fromJson, recvPort.first); | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   Future<CryptoKeyDistance> distance(CryptoKey key1, CryptoKey key2) {} | ||||
|   Future<void> verify(PublicKey key, Uint8List data, Signature signature) { | ||||
|     final nativeKey = jsonEncode(key).toNativeUtf8(); | ||||
|     final nativeEncodedData = base64UrlNoPadEncode(data).toNativeUtf8(); | ||||
|     final nativeSignature = jsonEncode(signature).toNativeUtf8(); | ||||
|  | ||||
|     final recvPort = ReceivePort("crypto_sign"); | ||||
|     final sendPort = recvPort.sendPort; | ||||
|     _ffi._cryptoSign(sendPort.nativePort, _kind, nativeKey, nativeEncodedData, | ||||
|         nativeSignature); | ||||
|     return processFutureVoid(recvPort.first); | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   Future<Signature> sign(PublicKey key, SecretKey secret, Uint8List data) {} | ||||
|   @override | ||||
|   Future<void> verify(PublicKey key, Uint8List data, Signature signature) {} | ||||
|   @override | ||||
|   Future<int> aeadOverhead() {} | ||||
|   Future<int> aeadOverhead() { | ||||
|     final recvPort = ReceivePort("crypto_aead_overhead"); | ||||
|     final sendPort = recvPort.sendPort; | ||||
|     _ffi._cryptoAeadOverhead( | ||||
|       sendPort.nativePort, | ||||
|       _kind, | ||||
|     ); | ||||
|     return processFuturePlain(recvPort.first); | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   Future<Uint8List> decryptAead(Uint8List body, Nonce nonce, | ||||
|       SharedSecret sharedSecret, Uint8List? associatedData) {} | ||||
|       SharedSecret sharedSecret, Uint8List? associatedData) async { | ||||
|     final nativeEncodedBody = base64UrlNoPadEncode(body).toNativeUtf8(); | ||||
|     final nativeNonce = jsonEncode(nonce).toNativeUtf8(); | ||||
|     final nativeSharedSecret = jsonEncode(sharedSecret).toNativeUtf8(); | ||||
|     final nativeSignature = (associatedData != null) | ||||
|         ? jsonEncode(associatedData).toNativeUtf8() | ||||
|         : nullptr; | ||||
|  | ||||
|     final recvPort = ReceivePort("crypto_decrypt_aead"); | ||||
|     final sendPort = recvPort.sendPort; | ||||
|     _ffi._cryptoDecryptAead(sendPort.nativePort, _kind, nativeEncodedBody, | ||||
|         nativeNonce, nativeSharedSecret, nativeSignature); | ||||
|     final out = await processFuturePlain(recvPort.first); | ||||
|     return base64UrlNoPadDecode(out); | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   Future<Uint8List> encryptAead(Uint8List body, Nonce nonce, | ||||
|       SharedSecret sharedSecret, Uint8List? associatedData) {} | ||||
|       SharedSecret sharedSecret, Uint8List? associatedData) async { | ||||
|     final nativeEncodedBody = base64UrlNoPadEncode(body).toNativeUtf8(); | ||||
|     final nativeNonce = jsonEncode(nonce).toNativeUtf8(); | ||||
|     final nativeSharedSecret = jsonEncode(sharedSecret).toNativeUtf8(); | ||||
|     final nativeSignature = (associatedData != null) | ||||
|         ? jsonEncode(associatedData).toNativeUtf8() | ||||
|         : nullptr; | ||||
|  | ||||
|     final recvPort = ReceivePort("crypto_encrypt_aead"); | ||||
|     final sendPort = recvPort.sendPort; | ||||
|     _ffi._cryptoEncryptAead(sendPort.nativePort, _kind, nativeEncodedBody, | ||||
|         nativeNonce, nativeSharedSecret, nativeSignature); | ||||
|     final out = await processFuturePlain(recvPort.first); | ||||
|     return base64UrlNoPadDecode(out); | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   Future<Uint8List> cryptNoAuth( | ||||
|       Uint8List body, Nonce nonce, SharedSecret sharedSecret) {} | ||||
|       Uint8List body, Nonce nonce, SharedSecret sharedSecret) async { | ||||
|     final nativeEncodedBody = base64UrlNoPadEncode(body).toNativeUtf8(); | ||||
|     final nativeNonce = jsonEncode(nonce).toNativeUtf8(); | ||||
|     final nativeSharedSecret = jsonEncode(sharedSecret).toNativeUtf8(); | ||||
|  | ||||
|     final recvPort = ReceivePort("crypto_crypt_no_auth"); | ||||
|     final sendPort = recvPort.sendPort; | ||||
|     _ffi._cryptoCryptNoAuth(sendPort.nativePort, _kind, nativeEncodedBody, | ||||
|         nativeNonce, nativeSharedSecret); | ||||
|     final out = await processFuturePlain(recvPort.first); | ||||
|     return base64UrlNoPadDecode(out); | ||||
|   } | ||||
| } | ||||
|  | ||||
| // FFI implementation of high level Veilid API | ||||
| @@ -1363,16 +1392,15 @@ class VeilidFFI implements Veilid { | ||||
|  | ||||
|   @override | ||||
|   Future<RouteBlob> newCustomPrivateRoute( | ||||
|       Stability stability, Sequencing sequencing) async { | ||||
|       Stability stability, Sequencing sequencing) { | ||||
|     final recvPort = ReceivePort("new_custom_private_route"); | ||||
|     final sendPort = recvPort.sendPort; | ||||
|     _newCustomPrivateRoute( | ||||
|         sendPort.nativePort, | ||||
|         jsonEncode(stability).toNativeUtf8(), | ||||
|         jsonEncode(sequencing).toNativeUtf8()); | ||||
|     final routeBlob = | ||||
|         await processFutureJson(RouteBlob.fromJson, recvPort.first); | ||||
|     return routeBlob; | ||||
|  | ||||
|     return processFutureJson(RouteBlob.fromJson, recvPort.first); | ||||
|   } | ||||
|  | ||||
|   @override | ||||
| @@ -1436,12 +1464,12 @@ class VeilidFFI implements Veilid { | ||||
|     if (!validCryptoKinds().contains(kind)) { | ||||
|       throw VeilidAPIExceptionGeneric("unsupported cryptosystem"); | ||||
|     } | ||||
|     return VeilidCryptoSystemFFI._(kind); | ||||
|     return VeilidCryptoSystemFFI._(this, kind); | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   Future<VeilidCryptoSystem> bestCryptoSystem() async { | ||||
|     return VeilidCryptoSystemFFI._(_bestCryptoKind()); | ||||
|     return VeilidCryptoSystemFFI._(this, _bestCryptoKind()); | ||||
|   } | ||||
|  | ||||
|   @override | ||||
| @@ -1451,19 +1479,41 @@ class VeilidFFI implements Veilid { | ||||
|     final nativeData = base64UrlNoPadEncode(data).toNativeUtf8(); | ||||
|     final nativeSignatures = jsonEncode(signatures).toNativeUtf8(); | ||||
|  | ||||
|     final recvPort = ReceivePort("app_call_reply"); | ||||
|     final recvPort = ReceivePort("verify_signatures"); | ||||
|     final sendPort = recvPort.sendPort; | ||||
|     _verifySignatures( | ||||
|         sendPort.nativePort, nativeNodeIds, nativeData, nativeSignatures); | ||||
|     return processFutureJson( | ||||
|         jsonListConstructor<TypedKey>(TypedKey.fromJson), recvPort.first); | ||||
|   } | ||||
| xxx | ||||
|  | ||||
|   @override | ||||
|   Future<List<TypedSignature>> generateSignatures( | ||||
|       Uint8List data, List<TypedKeyPair> keyPairs) {} | ||||
|       Uint8List data, List<TypedKeyPair> keyPairs) { | ||||
|     final nativeData = base64UrlNoPadEncode(data).toNativeUtf8(); | ||||
|     final nativeKeyPairs = jsonEncode(keyPairs).toNativeUtf8(); | ||||
|  | ||||
|     final recvPort = ReceivePort("generate_signatures"); | ||||
|     final sendPort = recvPort.sendPort; | ||||
|     _generateSignatures(sendPort.nativePort, nativeData, nativeKeyPairs); | ||||
|     return processFutureJson( | ||||
|         jsonListConstructor<TypedSignature>(TypedSignature.fromJson), | ||||
|         recvPort.first); | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   Future<TypedKeyPair> generateKeyPair(CryptoKind kind) {} | ||||
|   Timestamp now() { | ||||
|     final ts = _now(); | ||||
|     return Timestamp(value: BigInt.from(ts)); | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   Future<TypedKeyPair> generateKeyPair(CryptoKind kind) { | ||||
|     final recvPort = ReceivePort("generate_key_pair"); | ||||
|     final sendPort = recvPort.sendPort; | ||||
|     _generateKeyPair(sendPort.nativePort, kind); | ||||
|     return processFutureJson(TypedKeyPair.fromJson, recvPort.first); | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   Future<String> debug(String command) async { | ||||
|   | ||||
| @@ -9,95 +9,6 @@ import 'dart:typed_data'; | ||||
|  | ||||
| import 'veilid_encoding.dart'; | ||||
|  | ||||
| ////////////////////////////////////////////////////////// | ||||
| // WASM Platform-specific config | ||||
|  | ||||
| class VeilidWASMConfigLoggingPerformance { | ||||
|   bool enabled; | ||||
|   VeilidConfigLogLevel level; | ||||
|   bool logsInTimings; | ||||
|   bool logsInConsole; | ||||
|  | ||||
|   VeilidWASMConfigLoggingPerformance({ | ||||
|     required this.enabled, | ||||
|     required this.level, | ||||
|     required this.logsInTimings, | ||||
|     required this.logsInConsole, | ||||
|   }); | ||||
|  | ||||
|   Map<String, dynamic> toJson() { | ||||
|     return { | ||||
|       'enabled': enabled, | ||||
|       'level': level.toJson(), | ||||
|       'logs_in_timings': logsInTimings, | ||||
|       'logs_in_console': logsInConsole, | ||||
|     }; | ||||
|   } | ||||
|  | ||||
|   VeilidWASMConfigLoggingPerformance.fromJson(dynamic json) | ||||
|       : enabled = json['enabled'], | ||||
|         level = veilidConfigLogLevelFromJson(json['level']), | ||||
|         logsInTimings = json['logs_in_timings'], | ||||
|         logsInConsole = json['logs_in_console']; | ||||
| } | ||||
|  | ||||
| class VeilidWASMConfigLoggingApi { | ||||
|   bool enabled; | ||||
|   VeilidConfigLogLevel level; | ||||
|  | ||||
|   VeilidWASMConfigLoggingApi({ | ||||
|     required this.enabled, | ||||
|     required this.level, | ||||
|   }); | ||||
|  | ||||
|   Map<String, dynamic> toJson() { | ||||
|     return { | ||||
|       'enabled': enabled, | ||||
|       'level': level.toJson(), | ||||
|     }; | ||||
|   } | ||||
|  | ||||
|   VeilidWASMConfigLoggingApi.fromJson(dynamic json) | ||||
|       : enabled = json['enabled'], | ||||
|         level = veilidConfigLogLevelFromJson(json['level']); | ||||
| } | ||||
|  | ||||
| class VeilidWASMConfigLogging { | ||||
|   VeilidWASMConfigLoggingPerformance performance; | ||||
|   VeilidWASMConfigLoggingApi api; | ||||
|  | ||||
|   VeilidWASMConfigLogging({required this.performance, required this.api}); | ||||
|  | ||||
|   Map<String, dynamic> toJson() { | ||||
|     return { | ||||
|       'performance': performance.toJson(), | ||||
|       'api': api.toJson(), | ||||
|     }; | ||||
|   } | ||||
|  | ||||
|   VeilidWASMConfigLogging.fromJson(dynamic json) | ||||
|       : performance = | ||||
|             VeilidWASMConfigLoggingPerformance.fromJson(json['performance']), | ||||
|         api = VeilidWASMConfigLoggingApi.fromJson(json['api']); | ||||
| } | ||||
|  | ||||
| class VeilidWASMConfig { | ||||
|   VeilidWASMConfigLogging logging; | ||||
|  | ||||
|   VeilidWASMConfig({ | ||||
|     required this.logging, | ||||
|   }); | ||||
|  | ||||
|   Map<String, dynamic> toJson() { | ||||
|     return { | ||||
|       'logging': logging.toJson(), | ||||
|     }; | ||||
|   } | ||||
|  | ||||
|   VeilidWASMConfig.fromJson(dynamic json) | ||||
|       : logging = VeilidWASMConfigLogging.fromJson(json['logging']); | ||||
| } | ||||
|  | ||||
| ////////////////////////////////////////////////////////// | ||||
|  | ||||
| Veilid getVeilid() => VeilidJS(); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user