Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions packages/ndk/lib/domain_layer/entities/request_state.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import 'nip_01_event.dart';
class RelayRequestState {
String url;
bool receivedEOSE = false;
bool receivedClosed = false;
List<Filter> filters;

/// default const
Expand Down Expand Up @@ -85,6 +86,10 @@ class RequestState {
bool get didAllRequestsReceivedEOSE =>
!requests.values.any((element) => !element.receivedEOSE);

/// checks if all requests finished (received EOSE or CLOSED)
bool get didAllRequestsFinish => requests.values
.every((element) => element.receivedEOSE || element.receivedClosed);

/// Adds single relay request to the state
void addRequest(String url, List<Filter> filters) {
if (!requests.containsKey(url)) {
Expand Down
10 changes: 6 additions & 4 deletions packages/ndk/lib/domain_layer/usecases/relay_manager.dart
Original file line number Diff line number Diff line change
Expand Up @@ -644,7 +644,7 @@ class RelayManager<T> {
"⛁ received CLOSE from ${relayConnectivity.url} for REQ id $id, remaining requests from :${state.requests.keys} kind:${state.requests.values.first.filters.first.kinds}");
RelayRequestState? request = state.requests[relayConnectivity.url];
if (request != null) {
request.receivedEOSE = true;
request.receivedClosed = true;
}

_checkNetworkClose(state, relayConnectivity);
Expand All @@ -656,14 +656,14 @@ class RelayManager<T> {
void _checkNetworkClose(
RequestState state, RelayConnectivity relayConnectivity) {
/// recived everything, close the network controller
if (state.didAllRequestsReceivedEOSE) {
if (state.didAllRequestsFinish) {
state.networkController.close();
updateRelayConnectivity();
return;
}

/// check if relays for this request are still connected
/// if not ignore it and wait for the ones still alive to receive EOSE
/// if not ignore it and wait for the ones still alive to finish
final listOfRelaysForThisRequest = state.requests.keys.toList();
final myNotConnectedRelays = globalState.relays.keys
.where((url) => listOfRelaysForThisRequest.contains(url))
Expand All @@ -672,7 +672,9 @@ class RelayManager<T> {

final bool didAllRelaysFinish = state.requests.values.every(
(element) =>
element.receivedEOSE || myNotConnectedRelays.contains(element.url),
element.receivedEOSE ||
element.receivedClosed ||
myNotConnectedRelays.contains(element.url),
);

if (didAllRelaysFinish) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -263,5 +263,44 @@ void main() async {
await relay1.stopServer();
await ndk.destroy();
});

test('should NOT record fetched ranges when relay requires auth and client cannot authenticate',
timeout: const Timeout(Duration(seconds: 5)), () async {
MockRelay relay1 = MockRelay(
name: "relay auth required test",
explicitPort: 4210,
signEvents: false,
requireAuthForRequests: true,
);
await relay1.startServer(textNotes: textNotes);

final ndk = Ndk(
NdkConfig(
eventVerifier: Bip340EventVerifier(),
cache: MemCacheManager(),
bootstrapRelays: [relay1.url],
fetchedRangesEnabled: true,
),
);

await ndk.relays.seedRelaysConnected;

final filter = Filter(
kinds: [Nip01Event.kTextNodeKind],
authors: [key1.publicKey],
);

final response = ndk.requests.query(filter: filter);
await response.future;
await Future.delayed(const Duration(milliseconds: 100));

final fetchedRanges = await ndk.fetchedRanges.getForFilter(filter);

expect(fetchedRanges.isEmpty, isTrue,
reason: 'FetchedRanges should NOT be recorded when relay returns CLOSED auth-required');

await relay1.stopServer();
await ndk.destroy();
});
});
}