nextObject method

Future<Map<String, dynamic>?> nextObject()

Implementation

Future<Map<String, dynamic>?> nextObject() {
  if (state == State.init) {
    var qm = generateQueryMessage();
    return db.queryMessage(qm).then((replyMessage) {
      state = State.open;
      getCursorData(replyMessage);
      if (items.isNotEmpty) {
        return Future.value(_getNextItem());
      } else {
        return Future.value(null);
      }
    });
  } else if (state == State.open && limit > 0 && _returnedCount == limit) {
    return close();
  } else if (state == State.open && items.isNotEmpty) {
    return Future.value(_getNextItem());
  } else if (state == State.open && cursorId > 0) {
    var qm = generateGetMoreMessage();
    return db.queryMessage(qm).then((replyMessage) {
      state = State.open;
      getCursorData(replyMessage);
      var isDead = (replyMessage.responseFlags ==
              MongoReplyMessage.flagsCursorNotFound) &&
          (cursorId == 0);
      if (items.isNotEmpty) {
        return Future.value(_getNextItem());
      } else if (tailable && !isDead && awaitData) {
        return Future.value(null);
      } else if (tailable && !isDead) {
        var completer = Completer<Map<String, dynamic>?>();
        Timer(Duration(milliseconds: tailableRetryInterval),
            () => completer.complete(null));
        return completer.future;
      } else {
        state = State.closed;
        return Future.value(null);
      }
    });
  } else {
    state = State.closed;
    return Future.value(null);
  }
}