diff --git a/lib/src/client/transport/web_streams.dart b/lib/src/client/transport/web_streams.dart index 5d8c8cb..80f0a54 100644 --- a/lib/src/client/transport/web_streams.dart +++ b/lib/src/client/transport/web_streams.dart @@ -78,12 +78,11 @@ class _GrpcWebConversionSink extends ChunkedConversionSink { final dataLength = _dataHeader.buffer.asByteData().getUint32(0); _dataOffset = 0; _state = _GrpcWebParseState.Message; + _data = new Uint8List(dataLength); if (dataLength == 0) { // empty message _finishMessage(); } - - _data = new Uint8List(dataLength); } } diff --git a/lib/src/shared/message.dart b/lib/src/shared/message.dart index 73e0f1d..03e3b7b 100644 --- a/lib/src/shared/message.dart +++ b/lib/src/shared/message.dart @@ -29,7 +29,7 @@ class GrpcMetadata extends GrpcMessage { class GrpcData extends GrpcMessage { final List data; final bool isCompressed; - GrpcData(this.data, {this.isCompressed}); + GrpcData(this.data, {this.isCompressed}) : assert(data != null); @override String toString() => 'gRPC Data (${data.length} bytes)'; diff --git a/test/grpc_web_decoding_test.dart b/test/grpc_web_decoding_test.dart new file mode 100644 index 0000000..b5420d8 --- /dev/null +++ b/test/grpc_web_decoding_test.dart @@ -0,0 +1,17 @@ +import 'dart:async'; +import 'dart:typed_data'; + +import 'package:grpc/src/client/transport/web_streams.dart'; +import 'package:grpc/src/shared/message.dart'; +import 'package:test/test.dart'; + +main() { + test("decoding an empty repeated", () async { + final GrpcData data = await GrpcWebDecoder() + .bind(Stream.fromIterable([ + Uint8List.fromList([0, 0, 0, 0, 0]).buffer + ])) + .first as GrpcData; + expect(data.data, []); + }); +}