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?)
(items: AnyObject...) -> Void {
socket?.emitAck(num ?? -1, withData: items)
socket?.emitAck(num ?? -1, withItems: items)
}
private func emitAckCallbackObjectiveC(socket: SocketIOClient?, num: Int?)
(items: NSArray) -> Void {
socket?.emitAck(num ?? -1, withData: items as [AnyObject])
socket?.emitAck(num ?? -1, withItems: items as [AnyObject])
}
struct SocketEventHandler {

View File

@ -38,14 +38,14 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
var log = false
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 handleQueue: dispatch_queue_t!
public let socketURL: String
public private(set) var engine: SocketEngine?
public private(set) var secure = false
public private(set) var status = SocketIOClientStatus.NotConnected
public var engine:SocketEngine?
public var nsp = "/"
public var opts: [String: AnyObject]?
public var reconnects = true
@ -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
if let this = self {
this.ackHandlers.addAck(ack, callback: callback)
dispatch_async(this.emitQueue) {[weak this] in
this?._emit(event, items, ack: ack)
this?._emit(items, ack: ack)
}
if timeout != 0 {
@ -249,7 +249,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
}
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.
*/
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
*/
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 {
return
}
let packet = SocketPacket.packetFromEmitWithData(args, id: ack ?? -1, nsp: nsp)
let str = packet.createMessageForEvent(event)
let packet = SocketPacket.packetFromEmit(data, id: ack ?? -1, nsp: nsp, ack: false)
let str = packet.packetString
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
func emitAck(ack: Int, withData args: [AnyObject]) {
func emitAck(ack: Int, withItems items: [AnyObject]) {
dispatch_async(emitQueue) {[weak self] in
if let this = self where this.status == SocketIOClientStatus.Connected {
let packet = SocketPacket.packetFromEmitAckWithData(args, id: ack ?? -1, nsp: this.nsp)
let str = packet.createAck()
let packet = SocketPacket.packetFromEmit(items, id: ack ?? -1, nsp: this.nsp, ack: true)
let str = packet.packetString
SocketLogger.log("Emitting Ack: %@", client: this, args: str)

View File

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