// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. part of "dart:_internal"; // Casting wrappers for asynchronous classes. class CastStream extends Stream { final Stream _source; CastStream(this._source); bool get isBroadcast => _source.isBroadcast; StreamSubscription listen( void Function(T data)? onData, { Function? onError, void Function()? onDone, bool? cancelOnError, }) { return CastStreamSubscription( _source.listen(null, onDone: onDone, cancelOnError: cancelOnError), ) ..onData(onData) ..onError(onError); } Stream cast() => CastStream(_source); } class CastStreamSubscription implements StreamSubscription { final StreamSubscription _source; /// Zone where listen was called. final Zone _zone = Zone.current; /// User's data handler. void Function(T)? _handleData; /// Copy of _source's handleError so we can report errors in onData. Function? _handleError; CastStreamSubscription(this._source) { _source.onData(_onData); } Future cancel() => _source.cancel(); void onData(void Function(T data)? handleData) { _handleData = handleData == null ? null : _zone.registerUnaryCallback(handleData); } void onError(Function? handleError) { _source.onError(handleError); if (handleError == null) { _handleError = null; } else if (handleError is void Function(Object, StackTrace)) { _handleError = _zone.registerBinaryCallback( handleError, ); } else if (handleError is void Function(Object)) { _handleError = _zone.registerUnaryCallback(handleError); } else { throw ArgumentError( "handleError callback must take either an Object " "(the error), or both an Object (the error) and a StackTrace.", ); } } void onDone(void handleDone()?) { _source.onDone(handleDone); } void _onData(S data) { if (_handleData == null) return; T targetData; try { targetData = data as T; } catch (error, stack) { var handleError = _handleError; if (handleError == null) { _zone.handleUncaughtError(error, stack); } else if (handleError is void Function(Object, StackTrace)) { _zone.runBinaryGuarded(handleError, error, stack); } else { _zone.runUnaryGuarded( handleError as void Function(Object), error, ); } return; } _zone.runUnaryGuarded(_handleData!, targetData); } void pause([Future? resumeSignal]) { _source.pause(resumeSignal); } void resume() { _source.resume(); } bool get isPaused => _source.isPaused; Future asFuture([E? futureValue]) => _source.asFuture(futureValue); } class CastStreamTransformer extends StreamTransformerBase { final StreamTransformer _source; CastStreamTransformer(this._source); StreamTransformer cast() => CastStreamTransformer(_source); Stream bind(Stream stream) => _source.bind(stream.cast()).cast(); } class CastConverter extends Converter { final Converter _source; CastConverter(this._source); TT convert(TS input) => _source.convert(input as SS) as TT; // cast is inherited from Converter. Stream bind(Stream stream) => _source.bind(stream.cast()).cast(); Converter cast() => CastConverter(_source); }