twonly-app/lib/src/signal/connect_signed_pre_key_store.dart
2025-01-31 23:42:32 +01:00

72 lines
2.2 KiB
Dart

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<int, Uint8List>();
Future<HashMap<int, Uint8List>> getStore() async {
final storage = getSecureStorage();
final storeSerialized = await storage.read(key: "signed_pre_key_store");
var store = HashMap<int, Uint8List>();
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<int, Uint8List> 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<SignedPreKeyRecord> 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<List<SignedPreKeyRecord>> loadSignedPreKeys() async {
final store = await getStore();
final results = <SignedPreKeyRecord>[];
for (final serialized in store.values) {
results.add(SignedPreKeyRecord.fromSerialized(serialized));
}
return results;
}
@override
Future<void> storeSignedPreKey(
int signedPreKeyId, SignedPreKeyRecord record) async {
final store = await getStore();
store[signedPreKeyId] = record.serialize();
await safeStore(store);
}
@override
Future<bool> containsSignedPreKey(int signedPreKeyId) async =>
(await getStore()).containsKey(signedPreKeyId);
@override
Future<void> removeSignedPreKey(int signedPreKeyId) async {
final store = await getStore();
store.remove(signedPreKeyId);
await safeStore(store);
}
}