code: @Override
      public CompletableFuture<List<PageEntry>> getNext() {
          if (this.finished.get()) {
              return CompletableFuture.completedFuture(null);
          }
  
          TimeoutTimer timer = new TimeoutTimer(this.fetchTimeout);
          return locateNextPage(timer)
                  .thenApply(pageWrapper -> {
                      // Remember this page (for next time).
                      this.lastPage.set(pageWrapper);
                      List<PageEntry> result = null;
                      if (pageWrapper != null) {
                          // Extract the intermediate results from the page.
                          result = extractFromPage(pageWrapper);
                          this.processedPageCount.incrementAndGet();
                      }
  
                      // Check if we have reached the last page that could possibly contain some result.
                      if (result == null) {
                          this.finished.set(true);
                      }
  
                      return result;
                  });
      }
docs: Attempts to get the next element in the iteration. Please refer to {@link AsyncIterator#getNext()} for details.
  
  If this method is invoked concurrently (a second call is initiated prior to the previous call terminating) the
  state of the {@link EntryIterator} will be corrupted. Consider using {@link AsyncIterator#asSequential}.
  
  @return A CompletableFuture that, when completed, will contain a List of {@link PageEntry} instances that are
  next in the iteration, or null if no more items can be served.