Skip to content

Commit 2a0a773

Browse files
fix handle events when packets are sent before the socket is connected
1 parent 3b3de22 commit 2a0a773

File tree

1 file changed

+31
-2
lines changed

1 file changed

+31
-2
lines changed

Source/SocketIO/Client/SocketIOClient.swift

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)