handleRequest method

  1. @override
Future<void> handleRequest(
  1. RequestState state
)
override

Implementation

@override
Future<void> handleRequest(RequestState state) async {
  if (state.request.explicitRelays == null ||
      state.request.explicitRelays!.isEmpty) {
    await _relayManager.seedRelaysConnected;
  }

  if (state.request.relaySet != null) {
    return await doNostrRequestWithRelaySet(state);
  }
  Iterable<String>? relaysForRequest;

  if (state.request.explicitRelays != null &&
      state.request.explicitRelays!.isNotEmpty) {
    relaysForRequest = state.request.explicitRelays;
  } else {
    relaysForRequest = _bootstrapRelays;
  }
  relaysForRequest = cleanRelayUrls(relaysForRequest!.toList());
  for (final url in relaysForRequest) {
    if (state.request.filters.isEmpty) {
      throw Exception("cannot do request with empty filters");
    }
    final List<Filter> filters = [];
    for (final filter in state.request.filters) {
      filters.addAll(RelaySet.sliceFilterAuthors(filter));
    }
    state.addRequest(RelayConnectionKey.anonymous(url), filters);
  }
  _globalState.inFlightRequests[state.id] = state;

  // Late auth for subscriptions with authenticateAs
  if (state.request.authenticateAs != null &&
      state.request.authenticateAs!.isNotEmpty) {
    for (final connectionKey in state.requests.keys) {
      _relayManager.authenticateIfNeeded(
        connectionKey.url,
        state.request.authenticateAs!,
      );
    }
  }

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