awaitWithTimeout function

Future awaitWithTimeout(
  1. Future future,
  2. int timeoutMs, {
  3. Function? onTimeout,
  4. Function? onSuccessAfterTimeout,
  5. Function? onErrorAfterTimeout,
})

Implementation

Future awaitWithTimeout(
  Future future,
  int timeoutMs, {
  Function? onTimeout,
  Function? onSuccessAfterTimeout,
  Function? onErrorAfterTimeout,
}) {
  var completer = Completer<dynamic>();

  var timer = Timer(Duration(milliseconds: timeoutMs), () {
    if (!completer.isCompleted) {
      if (onTimeout != null) {
        onTimeout();
      }
      completer.completeError(Exception('Future timeout before complete'));
    }
  });
  future
      .then((dynamic t) {
        if (completer.isCompleted) {
          if (onSuccessAfterTimeout != null) {
            onSuccessAfterTimeout(t);
          }
        } else {
          timer.cancel();
          completer.complete(t);
        }
      })
      .catchError((dynamic err) {
        if (completer.isCompleted) {
          if (onErrorAfterTimeout != null) {
            onErrorAfterTimeout(err);
          }
        } else {
          timer.cancel();
          completer.completeError(err);
        }
      });

  return completer.future;
}