Prevent an exception to be thrown when a web connection stream is closed (#414)

This commit is contained in:
Luis Alejandro Herrera León 2020-12-20 14:05:59 -08:00 committed by GitHub
parent ed960c26c6
commit 93c21feb56
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 25 additions and 3 deletions

View File

@ -59,7 +59,7 @@ class XhrTransportStream implements GrpcTransportStream {
.listen((data) => _request.send(data), cancelOnError: true);
_request.onReadyStateChange.listen((data) {
if (_incomingMessages.isClosed) {
if (_incomingProcessor.isClosed) {
return;
}
switch (_request.readyState) {
@ -80,7 +80,7 @@ class XhrTransportStream implements GrpcTransportStream {
});
_request.onError.listen((ProgressEvent event) {
if (_incomingMessages.isClosed) {
if (_incomingProcessor.isClosed) {
return;
}
_onError(GrpcError.unavailable('XhrConnection connection-error'),
@ -89,7 +89,7 @@ class XhrTransportStream implements GrpcTransportStream {
});
_request.onProgress.listen((_) {
if (_incomingMessages.isClosed) {
if (_incomingProcessor.isClosed) {
return;
}
// Use response over responseText as most browsers don't support

View File

@ -94,6 +94,28 @@ void main() {
terminated = true;
await channel.terminate();
});
// Verify that stream cancellation does not cause an exception
test("stream cancellation works", () async {
final channel = GrpcWebClientChannel.xhr(server.uri);
final service = EchoServiceClient(channel);
const testMessage = 'hello from gRPC-web';
final stream = service
.serverStreamingEcho(ServerStreamingEchoRequest()
..message = testMessage
..messageCount = 20
..messageInterval = 100)
.listen((response) {
expect(response.message, equals(testMessage));
});
await Future.delayed(Duration(milliseconds: 500));
await stream.cancel();
await channel.terminate();
});
}
class GrpcWebServer {