diff --git a/Source/SocketPacket.swift b/Source/SocketPacket.swift index d88ef4c..9ea4656 100644 --- a/Source/SocketPacket.swift +++ b/Source/SocketPacket.swift @@ -29,15 +29,15 @@ struct SocketPacket { enum PacketType: Int { case connect, disconnect, event, ack, error, binaryEvent, binaryAck } - + private let placeholders: Int - + private static let logType = "SocketPacket" let nsp: String let id: Int let type: PacketType - + var binary: [Data] var data: [Any] var args: [Any] { @@ -47,20 +47,20 @@ struct SocketPacket { return data } } - + var description: String { return "SocketPacket {type: \(String(type.rawValue)); data: " + "\(String(describing: data)); id: \(id); placeholders: \(placeholders); nsp: \(nsp)}" } - + var event: String { return String(describing: data[0]) } - + var packetString: String { return createPacketString() } - + init(type: PacketType, data: [Any] = [Any](), id: Int = -1, nsp: String, placeholders: Int = 0, binary: [Data] = [Data]()) { self.data = data @@ -70,14 +70,14 @@ struct SocketPacket { self.placeholders = placeholders self.binary = binary } - + mutating func addData(_ data: Data) -> Bool { if placeholders == binary.count { return true } - + binary.append(data) - + if placeholders == binary.count { fillInPlaceholders() return true @@ -85,22 +85,19 @@ struct SocketPacket { return false } } - + private func completeMessage(_ message: String) -> String { - if data.count == 0 { - return message + "[]" - } - + guard data.count != 0 else { return message + "[]" } guard let jsonSend = try? data.toJSON(), let jsonString = String(data: jsonSend, encoding: .utf8) else { DefaultSocketLogger.Logger.error("Error creating JSON object in SocketPacket.completeMessage", type: SocketPacket.logType) - + return message + "[]" } - + return message + jsonString } - + private func createPacketString() -> String { let typeString = String(type.rawValue) // Binary count? @@ -109,17 +106,17 @@ struct SocketPacket { let nspString = binaryCountString + (nsp != "/" ? "\(nsp)," : "") // Ack number? let idString = nspString + (id != -1 ? String(id) : "") - + return completeMessage(idString) } - + // Called when we have all the binary data for a packet // calls _fillInPlaceholders, which replaces placeholders with the // corresponding binary private mutating func fillInPlaceholders() { data = data.map(_fillInPlaceholders) } - + // Helper method that looks for placeholders // If object is a collection it will recurse // Returns the object if it is not a placeholder or the corresponding @@ -132,9 +129,9 @@ struct SocketPacket { } else { return dict.reduce(JSON(), {cur, keyValue in var cur = cur - + cur[keyValue.0] = _fillInPlaceholders(keyValue.1) - + return cur }) } @@ -161,12 +158,12 @@ extension SocketPacket { return .error } } - + static func packetFromEmit(_ items: [Any], 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, binary: binary) - + return packet } } @@ -175,32 +172,32 @@ private extension SocketPacket { // Recursive function that looks for NSData in collections static func shred(_ data: Any, binary: inout [Data]) -> Any { let placeholder = ["_placeholder": true, "num": binary.count] as JSON - + switch data { case let bin as Data: binary.append(bin) - + return placeholder case let arr as [Any]: return arr.map({shred($0, binary: &binary)}) case let dict as JSON: return dict.reduce(JSON(), {cur, keyValue in var mutCur = cur - + mutCur[keyValue.0] = shred(keyValue.1, binary: &binary) - + return mutCur }) default: return data } } - + // Removes binary data from emit data // Returns a type containing the de-binaryed data and the binary static func deconstructData(_ data: [Any]) -> ([Any], [Data]) { var binary = [Data]() - + return (data.map({shred($0, binary: &binary)}), binary) } }