Fix a race when close() called before remote class event delivered (dart-lang/web_socket_channel#348)
diff --git a/pkgs/web_socket_channel/lib/adapter_web_socket_channel.dart b/pkgs/web_socket_channel/lib/adapter_web_socket_channel.dart
index 8415f27..d4df1b3 100644
--- a/pkgs/web_socket_channel/lib/adapter_web_socket_channel.dart
+++ b/pkgs/web_socket_channel/lib/adapter_web_socket_channel.dart
@@ -79,7 +79,6 @@
}
webSocketFuture.then((webSocket) {
- var remoteClosed = false;
webSocket.events.listen((event) {
switch (event) {
case TextDataReceived(text: final text):
@@ -87,7 +86,6 @@
case BinaryDataReceived(data: final data):
_controller.local.sink.add(data);
case CloseReceived(code: final code, reason: final reason):
- remoteClosed = true;
_closeCode = code;
_closeReason = reason;
_controller.local.sink.close();
@@ -105,13 +103,15 @@
default:
throw UnsupportedError('Cannot send ${obj.runtimeType}');
}
- } on WebSocketConnectionClosed catch (_) {
+ } on WebSocketConnectionClosed {
// There is nowhere to surface this error; `_controller.local.sink`
// has already been closed.
}
- }, onDone: () {
- if (!remoteClosed) {
- webSocket.close(_localCloseCode, _localCloseReason);
+ }, onDone: () async {
+ try {
+ await webSocket.close(_localCloseCode, _localCloseReason);
+ } on WebSocketConnectionClosed {
+ // It is not an error to close an already-closed `WebSocketChannel`.
}
});
_protocol = webSocket.protocol;
diff --git a/pkgs/web_socket_channel/pubspec.yaml b/pkgs/web_socket_channel/pubspec.yaml
index d198922..6b8ae39 100644
--- a/pkgs/web_socket_channel/pubspec.yaml
+++ b/pkgs/web_socket_channel/pubspec.yaml
@@ -14,7 +14,7 @@
crypto: ^3.0.0
stream_channel: ^2.1.0
web: ^0.5.0
- web_socket: ^0.1.1
+ web_socket: ^0.1.3
dev_dependencies:
dart_flutter_team_lints: ^2.0.0