Skip to content

Commit 38fbbca

Browse files
committed
Ensure the WebSocket conneciton can be re-established after a disconnection occurs.
1 parent 9c92442 commit 38fbbca

File tree

1 file changed

+12
-6
lines changed

1 file changed

+12
-6
lines changed

Sources/Models/WebSocket.swift

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ open class WebSocket: NSObject, WebSocketConnection, URLSessionWebSocketDelegate
99

1010
// MARK: - Private properties
1111

12-
private var webSocketTask: URLSessionWebSocketTask!
12+
private var webSocketTask: URLSessionWebSocketTask?
13+
private var webSocketRequest: URLRequest!
1314
private var urlSession: URLSession!
1415
private let delegateQueue = OperationQueue()
1516
private var pingTimer: Timer?
@@ -60,7 +61,11 @@ open class WebSocket: NSObject, WebSocketConnection, URLSessionWebSocketDelegate
6061
// MARK: - WebSocketConnection conformance
6162

6263
func connect() {
63-
webSocketTask.resume()
64+
if webSocketTask == nil {
65+
webSocketTask = urlSession.webSocketTask(with: webSocketRequest)
66+
}
67+
68+
webSocketTask?.resume()
6469
listen()
6570
}
6671

@@ -73,7 +78,7 @@ open class WebSocket: NSObject, WebSocketConnection, URLSessionWebSocketDelegate
7378
}
7479

7580
func listen() {
76-
webSocketTask.receive { [weak self] result in
81+
webSocketTask?.receive { [weak self] result in
7782
guard let self = self else {
7883
return
7984
}
@@ -108,7 +113,7 @@ open class WebSocket: NSObject, WebSocketConnection, URLSessionWebSocketDelegate
108113
}
109114

110115
func ping() {
111-
self.webSocketTask.sendPing { error in
116+
self.webSocketTask?.sendPing { error in
112117
if let error = error {
113118
self.delegate?.webSocketDidReceiveError(connection: self, error: error)
114119
} else {
@@ -119,14 +124,15 @@ open class WebSocket: NSObject, WebSocketConnection, URLSessionWebSocketDelegate
119124

120125
func disconnect(closeCode: Int = URLSessionWebSocketTask.CloseCode.normalClosure.rawValue) {
121126
let closeCode = URLSessionWebSocketTask.CloseCode(rawValue: closeCode) ?? .normalClosure
122-
webSocketTask.cancel(with: closeCode, reason: nil)
127+
webSocketTask?.cancel(with: closeCode, reason: nil)
128+
webSocketTask = nil
123129
pingTimer?.invalidate()
124130
}
125131

126132
// MARK: - Private methods
127133

128134
private func send(message: URLSessionWebSocketTask.Message) {
129-
webSocketTask.send(message) { [weak self] error in
135+
webSocketTask?.send(message) { [weak self] error in
130136
guard let self = self else {
131137
return
132138
}

0 commit comments

Comments
 (0)