diff --git a/Source/SocketIOClient.swift b/Source/SocketIOClient.swift index d2b4b3a..1aba6c1 100644 --- a/Source/SocketIOClient.swift +++ b/Source/SocketIOClient.swift @@ -203,12 +203,12 @@ open class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineClient, So return OnAckCallback(ackNumber: currentAck, items: items, socket: self) } - func didConnect() { + func didConnect(toNamespace namespace: String) { DefaultSocketLogger.Logger.log("Socket connected", type: logType) status = .connected - handleClientEvent(.connect, data: []) + handleClientEvent(.connect, data: [namespace]) } func didDisconnect(reason: String) { diff --git a/Source/SocketIOClientSpec.swift b/Source/SocketIOClientSpec.swift index b4b99a1..eaf63af 100644 --- a/Source/SocketIOClientSpec.swift +++ b/Source/SocketIOClientSpec.swift @@ -29,7 +29,7 @@ protocol SocketIOClientSpec : class { var nsp: String { get set } var waitingPackets: [SocketPacket] { get set } - func didConnect() + func didConnect(toNamespace namespace: String) func didDisconnect(reason: String) func didError(reason: String) func handleAck(_ ack: Int, data: [Any]) diff --git a/Source/SocketParsable.swift b/Source/SocketParsable.swift index 5c698dc..6b31cc8 100644 --- a/Source/SocketParsable.swift +++ b/Source/SocketParsable.swift @@ -31,15 +31,15 @@ extension SocketParsable where Self: SocketIOClientSpec { private func isCorrectNamespace(_ nsp: String) -> Bool { return nsp == self.nsp } - + private func handleConnect(_ packetNamespace: String) { if packetNamespace == "/" && nsp != "/" { joinNamespace(nsp) } else { - didConnect() + didConnect(toNamespace: packetNamespace) } } - + private func handlePacket(_ pack: SocketPacket) { switch pack.type { case .event where isCorrectNamespace(pack.nsp): @@ -60,22 +60,22 @@ extension SocketParsable where Self: SocketIOClientSpec { DefaultSocketLogger.Logger.log("Got invalid packet: %@", type: "SocketParser", args: pack.description) } } - + /// Parses a messsage from the engine. Returning either a string error or a complete SocketPacket func parseString(_ message: String) -> Either { var reader = SocketStringReader(message: message) - + guard let type = Int(reader.read(count: 1)).flatMap({ SocketPacket.PacketType(rawValue: $0) }) else { return .left("Invalid packet type") } - + if !reader.hasNext { return .right(SocketPacket(type: type, nsp: "/")) } - + var namespace = "/" var placeholders = -1 - + if type == .binaryEvent || type == .binaryAck { if let holders = Int(reader.readUntilOccurence(of: "-")) { placeholders = holders @@ -83,17 +83,17 @@ extension SocketParsable where Self: SocketIOClientSpec { return .left("Invalid packet") } } - + if reader.currentCharacter == "/" { - namespace = reader.readUntilOccurence(of: ",") + namespace = reader.readUntilOccurence(of: ",") } - + if !reader.hasNext { return .right(SocketPacket(type: type, nsp: namespace, placeholders: placeholders)) } - + var idString = "" - + if type == .error { reader.advance(by: -1) } else { @@ -106,13 +106,13 @@ extension SocketParsable where Self: SocketIOClientSpec { } } } - + var dataArray = String(message.utf16[message.utf16.index(reader.currentIndex, offsetBy: 1).. Either { do { @@ -130,13 +130,13 @@ extension SocketParsable where Self: SocketIOClientSpec { return .left("Error parsing data for packet") } } - + // Parses messages recieved func parseSocketMessage(_ message: String) { guard !message.isEmpty else { return } - + DefaultSocketLogger.Logger.log("Parsing %@", type: "SocketParser", args: message) - + switch parseString(message) { case let .left(err): DefaultSocketLogger.Logger.error("\(err): %@", type: "SocketParser", args: message) @@ -145,18 +145,18 @@ extension SocketParsable where Self: SocketIOClientSpec { handlePacket(pack) } } - + func parseBinaryData(_ data: Data) { guard !waitingPackets.isEmpty else { DefaultSocketLogger.Logger.error("Got data when not remaking packet", type: "SocketParser") return } - + // Should execute event? guard waitingPackets[waitingPackets.count - 1].addData(data) else { return } - + let packet = waitingPackets.removeLast() - + if packet.type != .binaryAck { handleEvent(packet.event, data: packet.args, isInternalMessage: false, withAck: packet.id) } else {