import 'dart:collection'; import 'dart:convert'; import 'dart:typed_data'; import 'package:libsignal_protocol_dart/libsignal_protocol_dart.dart'; import 'package:twonly/src/utils/misc.dart'; class ConnectSignedPreKeyStore extends SignedPreKeyStore { // final store = HashMap(); Future> getStore() async { final storage = getSecureStorage(); final storeSerialized = await storage.read(key: "signed_pre_key_store"); var store = HashMap(); if (storeSerialized == null) { return store; } final storeHashMap = json.decode(storeSerialized); for (final item in storeHashMap) { store[item[0]] = base64Decode(item[1]); } return store; } Future safeStore(HashMap store) async { final storage = getSecureStorage(); var storeHashMap = []; for (final item in store.entries) { storeHashMap.add([item.key, base64Encode(item.value)]); } final storeSerialized = json.encode(storeHashMap); await storage.write(key: "signed_pre_key_store", value: storeSerialized); } @override Future loadSignedPreKey(int signedPreKeyId) async { final store = await getStore(); if (!store.containsKey(signedPreKeyId)) { throw InvalidKeyIdException( 'No such signedprekeyrecord! $signedPreKeyId'); } return SignedPreKeyRecord.fromSerialized(store[signedPreKeyId]!); } @override Future> loadSignedPreKeys() async { final store = await getStore(); final results = []; for (final serialized in store.values) { results.add(SignedPreKeyRecord.fromSerialized(serialized)); } return results; } @override Future storeSignedPreKey( int signedPreKeyId, SignedPreKeyRecord record) async { final store = await getStore(); store[signedPreKeyId] = record.serialize(); await safeStore(store); } @override Future containsSignedPreKey(int signedPreKeyId) async => (await getStore()).containsKey(signedPreKeyId); @override Future removeSignedPreKey(int signedPreKeyId) async { final store = await getStore(); store.remove(signedPreKeyId); await safeStore(store); } }