add test
diff --git a/lib/server/sse_handler.dart b/lib/server/sse_handler.dart
index abec5cf..07e9a78 100644
--- a/lib/server/sse_handler.dart
+++ b/lib/server/sse_handler.dart
@@ -88,7 +88,7 @@
void close() {
if (!_connectionController.isClosed) _connectionController.close();
- for (var connection in _connections) {
+ for (var connection in _connections.toList()) {
connection.sink.close();
_connections.remove(connection);
}
@@ -101,8 +101,12 @@
var clientId = req.url.queryParameters['sseClientId'];
var connection = SseConnection(sink, clientId);
_connections.add(connection);
- // Remove connection when it is remotely closed.
- channel.stream.listen((_) {}, onDone: () {
+ // 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: () {
+ // Trigger closing the connection.
connection.sink.close();
_connections.remove(connection);
});
diff --git a/test/sse_test.dart b/test/sse_test.dart
index a9db7d9..c21345e 100644
--- a/test/sse_test.dart
+++ b/test/sse_test.dart
@@ -83,7 +83,31 @@
var closeButton = await webdriver.findElement(const By.tagName('button'));
await closeButton.click();
- // Stream should complete.
+ // Should complete since the connection is closed.
+ await connection.stream.toList();
+ expect(handler.numberOfClients, 0);
+ });
+
+ test('Cancelling the listener closes the conneciton', () async {
+ expect(handler.numberOfClients, 0);
+ await webdriver.get('http://localhost:${server.port}');
+ var connection = await handler.connections.next;
+ expect(handler.numberOfClients, 1);
+
+ var sub = connection.stream.listen((_) {});
+ await sub.cancel();
+ await pumpEventQueue();
+ expect(handler.numberOfClients, 0);
+ });
+
+ test('Can close the handler which closes the connections', () async {
+ expect(handler.numberOfClients, 0);
+ await webdriver.get('http://localhost:${server.port}');
+ var connection = await handler.connections.next;
+ expect(handler.numberOfClients, 1);
+
+ handler.close();
+ // Should complete since the connection is closed.
await connection.stream.toList();
expect(handler.numberOfClients, 0);
});