Skip to content

Commit 7283180

Browse files
authored
build(gql_websocket_link): upgrade web_socket_channel to v3.0.3, rxdart to >=0.26.0 <= 0.28.0 (#475)
upgrade web_socket_channel to v3.0.3, supports web_socket v1.0, rxdart to >=0.26.0 <= 0.28.0
1 parent 5322e86 commit 7283180

File tree

3 files changed

+54
-4
lines changed

3 files changed

+54
-4
lines changed

links/gql_websocket_link/lib/src/graphql_transport_ws.dart

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -551,10 +551,12 @@ class TransportWsClientOptions {
551551
class _Connected {
552552
final WebSocketChannel socket;
553553
final Future<void> throwOnClose;
554+
final Future<LikeCloseEvent?> likeCloseEvent;
554555

555556
_Connected(
556557
this.socket,
557558
this.throwOnClose,
559+
this.likeCloseEvent,
558560
);
559561
}
560562

@@ -879,9 +881,26 @@ class _ConnectionState {
879881
retries = 0; // reset the retries on connect
880882
final _completer = Completer<void>();
881883
errorOrClosed(_completer.completeError);
884+
// workground for dart linux bug: complete error not being caught by try..catch block
885+
final _likeCloseEventCompleter = Completer<LikeCloseEvent?>();
882886
connected(_Connected(
883887
socket,
884-
_completer.future,
888+
_completer.future.catchError((err) {
889+
// workground for dart linux bug: complete error not being caught by try..catch block
890+
// if the connection is closed, the error is not fatal
891+
if (err is LikeCloseEvent) {
892+
if (!_likeCloseEventCompleter.isCompleted) {
893+
_likeCloseEventCompleter.complete(err);
894+
}
895+
return;
896+
}
897+
throw err;
898+
}).whenComplete(() {
899+
if (!_likeCloseEventCompleter.isCompleted) {
900+
_likeCloseEventCompleter.complete(null);
901+
}
902+
}),
903+
_likeCloseEventCompleter.future,
885904
));
886905
} catch (err) {
887906
// stop reading messages as soon as reading breaks once
@@ -930,6 +949,7 @@ class _ConnectionState {
930949

931950
final socket = _connection.socket;
932951
final throwOnClose = _connection.throwOnClose;
952+
final likeCloseEvent = _connection.likeCloseEvent;
933953

934954
// if the provided socket is in a closing state, wait for the throw on close
935955
// TODO: WebSocketChannel should have a `state` getter
@@ -972,6 +992,7 @@ class _ConnectionState {
972992
// or
973993
throwOnClose,
974994
]),
995+
waitForLikeCloseEvent: likeCloseEvent,
975996
);
976997
}
977998
}
@@ -1013,6 +1034,7 @@ class _Client extends TransportWsClient {
10131034
final socket = _c.socket;
10141035
final release = _c.release;
10151036
final waitForReleaseOrThrowOnClose = _c.waitForReleaseOrThrowOnClose;
1037+
final waitForLikeCloseEvent = _c.waitForLikeCloseEvent;
10161038
// print("isolate debug name: ${Isolate.current.debugName}");
10171039
// print(payload.operation.toString());
10181040
// print(payload.variables.toString());
@@ -1072,6 +1094,12 @@ class _Client extends TransportWsClient {
10721094
// whatever happens though, we want to stop listening for messages
10731095
await waitForReleaseOrThrowOnClose.whenComplete(unlisten);
10741096

1097+
// workground for dart linux bug: complete error not being caught by try..catch block
1098+
final likeCloseEvent = await waitForLikeCloseEvent;
1099+
if (likeCloseEvent != null) {
1100+
throw likeCloseEvent;
1101+
}
1102+
10751103
return; // completed, shouldnt try again
10761104
} catch (errOrCloseEvent) {
10771105
if (!state.shouldRetryConnectOrThrow(errOrCloseEvent)) return;
@@ -1123,11 +1151,13 @@ class _Connection {
11231151
final WebSocketChannel socket;
11241152
final Completer<void> release;
11251153
final Future<void> waitForReleaseOrThrowOnClose;
1154+
final Future<LikeCloseEvent?> waitForLikeCloseEvent;
11261155

11271156
_Connection({
11281157
required this.socket,
11291158
required this.release,
11301159
required this.waitForReleaseOrThrowOnClose,
1160+
required this.waitForLikeCloseEvent,
11311161
});
11321162
}
11331163

links/gql_websocket_link/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ dependencies:
1111
meta: ^1.3.0
1212
rxdart: '>=0.26.0 <=0.28.0'
1313
uuid: '>=3.0.0 <5.0.0'
14-
web_socket_channel: ^2.0.0
14+
web_socket_channel: ^3.0.3
1515
dev_dependencies:
1616
gql_pedantic: ^1.0.2
1717
mockito: ^5.0.0

links/gql_websocket_link/test/gql_websocket_link_test.dart

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -971,7 +971,6 @@ void _testLinks(
971971
link.request(request).listen(
972972
expectAsync1(
973973
(response) {
974-
print(response);
975974
expect(
976975
response.data,
977976
responseData1,
@@ -1239,9 +1238,16 @@ void _testLinks(
12391238
server.transform(WebSocketTransformer());
12401239

12411240
webSocket = await WebSocket.connect("ws://localhost:${server.port}");
1241+
channel = IOWebSocketChannel(webSocket);
1242+
channel.stream.asBroadcastStream().listen(
1243+
null,
1244+
onError: (Object err) {
1245+
print(err);
1246+
},
1247+
onDone: () => print("done"),
1248+
);
12421249
// Close the socket to cause network error.
12431250
await webSocket.close();
1244-
channel = IOWebSocketChannel(webSocket);
12451251
link = makeLink(null, channelGenerator: () => channel);
12461252
expect(
12471253
link.request(request).first,
@@ -1466,7 +1472,15 @@ void _testLinks(
14661472
),
14671473
);
14681474

1475+
final completer = Completer<void>();
1476+
final timer = Timer(const Duration(seconds: 5), () {
1477+
if (!completer.isCompleted) {
1478+
completer.completeError("Timeout");
1479+
}
1480+
});
1481+
14691482
server = await HttpServer.bind("localhost", 0);
1483+
var connectCount = 0;
14701484
server.transform(WebSocketTransformer()).take(2).listen(
14711485
expectAsync1(
14721486
(webSocket) async {
@@ -1485,6 +1499,10 @@ void _testLinks(
14851499
),
14861500
);
14871501
webSocket.close(websocket_status.goingAway);
1502+
connectCount++;
1503+
if (connectCount == 2) {
1504+
completer.complete();
1505+
}
14881506
}
14891507
messageCount++;
14901508
},
@@ -1509,6 +1527,8 @@ void _testLinks(
15091527
);
15101528
//
15111529
link.request(request).listen(print, onError: print);
1530+
await completer.future;
1531+
timer.cancel();
15121532
},
15131533
);
15141534

0 commit comments

Comments
 (0)