Fix the MultiChannel constructor. R=kevmoo@google.com, rnystrom@google.com Review URL: https://codereview.chromium.org//1644943004 .
diff --git a/pkgs/stream_channel/CHANGELOG.md b/pkgs/stream_channel/CHANGELOG.md index 3149059..c85bbe3 100644 --- a/pkgs/stream_channel/CHANGELOG.md +++ b/pkgs/stream_channel/CHANGELOG.md
@@ -1,3 +1,9 @@ +## 1.0.1 + +* Fix `MultiChannel`'s constructor to take a `StreamChannel`. This is + technically a breaking change, but since 1.0.0 was only released an hour ago, + we're treating it as a bug fix. + ## 1.0.0 * Initial version
diff --git a/pkgs/stream_channel/lib/src/multi_channel.dart b/pkgs/stream_channel/lib/src/multi_channel.dart index e87deb3..cba592a 100644 --- a/pkgs/stream_channel/lib/src/multi_channel.dart +++ b/pkgs/stream_channel/lib/src/multi_channel.dart
@@ -52,12 +52,11 @@ /// virtual channels may be opened. StreamSink get sink; - /// Creates a new [MultiChannel] that sends messages over [innerStream] and - /// [innerSink]. + /// Creates a new [MultiChannel] that sends and receives messages over + /// [inner]. /// - /// The inner streams must take JSON-like objects. - factory MultiChannel(Stream innerStream, StreamSink innerSink) => - new _MultiChannel(innerStream, innerSink); + /// The inner channel must take JSON-like objects. + factory MultiChannel(StreamChannel inner) => new _MultiChannel(inner); /// Creates a new virtual channel. /// @@ -78,17 +77,12 @@ /// This is private so that [VirtualChannel] can inherit from [MultiChannel] /// without having to implement all the private members. class _MultiChannel extends StreamChannelMixin implements MultiChannel { - /// The inner stream over which all communication is received. + /// The inner channel over which all communication is conducted. /// /// This will be `null` if the underlying communication channel is closed. - Stream _innerStream; + StreamChannel _inner; - /// The inner sink over which all communication is sent. - /// - /// This will be `null` if the underlying communication channel is closed. - StreamSink _innerSink; - - /// The subscription to [_innerStream]. + /// The subscription to [_inner.stream]. StreamSubscription _innerStreamSubscription; Stream get stream => _streamController.stream; @@ -128,16 +122,16 @@ /// scheme, but if it has an even id, it's using the remote id scheme. var _nextId = 1; - _MultiChannel(this._innerStream, this._innerSink) { + _MultiChannel(this._inner) { // The default connection is a special case which has id 0 on both ends. // This allows it to begin connected without having to send over an id. _streamControllers[0] = _streamController; _sinkControllers[0] = _sinkController; _sinkController.stream.listen( - (message) => _innerSink.add([0, message]), + (message) => _inner.sink.add([0, message]), onDone: () => _closeChannel(0, 0)); - _innerStreamSubscription = _innerStream.listen((message) { + _innerStreamSubscription = _inner.stream.listen((message) { var id = message[0]; var sink = _streamControllers[id]; @@ -156,7 +150,7 @@ } VirtualChannel virtualChannel([id]) { - if (_innerStream == null) { + if (_inner == null) { throw new StateError("The underlying channel is closed."); } @@ -186,7 +180,7 @@ _streamControllers[inputId] = streamController; _sinkControllers[inputId] = sinkController; sinkController.stream.listen( - (message) => _innerSink.add([outputId, message]), + (message) => _inner.sink.add([outputId, message]), onDone: () => _closeChannel(inputId, outputId)); return new VirtualChannel._( @@ -199,20 +193,19 @@ _streamControllers.remove(inputId).close(); _sinkControllers.remove(inputId).close(); - if (_innerSink == null) return; + if (_inner == null) return; // A message without data indicates that the virtual channel has been // closed. - _innerSink.add([outputId]); + _inner.sink.add([outputId]); if (_streamControllers.isEmpty) _closeInnerChannel(); } /// Closes the underlying communication channel. void _closeInnerChannel() { - _innerSink.close(); + _inner.sink.close(); _innerStreamSubscription.cancel(); - _innerStream = null; - _innerSink = null; + _inner = null; for (var controller in _sinkControllers.values.toList()) { controller.close(); }
diff --git a/pkgs/stream_channel/pubspec.yaml b/pkgs/stream_channel/pubspec.yaml index 5f1a739..09df4a7 100644 --- a/pkgs/stream_channel/pubspec.yaml +++ b/pkgs/stream_channel/pubspec.yaml
@@ -1,5 +1,5 @@ name: stream_channel -version: 1.0.0 +version: 1.0.1 description: An abstraction for two-way communication channels. author: Dart Team <misc@dartlang.org> homepage: https://github.com/dart-lang/stream_channel
diff --git a/pkgs/stream_channel/test/multi_channel_test.dart b/pkgs/stream_channel/test/multi_channel_test.dart index e459412..cc9ed1d 100644 --- a/pkgs/stream_channel/test/multi_channel_test.dart +++ b/pkgs/stream_channel/test/multi_channel_test.dart
@@ -17,8 +17,10 @@ setUp(() { oneToTwo = new StreamController(); twoToOne = new StreamController(); - channel1 = new MultiChannel(twoToOne.stream, oneToTwo.sink); - channel2 = new MultiChannel(oneToTwo.stream, twoToOne.sink); + channel1 = new MultiChannel( + new StreamChannel(twoToOne.stream, oneToTwo.sink)); + channel2 = new MultiChannel( + new StreamChannel(oneToTwo.stream, twoToOne.sink)); }); group("the default virtual channel", () {