Skip to content

Commit 77499cf

Browse files
committed
Store unsentEvents in array instead of a dictionary
1 parent b618bea commit 77499cf

File tree

2 files changed

+28
-6
lines changed

2 files changed

+28
-6
lines changed

Source/PusherSwift.swift

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -255,9 +255,10 @@ public class PusherConnection: WebSocketDelegate {
255255
}
256256
}
257257
}
258-
for (eventName, data) in chan.unsentEvents {
259-
chan.unsentEvents.removeValueForKey(channelName)
260-
chan.trigger(eventName, data: data)
258+
while chan.unsentEvents.count > 0 {
259+
if let pusherEvent = chan.unsentEvents.popLast() {
260+
chan.trigger(pusherEvent.name, data: pusherEvent.data)
261+
}
261262
}
262263
}
263264
}
@@ -558,7 +559,7 @@ public class PusherChannel {
558559
public var subscribed = false
559560
public let name: String
560561
public let connection: PusherConnection
561-
public var unsentEvents = [String: AnyObject]()
562+
public var unsentEvents = [PusherEvent]()
562563

563564
public init(name: String, connection: PusherConnection) {
564565
self.name = name
@@ -608,11 +609,16 @@ public class PusherChannel {
608609
if subscribed {
609610
self.connection.sendEvent(eventName, data: data, channelName: self.name)
610611
} else {
611-
unsentEvents[eventName] = data
612+
unsentEvents.insert(PusherEvent(name: eventName, data: data), atIndex: 0)
612613
}
613614
}
614615
}
615616

617+
public struct PusherEvent {
618+
public let name: String
619+
public let data: AnyObject
620+
}
621+
616622
public class PresencePusherChannel: PusherChannel {
617623
public var members: [PresenceChannelMember]
618624

Tests/PusherSwiftTests.swift

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -633,14 +633,30 @@ class PusherChannelSpec: QuickSpec {
633633
connection.channels.channels["private-channel"] = chan
634634
expect(chan.unsentEvents).to(beEmpty())
635635
chan.trigger("client-test-event", data: ["data": "testing client events"])
636-
expect(chan.unsentEvents.keys).to(contain("client-test-event"))
636+
expect(chan.unsentEvents.last!.name).to(equal("client-test-event"))
637637
expect(socket.stubber.calls).to(beEmpty())
638638
connection.connect()
639639
let parsedSubscribeArgs = convertStringToDictionary(socket.stubber.calls.last?.args!.first as! String)
640640
let expectedDict = ["data": ["data": "testing client events"], "event": "client-test-event", "channel": "private-channel"]
641641
let parsedEqualsExpected = NSDictionary(dictionary: parsedSubscribeArgs!).isEqualToDictionary(NSDictionary(dictionary: expectedDict) as [NSObject : AnyObject])
642642
expect(parsedEqualsExpected).to(beTrue())
643643
}
644+
645+
it("should send multipe client events with the same event name that were triggered before subscription was successful") {
646+
let chan = PusherChannel(name: "private-channel", connection: connection)
647+
connection.channels.channels["private-channel"] = chan
648+
expect(chan.unsentEvents).to(beEmpty())
649+
chan.trigger("client-test-event", data: ["data": "testing client events"])
650+
chan.trigger("client-test-event", data: ["data": "more testing client events"])
651+
expect(chan.unsentEvents.last!.name).to(equal("client-test-event"))
652+
expect(chan.unsentEvents.count).to(equal(2))
653+
expect(socket.stubber.calls).to(beEmpty())
654+
connection.connect()
655+
let parsedSubscribeArgs = convertStringToDictionary(socket.stubber.calls.last?.args!.first as! String)
656+
let expectedDict = ["data": ["data": "more testing client events"], "event": "client-test-event", "channel": "private-channel"]
657+
let parsedEqualsExpected = NSDictionary(dictionary: parsedSubscribeArgs!).isEqualToDictionary(NSDictionary(dictionary: expectedDict) as [NSObject : AnyObject])
658+
expect(parsedEqualsExpected).to(beTrue())
659+
}
644660
}
645661
}
646662
}

0 commit comments

Comments
 (0)