From f5547e70dbf924194c66289e98523a53d339c949 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bruno=20Pantalea=CC=83o?= <bruno.ing879@gmail.com>
Date: Tue, 26 Mar 2024 10:54:24 +0100
Subject: [PATCH 1/2] Use StarScream branch which prevents multiple URLSession
 creation

---
 Package.resolved                                          | 8 ++++----
 Package.swift                                             | 4 ++--
 Source/Internal/HAConnectionImpl+Responses.swift          | 2 +-
 .../ResponseController/HAResponseController.swift         | 2 ++
 4 files changed, 9 insertions(+), 7 deletions(-)

diff --git a/Package.resolved b/Package.resolved
index 73ddc97..16727c0 100644
--- a/Package.resolved
+++ b/Package.resolved
@@ -12,11 +12,11 @@
       },
       {
         "package": "Starscream",
-        "repositoryURL": "https://github.com/daltoniam/Starscream",
+        "repositoryURL": "https://github.com/bgoncal/Starscream",
         "state": {
-          "branch": null,
-          "revision": "df8d82047f6654d8e4b655d1b1525c64e1059d21",
-          "version": "4.0.4"
+          "branch": "ha-URLSession-fix",
+          "revision": "7e3d24425c20649105cb4bdd612b6bab66f73ade",
+          "version": null
         }
       }
     ]
diff --git a/Package.swift b/Package.swift
index 7403a48..8558baf 100644
--- a/Package.swift
+++ b/Package.swift
@@ -19,8 +19,8 @@ public let package = Package(
     ],
     dependencies: [
         .package(
-            url: "https://github.com/daltoniam/Starscream",
-            from: "4.0.4"
+            url: "https://github.com/bgoncal/Starscream",
+            .branchItem("ha-URLSession-fix")
         ),
         .package(
             url: "https://github.com/mxcl/PromiseKit",
diff --git a/Source/Internal/HAConnectionImpl+Responses.swift b/Source/Internal/HAConnectionImpl+Responses.swift
index 054db5f..b2c8a85 100644
--- a/Source/Internal/HAConnectionImpl+Responses.swift
+++ b/Source/Internal/HAConnectionImpl+Responses.swift
@@ -1,7 +1,7 @@
 import Starscream
 
 extension HAConnectionImpl: Starscream.WebSocketDelegate {
-    func didReceive(event: Starscream.WebSocketEvent, client: Starscream.WebSocket) {
+    func didReceive(event: Starscream.WebSocketEvent, client: any Starscream.WebSocketClient) {
         responseController.didReceive(event: event)
     }
 }
diff --git a/Source/Internal/ResponseController/HAResponseController.swift b/Source/Internal/ResponseController/HAResponseController.swift
index 7cd30da..81c7238 100644
--- a/Source/Internal/ResponseController/HAResponseController.swift
+++ b/Source/Internal/ResponseController/HAResponseController.swift
@@ -124,6 +124,8 @@ internal class HAResponseControllerImpl: HAResponseController {
         case let .error(error):
             HAGlobal.log(.error, "Error: \(String(describing: error))")
             phase = .disconnected(error: error, forReset: false)
+        case .peerClosed:
+            HAGlobal.log(.info, "Peer closed")
         }
     }
 

From 560c62a7fd0c1a0034deb61c6a5b47b13a2e7b8b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bruno=20Pantalea=CC=83o?= <bruno.ing879@gmail.com>
Date: Tue, 2 Apr 2024 14:16:42 +0200
Subject: [PATCH 2/2] Add test for new case

---
 .../ResponseController/HAResponseController.swift         | 1 +
 Tests/HAResponseController.test.swift                     | 8 ++++++++
 2 files changed, 9 insertions(+)

diff --git a/Source/Internal/ResponseController/HAResponseController.swift b/Source/Internal/ResponseController/HAResponseController.swift
index 81c7238..3d41020 100644
--- a/Source/Internal/ResponseController/HAResponseController.swift
+++ b/Source/Internal/ResponseController/HAResponseController.swift
@@ -126,6 +126,7 @@ internal class HAResponseControllerImpl: HAResponseController {
             phase = .disconnected(error: error, forReset: false)
         case .peerClosed:
             HAGlobal.log(.info, "Peer closed")
+            phase = .disconnected(error: nil, forReset: false)
         }
     }
 
diff --git a/Tests/HAResponseController.test.swift b/Tests/HAResponseController.test.swift
index e9a2f48..72a25b5 100644
--- a/Tests/HAResponseController.test.swift
+++ b/Tests/HAResponseController.test.swift
@@ -72,6 +72,14 @@ internal class HAResponseControllerTests: XCTestCase {
         }
     }
 
+    func testPeerClosedEvent() {
+        fireConnected()
+        controller.didReceive(event: .peerClosed)
+        waitForCallback()
+        XCTAssertEqual(delegate.lastPhase, .disconnected(error: nil, forReset: false))
+        XCTAssertNil(delegate.lastReceived)
+    }
+
     func testAuthFlow() throws {
         fireConnected()
         try fireText(