diff --git a/README.md b/README.md index 03364ff..27fbc41 100644 --- a/README.md +++ b/README.md @@ -112,13 +112,13 @@ Import the module: Swift: ```swift -import Socket_IO_Client_Swift +import SocketIOClientSwift ``` Objective-C: ```Objective-C -#import +#import ``` CocoaSeeds diff --git a/Socket.IO-Client-Swift.podspec b/Socket.IO-Client-Swift.podspec index 8e59980..9f5cd7b 100644 --- a/Socket.IO-Client-Swift.podspec +++ b/Socket.IO-Client-Swift.podspec @@ -1,11 +1,12 @@ Pod::Spec.new do |s| s.name = "Socket.IO-Client-Swift" + s.module_name = "SocketIOClientSwift" s.version = "5.1.0" s.summary = "Socket.IO-client for iOS and OS X" s.description = <<-DESC Socket.IO-client for iOS and OS X. Supports ws/wss/polling connections and binary. - For socket.io 1.0+ and Swift 1.2. + For socket.io 1.0+ and Swift. DESC s.homepage = "https://github.com/socketio/socket.io-client-swift" s.license = { :type => 'MIT' } diff --git a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj index f19e020..88aa8d7 100644 --- a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj +++ b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj @@ -8,9 +8,9 @@ /* Begin PBXBuildFile section */ 572EF21F1B51F16C00EEBB58 /* SocketIO-iOS.h in Headers */ = {isa = PBXBuildFile; fileRef = 572EF21E1B51F16C00EEBB58 /* SocketIO-iOS.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 572EF2251B51F16C00EEBB58 /* SocketIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 572EF2191B51F16C00EEBB58 /* SocketIO.framework */; }; + 572EF2251B51F16C00EEBB58 /* SocketIOClientSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 572EF2191B51F16C00EEBB58 /* SocketIOClientSwift.framework */; }; 572EF23D1B51F18A00EEBB58 /* SocketIO-Mac.h in Headers */ = {isa = PBXBuildFile; fileRef = 572EF23C1B51F18A00EEBB58 /* SocketIO-Mac.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 572EF2431B51F18A00EEBB58 /* SocketIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 572EF2381B51F18A00EEBB58 /* SocketIO.framework */; }; + 572EF2431B51F18A00EEBB58 /* SocketIOClientSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 572EF2381B51F18A00EEBB58 /* SocketIOClientSwift.framework */; }; 57634A111BD9B46A00E19CD7 /* SocketIO-iOS.h in Headers */ = {isa = PBXBuildFile; fileRef = 572EF21E1B51F16C00EEBB58 /* SocketIO-iOS.h */; settings = {ATTRIBUTES = (Public, ); }; }; 57634A231BD9B46D00E19CD7 /* SocketSideEffectTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7472C65E1BCAC46E003CA70D /* SocketSideEffectTest.swift */; }; 57634A2A1BD9B46D00E19CD7 /* SocketEngineTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 741F39ED1BD025D80026C9CC /* SocketEngineTest.swift */; }; @@ -159,12 +159,12 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 572EF2191B51F16C00EEBB58 /* SocketIO.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SocketIO.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 572EF2191B51F16C00EEBB58 /* SocketIOClientSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SocketIOClientSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 572EF21D1B51F16C00EEBB58 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 572EF21E1B51F16C00EEBB58 /* SocketIO-iOS.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SocketIO-iOS.h"; sourceTree = ""; }; 572EF2241B51F16C00EEBB58 /* SocketIO-iOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "SocketIO-iOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 572EF22A1B51F16C00EEBB58 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 572EF2381B51F18A00EEBB58 /* SocketIO.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SocketIO.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 572EF2381B51F18A00EEBB58 /* SocketIOClientSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SocketIOClientSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 572EF23B1B51F18A00EEBB58 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 572EF23C1B51F18A00EEBB58 /* SocketIO-Mac.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SocketIO-Mac.h"; sourceTree = ""; }; 572EF2421B51F18A00EEBB58 /* SocketIO-MacTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "SocketIO-MacTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -213,7 +213,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 572EF2251B51F16C00EEBB58 /* SocketIO.framework in Frameworks */, + 572EF2251B51F16C00EEBB58 /* SocketIOClientSwift.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -228,7 +228,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 572EF2431B51F18A00EEBB58 /* SocketIO.framework in Frameworks */, + 572EF2431B51F18A00EEBB58 /* SocketIOClientSwift.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -265,9 +265,9 @@ 572EF21A1B51F16C00EEBB58 /* Products */ = { isa = PBXGroup; children = ( - 572EF2191B51F16C00EEBB58 /* SocketIO.framework */, + 572EF2191B51F16C00EEBB58 /* SocketIOClientSwift.framework */, 572EF2241B51F16C00EEBB58 /* SocketIO-iOSTests.xctest */, - 572EF2381B51F18A00EEBB58 /* SocketIO.framework */, + 572EF2381B51F18A00EEBB58 /* SocketIOClientSwift.framework */, 572EF2421B51F18A00EEBB58 /* SocketIO-MacTests.xctest */, 57634A161BD9B46A00E19CD7 /* SocketIO.framework */, 57634A3B1BD9B46D00E19CD7 /* SocketIO-tvOSTests.xctest */, @@ -421,7 +421,7 @@ ); name = "SocketIO-iOS"; productName = "SocketIO-iOS"; - productReference = 572EF2191B51F16C00EEBB58 /* SocketIO.framework */; + productReference = 572EF2191B51F16C00EEBB58 /* SocketIOClientSwift.framework */; productType = "com.apple.product-type.framework"; }; 572EF2231B51F16C00EEBB58 /* SocketIO-iOSTests */ = { @@ -457,7 +457,7 @@ ); name = "SocketIO-Mac"; productName = "SocketIO-Mac"; - productReference = 572EF2381B51F18A00EEBB58 /* SocketIO.framework */; + productReference = 572EF2381B51F18A00EEBB58 /* SocketIOClientSwift.framework */; productType = "com.apple.product-type.framework"; }; 572EF2411B51F18A00EEBB58 /* SocketIO-MacTests */ = { @@ -798,7 +798,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 8.0; MACOSX_DEPLOYMENT_TARGET = 10.10; ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = SocketIO; + PRODUCT_NAME = SocketIOClientSwift; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; TVOS_DEPLOYMENT_TARGET = 9.0; WATCHOS_DEPLOYMENT_TARGET = 2.0; @@ -813,7 +813,7 @@ ENABLE_BITCODE = YES; IPHONEOS_DEPLOYMENT_TARGET = 8.0; MACOSX_DEPLOYMENT_TARGET = 10.10; - PRODUCT_NAME = SocketIO; + PRODUCT_NAME = SocketIOClientSwift; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; TVOS_DEPLOYMENT_TARGET = 9.0; WATCHOS_DEPLOYMENT_TARGET = 2.0; @@ -866,7 +866,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; - PRODUCT_BUNDLE_IDENTIFIER = "io.socket.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_BUNDLE_IDENTIFIER = io.socket.SocketIOClientSwift; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -916,7 +916,7 @@ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_BUNDLE_IDENTIFIER = "io.socket.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_BUNDLE_IDENTIFIER = io.socket.SocketIOClientSwift; SDKROOT = iphoneos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; diff --git a/Socket.IO-Client-Swift.xcodeproj/xcshareddata/xcschemes/SocketIO-Mac.xcscheme b/Socket.IO-Client-Swift.xcodeproj/xcshareddata/xcschemes/SocketIO-Mac.xcscheme index 7fef4ce..64047b1 100644 --- a/Socket.IO-Client-Swift.xcodeproj/xcshareddata/xcschemes/SocketIO-Mac.xcscheme +++ b/Socket.IO-Client-Swift.xcodeproj/xcshareddata/xcschemes/SocketIO-Mac.xcscheme @@ -15,7 +15,7 @@ @@ -57,7 +57,7 @@ @@ -79,7 +79,7 @@ @@ -97,7 +97,7 @@ diff --git a/Socket.IO-Client-Swift.xcodeproj/xcshareddata/xcschemes/SocketIO-iOS.xcscheme b/Socket.IO-Client-Swift.xcodeproj/xcshareddata/xcschemes/SocketIO-iOS.xcscheme index fc2fa75..e57f397 100644 --- a/Socket.IO-Client-Swift.xcodeproj/xcshareddata/xcschemes/SocketIO-iOS.xcscheme +++ b/Socket.IO-Client-Swift.xcodeproj/xcshareddata/xcschemes/SocketIO-iOS.xcscheme @@ -15,7 +15,7 @@ @@ -58,7 +58,7 @@ @@ -80,7 +80,7 @@ @@ -98,7 +98,7 @@ diff --git a/SocketIO-MacTests/SocketAckManagerTest.swift b/SocketIO-MacTests/SocketAckManagerTest.swift index 768bb9a..67315ac 100644 --- a/SocketIO-MacTests/SocketAckManagerTest.swift +++ b/SocketIO-MacTests/SocketAckManagerTest.swift @@ -7,7 +7,7 @@ // import XCTest -@testable import SocketIO +@testable import SocketIOClientSwift class SocketAckManagerTest: XCTestCase { var ackManager = SocketAckManager() diff --git a/SocketIO-MacTests/SocketBasicPacketTest.swift b/SocketIO-MacTests/SocketBasicPacketTest.swift index 7257075..23d88df 100644 --- a/SocketIO-MacTests/SocketBasicPacketTest.swift +++ b/SocketIO-MacTests/SocketBasicPacketTest.swift @@ -7,7 +7,7 @@ // import XCTest -@testable import SocketIO +@testable import SocketIOClientSwift class SocketBasicPacketTest: XCTestCase { let data = "test".dataUsingEncoding(NSUTF8StringEncoding)! diff --git a/SocketIO-MacTests/SocketEngineTest.swift b/SocketIO-MacTests/SocketEngineTest.swift index 90a4c22..4572a0f 100644 --- a/SocketIO-MacTests/SocketEngineTest.swift +++ b/SocketIO-MacTests/SocketEngineTest.swift @@ -7,7 +7,7 @@ // import XCTest -@testable import SocketIO +@testable import SocketIOClientSwift class SocketEngineTest: XCTestCase { var client: SocketIOClient! diff --git a/SocketIO-MacTests/SocketNamespacePacketTest.swift b/SocketIO-MacTests/SocketNamespacePacketTest.swift index 431a62b..4a235ba 100644 --- a/SocketIO-MacTests/SocketNamespacePacketTest.swift +++ b/SocketIO-MacTests/SocketNamespacePacketTest.swift @@ -7,7 +7,7 @@ // import XCTest -@testable import SocketIO +@testable import SocketIOClientSwift class SocketNamespacePacketTest: XCTestCase { let data = "test".dataUsingEncoding(NSUTF8StringEncoding)! diff --git a/SocketIO-MacTests/SocketParserTest.swift b/SocketIO-MacTests/SocketParserTest.swift index 2428dd4..9c24913 100644 --- a/SocketIO-MacTests/SocketParserTest.swift +++ b/SocketIO-MacTests/SocketParserTest.swift @@ -7,7 +7,7 @@ // import XCTest -@testable import SocketIO +@testable import SocketIOClientSwift class SocketParserTest: XCTestCase { let testSocket = SocketIOClient(socketURL: "") diff --git a/SocketIO-MacTests/SocketSideEffectTest.swift b/SocketIO-MacTests/SocketSideEffectTest.swift index ba2d795..e703335 100644 --- a/SocketIO-MacTests/SocketSideEffectTest.swift +++ b/SocketIO-MacTests/SocketSideEffectTest.swift @@ -7,7 +7,7 @@ // import XCTest -@testable import SocketIO +@testable import SocketIOClientSwift class SocketSideEffectTest: XCTestCase { let data = "test".dataUsingEncoding(NSUTF8StringEncoding)! diff --git a/Source/SocketIOClient.swift b/Source/SocketIOClient.swift index d275d37..4f41ed2 100644 --- a/Source/SocketIOClient.swift +++ b/Source/SocketIOClient.swift @@ -26,10 +26,10 @@ import Foundation public final class SocketIOClient: NSObject, SocketEngineClient, SocketParsable { public let socketURL: String - + public private(set) var engine: SocketEngineSpec? public private(set) var status = SocketIOClientStatus.NotConnected - + public var connectParams: [String: AnyObject]? public var forceNew = false public var nsp = "/" @@ -39,35 +39,35 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketParsable public var sid: String? { return engine?.sid } - + private let emitQueue = dispatch_queue_create("com.socketio.emitQueue", DISPATCH_QUEUE_SERIAL) private let logType = "SocketIOClient" private let parseQueue = dispatch_queue_create("com.socketio.parseQueue", DISPATCH_QUEUE_SERIAL) - + private var anyHandler: ((SocketAnyEvent) -> Void)? private var currentReconnectAttempt = 0 private var handlers = [SocketEventHandler]() private var reconnectTimer: NSTimer? private var ackHandlers = SocketAckManager() - + private(set) var currentAck = -1 private(set) var handleQueue = dispatch_get_main_queue() private(set) var reconnectAttempts = -1 - + var waitingData = [SocketPacket]() - + /** Type safe way to create a new SocketIOClient. opts can be omitted */ public init(socketURL: String, options: Set = []) { self.options = options - + if socketURL["https://"].matches().count != 0 { self.options.insertIgnore(.Secure(true)) } - + self.socketURL = socketURL["https?://"] ~= "" - + for option in options { switch option { case let .ConnectParams(params): @@ -92,12 +92,12 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketParsable continue } } - + self.options.insertIgnore(.Path("/socket.io")) - + super.init() } - + /** Not so type safe way to create a SocketIOClient, meant for Objective-C compatiblity. If using Swift it's recommended to use `init(var socketURL: String, opts: SocketOptionsDictionary? = nil)` @@ -106,86 +106,85 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketParsable self.init(socketURL: socketURL, options: options?.toSocketOptionsSet() ?? []) } - + deinit { DefaultSocketLogger.Logger.log("Client is being deinit", type: logType) engine?.close("Client Deinit") } - + private func addEngine() -> SocketEngineSpec { DefaultSocketLogger.Logger.log("Adding engine", type: logType) - + engine = SocketEngine(client: self, url: socketURL, options: options) - + return engine! } - + private func clearReconnectTimer() { reconnectTimer?.invalidate() reconnectTimer = nil } - + @available(*, deprecated=6.0) public func close() { disconnect() } - + /** Connect to the server. */ public func connect() { connect(timeoutAfter: 0, withTimeoutHandler: nil) } - + /** Connect to the server. If we aren't connected after timeoutAfter, call handler */ - public func connect(timeoutAfter timeoutAfter: Int, - withTimeoutHandler handler: (() -> Void)?) { - assert(timeoutAfter >= 0, "Invalid timeout: \(timeoutAfter)") - - guard status != .Connected else { - DefaultSocketLogger.Logger.log("Tried connecting on an already connected socket", - type: logType) - return - } - - status = .Connecting - - if engine == nil || forceNew { - addEngine().open(connectParams) - } else { - engine?.open(connectParams) - } - - guard timeoutAfter != 0 else { return } - - let time = dispatch_time(DISPATCH_TIME_NOW, Int64(timeoutAfter) * Int64(NSEC_PER_SEC)) - - dispatch_after(time, handleQueue) {[weak self] in - if let this = self where this.status != .Connected { - this.status = .Closed - this.engine?.close("Connect timeout") - - handler?() - } + public func connect(timeoutAfter timeoutAfter: Int, withTimeoutHandler handler: (() -> Void)?) { + assert(timeoutAfter >= 0, "Invalid timeout: \(timeoutAfter)") + + guard status != .Connected else { + DefaultSocketLogger.Logger.log("Tried connecting on an already connected socket", + type: logType) + return + } + + status = .Connecting + + if engine == nil || forceNew { + addEngine().open(connectParams) + } else { + engine?.open(connectParams) + } + + guard timeoutAfter != 0 else { return } + + let time = dispatch_time(DISPATCH_TIME_NOW, Int64(timeoutAfter) * Int64(NSEC_PER_SEC)) + + dispatch_after(time, handleQueue) {[weak self] in + if let this = self where this.status != .Connected { + this.status = .Closed + this.engine?.close("Connect timeout") + + handler?() } + } } - + private func createOnAck(items: [AnyObject]) -> OnAckCallback { currentAck += 1 - + return {[weak self, ack = currentAck] timeout, callback in if let this = self { this.ackHandlers.addAck(ack, callback: callback) - + dispatch_async(this.emitQueue) { this._emit(items, ack: ack) } - + if timeout != 0 { let time = dispatch_time(DISPATCH_TIME_NOW, Int64(timeout * NSEC_PER_SEC)) - + dispatch_after(time, this.handleQueue) { this.ackHandlers.timeoutAck(ack) } @@ -193,51 +192,51 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketParsable } } } - + func didConnect() { DefaultSocketLogger.Logger.log("Socket connected", type: logType) status = .Connected currentReconnectAttempt = 0 clearReconnectTimer() - + // Don't handle as internal because something crazy could happen where // we disconnect before it's handled handleEvent("connect", data: [], isInternalMessage: false) } - + func didDisconnect(reason: String) { guard status != .Closed else { return } - + DefaultSocketLogger.Logger.log("Disconnected: %@", type: logType, args: reason) - + status = .Closed reconnects = false - + // Make sure the engine is actually dead. engine?.close("Client closed") handleEvent("disconnect", data: [reason], isInternalMessage: true) } - + /** Closes the socket. Only reopen the same socket if you know what you're doing. Will turn off automatic reconnects. */ public func disconnect() { DefaultSocketLogger.Logger.log("Closing socket", type: logType) - + reconnects = false didDisconnect("Closed") } - + /** Send a message to the server */ public func emit(event: String, _ items: AnyObject...) { emit(event, withItems: items) } - + /** Same as emit, but meant for Objective-C */ @@ -246,12 +245,12 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketParsable handleEvent("error", data: ["Tried emitting \(event) when not connected"], isInternalMessage: true) return } - + dispatch_async(emitQueue) { self._emit([event] + items) } } - + /** Sends a message to the server, requesting an ack. Use the onAck method of SocketAckHandler to add an ack. @@ -259,45 +258,45 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketParsable public func emitWithAck(event: String, _ items: AnyObject...) -> OnAckCallback { 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) } - + private func _emit(data: [AnyObject], ack: Int? = nil) { guard status == .Connected else { handleEvent("error", data: ["Tried emitting when not connected"], isInternalMessage: true) return } - + let packet = SocketPacket.packetFromEmit(data, id: ack ?? -1, nsp: nsp, ack: false) let str = packet.packetString - + DefaultSocketLogger.Logger.log("Emitting: %@", type: logType, args: str) - + engine?.send(str, withData: packet.binary) } - + // If the server wants to know that the client received data func emitAck(ack: Int, withItems items: [AnyObject]) { dispatch_async(emitQueue) { if self.status == .Connected { let packet = SocketPacket.packetFromEmit(items, id: ack ?? -1, nsp: self.nsp, ack: true) let str = packet.packetString - + DefaultSocketLogger.Logger.log("Emitting Ack: %@", type: self.logType, args: str) - + self.engine?.send(str, withData: packet.binary) } } } - + public func engineDidClose(reason: String) { waitingData.removeAll() - + if status == .Closed || !reconnects { didDisconnect(reason) } else if status != .Reconnecting { @@ -306,23 +305,23 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketParsable tryReconnect() } } - + /// error public func engineDidError(reason: String) { DefaultSocketLogger.Logger.error("%@", type: logType, args: reason) - + handleEvent("error", data: [reason], isInternalMessage: true) } - + // Called when the socket gets an ack for something it sent func handleAck(ack: Int, data: [AnyObject]) { guard status == .Connected else {return} - + DefaultSocketLogger.Logger.log("Handling ack: %@ with data: %@", type: logType, args: ack, data ?? "") - + ackHandlers.executeAck(ack, items: data) } - + /** Causes an event to be handled. Only use if you know what you're doing. */ @@ -330,18 +329,18 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketParsable guard status == .Connected || isInternalMessage else { return } - + DefaultSocketLogger.Logger.log("Handling event: %@ with data: %@", type: logType, args: event, data ?? "") - + dispatch_async(handleQueue) { self.anyHandler?(SocketAnyEvent(event: event, items: data)) - + for handler in self.handlers where handler.event == event { handler.executeCallback(data, withAck: ack, withSocket: self) } } } - + /** Leaves nsp and goes back to / */ @@ -351,104 +350,105 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketParsable nsp = "/" } } - + /** Joins namespace */ public func joinNamespace(namespace: String) { nsp = namespace - + if nsp != "/" { DefaultSocketLogger.Logger.log("Joining namespace", type: logType) engine?.send("0\(nsp)", withData: []) } } - + /** Removes handler(s) */ public func off(event: String) { DefaultSocketLogger.Logger.log("Removing handler for event: %@", type: logType, args: event) - + handlers = handlers.filter { $0.event != event } } - + /** Removes a handler with the specified UUID gotten from an `on` or `once` */ public func off(id id: NSUUID) { DefaultSocketLogger.Logger.log("Removing handler with id: %@", type: logType, args: id) - + handlers = handlers.filter { $0.id != id } } - + /** Adds a handler for an event. Returns: A unique id for the handler */ public func on(event: String, callback: NormalCallback) -> NSUUID { DefaultSocketLogger.Logger.log("Adding handler for event: %@", type: logType, args: event) - + let handler = SocketEventHandler(event: event, id: NSUUID(), callback: callback) handlers.append(handler) - + return handler.id } - + /** Adds a single-use handler for an event. Returns: A unique id for the handler */ public func once(event: String, callback: NormalCallback) -> NSUUID { DefaultSocketLogger.Logger.log("Adding once handler for event: %@", type: logType, args: event) - + let id = NSUUID() - + let handler = SocketEventHandler(event: event, id: id) {[weak self] data, ack in guard let this = self else {return} this.off(id: id) callback(data, ack) } - + handlers.append(handler) - + return handler.id } - + /** Adds a handler that will be called on every event. */ public func onAny(handler: (SocketAnyEvent) -> Void) { anyHandler = handler } - + /** Same as connect */ public func open() { connect() } - + public func parseEngineMessage(msg: String) { - DefaultSocketLogger.Logger.log("Should parse message", type: "SocketIOClient") + DefaultSocketLogger.Logger.log("Should parse message: %@", type: "SocketIOClient", args: msg) + dispatch_async(parseQueue) { self.parseSocketMessage(msg) } } - + public func parseEngineBinaryData(data: NSData) { dispatch_async(parseQueue) { self.parseBinaryData(data) } } - + /** Tries to reconnect to the server. */ public func reconnect() { tryReconnect() } - + /** Removes all handlers. Can be used after disconnecting to break any potential remaining retain cycles. @@ -456,38 +456,38 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketParsable public func removeAllHandlers() { handlers.removeAll(keepCapacity: false) } - + private func tryReconnect() { if reconnectTimer == nil { DefaultSocketLogger.Logger.log("Starting reconnect", type: logType) - + status = .Reconnecting - + dispatch_async(dispatch_get_main_queue()) { self.reconnectTimer = NSTimer.scheduledTimerWithTimeInterval(Double(self.reconnectWait), target: self, selector: "_tryReconnect", userInfo: nil, repeats: true) } } } - + @objc private func _tryReconnect() { if status == .Connected { clearReconnectTimer() - + return } - + if reconnectAttempts != -1 && currentReconnectAttempt + 1 > reconnectAttempts || !reconnects { clearReconnectTimer() didDisconnect("Reconnect Failed") - + return } - + DefaultSocketLogger.Logger.log("Trying to reconnect", type: logType) handleEvent("reconnectAttempt", data: [reconnectAttempts - currentReconnectAttempt], isInternalMessage: true) - + currentReconnectAttempt += 1 connect() } @@ -498,15 +498,15 @@ extension SocketIOClient { var testHandlers: [SocketEventHandler] { return handlers } - + func setTestable() { status = .Connected } - + func setTestEngine(engine: SocketEngineSpec?) { self.engine = engine } - + func emitTest(event: String, _ data: AnyObject...) { self._emit([event] + data) }