requestRelays method
Implementation
Future<NdkResponse> requestRelays(
String name,
Iterable<String> urls,
Filter filter, {
Duration timeout = kDefaultStreamIdleTimeout,
bool closeOnEOSE = true,
}) async {
String id = Helpers.getRandomString(10);
RequestState state = RequestState(
closeOnEOSE
? NdkRequest.query(
id,
name: name,
filters: [filter],
timeoutDuration: timeout,
)
: NdkRequest.subscription(id, name: name, filters: []),
);
for (final url in urls) {
state.addRequestForRelay(url, RelaySet.sliceFilterAuthors(filter));
}
_globalState.inFlightRequests[state.id] = state;
for (MapEntry<RelayConnectionKey, RelayRequestState> entry
in state.requests.entries) {
doRelayRequest(state.id, entry.value).then((sent) {
if (!sent) {
state.removeRequest(entry.key);
// start fix
if (state.requests.isEmpty) {
state.networkController.close();
}
// end fix
}
});
}
return NdkResponse(
state.id,
state.stream,
relayOutcomes: () => state.relayOutcomes,
relayOutcomesStream: () => state.relayOutcomesStream,
relayOutcomesDone: state.controller.done.then((_) => state.relayOutcomes),
);
}