timeoutDone method

Stream<T> timeoutDone(
  1. Duration duration, {
  2. void onTimeout(
    1. StreamSink<T> sink
    )?,
  3. bool? cancelOnError = true,
})

设定stream 的 done 超时

  • duration 超时时间
  • onTimeout 超时时返回的值
  • cancelOnError 发生错误时 取消

Implementation

Stream<T> timeoutDone(Duration duration,
    {void Function(StreamSink<T> sink)? onTimeout,
    bool? cancelOnError = true}) {
  StreamController<T> controller = isBroadcast
      ? StreamController.broadcast(sync: true)
      : StreamController(sync: true);
  Timer? time;

  void onDone() {
    if (time?.isActive == true) time?.cancel();
    if (!controller.isClosed) {
      controller.close();
    }
  }

  controller.onListen = () {
    final subscription = listen(
      controller.add,
      onError: controller.addError,
      onDone: onDone,
      cancelOnError: cancelOnError,
    );
    time = Timer(duration, () {
      if (!controller.isClosed) {
        onTimeout?.call(controller.sink);
        if (!controller.isClosed) {
          controller.close();
        }
      }
    });
    controller.onCancel = () {
      subscription.cancel();
      if (time?.isActive == true) time?.cancel();
    };
  };

  return controller.stream;
}