diff --git a/SocketIO-iOSTests/AbstractSocketTest.swift b/SocketIO-iOSTests/AbstractSocketTest.swift index 62c6e7a..1fd61c2 100644 --- a/SocketIO-iOSTests/AbstractSocketTest.swift +++ b/SocketIO-iOSTests/AbstractSocketTest.swift @@ -9,7 +9,8 @@ import XCTest class AbstractSocketTest: XCTestCase { - static let serverURL = "milkbartube.com:6979" + static let testLocal = false + static let serverURL = AbstractSocketTest.testLocal ? "localhost:6979" : "milkbartube.com:6979" static let TEST_TIMEOUT = 8.0 static var socket:SocketIOClient! var testKind:TestKind? @@ -22,6 +23,7 @@ class AbstractSocketTest: XCTestCase { XCTAssertTrue(AbstractSocketTest.socket.status == SocketIOClientStatus.NotConnected) AbstractSocketTest.socket.on("connect") {data, ack in XCTAssertEqual(AbstractSocketTest.socket.status, SocketIOClientStatus.Connected) + XCTAssertFalse(AbstractSocketTest.socket.secure) if let expection = expection { expection.fulfill() } diff --git a/SocketIO-iOSTests/SocketAcknowledgementTest.swift b/SocketIO-iOSTests/SocketAcknowledgementTest.swift index 045d32e..0f1f425 100644 --- a/SocketIO-iOSTests/SocketAcknowledgementTest.swift +++ b/SocketIO-iOSTests/SocketAcknowledgementTest.swift @@ -21,6 +21,8 @@ class SocketAcknowledgementTest: AbstractSocketTest { "forcePolling": false, "forceWebsockets": false,// default false "path": ""]) + }else { + AbstractSocketTest.socket.leaveNamespace() } openConnection() diff --git a/SocketIO-iOSTests/SocketEmitTest.swift b/SocketIO-iOSTests/SocketEmitTest.swift index 958f241..5e58491 100644 --- a/SocketIO-iOSTests/SocketEmitTest.swift +++ b/SocketIO-iOSTests/SocketEmitTest.swift @@ -22,6 +22,8 @@ class SocketEmitTest: AbstractSocketTest { "forceWebsockets": false,// default false "path": ""] ) + }else { + AbstractSocketTest.socket.leaveNamespace() } openConnection() diff --git a/SocketIO-iOSTests/SocketNamespaceAcknowledgementTest.swift b/SocketIO-iOSTests/SocketNamespaceAcknowledgementTest.swift index a7ae5b9..a0604f3 100644 --- a/SocketIO-iOSTests/SocketNamespaceAcknowledgementTest.swift +++ b/SocketIO-iOSTests/SocketNamespaceAcknowledgementTest.swift @@ -22,6 +22,8 @@ class SocketNamespaceAcknowledgementTest: AbstractSocketTest { "forceWebsockets": false,// default false "path": "", "nsp": "/swift"]) + }else { + AbstractSocketTest.socket.joinNamespace("/swift") } openConnection() diff --git a/SocketIO-iOSTests/SocketNamespaceEmitTest.swift b/SocketIO-iOSTests/SocketNamespaceEmitTest.swift index cac2fe9..e02ede3 100644 --- a/SocketIO-iOSTests/SocketNamespaceEmitTest.swift +++ b/SocketIO-iOSTests/SocketNamespaceEmitTest.swift @@ -22,6 +22,8 @@ class SocketNamespaceEmitTest: AbstractSocketTest { "forceWebsockets": false,// default false "path": "", "nsp": "/swift"]) + }else { + AbstractSocketTest.socket.joinNamespace("/swift") } openConnection() diff --git a/SocketIOClientSwift/SocketEngine.swift b/SocketIOClientSwift/SocketEngine.swift index bd32394..bf0c70d 100644 --- a/SocketIOClientSwift/SocketEngine.swift +++ b/SocketIOClientSwift/SocketEngine.swift @@ -24,18 +24,17 @@ import Foundation -public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { - public let logType = "SocketEngine" - +public final class SocketEngine: NSObject, WebSocketDelegate { private typealias Probe = (msg: String, type: PacketType, data: [NSData]?) private typealias ProbeWaitQueue = [Probe] private let allowedCharacterSet = NSCharacterSet(charactersInString: "!*'();:@&=+$,/?%#[]\" {}").invertedSet - private let workQueue = NSOperationQueue() private let emitQueue = dispatch_queue_create("engineEmitQueue", DISPATCH_QUEUE_SERIAL) - private let parseQueue = dispatch_queue_create("engineParseQueue", DISPATCH_QUEUE_SERIAL) private let handleQueue = dispatch_queue_create("engineHandleQueue", DISPATCH_QUEUE_SERIAL) + private let logType = "SocketEngine" + private let parseQueue = dispatch_queue_create("engineParseQueue", DISPATCH_QUEUE_SERIAL) private let session: NSURLSession! + private let workQueue = NSOperationQueue() private var closed = false private var extraHeaders: [String: String]? @@ -98,11 +97,11 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } deinit { - Logger.log("Engine is being deinit", client: self, altType: nil) + Logger.log("Engine is being deinit", type: logType) } public func close(fast fast: Bool) { - Logger.log("Engine is being closed. Fast: %@", client: self, altType: nil, args: fast) + Logger.log("Engine is being closed. Fast: %@", type: logType, args: fast) pingTimer?.invalidate() closed = true @@ -199,8 +198,8 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { private func doFastUpgrade() { if waitingForPoll { - Logger.err("Outstanding poll when switched to WebSockets," + - "we'll probably disconnect soon. You should report this.", client: self, altType: nil) + Logger.error("Outstanding poll when switched to WebSockets," + + "we'll probably disconnect soon. You should report this.", type: logType) } sendWebSocketMessage("", withType: PacketType.Upgrade, datas: nil) @@ -240,7 +239,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { req.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalAndRemoteCacheData - Logger.log("Doing polling request", client: self, altType: nil) + Logger.log("Doing polling request", type: logType) session.dataTaskWithRequest(req) {[weak self] data, res, err in if let this = self { @@ -248,12 +247,12 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { if this.polling { this.handlePollingFailed(err?.localizedDescription ?? "Error") } else { - Logger.err(err?.localizedDescription ?? "Error", client: this, altType: nil) + Logger.error(err?.localizedDescription ?? "Error", type: this.logType) } return } - Logger.log("Got polling response", client: this, altType: nil) + Logger.log("Got polling response", type: this.logType) if let str = NSString(data: data!, encoding: NSUTF8StringEncoding) as? String { dispatch_async(this.parseQueue) {[weak this] in @@ -272,7 +271,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } private func flushProbeWait() { - Logger.log("Flushing probe wait", client: self, altType: nil) + Logger.log("Flushing probe wait", type: logType) dispatch_async(emitQueue) {[weak self] in if let this = self { @@ -325,7 +324,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { waitingForPost = true - Logger.log("POSTing: %@", client: self, altType: nil, args: postStr) + Logger.log("POSTing: %@", type: logType, args: postStr) session.dataTaskWithRequest(req) {[weak self] data, res, err in if let this = self { @@ -412,7 +411,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } } } catch { - Logger.err("Error parsing open packet", client: self, altType: nil) + Logger.error("Error parsing open packet", type: logType) return } @@ -448,14 +447,14 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { public func open(opts: [String: AnyObject]? = nil) { if connected { - Logger.err("Tried to open while connected", client: self, altType: nil) + Logger.error("Tried to open while connected", type: logType) client?.didError("Tried to open while connected") return } - Logger.log("Starting engine", client: self, altType: nil) - Logger.log("Handshaking", client: self, altType: nil) + Logger.log("Starting engine", type: logType) + Logger.log("Handshaking", type: logType) closed = false @@ -512,7 +511,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { length += chr } else { if length == "" || testLength(length, n: &n) { - Logger.err("Parsing error: %@", client: self, altType: nil, args: str) + Logger.error("Parsing error: %@", type: logType, args: str) handlePollingFailed("Error parsing XHR message") return } @@ -520,7 +519,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { msg = String(strArray[i+1...i+n]) if let lengthInt = Int(length) where lengthInt != msg.characters.count { - Logger.err("Parsing error: %@", client: self, altType: nil, args: str) + Logger.error("Parsing error: %@", type: logType, args: str) return } @@ -542,7 +541,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } private func parseEngineMessage(var message: String, fromPolling: Bool) { - Logger.log("Got message: %@", client: self, altType: nil, args: message) + Logger.log("Got message: %@", type: logType, args: message) if fromPolling { fixDoubleUTF8(&message) @@ -567,7 +566,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { case PacketType.Close: handleClose() default: - Logger.log("Got unknown packet type", client: self, altType: nil) + Logger.log("Got unknown packet type", type: logType) } } @@ -602,7 +601,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { /// Only call on emitQueue private func sendPollMessage(var msg: String, withType type: PacketType, datas:[NSData]? = nil) { - Logger.log("Sending poll: %@ as type: %@", client: self, altType: nil, args: msg, type.rawValue) + Logger.log("Sending poll: %@ as type: %@", type: logType, args: msg, type.rawValue) doubleEncodeUTF8(&msg) let strMsg = "\(type.rawValue)\(msg)" @@ -626,7 +625,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { /// Only call on emitQueue private func sendWebSocketMessage(str: String, withType type: PacketType, datas:[NSData]? = nil) { - Logger.log("Sending ws: %@ as type: %@", client: self, altType: nil, args: str, type.rawValue) + Logger.log("Sending ws: %@ as type: %@", type: logType, args: str, type.rawValue) ws?.writeString("\(type.rawValue)\(str)") @@ -661,7 +660,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { private func upgradeTransport() { if websocketConnected { - Logger.log("Upgrading transport to WebSockets", client: self, altType: nil) + Logger.log("Upgrading transport to WebSockets", type: logType) fastUpgrade = true sendPollMessage("", withType: PacketType.Noop) @@ -676,12 +675,12 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { dispatch_async(emitQueue) {[weak self] in if let this = self where this.connected { if this.websocket { - Logger.log("Writing ws: %@ has data: %@", client: this, altType: nil, - args: msg, data == nil ? false : true) + Logger.log("Writing ws: %@ has data: %@", type: this.logType, args: msg, + data == nil ? false : true) this.sendWebSocketMessage(msg, withType: type, datas: data) } else { - Logger.log("Writing poll: %@ has data: %@", client: this, altType: nil, - args: msg, data == nil ? false : true) + Logger.log("Writing poll: %@ has data: %@", type: this.logType, args: msg, + data == nil ? false : true) this.sendPollMessage(msg, withType: type, datas: data) } } diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index 40964bf..0a1d8bf 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -24,21 +24,9 @@ import Foundation -public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient { - private var anyHandler: ((SocketAnyEvent) -> Void)? - private var currentReconnectAttempt = 0 - private var handlers = ContiguousArray() - private var connectParams: [String: AnyObject]? - private var reconnectTimer: NSTimer? - - let reconnectAttempts: Int! - var ackHandlers = SocketAckManager() - var currentAck = -1 - var waitingData = [SocketPacket]() - +public final class SocketIOClient: NSObject, SocketEngineClient { public let emitQueue = dispatch_queue_create("emitQueue", DISPATCH_QUEUE_SERIAL) public let handleQueue: dispatch_queue_t! - public let logType = "SocketClient" public let socketURL: String public private(set) var engine: SocketEngine? @@ -53,6 +41,19 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient return engine?.sid } + private let logType = "SocketIOClient" + + private var anyHandler: ((SocketAnyEvent) -> Void)? + private var currentReconnectAttempt = 0 + private var handlers = ContiguousArray() + private var connectParams: [String: AnyObject]? + private var reconnectTimer: NSTimer? + + let reconnectAttempts: Int! + var ackHandlers = SocketAckManager() + var currentAck = -1 + var waitingData = [SocketPacket]() + /** Create a new SocketIOClient. opts can be omitted */ @@ -107,12 +108,12 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient } deinit { - Logger.log("Client is being deinit", client: self, altType: nil) + Logger.log("Client is being deinit", type: logType) engine?.close(fast: true) } private func addEngine() { - Logger.log("Adding engine", client: self, altType: nil) + Logger.log("Adding engine", type: logType) engine = SocketEngine(client: self, opts: opts) } @@ -128,7 +129,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient Pass true to fast if you're closing from a background task */ public func close(fast fast: Bool) { - Logger.log("Closing socket", client: self, altType: nil) + Logger.log("Closing socket", type: logType) reconnects = false status = SocketIOClientStatus.Closed @@ -152,7 +153,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient } if status == SocketIOClientStatus.Closed { Logger.log("Warning! This socket was previously closed. This might be dangerous!", - client: self, altType: nil) + type: logType) } status = SocketIOClientStatus.Connecting @@ -196,7 +197,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient } func didConnect() { - Logger.log("Socket connected", client: self, altType: nil) + Logger.log("Socket connected", type: logType) status = SocketIOClientStatus.Connected currentReconnectAttempt = 0 clearReconnectTimer() @@ -211,7 +212,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient return } - Logger.log("Disconnected: %@", client: self, altType: nil, args: reason) + Logger.log("Disconnected: %@", type: logType, args: reason) status = SocketIOClientStatus.Closed @@ -224,7 +225,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient /// error public func didError(reason: AnyObject) { - Logger.err("%@", client: self, altType: nil, args: reason) + Logger.error("%@", type: logType, args: reason) handleEvent("error", data: reason as? [AnyObject] ?? [reason], isInternalMessage: true) @@ -280,7 +281,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient let packet = SocketPacket.packetFromEmit(data, id: ack ?? -1, nsp: nsp, ack: false) let str = packet.packetString - Logger.log("Emitting: %@", client: self, altType: nil, args: str) + Logger.log("Emitting: %@", type: logType, args: str) if packet.type == SocketPacket.PacketType.BinaryEvent { engine?.send(str, withData: packet.binary) @@ -296,7 +297,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient let packet = SocketPacket.packetFromEmit(items, id: ack ?? -1, nsp: this.nsp, ack: true) let str = packet.packetString - Logger.log("Emitting Ack: %@", client: this, altType: nil, args: str) + Logger.log("Emitting Ack: %@", type: this.logType, args: str) if packet.type == SocketPacket.PacketType.BinaryAck { this.engine?.send(str, withData: packet.binary) @@ -322,8 +323,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient // Called when the socket gets an ack for something it sent func handleAck(ack: Int, data: AnyObject?) { - Logger.log("Handling ack: %@ with data: %@", client: self, - altType: nil, args: ack, data ?? "") + Logger.log("Handling ack: %@ with data: %@", type: logType, args: ack, data ?? "") ackHandlers.executeAck(ack, items: (data as? [AnyObject]?) ?? (data != nil ? [data!] : nil)) @@ -339,8 +339,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient } // println("Should do event: \(event) with data: \(data)") - Logger.log("Handling event: %@ with data: %@", client: self, - altType: nil, args: event, data ?? "") + Logger.log("Handling event: %@ with data: %@", type: logType, args: event, data ?? "") if anyHandler != nil { dispatch_async(handleQueue) {[weak self] in @@ -375,7 +374,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient Joins nsp if it is not / */ public func joinNamespace() { - Logger.log("Joining namespace", client: self, altType: nil) + Logger.log("Joining namespace", type: logType) if nsp != "/" { engine?.send("0\(nsp)", withData: nil) @@ -394,7 +393,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient Removes handler(s) */ public func off(event: String) { - Logger.log("Removing handler for event: %@", client: self, altType: nil, args: event) + Logger.log("Removing handler for event: %@", type: logType, args: event) handlers = ContiguousArray(handlers.filter {!($0.event == event)}) } @@ -403,7 +402,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient Adds a handler for an event. */ public func on(event: String, callback: NormalCallback) { - Logger.log("Adding handler for event: %@", client: self, altType: nil, args: event) + Logger.log("Adding handler for event: %@", type: logType, args: event) let handler = SocketEventHandler(event: event, callback: callback) handlers.append(handler) @@ -413,7 +412,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient Adds a handler for an event. */ public func onObjectiveC(event: String, callback: NormalCallbackObjectiveC) { - Logger.log("Adding handler for event: %@", client: self, altType: nil, args: event) + Logger.log("Adding handler for event: %@", type: logType, args: event) let handler = SocketEventHandler(event: event, callback: callback) handlers.append(handler) @@ -467,7 +466,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient private func tryReconnect() { if reconnectTimer == nil { - Logger.log("Starting reconnect", client: self, altType: nil) + Logger.log("Starting reconnect", type: logType) status = SocketIOClientStatus.Reconnecting @@ -495,7 +494,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient return } - Logger.log("Trying to reconnect", client: self, altType: nil) + Logger.log("Trying to reconnect", type: logType) handleEvent("reconnectAttempt", data: [reconnectAttempts - currentReconnectAttempt], isInternalMessage: true) diff --git a/SocketIOClientSwift/SocketIOClientStatus.swift b/SocketIOClientSwift/SocketIOClientStatus.swift index 0dfac8a..db9f959 100644 --- a/SocketIOClientSwift/SocketIOClientStatus.swift +++ b/SocketIOClientSwift/SocketIOClientStatus.swift @@ -26,24 +26,18 @@ import Foundation @objc public enum SocketIOClientStatus: Int, CustomStringConvertible { public var description: String { - let des: String - - switch rawValue { - case 0: - des = "Not Connected" - case 1: - des = "Closed" - case 2: - des = "Connecting" - case 3: - des = "Connected" - case 4: - des = "Reconnecting" - default: - des = "Unknown State" + switch self { + case NotConnected: + return "Not Connected" + case Closed: + return "Closed" + case Connecting: + return "Connecting" + case Connected: + return "Connected" + case Reconnecting: + return "Reconnecting" } - - return des } case NotConnected, Closed, Connecting, Connected, Reconnecting diff --git a/SocketIOClientSwift/SocketLogger.swift b/SocketIOClientSwift/SocketLogger.swift index af2cfe8..b31a894 100644 --- a/SocketIOClientSwift/SocketLogger.swift +++ b/SocketIOClientSwift/SocketLogger.swift @@ -26,43 +26,34 @@ import Foundation var Logger: SocketLogger = DefaultSocketLogger() -public protocol SocketLogClient { - /// The type of object being logged - var logType: String {get} -} - public protocol SocketLogger { /// Whether to log or not var log: Bool {get set} /// Normal log messages - func log(message: String, client: SocketLogClient, altType: String?, args: AnyObject...) + func log(message: String, type: String, args: AnyObject...) /// Error Messages - func err(message: String, client: SocketLogClient, altType: String?, args: AnyObject...) + func error(message: String, type: String, args: AnyObject...) } public extension SocketLogger { - func log(message: String, client: SocketLogClient, altType: String?, args: AnyObject...) { - if !log { - return - } - - let newArgs = args.map {arg -> CVarArgType in String(arg)} - let replaced = String(format: message, arguments: newArgs) - - NSLog("%@: %@", altType ?? client.logType, replaced) + func log(message: String, type: String, args: AnyObject...) { + abstractLog("Log", message: message, type: type, args: args) } - func err(message: String, client: SocketLogClient, altType: String?, args: AnyObject...) { - if !log { - return - } + func error(message: String, type: String, args: AnyObject...) { + abstractLog("ERROR", message: message, type: type, args: args) + + } + + private func abstractLog(logType: String, message: String, type: String, args: [AnyObject]) { + guard log else { return } let newArgs = args.map {arg -> CVarArgType in String(arg)} let replaced = String(format: message, arguments: newArgs) - NSLog("ERROR %@: %@", altType ?? client.logType, replaced) + NSLog("%@ %@: %@", logType, type, replaced) } } diff --git a/SocketIOClientSwift/SocketParser.swift b/SocketIOClientSwift/SocketParser.swift index a3d97c7..d7086e8 100644 --- a/SocketIOClientSwift/SocketParser.swift +++ b/SocketIOClientSwift/SocketParser.swift @@ -168,14 +168,14 @@ class SocketParser { static func parseSocketMessage(stringMessage: String, socket: SocketIOClient) { guard !stringMessage.isEmpty else { return } - Logger.log("Parsing %@", client: socket, altType: "SocketParser", args: stringMessage) + Logger.log("Parsing %@", type: "SocketParser", args: stringMessage) guard let pack = parseString(stringMessage) else { socket.didError("Error parsing packet") return } - Logger.log("Decoded packet as: %@", client: socket, altType: "SocketParser", args: pack.description) + Logger.log("Decoded packet as: %@", type: "SocketParser", args: pack.description) switch pack.type { case .Event: @@ -197,7 +197,7 @@ class SocketParser { static func parseBinaryData(data: NSData, socket: SocketIOClient) { if socket.waitingData.count == 0 { - Logger.err("Got data when not remaking packet", client: socket, altType: "SocketParser") + Logger.error("Got data when not remaking packet", type: "SocketParser") return }