Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 part of dart.async; | 5 part of dart.async; |
| 6 | 6 |
| 7 /** | 7 /** |
| 8 * Wraps an [_EventSink] so it exposes only the [EventSink] interface. | 8 * Wraps an [_EventSink] so it exposes only the [EventSink] interface. |
| 9 */ | 9 */ |
| 10 class _EventSinkWrapper<T> implements EventSink<T> { | 10 class _EventSinkWrapper<T> implements EventSink<T> { |
| (...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 202 * Wraps handlers (from [StreamTransformer.fromHandlers]) into an `EventSink`. | 202 * Wraps handlers (from [StreamTransformer.fromHandlers]) into an `EventSink`. |
| 203 * | 203 * |
| 204 * This way we can reuse the code from [_StreamSinkTransformer]. | 204 * This way we can reuse the code from [_StreamSinkTransformer]. |
| 205 */ | 205 */ |
| 206 class _HandlerEventSink<S, T> implements EventSink<S> { | 206 class _HandlerEventSink<S, T> implements EventSink<S> { |
| 207 final _TransformDataHandler<S, T> _handleData; | 207 final _TransformDataHandler<S, T> _handleData; |
| 208 final _TransformErrorHandler<T> _handleError; | 208 final _TransformErrorHandler<T> _handleError; |
| 209 final _TransformDoneHandler<T> _handleDone; | 209 final _TransformDoneHandler<T> _handleDone; |
| 210 | 210 |
| 211 /// The output sink where the handlers should send their data into. | 211 /// The output sink where the handlers should send their data into. |
| 212 final EventSink<T> _sink; | 212 EventSink<T> _sink; |
| 213 | 213 |
| 214 _HandlerEventSink( | 214 _HandlerEventSink( |
| 215 this._handleData, this._handleError, this._handleDone, this._sink); | 215 this._handleData, this._handleError, this._handleDone, this._sink) { |
| 216 if (_sink == null) { | |
| 217 throw new ArgumentError("The provided sink must not be null."); | |
| 218 } | |
| 219 } | |
| 220 | |
| 221 bool get _isClosed => _sink == null; | |
| 216 | 222 |
| 217 void add(S data) { | 223 void add(S data) { |
| 224 if (_isClosed) { | |
| 225 // TODO(29554): throw a StateError, and don't just report the problem. | |
| 226 Zone.ROOT.print("Sink is closed and adding to it is an error."); | |
| 227 Zone.ROOT.print(" See http://dartbug.com/29554."); | |
|
Lasse Reichstein Nielsen
2017/05/08 11:31:08
Cascade?
floitsch
2017/05/08 12:22:39
Done.
| |
| 228 Zone.ROOT.print(StackTrace.current); | |
|
Lasse Reichstein Nielsen
2017/05/08 11:31:08
Consider returning here. Adding isn't useful. Ditt
floitsch
2017/05/08 12:22:39
The whole point of the warning is to keep the old
| |
| 229 } | |
| 218 if (_handleData != null) { | 230 if (_handleData != null) { |
| 219 _handleData(data, _sink); | 231 _handleData(data, _sink); |
| 220 } else { | 232 } else { |
| 221 _sink.add(data as T); | 233 _sink.add(data as T); |
| 222 } | 234 } |
| 223 } | 235 } |
| 224 | 236 |
| 225 void addError(Object error, [StackTrace stackTrace]) { | 237 void addError(Object error, [StackTrace stackTrace]) { |
| 238 if (_isClosed) { | |
| 239 // TODO(29554): throw a StateError, and don't just report the problem. | |
| 240 Zone.ROOT.print("Sink is closed and adding to it is an error."); | |
| 241 Zone.ROOT.print(" See http://dartbug.com/29554."); | |
| 242 Zone.ROOT.print(StackTrace.current); | |
| 243 } | |
| 226 if (_handleError != null) { | 244 if (_handleError != null) { |
| 227 _handleError(error, stackTrace, _sink); | 245 _handleError(error, stackTrace, _sink); |
| 228 } else { | 246 } else { |
| 229 _sink.addError(error, stackTrace); | 247 _sink.addError(error, stackTrace); |
| 230 } | 248 } |
| 231 } | 249 } |
| 232 | 250 |
| 233 void close() { | 251 void close() { |
| 252 if (_isClosed) return; | |
| 253 var sink = _sink; | |
| 254 _sink = null; | |
| 234 if (_handleDone != null) { | 255 if (_handleDone != null) { |
| 235 _handleDone(_sink); | 256 _handleDone(sink); |
| 236 } else { | 257 } else { |
| 237 _sink.close(); | 258 sink.close(); |
| 238 } | 259 } |
| 239 } | 260 } |
| 240 } | 261 } |
| 241 | 262 |
| 242 /** | 263 /** |
| 243 * A StreamTransformer that transformers events with the given handlers. | 264 * A StreamTransformer that transformers events with the given handlers. |
| 244 * | 265 * |
| 245 * Note that this transformer can only be used once. | 266 * Note that this transformer can only be used once. |
| 246 */ | 267 */ |
| 247 class _StreamHandlerTransformer<S, T> extends _StreamSinkTransformer<S, T> { | 268 class _StreamHandlerTransformer<S, T> extends _StreamSinkTransformer<S, T> { |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 300 StreamSubscription<T> listen(void onData(T event), | 321 StreamSubscription<T> listen(void onData(T event), |
| 301 {Function onError, void onDone(), bool cancelOnError}) { | 322 {Function onError, void onDone(), bool cancelOnError}) { |
| 302 cancelOnError = identical(true, cancelOnError); | 323 cancelOnError = identical(true, cancelOnError); |
| 303 StreamSubscription<T> result = _transformer(_stream, cancelOnError); | 324 StreamSubscription<T> result = _transformer(_stream, cancelOnError); |
| 304 result.onData(onData); | 325 result.onData(onData); |
| 305 result.onError(onError); | 326 result.onError(onError); |
| 306 result.onDone(onDone); | 327 result.onDone(onDone); |
| 307 return result; | 328 return result; |
| 308 } | 329 } |
| 309 } | 330 } |
| OLD | NEW |