@@ -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