cast<R> method

  1. @override
Stream<R> cast<R>()
override

Adapt this stream to be a Stream<R>.

This stream is wrapped as a Stream<R> which checks at run-time that each data event emitted by this stream is also an instance of R.

Implementation

@override
Stream<R> cast<R>() {
  var s = origin.cast<R>();
  if (!isTextResponse()) {
    recordResponse(
      statusCode,
      '返回结果不支持解析',
      headers.toString(),
      contentLength,
    );
    return s;
  }
  final asyncStream = s.asBroadcastStream();
  asyncStream.listen((R event) {
    if (event is Uint8List) {
      final Uint8List result = event;
      var encoding = getEncoding();
      if (encoding != null) {
        recordResponse(
          statusCode,
          encoding.decode(result.toList()),
          headers.toString(),
          event.length,
        );
      } else {
        recordResponse(
          statusCode,
          '返回结果解析失败',
          headers.toString(),
          contentLength,
        );
      }
    } else if (event is String) {
      recordResponse(statusCode, event, headers.toString(), contentLength);
    } else {
      recordResponse(
        statusCode,
        'unknown type:${event.runtimeType}',
        headers.toString(),
        contentLength,
      );
    }
  });
  return asyncStream.repeatLatest();
}