Skip to content

Commit ea8b660

Browse files
Add socketio connection state recovery
1 parent 42da871 commit ea8b660

File tree

1 file changed

+28
-1
lines changed

1 file changed

+28
-1
lines changed

Source/SocketIO/Client/SocketIOClient.swift

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,17 @@ open class SocketIOClient: NSObject, SocketIOClientSpec {
7777

7878
/// The id of this socket.io connect. This is different from the sid of the engine.io connection.
7979
public private(set) var sid: String?
80+
/// The id of this socket.io connect for connection state recovery.
81+
public private(set) var pid: String? {
82+
didSet {
83+
recovered = pid == oldValue
84+
}
85+
}
86+
87+
/// Offset of last socket.io event for connection state recovery.
88+
public private(set) var lastEventOffset: String?
89+
/// Boolean setted after connection to know if socket state is recovered or not.
90+
public private(set) var recovered: Bool = false
8091

8192
let ackHandlers = SocketAckManager()
8293
var connectPayload: [String: Any]?
@@ -130,9 +141,11 @@ open class SocketIOClient: NSObject, SocketIOClientSpec {
130141
return
131142
}
132143

144+
let payloadWithConnectionStateRecovery = getConnectionStateRecoveryPayload(with: payload)
145+
133146
status = .connecting
134147

135-
joinNamespace(withPayload: payload)
148+
joinNamespace(withPayload: payloadWithConnectionStateRecovery)
136149

137150
switch manager.version {
138151
case .three:
@@ -159,6 +172,14 @@ open class SocketIOClient: NSObject, SocketIOClientSpec {
159172
}
160173
}
161174

175+
func getConnectionStateRecoveryPayload(with payload: [String: Any]?) -> [String: Any]? {
176+
guard let pid, let lastEventOffset else { return payload }
177+
var recoveryPayload = payload ?? [:]
178+
recoveryPayload["pid"] = pid
179+
recoveryPayload["offset"] = lastEventOffset
180+
return recoveryPayload
181+
}
182+
162183
func createOnAck(_ items: [Any], binary: Bool = true) -> OnAckCallback {
163184
currentAck += 1
164185

@@ -175,6 +196,7 @@ open class SocketIOClient: NSObject, SocketIOClientSpec {
175196
DefaultSocketLogger.Logger.log("Socket connected", type: logType)
176197

177198
status = .connected
199+
pid = payload?["pid"] as? String
178200
sid = payload?["sid"] as? String
179201

180202
handleClientEvent(.connect, data: payload == nil ? [namespace] : [namespace, payload!])
@@ -359,6 +381,11 @@ open class SocketIOClient: NSObject, SocketIOClientSpec {
359381
open func handleEvent(_ event: String, data: [Any], isInternalMessage: Bool, withAck ack: Int = -1) {
360382
guard status == .connected || isInternalMessage else { return }
361383

384+
if let eventOffset = data.last as? String,
385+
!isInternalMessage && ack < 0 && pid != nil {
386+
self.lastEventOffset = eventOffset
387+
}
388+
362389
DefaultSocketLogger.Logger.log("Handling event: \(event) with data: \(data)", type: logType)
363390

364391
anyHandler?(SocketAnyEvent(event: event, items: data))

0 commit comments

Comments
 (0)