getMessage method

Future<MimeMessage> getMessage(
  1. int messageIndex,
  2. MailClient mailClient, {
  3. Mailbox? mailbox,
  4. FetchPreference fetchPreference = FetchPreference.envelope,
})

Retrieves the message at the given index.

Note that the messageIndex is expected to be based on full messageSequence, where index 0 is newest message and size-1 is the oldest message.

Implementation

Future<MimeMessage> getMessage(
  int messageIndex,
  MailClient mailClient, {
  Mailbox? mailbox,
  FetchPreference fetchPreference = FetchPreference.envelope,
}) async {
  Future<List<MimeMessage>> queue(int pageIndex) {
    final sequence = pagedSequence.getSequence(pageIndex);
    final future = mailClient.fetchMessageSequence(
      sequence,
      mailbox: mailbox,
      fetchPreference: fetchPreference,
    );
    _requestedPages[pageIndex] = future;

    return future;
  }

  if (isAvailable(messageIndex)) {
    return this[messageIndex];
  }
  final pageIndex = pagedSequence.pageIndexOf(messageIndex);
  if (pageIndex > 0) {
    // ensure that previous pages are loaded first:
    final previousRequest = _requestedPages[pageIndex - 1];
    if (previousRequest != null) {
      await previousRequest;
    }
  }
  final request = _requestedPages[pageIndex] ?? queue(pageIndex);
  final messages = await request;
  if (_requestedPages.containsKey(pageIndex)) {
    unawaited(_requestedPages.remove(pageIndex));
    insertAll(messages);
  }
  final relativeIndex =
      (pageIndex * pagedSequence.pageSize + messages.length) -
          (messageIndex + 1);

  return messages[relativeIndex];
}