refactor socketpacket

This commit is contained in:
Erik 2015-08-17 14:47:14 -04:00
parent aa43107ad6
commit 4c9d6ef3de
3 changed files with 48 additions and 42 deletions

View File

@ -26,12 +26,12 @@ import Foundation
private func emitAckCallback(socket: SocketIOClient?, num: Int?) private func emitAckCallback(socket: SocketIOClient?, num: Int?)
(items: AnyObject...) -> Void { (items: AnyObject...) -> Void {
socket?.emitAck(num ?? -1, withData: items) socket?.emitAck(num ?? -1, withItems: items)
} }
private func emitAckCallbackObjectiveC(socket: SocketIOClient?, num: Int?) private func emitAckCallbackObjectiveC(socket: SocketIOClient?, num: Int?)
(items: NSArray) -> Void { (items: NSArray) -> Void {
socket?.emitAck(num ?? -1, withData: items as [AnyObject]) socket?.emitAck(num ?? -1, withItems: items as [AnyObject])
} }
struct SocketEventHandler { struct SocketEventHandler {

View File

@ -25,7 +25,7 @@
import Foundation import Foundation
public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient { public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient {
private var anyHandler:((SocketAnyEvent) -> Void)? private var anyHandler: ((SocketAnyEvent) -> Void)?
private var currentReconnectAttempt = 0 private var currentReconnectAttempt = 0
private var handlers = ContiguousArray<SocketEventHandler>() private var handlers = ContiguousArray<SocketEventHandler>()
private var connectParams: [String: AnyObject]? private var connectParams: [String: AnyObject]?
@ -38,19 +38,19 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
var log = false var log = false
var waitingData = [SocketPacket]() var waitingData = [SocketPacket]()
public let socketURL: String
public let handleQueue: dispatch_queue_t!
public let emitQueue = dispatch_queue_create("emitQueue", DISPATCH_QUEUE_SERIAL) public let emitQueue = dispatch_queue_create("emitQueue", DISPATCH_QUEUE_SERIAL)
public let handleQueue: dispatch_queue_t!
public let socketURL: String
public private(set) var engine: SocketEngine?
public private(set) var secure = false public private(set) var secure = false
public private(set) var status = SocketIOClientStatus.NotConnected public private(set) var status = SocketIOClientStatus.NotConnected
public var engine:SocketEngine?
public var nsp = "/" public var nsp = "/"
public var opts: [String: AnyObject]? public var opts: [String: AnyObject]?
public var reconnects = true public var reconnects = true
public var reconnectWait = 10 public var reconnectWait = 10
public var sid:String? { public var sid: String? {
return engine?.sid return engine?.sid
} }
@ -171,13 +171,13 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
} }
} }
private func createOnAck(event: String, items: [AnyObject]) -> OnAckCallback { private func createOnAck(items: [AnyObject]) -> OnAckCallback {
return {[weak self, ack = ++currentAck] timeout, callback in return {[weak self, ack = ++currentAck] timeout, callback in
if let this = self { if let this = self {
this.ackHandlers.addAck(ack, callback: callback) this.ackHandlers.addAck(ack, callback: callback)
dispatch_async(this.emitQueue) {[weak this] in dispatch_async(this.emitQueue) {[weak this] in
this?._emit(event, items, ack: ack) this?._emit(items, ack: ack)
} }
if timeout != 0 { if timeout != 0 {
@ -249,7 +249,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
} }
dispatch_async(emitQueue) {[weak self] in dispatch_async(emitQueue) {[weak self] in
self?._emit(event, items) self?._emit([event] + items)
} }
} }
@ -258,23 +258,23 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
an ack. an ack.
*/ */
public func emitWithAck(event: String, _ items: AnyObject...) -> OnAckCallback { public func emitWithAck(event: String, _ items: AnyObject...) -> OnAckCallback {
return createOnAck(event, items: items) return emitWithAck(event, withItems: items)
} }
/** /**
Same as emitWithAck, but for Objective-C Same as emitWithAck, but for Objective-C
*/ */
public func emitWithAck(event: String, withItems items: [AnyObject]) -> OnAckCallback { public func emitWithAck(event: String, withItems items: [AnyObject]) -> OnAckCallback {
return createOnAck(event, items: items) return createOnAck([event] + items)
} }
private func _emit(event: String, _ args: [AnyObject], ack: Int? = nil) { private func _emit(data: [AnyObject], ack: Int? = nil) {
guard status == SocketIOClientStatus.Connected else { guard status == SocketIOClientStatus.Connected else {
return return
} }
let packet = SocketPacket.packetFromEmitWithData(args, id: ack ?? -1, nsp: nsp) let packet = SocketPacket.packetFromEmit(data, id: ack ?? -1, nsp: nsp, ack: false)
let str = packet.createMessageForEvent(event) let str = packet.packetString
SocketLogger.log("Emitting: %@", client: self, args: str) SocketLogger.log("Emitting: %@", client: self, args: str)
@ -286,11 +286,11 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
} }
// If the server wants to know that the client received data // If the server wants to know that the client received data
func emitAck(ack: Int, withData args: [AnyObject]) { func emitAck(ack: Int, withItems items: [AnyObject]) {
dispatch_async(emitQueue) {[weak self] in dispatch_async(emitQueue) {[weak self] in
if let this = self where this.status == SocketIOClientStatus.Connected { if let this = self where this.status == SocketIOClientStatus.Connected {
let packet = SocketPacket.packetFromEmitAckWithData(args, id: ack ?? -1, nsp: this.nsp) let packet = SocketPacket.packetFromEmit(items, id: ack ?? -1, nsp: this.nsp, ack: true)
let str = packet.createAck() let str = packet.packetString
SocketLogger.log("Emitting Ack: %@", client: this, args: str) SocketLogger.log("Emitting Ack: %@", client: this, args: str)

View File

@ -57,6 +57,10 @@ struct SocketPacket {
return better return better
} }
var packetString: String {
return createPacketString()
}
init(type: SocketPacket.PacketType, data: [AnyObject] = [AnyObject](), id: Int = -1, init(type: SocketPacket.PacketType, data: [AnyObject] = [AnyObject](), id: Int = -1,
nsp: String, placeholders: Int = 0, binary: [NSData] = [NSData]()) { nsp: String, placeholders: Int = 0, binary: [NSData] = [NSData]()) {
self.data = data self.data = data
@ -86,8 +90,6 @@ struct SocketPacket {
private func completeMessage(var message: String, ack: Bool) -> String { private func completeMessage(var message: String, ack: Bool) -> String {
if data.count == 0 { if data.count == 0 {
return message + "]" return message + "]"
} else if !ack {
message += ","
} }
for arg in data { for arg in data {
@ -120,7 +122,7 @@ struct SocketPacket {
return message + "]" return message + "]"
} }
func createAck() -> String { private func createAck() -> String {
let msg: String let msg: String
if type == PacketType.Ack { if type == PacketType.Ack {
@ -141,35 +143,35 @@ struct SocketPacket {
} }
func createMessageForEvent(event: String) -> String { private func createMessageForEvent() -> String {
let message: String let message: String
if type == PacketType.Event { if type == PacketType.Event {
if nsp == "/" { if nsp == "/" {
if id == -1 { if id == -1 {
message = "2[\"\(event)\"" message = "2["
} else { } else {
message = "2\(id)[\"\(event)\"" message = "2\(id)["
} }
} else { } else {
if id == -1 { if id == -1 {
message = "2\(nsp),[\"\(event)\"" message = "2\(nsp),["
} else { } else {
message = "2\(nsp),\(id)[\"\(event)\"" message = "2\(nsp),\(id)["
} }
} }
} else { } else {
if nsp == "/" { if nsp == "/" {
if id == -1 { if id == -1 {
message = "5\(binary.count)-[\"\(event)\"" message = "5\(binary.count)-["
} else { } else {
message = "5\(binary.count)-\(id)[\"\(event)\"" message = "5\(binary.count)-\(id)["
} }
} else { } else {
if id == -1 { if id == -1 {
message = "5\(binary.count)-\(nsp),[\"\(event)\"" message = "5\(binary.count)-\(nsp),["
} else { } else {
message = "5\(binary.count)-\(nsp),\(id)[\"\(event)\"" message = "5\(binary.count)-\(nsp),\(id)["
} }
} }
} }
@ -177,6 +179,18 @@ struct SocketPacket {
return completeMessage(message, ack: false) return completeMessage(message, ack: false)
} }
private func createPacketString() -> String {
let str: String
if type == PacketType.Event || type == PacketType.BinaryEvent {
str = createMessageForEvent()
} else {
str = createAck()
}
return str
}
mutating func fillInPlaceholders() { mutating func fillInPlaceholders() {
let newArr = NSMutableArray(array: data) let newArr = NSMutableArray(array: data)
@ -255,17 +269,9 @@ extension SocketPacket {
} }
} }
static func packetFromEmitWithData(data: [AnyObject], id: Int, nsp: String) -> SocketPacket { static func packetFromEmit(items: [AnyObject], id: Int, nsp: String, ack: Bool) -> SocketPacket {
let (parsedData, binary) = deconstructData(data) let (parsedData, binary) = deconstructData(items)
let packet = SocketPacket(type: findType(binary.count, ack: false), data: parsedData, let packet = SocketPacket(type: findType(binary.count, ack: ack), data: parsedData,
id: id, nsp: nsp, placeholders: -1, binary: binary)
return packet
}
static func packetFromEmitAckWithData(data: [AnyObject], id: Int, nsp: String) -> SocketPacket {
let (parsedData, binary) = deconstructData(data)
let packet = SocketPacket(type: findType(binary.count, ack: true), data: parsedData,
id: id, nsp: nsp, placeholders: -1, binary: binary) id: id, nsp: nsp, placeholders: -1, binary: binary)
return packet return packet