From 7be6275f03e3f94540006ce76cde4a0a92d501d6 Mon Sep 17 00:00:00 2001 From: Nate Bosch Date: Fri, 21 Apr 2023 12:34:00 -0700 Subject: [PATCH] Check for closed StreamController in more places (#623) --- lib/src/client/call.dart | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/lib/src/client/call.dart b/lib/src/client/call.dart index f89f68d..0cdda56 100644 --- a/lib/src/client/call.dart +++ b/lib/src/client/call.dart @@ -209,9 +209,7 @@ class ClientCall implements Response { void _terminateWithError(GrpcError error) { _finishTimelineWithError(error, _requestTimeline); - if (!_responses.isClosed) { - _responses.addError(error); - } + _responses.addErrorIfNotClosed(error); _safeTerminate(); } @@ -300,7 +298,7 @@ class ClientCall implements Response { void _onTimedOut() { final error = GrpcError.deadlineExceeded('Deadline exceeded'); _finishTimelineWithError(error, _requestTimeline); - _responses.addError(error); + _responses.addErrorIfNotClosed(error); _safeTerminate(); } @@ -329,7 +327,7 @@ class ClientCall implements Response { /// Emit an error response to the user, and tear down this call. void _responseError(GrpcError error, [StackTrace? stackTrace]) { _finishTimelineWithError(error, _responseTimeline); - _responses.addError(error, stackTrace); + _responses.addErrorIfNotClosed(error); _timeoutTimer?.cancel(); _requestSubscription?.cancel(); _responseSubscription!.cancel(); @@ -444,7 +442,7 @@ class ClientCall implements Response { } _finishTimelineWithError(error, _requestTimeline); - _responses.addError(error, stackTrace); + _responses.addErrorIfNotClosed(error); _timeoutTimer?.cancel(); _responses.close(); _requestSubscription?.cancel(); @@ -494,3 +492,11 @@ class ClientCall implements Response { } catch (_) {} } } + +extension on StreamController { + void addErrorIfNotClosed(Object error, [StackTrace? stackTrace]) { + if (!isClosed) { + addError(error, stackTrace); + } + } +}