diff --git a/.github/workflows/dart.yml b/.github/workflows/dart.yml index 9593e138..6bfecb53 100644 --- a/.github/workflows/dart.yml +++ b/.github/workflows/dart.yml @@ -18,7 +18,7 @@ jobs: matrix: sdk: [3.0.0, dev] steps: - - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab + - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 - uses: dart-lang/setup-dart@d6a63dab3335f427404425de0fbfed4686d93c4f with: sdk: ${{ matrix.sdk }} @@ -70,7 +70,7 @@ jobs: - os: macos-latest platform: chrome steps: - - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab + - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 - uses: dart-lang/setup-dart@d6a63dab3335f427404425de0fbfed4686d93c4f with: sdk: ${{ matrix.sdk }} diff --git a/CHANGELOG.md b/CHANGELOG.md index e37b5d43..24fd9766 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ * Add const constructor to `GrpcError` fixing #606. * Make `GrpcError` non-final to allow implementations. * Only send keepalive pings on open connections. +* Fix interop tests. ## 3.2.2 diff --git a/lib/grpc.dart b/lib/grpc.dart index d87836d5..e56f3c29 100644 --- a/lib/grpc.dart +++ b/lib/grpc.dart @@ -21,6 +21,7 @@ export 'src/auth/auth_io.dart' ServiceAccountAuthenticator; export 'src/client/call.dart' show ClientCall; export 'src/client/client.dart' show Client; +export 'src/client/client_keepalive.dart' show ClientKeepAliveOptions; export 'src/client/client_transport_connector.dart' show ClientTransportConnector; export 'src/client/connection.dart' show ConnectionState; @@ -50,6 +51,7 @@ export 'src/server/server.dart' ServerTlsCredentials, ConnectionServer, Server; +export 'src/server/server_keepalive.dart' show ServerKeepAliveOptions; export 'src/server/service.dart' show ServiceMethod, Service; export 'src/shared/api.dart'; export 'src/shared/codec.dart' show Codec, IdentityCodec, GzipCodec; diff --git a/lib/src/client/client_keepalive.dart b/lib/src/client/client_keepalive.dart index 0f021e2b..9dcd54e2 100644 --- a/lib/src/client/client_keepalive.dart +++ b/lib/src/client/client_keepalive.dart @@ -27,7 +27,7 @@ class ClientKeepAliveOptions { const ClientKeepAliveOptions({ this.pingInterval, - this.timeout = const Duration(milliseconds: 20000), + this.timeout = const Duration(seconds: 20), this.permitWithoutCalls = false, }); @@ -189,7 +189,7 @@ class ClientKeepAlive { final void Function() ping; final ClientKeepAliveOptions _options; - Duration get _pingInterval => _options.pingInterval ?? Duration(days: 365); + Duration get _pingInterval => _options.pingInterval!; ClientKeepAlive({ required ClientKeepAliveOptions options, @@ -236,7 +236,9 @@ class ClientKeepAlive { } void _setState(KeepAliveEvent event) { - final newState = state.onEvent(event, this); - if (newState != null) state = newState; + if (_options.shouldSendPings) { + final newState = state.onEvent(event, this); + if (newState != null) state = newState; + } } } diff --git a/lib/src/server/server.dart b/lib/src/server/server.dart index a93f4563..30b75964 100644 --- a/lib/src/server/server.dart +++ b/lib/src/server/server.dart @@ -90,7 +90,7 @@ class ConnectionServer { final CodecRegistry? _codecRegistry; final GrpcErrorHandler? _errorHandler; final ServerKeepAliveOptions _keepAliveOptions; - final List _handlers = []; + final Map> _handlers = {}; final _connections = []; @@ -117,6 +117,7 @@ class ConnectionServer { InternetAddress? remoteAddress, }) async { _connections.add(connection); + _handlers[connection] = []; // TODO(jakobr): Set active state handlers, close connection after idle // timeout. final onDataReceivedController = StreamController(); @@ -128,7 +129,7 @@ class ConnectionServer { dataNotifier: onDataReceivedController.stream, ).handle(); connection.incomingStreams.listen((stream) { - _handlers.add(serveStream_( + _handlers[connection]!.add(serveStream_( stream: stream, clientCertificate: clientCertificate, remoteAddress: remoteAddress, @@ -143,10 +144,11 @@ class ConnectionServer { // half-closed tcp streams. // Half-closed streams seems to not be fully supported by package:http2. // https://github.com/dart-lang/http2/issues/42 - for (var handler in _handlers) { + for (var handler in _handlers[connection]!) { handler.cancel(); } _connections.remove(connection); + _handlers.remove(connection); await onDataReceivedController.close(); }); } diff --git a/lib/src/server/server_keepalive.dart b/lib/src/server/server_keepalive.dart index d196641a..6bf6f8da 100644 --- a/lib/src/server/server_keepalive.dart +++ b/lib/src/server/server_keepalive.dart @@ -14,8 +14,7 @@ class ServerKeepAliveOptions { final Duration minIntervalBetweenPingsWithoutData; const ServerKeepAliveOptions({ - this.minIntervalBetweenPingsWithoutData = - const Duration(milliseconds: 300000), + this.minIntervalBetweenPingsWithoutData = const Duration(minutes: 5), this.maxBadPings = 2, }); } diff --git a/test/keepalive_test.dart b/test/keepalive_test.dart index 51ef15e8..e4ddf2d1 100644 --- a/test/keepalive_test.dart +++ b/test/keepalive_test.dart @@ -5,7 +5,6 @@ import 'package:grpc/grpc.dart'; import 'package:grpc/src/client/client_keepalive.dart'; import 'package:grpc/src/client/connection.dart'; import 'package:grpc/src/client/http2_connection.dart'; -import 'package:grpc/src/server/server_keepalive.dart'; import 'package:http2/transport.dart'; import 'package:test/test.dart'; diff --git a/test/src/client_utils.dart b/test/src/client_utils.dart index 852ebd0f..30d918ba 100644 --- a/test/src/client_utils.dart +++ b/test/src/client_utils.dart @@ -18,7 +18,6 @@ import 'dart:convert'; import 'package:grpc/grpc.dart'; import 'package:grpc/src/client/channel.dart' as base; -import 'package:grpc/src/client/client_keepalive.dart'; import 'package:grpc/src/client/http2_connection.dart'; import 'package:grpc/src/shared/message.dart'; import 'package:http2/transport.dart';