Line data Source code
1 : import 'dart:async'; 2 : import 'dart:typed_data'; 3 : import 'package:dio/dio.dart'; 4 : 5 4 : Stream<Uint8List> addProgress( 6 : Stream<List<int>> stream, int? length, RequestOptions options) { 7 4 : var streamTransformer = stream is Stream<Uint8List> 8 1 : ? _transform<Uint8List>(stream, length, options) 9 4 : : _transform<List<int>>(stream, length, options); 10 : 11 4 : var byteStream = stream.transform<Uint8List>(streamTransformer); 12 : 13 8 : if (options.sendTimeout > 0) { 14 0 : byteStream.timeout(Duration(milliseconds: options.sendTimeout), 15 0 : onTimeout: (sink) { 16 0 : sink.addError(DioError( 17 : requestOptions: options, 18 0 : error: 'Sending timeout[${options.connectTimeout}ms]', 19 : type: DioErrorType.sendTimeout, 20 : )); 21 0 : sink.close(); 22 : }); 23 : } 24 : return byteStream; 25 : } 26 : 27 4 : StreamTransformer<S, Uint8List> _transform<S extends List<int>>( 28 : Stream<S> stream, int? length, RequestOptions options) { 29 : var complete = 0; 30 4 : return StreamTransformer<S, Uint8List>.fromHandlers( 31 3 : handleData: (S data, sink) { 32 3 : final cancelToken = options.cancelToken; 33 0 : if (cancelToken != null && cancelToken.isCancelled) { 34 0 : cancelToken.requestOptions = options; 35 : sink 36 0 : ..addError(cancelToken.cancelError!) 37 0 : ..close(); 38 : } else { 39 3 : if (data is Uint8List) { 40 3 : sink.add(data); 41 : } else { 42 2 : sink.add(Uint8List.fromList(data)); 43 : } 44 : if (length != null) { 45 6 : complete += data.length; 46 3 : if (options.onSendProgress != null) { 47 0 : options.onSendProgress!(complete, length!); 48 : } 49 : } 50 : } 51 : }, 52 : ); 53 : }