waitOperation method

Future<bool> waitOperation(
  1. TransactionOperation? operation, {
  2. TransactionOperation? parentOperation,
  3. Duration timeout = const Duration(seconds: 40),
})

Waits operation to be executed in this Transaction.

Implementation

Future<bool> waitOperation(TransactionOperation? operation,
    {TransactionOperation? parentOperation,
    Duration timeout = const Duration(seconds: 40)}) async {
  if (operation == null) return false;

  if (!identical(operation.transaction, this)) {
    throw StateError(
        "Operation from different transaction: ${operation.transaction.id} != $id");
  }

  if (!_operations.contains(operation)) {
    throw StateError(
        "Operation not in transaction:\n-- Operation> $operation\n-- $this");
  }

  if (_executedOperations.contains(operation)) {
    return true;
  }

  // Avoid recursive loop:
  if (parentOperation != null &&
      parentOperation.isParentOperation(operation)) {
    return false;
  }

  var initTime = DateTime.now();

  while (_executedOperations.length < _operations.length) {
    var elapsedTime = DateTime.now().difference(initTime);
    var remainingTime = timeout - elapsedTime;

    if (remainingTime.inMilliseconds <= 0) {
      return false;
    }

    var completer =
        _waitingExecutedOperation ??= Completer<TransactionOperation?>();

    var executedOp =
        await completer.future.timeout(remainingTime, onTimeout: () => null);

    if (executedOp == operation) {
      return true;
    }

    if (_executedOperations.contains(operation)) {
      return true;
    }
  }

  return _executedOperations.contains(operation);
}