doNostrRequestWithRelaySet method

Future<void> doNostrRequestWithRelaySet(
  1. RequestState state, {
  2. bool splitRequestsByPubKeyMappings = true,
})

Implementation

Future<void> doNostrRequestWithRelaySet(
  RequestState state, {
  bool splitRequestsByPubKeyMappings = true,
}) async {
  if (state.unresolvedFilters.isEmpty || state.request.relaySet == null) {
    return;
  }
  RelaySet relaySet = state.request.relaySet!;
  for (final filter in state.unresolvedFilters) {
    if (splitRequestsByPubKeyMappings) {
      relaySet.splitIntoRequests(filter, state);
      print(
        "request for ${filter.authors != null ? filter.authors!.length : 0} authors with kinds: ${filter.kinds} made requests to ${state.requests.length} relays",
      );

      if (state.requests.isEmpty && relaySet.fallbackToBootstrapRelays) {
        print(
          "making fallback requests to ${_bootstrapRelays.length} bootstrap relays for ${filter.authors != null ? filter.authors!.length : 0} authors with kinds: ${filter.kinds}",
        );
        for (final url in _bootstrapRelays) {
          state.addRequestForRelay(url, RelaySet.sliceFilterAuthors(filter));
        }
      }
    } else {
      for (final url in relaySet.urls) {
        state.addRequestForRelay(url, RelaySet.sliceFilterAuthors(filter));
      }
    }
  }
  _globalState.inFlightRequests[state.id] = state;

  state.closeIfNoRelays();

  for (MapEntry<RelayConnectionKey, RelayRequestState> entry
      in state.requests.entries.toList()) {
    doRelayRequest(state.id, entry.value).then((sent) {
      if (!sent) {
        state.requests.remove(entry.key);
        if (state.requests.isEmpty) {
          state.networkController.close();
        }
      }
    });
  }
}