Index: sdk/lib/async/stream.dart |
diff --git a/sdk/lib/async/stream.dart b/sdk/lib/async/stream.dart |
index 77420d0b668a6298f3aeda736ed1f644e46541f9..3f11b91f080054036bd969eb3f7e77f3d32e12ff 100644 |
--- a/sdk/lib/async/stream.dart |
+++ b/sdk/lib/async/stream.dart |
@@ -75,6 +75,22 @@ abstract class Stream<T> { |
Stream(); |
/** |
+ * Internal use only. We do not want to promise that Stream stays const. |
+ * |
+ * If mixins become compatible with const constructors, we may use a |
+ * stream mixin instead of extending Stream from a const class. |
+ */ |
+ const Stream._internal(); |
+ |
+ /** |
+ * Creates an empty broadcast stream. |
+ * |
+ * This is a stream which does nothing except sending a done event |
+ * when it's listened to. |
+ */ |
+ const factory Stream.empty() = _EmptyStream<T>; |
+ |
+ /** |
* Creates a new single-subscription stream from the future. |
* |
* When the future completes, the stream will fire one event, either |
@@ -1423,11 +1439,19 @@ class StreamView<T> extends Stream<T> { |
/** |
- * The target of a [Stream.pipe] call. |
+ * Abstract interface for a "sink" accepting multiple entire streams. |
* |
- * The [Stream.pipe] call will pass itself to this object, and then return |
- * the resulting [Future]. The pipe should complete the future when it's |
- * done. |
+ * A consumer can accept a number of consequtive streams using [addStream], |
+ * and when no further data need to be added, the [close] method tells the |
+ * consumer to complete its work and shut down. |
+ * |
+ * This class is not just a [Sink<Stream>] because it is also combined with |
+ * other [Sink] classes, like it's combined with [EventSink] in the |
+ * [StreamSink] class. |
+ * |
+ * The [Stream.pipe] accepts a `StreamConsumer` and will pass the stream |
+ * to the consumer's [addStream] method. When that completes, it will |
+ * call [close] and then complete its own returned future. |
*/ |
abstract class StreamConsumer<S> { |
/** |
@@ -1435,22 +1459,38 @@ abstract class StreamConsumer<S> { |
* |
* Listens on [stream] and does something for each event. |
* |
- * The consumer may stop listening after an error, or it may consume |
- * all the errors and only stop at a done event. |
+ * Returns a future which is completed when the stream is done being added, |
+ * and the consumer is ready to accept a new stream. |
+ * No further calls to [addStream] or [close] should happen before the |
+ * returned future has completed. |
+ * |
+ * The consumer may stop listening to the stream after an error, |
+ * it may consume all the errors and only stop at a done event, |
+ * or it may be canceled early if the receiver don't want any further events. |
+ * |
+ * If the consumer stops listening because of some error preventing it |
+ * from continuing, it may report this error in the returned future, |
+ * otherwise it will just complete the future with `null`. |
*/ |
Future addStream(Stream<S> stream); |
/** |
- * Tell the consumer that no futher streams will be added. |
+ * Tells the consumer that no futher streams will be added. |
* |
- * Returns a future that is completed when the consumer is done handling |
- * events. |
+ * This allows the consumer to complete any remaining work and release |
+ * resources that are no longer needed |
+ * |
+ * Returns a future which is completed when the consumer has shut down. |
+ * If cleaning up can fail, the error may be reported in the returned future, |
+ * otherwise it completes with `null`. |
*/ |
Future close(); |
} |
/** |
+ * A object that accepts stream events both synchronously and asynchronously. |
+ * |
* A [StreamSink] unifies the asynchronous methods from [StreamConsumer] and |
* the synchronous methods from [EventSink]. |
* |
@@ -1467,11 +1507,26 @@ abstract class StreamConsumer<S> { |
* |
* When [close] is called, it will return the [done] [Future]. |
*/ |
-abstract class StreamSink<S> implements StreamConsumer<S>, EventSink<S> { |
+abstract class StreamSink<S> implements EventSink<S>, StreamConsumer<S> { |
/** |
- * As [EventSink.close], but returns a future. |
+ * Tells the stream sink that no futher streams will be added. |
+ * |
+ * This allows the stream sink to complete any remaining work and release |
+ * resources that are no longer needed |
+ * |
+ * Returns a future which is completed when the stream sink has shut down. |
+ * If cleaning up can fail, the error may be reported in the returned future, |
+ * otherwise it completes with `null`. |
* |
* Returns the same future as [done]. |
+ * |
+ * The stream sink may close before the [close] method is called, either due |
+ * to an error or because it is itself provding events to someone who has |
+ * stopped listening. In that case, the [done] future is completed first, |
+ * and the `close` method will return the `done` future when called. |
+ * |
+ * Unifies [StreamConsumer.close] and [EventSink.close] which both mark their |
+ * object as not expecting any further events. |
*/ |
Future close(); |