loadMissingMetadatas method
Implementation
Future<List<Metadata>> loadMissingMetadatas(List<String> pubKeys,
RelaySet relaySet, {bool splitRequestsByPubKeyMappings=true, Function(Metadata)? onLoad}) async {
List<String> missingPubKeys = [];
for (var pubKey in pubKeys) {
Metadata? userMetadata = cacheManager.loadMetadata(pubKey);
if (userMetadata == null) {
// TODO check if not too old (time passed since last refreshed timestamp)
missingPubKeys.add(pubKey);
}
}
Map<String, Metadata> metadatas = {};
if (missingPubKeys.isNotEmpty) {
print("loading missing user metadatas ${missingPubKeys.length}");
try {
await for (final event in (await query(
idleTimeout: 1,
splitRequestsByPubKeyMappings: splitRequestsByPubKeyMappings,
Filter(authors: missingPubKeys, kinds: [Metadata.KIND]),
relaySet)).stream.timeout(const Duration(seconds: 5), onTimeout: (sink) {
print("timeout metadatas.length:${metadatas.length}");
})) {
if (metadatas[event.pubKey] == null ||
metadatas[event.pubKey]!.updatedAt! < event.createdAt) {
metadatas[event.pubKey] = Metadata.fromEvent(event);
metadatas[event.pubKey]!.refreshedTimestamp = Helpers.now;
await cacheManager.saveMetadata(metadatas[event.pubKey]!);
if (onLoad!=null) {
onLoad(metadatas[event.pubKey]!);
}
}
}
} catch (e) {
print(e);
}
// if (metadatas.isNotEmpty) {
// await cacheManager.saveMetadatas(metadatas.values
// // .map((metadata) => DbMetadata.fromMetadata(metadata))
// .toList());
// }
print("Loaded ${metadatas.length} user metadatas ");
}
return metadatas.values.toList();
}