requestRelays method

Future<NostrRequest> requestRelays(
  1. Iterable<String> urls,
  2. Filter filter, {
  3. int timeout = DEFAULT_STREAM_IDLE_TIMEOUT,
  4. bool closeOnEOSE = true,
  5. dynamic onTimeout()?,
})

Implementation

Future<NostrRequest> requestRelays(Iterable<String> urls, Filter filter,
    {int timeout = DEFAULT_STREAM_IDLE_TIMEOUT, bool closeOnEOSE = true, Function()? onTimeout}) async {
  String id = Helpers.getRandomString(10);
  NostrRequest nostrRequest = closeOnEOSE?
  NostrRequest.query(id, eventVerifier: eventVerifier, timeout: timeout, onTimeout: (request) {
    closeNostrRequest(request);
    if (onTimeout!=null) {
      onTimeout();
    }
  }) :
  NostrRequest.subscription(id, eventVerifier: eventVerifier);

  for (var url in urls) {
    nostrRequest.addRequest(url, RelaySet.sliceFilterAuthors(filter));
  }
  nostrRequests[nostrRequest.id] = nostrRequest;

  List<String> notSent = [];
  Map<int?,int> kindsMap = {};
  nostrRequests.forEach((key, request) {
    int? kind;
    if (request.requests.isNotEmpty && request.requests.values.first.filters.first.kinds!=null && request.requests.values.first.filters.first.kinds!.isNotEmpty) {
      kind = request.requests.values.first.filters.first.kinds!.first;
    }
    int? count = kindsMap[kind];
    count ??= 0;
    count++;
    kindsMap[kind] = count;
  });
  print(
      "----------------NOSTR REQUESTS: ${nostrRequests.length} || $kindsMap");
  for(MapEntry<String,RelayRequest> entry in nostrRequest.requests.entries) {
    if (!doRequest(nostrRequest.id, entry.value)) {
      notSent.add(entry.key);
    }
  }
  for (var url in notSent) {
    nostrRequest.requests.remove(url);
  }

  return nostrRequest;
}