newPoller<T extends Object> method

Stream<T> newPoller<T extends Object>(
  1. FutureOr<T> callback(),
  2. Duration interval
)

Creates a Stream that polls a callback at a specified interval.

Implementation

Stream<T> newPoller<T extends Object>(
  FutureOr<T> Function() callback,
  Duration interval,
) {
  final controller = StreamController<T>();
  Timer? timer;
  void poll() {
    if (controller.isClosed) return;
    try {
      consec(callback(), (value) {
        if (!controller.isClosed) {
          controller.add(value);
        }
      });
    } catch (e, s) {
      if (!controller.isClosed) {
        controller.addError(e, s);
      }
    }
  }

  void startTimer() {
    poll();
    timer = Timer.periodic(interval, (_) => poll());
  }

  void stopTimer() {
    timer?.cancel();
    timer = null;
  }

  controller
    ..onListen = startTimer
    ..onPause = stopTimer
    ..onResume = startTimer
    ..onCancel = stopTimer;
  return controller.stream;
}