@@ -89,6 +89,9 @@ open class SocketIOClient: NSObject, SocketIOClientSpec {
8989 /// Boolean setted after connection to know if socket state is recovered or not.
9090 public private( set) var recovered : Bool = false
9191
92+ /// Array of events (or binary events) to handle when socket is connected and recover packets from server
93+ public private( set) var savedEvents = [ SocketPacket] ( )
94+
9295 let ackHandlers = SocketAckManager ( )
9396 var connectPayload : [ String : Any ] ?
9497
@@ -193,13 +196,15 @@ open class SocketIOClient: NSObject, SocketIOClientSpec {
193196 open func didConnect( toNamespace namespace: String , payload: [ String : Any ] ? ) {
194197 guard status != . connected else { return }
195198
199+ pid = payload ? [ " pid " ] as? String
200+ sid = payload ? [ " sid " ] as? String
201+
196202 DefaultSocketLogger . Logger. log ( " Socket connected " , type: logType)
197203
198204 status = . connected
199- pid = payload ? [ " pid " ] as? String
200- sid = payload ? [ " sid " ] as? String
201205
202206 handleClientEvent ( . connect, data: payload == nil ? [ namespace] : [ namespace, payload!] )
207+ handleSavedEventPackets ( )
203208 }
204209
205210 /// Called when the client has disconnected from socket.io.
@@ -404,6 +409,7 @@ open class SocketIOClient: NSObject, SocketIOClientSpec {
404409
405410 switch packet. type {
406411 case . event, . binaryEvent:
412+ saveEventPacketIfNeeded ( packet: packet, isInternalMessage: false )
407413 handleEvent ( packet. event, data: packet. args, isInternalMessage: false , withAck: packet. id)
408414 case . ack, . binaryAck:
409415 handleAck ( packet. id, data: packet. data)
@@ -416,6 +422,29 @@ open class SocketIOClient: NSObject, SocketIOClientSpec {
416422 }
417423 }
418424
425+ /// Called when we get an event from socket.io
426+ /// Save it to event array if an event is sent before socket is set to connected status.
427+ /// Do not save event if pid is nil (cannot recover events from server)
428+ ///
429+ /// - parameter packet: The packet to handle.
430+ /// - parameter isInternalMessage: Whether this event was sent internally. If `true` ignore it.
431+ open func saveEventPacketIfNeeded( packet: SocketPacket , isInternalMessage: Bool ) {
432+ guard status != . connected && !isInternalMessage && pid != nil else { return }
433+ savedEvents. append ( packet)
434+ }
435+
436+ /// Called when socket pass to connected state, handle events if socket recover data from server
437+ open func handleSavedEventPackets( ) {
438+ if recovered {
439+ savedEvents. removeAll { packet in
440+ handleEvent ( packet. event, data: packet. args, isInternalMessage: false )
441+ return true
442+ }
443+ } else {
444+ savedEvents. removeAll ( )
445+ }
446+ }
447+
419448 /// Call when you wish to leave a namespace and disconnect this socket.
420449 open func leaveNamespace( ) {
421450 manager? . disconnectSocket ( self )
0 commit comments