loadMissingMetadatas method

Future<List<Metadata>> loadMissingMetadatas(
  1. List<String> pubKeys,
  2. RelaySet relaySet, {
  3. bool splitRequestsByPubKeyMappings = true,
  4. dynamic onLoad(
    1. Metadata
    )?,
})

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();
}