copyToSink<T> function

Future copyToSink<T>(
  1. Stream<T> stream,
  2. EventSink<T> sink, {
  3. bool cancelOnError = true,
  4. bool closeSink = true,
  5. void copyTo(
    1. T event,
    2. void close()
    )?,
})

Copies stream into sink.

  • copyTo if specified, it is called instead of sink.add. The implementation can call close() if it'd like to stop the reading.

Implementation

Future copyToSink<T>(Stream<T> stream, EventSink<T> sink,
    {bool cancelOnError = true, bool closeSink = true,
     void copyTo(T event, void close())?}) {
  final completer = Completer();

  var done = false;
  void setDone() {
    if (!done) {
      done = true;
      if (closeSink) sink.close();
      completer.complete();
    }
  }

  stream.listen(
    copyTo == null ? sink.add: (data) => copyTo(data, setDone),
    onError: (Object e, StackTrace st) {
      if (!done) {
        sink.addError(e, st);
        if (cancelOnError) {
          completer.complete();
          if (closeSink) sink.close();
        }
      }
    },
    onDone: setDone,
    cancelOnError: cancelOnError);

  return completer.future;
}