Fix keepAlive reconnection (#23)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index a318705..5135fb4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 3.2.1
+
+- Fix an issue where `keepAlive` would only allow a single reconnection.
+
## 3.2.0
- Re-expose `isInKeepAlivePeriod` flag on `SseConnection`. This flag will be
diff --git a/lib/src/server/sse_handler.dart b/lib/src/server/sse_handler.dart
index e8cd523..1749f46 100644
--- a/lib/src/server/sse_handler.dart
+++ b/lib/src/server/sse_handler.dart
@@ -163,16 +163,15 @@
unawaited(connection._closedCompleter.future.then((_) {
_connections.remove(clientId);
}));
- // Remove connection when it is remotely closed or the stream is
- // cancelled.
- channel.stream.listen((_) {
- // SSE is unidirectional. Responses are handled through POST requests.
- }, onDone: () {
- connection._handleDisconnect();
- });
-
_connectionController.add(connection);
}
+ // Remove connection when it is remotely closed or the stream is
+ // cancelled.
+ channel.stream.listen((_) {
+ // SSE is unidirectional. Responses are handled through POST requests.
+ }, onDone: () {
+ _connections[clientId]?._handleDisconnect();
+ });
});
return shelf.Response.notFound('');
}
diff --git a/pubspec.yaml b/pubspec.yaml
index 9e8225a..1381d61 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
name: sse
-version: 3.2.0
+version: 3.2.1
homepage: https://github.com/dart-lang/sse
description: >-
Provides client and server functionality for setting up bi-directional
diff --git a/test/sse_test.dart b/test/sse_test.dart
index 4f66393..3a7f76b 100644
--- a/test/sse_test.dart
+++ b/test/sse_test.dart
@@ -6,6 +6,7 @@
import 'dart:async';
import 'dart:io';
+import 'package:async/async.dart';
import 'package:shelf/shelf.dart' as shelf;
import 'package:shelf/shelf_io.dart' as io;
import 'package:shelf_static/shelf_static.dart';
@@ -195,7 +196,20 @@
// Ensure we can still round-trip data on the original connection and that
// the connection is no longer marked keep-alive once it's reconnected.
connection.sink.add('bar');
- expect(await connection.stream.first, 'bar');
+ var queue = StreamQueue(connection.stream);
+ expect(await queue.next, 'bar');
+ expect(connection.isInKeepAlivePeriod, isFalse);
+
+ // Now check that we can reconnect multiple times.
+ closeSink(connection);
+ maxPumps = 50;
+ while (!connection.isInKeepAlivePeriod && maxPumps-- > 0) {
+ await pumpEventQueue(times: 1);
+ }
+ expect(connection.isInKeepAlivePeriod, isTrue);
+ expect(handler.numberOfClients, 1);
+ connection.sink.add('bar');
+ expect(await queue.next, 'bar');
expect(connection.isInKeepAlivePeriod, isFalse);
});