diff --git a/.swift-version b/.swift-version index 8c50098..5186d07 100644 --- a/.swift-version +++ b/.swift-version @@ -1 +1 @@ -3.1 +4.0 diff --git a/.travis.yml b/.travis.yml index ad25aeb..46c3a79 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,16 +1,17 @@ language: objective-c xcode_project: Socket.IO-Client-Swift.xcodeproj # path to your xcodeproj folder xcode_scheme: SocketIO-iOS -osx_image: xcode8.3 +osx_image: xcode9 branches: only: - master - development + - swift4.0 before_install: - brew update - brew outdated xctool || brew upgrade xctool script: - - xcodebuild -project Socket.IO-Client-Swift.xcodeproj -scheme SocketIO-Mac build-for-testing -quiet - - xctool -project Socket.IO-Client-Swift.xcodeproj -scheme SocketIO-Mac run-tests --parallelize + - xcodebuild -project Socket.IO-Client-Swift.xcodeproj -scheme SocketIO-Mac build test -quiet +# - xcodebuild -project Socket.IO-Client-Swift.xcodeproj -scheme SocketIO-Mac build-for-testing -quiet +# - xctool -project Socket.IO-Client-Swift.xcodeproj -scheme SocketIO-Mac run-tests --parallelize - swift build -#script: xcodebuild -project Socket.IO-Client-Swift.xcodeproj -scheme SocketIO-Mac build test diff --git a/Package.swift b/Package.swift index b60d8ec..a782647 100644 --- a/Package.swift +++ b/Package.swift @@ -1,9 +1,16 @@ +// swift-tools-version:4.0 + import PackageDescription let package = Package( name: "SocketIO", - dependencies: [ - .Package(url: "https://github.com/nuclearace/Starscream", majorVersion: 8), + products: [ + .library(name: "SocketIO", targets: ["SocketIO"]) ], - exclude: ["Source/Starscream"] + dependencies: [ + .package(url: "https://github.com/nuclearace/Starscream", .upToNextMajor(from: "8.0.0")), + ], + targets: [ + .target(name: "SocketIO", dependencies: ["StarscreamSocketIO"], exclude: ["Sources/Starscream"]) + ] ) diff --git a/Socket.IO-Client-Swift.podspec b/Socket.IO-Client-Swift.podspec index ea505d6..eae9b3e 100644 --- a/Socket.IO-Client-Swift.podspec +++ b/Socket.IO-Client-Swift.podspec @@ -21,7 +21,7 @@ Pod::Spec.new do |s| :submodules => true } s.pod_target_xcconfig = { - 'SWIFT_VERSION' => '3.1' + 'SWIFT_VERSION' => '4.0' } s.source_files = "Source/SocketIO/**/*.swift", "Source/SocketIO/*.swift" s.dependency "StarscreamSocketIO", "~> 8.0.5" diff --git a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj index 73f35a7..c54d956 100644 --- a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj +++ b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj @@ -657,7 +657,7 @@ attributes = { LastSwiftMigration = 0730; LastSwiftUpdateCheck = 0730; - LastUpgradeCheck = 0800; + LastUpgradeCheck = 0900; TargetAttributes = { 572EF2181B51F16C00EEBB58 = { CreatedOnToolsVersion = 6.4; @@ -667,11 +667,11 @@ }; 572EF2371B51F18A00EEBB58 = { CreatedOnToolsVersion = 6.4; - LastSwiftMigration = 0800; + LastSwiftMigration = 0900; }; 572EF2411B51F18A00EEBB58 = { CreatedOnToolsVersion = 6.4; - LastSwiftMigration = 0800; + LastSwiftMigration = 0900; }; }; }; @@ -958,11 +958,19 @@ isa = XCBuildConfiguration; buildSettings = { BITCODE_GENERATION_MODE = bitcode; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "Developer ID Application"; @@ -992,11 +1000,19 @@ isa = XCBuildConfiguration; buildSettings = { BITCODE_GENERATION_MODE = bitcode; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "Developer ID Application"; @@ -1038,7 +1054,7 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; COPY_PHASE_STRIP = NO; CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; @@ -1071,7 +1087,7 @@ SKIP_INSTALL = YES; SWIFT_INCLUDE_PATHS = $SRCROOT/zlib; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; @@ -1097,7 +1113,7 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "iPhone Distribution"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; COPY_PHASE_STRIP = NO; CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; @@ -1123,7 +1139,7 @@ SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_INCLUDE_PATHS = $SRCROOT/zlib; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; @@ -1179,6 +1195,7 @@ PRODUCT_BUNDLE_IDENTIFIER = "io.socket.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; + SWIFT_VERSION = 4.0; }; name = Debug; }; @@ -1223,6 +1240,7 @@ PRODUCT_BUNDLE_IDENTIFIER = "io.socket.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; + SWIFT_VERSION = 4.0; VALIDATE_PRODUCT = YES; }; name = Release; @@ -1285,7 +1303,8 @@ SKIP_INSTALL = YES; SWIFT_INCLUDE_PATHS = ""; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = On; + SWIFT_VERSION = 4.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; @@ -1342,7 +1361,8 @@ SDKROOT = macosx; SKIP_INSTALL = YES; SWIFT_INCLUDE_PATHS = ""; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = On; + SWIFT_VERSION = 4.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; @@ -1403,7 +1423,8 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = On; + SWIFT_VERSION = 4.0; }; name = Debug; }; @@ -1454,7 +1475,8 @@ PRODUCT_BUNDLE_IDENTIFIER = "io.socket.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = On; + SWIFT_VERSION = 4.0; }; name = Release; }; @@ -1476,6 +1498,7 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; CURRENT_PROJECT_VERSION = 1; @@ -1510,6 +1533,7 @@ SKIP_INSTALL = YES; SWIFT_INCLUDE_PATHS = $SRCROOT/zlib; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = 3; TVOS_DEPLOYMENT_TARGET = 9.0; VERSIONING_SYSTEM = "apple-generic"; @@ -1535,6 +1559,7 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "iPhone Distribution"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; COPY_PHASE_STRIP = NO; CURRENT_PROJECT_VERSION = 1; @@ -1562,6 +1587,7 @@ SDKROOT = appletvos; SKIP_INSTALL = YES; SWIFT_INCLUDE_PATHS = $SRCROOT/zlib; + SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = 3; TVOS_DEPLOYMENT_TARGET = 9.0; VALIDATE_PRODUCT = YES; @@ -1618,6 +1644,7 @@ PRODUCT_BUNDLE_IDENTIFIER = "io.socket.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = appletvos; + SWIFT_VERSION = 4.0; }; name = Debug; }; @@ -1662,6 +1689,7 @@ PRODUCT_BUNDLE_IDENTIFIER = "io.socket.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = appletvos; + SWIFT_VERSION = 4.0; VALIDATE_PRODUCT = YES; }; name = Release; 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 ea5febe..d533f78 100644 --- a/Socket.IO-Client-Swift.xcodeproj/xcshareddata/xcschemes/SocketIO-Mac.xcscheme +++ b/Socket.IO-Client-Swift.xcodeproj/xcshareddata/xcschemes/SocketIO-Mac.xcscheme @@ -1,6 +1,6 @@ ())?) { assert(timeoutAfter >= 0, "Invalid timeout: \(timeoutAfter)") @@ -218,7 +230,7 @@ open class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineClient, So func didDisconnect(reason: String) { guard status != .disconnected else { return } - DefaultSocketLogger.Logger.log("Disconnected: %@", type: SocketIOClient.logType, args: reason) + DefaultSocketLogger.Logger.log("Disconnected: \(reason)", type: SocketIOClient.logType) reconnecting = false status = .disconnected @@ -229,6 +241,7 @@ open class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineClient, So } /// Disconnects the socket. + @objc open func disconnect() { DefaultSocketLogger.Logger.log("Closing socket", type: SocketIOClient.logType) @@ -257,6 +270,7 @@ open class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineClient, So /// /// - parameter event: The event to send. /// - parameter with: The items to send with this event. May be left out. + @objc open func emit(_ event: String, with items: [Any]) { guard status == .connected else { handleClientEvent(.error, data: ["Tried emitting \(event) when not connected"]) @@ -314,6 +328,7 @@ open class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineClient, So /// - parameter event: The event to send. /// - parameter with: The items to send with this event. Use `[]` to send nothing. /// - returns: An `OnAckCallback`. You must call the `timingOut(after:)` method before the event will be sent. + @objc open func emitWithAck(_ event: String, with items: [Any]) -> OnAckCallback { return createOnAck([event] + items) } @@ -327,7 +342,7 @@ open class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineClient, So let packet = SocketPacket.packetFromEmit(data, id: ack ?? -1, nsp: nsp, ack: false) let str = packet.packetString - DefaultSocketLogger.Logger.log("Emitting: %@", type: SocketIOClient.logType, args: str) + DefaultSocketLogger.Logger.log("Emitting: \(str)", type: SocketIOClient.logType) engine?.send(str, withData: packet.binary) } @@ -339,7 +354,7 @@ open class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineClient, So let packet = SocketPacket.packetFromEmit(items, id: ack, nsp: nsp, ack: true) let str = packet.packetString - DefaultSocketLogger.Logger.log("Emitting Ack: %@", type: SocketIOClient.logType, args: str) + DefaultSocketLogger.Logger.log("Emitting Ack: \(str)", type: SocketIOClient.logType) engine?.send(str, withData: packet.binary) } @@ -378,7 +393,7 @@ open class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineClient, So } private func _engineDidError(reason: String) { - DefaultSocketLogger.Logger.error("%@", type: SocketIOClient.logType, args: reason) + DefaultSocketLogger.Logger.error("\(reason)", type: SocketIOClient.logType) handleClientEvent(.error, data: [reason]) } @@ -394,7 +409,7 @@ open class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineClient, So func handleAck(_ ack: Int, data: [Any]) { guard status == .connected else { return } - DefaultSocketLogger.Logger.log("Handling ack: %@ with data: %@", type: SocketIOClient.logType, args: ack, data) + DefaultSocketLogger.Logger.log("Handling ack: \(ack) with data: \(data)", type: SocketIOClient.logType) ackHandlers.executeAck(ack, with: data, onQueue: handleQueue) } @@ -405,11 +420,11 @@ open class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineClient, So /// - parameter data: the data associated with this event. /// - parameter isInternalMessage: If `true` event handlers for this event will be called regardless of status. /// - parameter withAck: The ack number for this event. May be left out. + @objc open func handleEvent(_ event: String, data: [Any], isInternalMessage: Bool, withAck ack: Int = -1) { guard status == .connected || isInternalMessage else { return } - DefaultSocketLogger.Logger.log("Handling event: %@ with data: %@", type: SocketIOClient.logType, - args: event, data) + DefaultSocketLogger.Logger.log("Handling event: \(event) with data: \(data)", type: SocketIOClient.logType) anyHandler?(SocketAnyEvent(event: event, items: data)) @@ -423,6 +438,7 @@ open class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineClient, So } /// Leaves nsp and goes back to the default namespace. + @objc open func leaveNamespace() { if nsp != "/" { engine?.send("1\(nsp)", withData: []) @@ -435,6 +451,7 @@ open class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineClient, So /// **Do not use this to join the default namespace.** Instead call `leaveNamespace`. /// /// - parameter namespace: The namespace to join. + @objc open func joinNamespace(_ namespace: String) { nsp = namespace @@ -458,8 +475,9 @@ open class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineClient, So /// If you wish to remove a specific event, call the `off(id:)` with the UUID received from its `on` call. /// /// - parameter event: The event to remove handlers for. + @objc open func off(_ event: String) { - DefaultSocketLogger.Logger.log("Removing handler for event: %@", type: SocketIOClient.logType, args: event) + DefaultSocketLogger.Logger.log("Removing handler for event: \(event)", type: SocketIOClient.logType) handlers = handlers.filter({ $0.event != event }) } @@ -469,8 +487,9 @@ open class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineClient, So /// If you want to remove all events for an event, call the off `off(_:)` method with the event name. /// /// - parameter id: The UUID of the handler you wish to remove. + @objc open func off(id: UUID) { - DefaultSocketLogger.Logger.log("Removing handler with id: %@", type: SocketIOClient.logType, args: id) + DefaultSocketLogger.Logger.log("Removing handler with id: \(id)", type: SocketIOClient.logType) handlers = handlers.filter({ $0.id != id }) } @@ -480,9 +499,10 @@ open class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineClient, So /// - parameter event: The event name for this handler. /// - parameter callback: The callback that will execute when this event is received. /// - returns: A unique id for the handler that can be used to remove it. + @objc @discardableResult open func on(_ event: String, callback: @escaping NormalCallback) -> UUID { - DefaultSocketLogger.Logger.log("Adding handler for event: %@", type: SocketIOClient.logType, args: event) + DefaultSocketLogger.Logger.log("Adding handler for event: \(event)", type: SocketIOClient.logType) let handler = SocketEventHandler(event: event, id: UUID(), callback: callback) handlers.append(handler) @@ -505,7 +525,7 @@ open class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineClient, So /// - returns: A unique id for the handler that can be used to remove it. @discardableResult open func on(clientEvent event: SocketClientEvent, callback: @escaping NormalCallback) -> UUID { - DefaultSocketLogger.Logger.log("Adding handler for event: %@", type: SocketIOClient.logType, args: event) + DefaultSocketLogger.Logger.log("Adding handler for event: \(event)", type: SocketIOClient.logType) let handler = SocketEventHandler(event: event.rawValue, id: UUID(), callback: callback) handlers.append(handler) @@ -528,9 +548,10 @@ open class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineClient, So /// - parameter event: The event name for this handler. /// - parameter callback: The callback that will execute when this event is received. /// - returns: A unique id for the handler that can be used to remove it. + @objc @discardableResult open func once(_ event: String, callback: @escaping NormalCallback) -> UUID { - DefaultSocketLogger.Logger.log("Adding once handler for event: %@", type: SocketIOClient.logType, args: event) + DefaultSocketLogger.Logger.log("Adding once handler for event: \(event)", type: SocketIOClient.logType) let id = UUID() @@ -548,6 +569,7 @@ open class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineClient, So /// Adds a handler that will be called on every event. /// /// - parameter handler: The callback that will execute whenever an event is received. + @objc open func onAny(_ handler: @escaping (SocketAnyEvent) -> ()) { anyHandler = handler } @@ -556,7 +578,7 @@ open class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineClient, So /// /// - parameter msg: The message that needs parsing. public func parseEngineMessage(_ msg: String) { - DefaultSocketLogger.Logger.log("Should parse message: %@", type: SocketIOClient.logType, args: msg) + DefaultSocketLogger.Logger.log("Should parse message: \(msg)", type: SocketIOClient.logType) handleQueue.async { self.parseSocketMessage(msg) } } @@ -571,6 +593,7 @@ open class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineClient, So /// Tries to reconnect to the server. /// /// This will cause a `disconnect` event to be emitted, as well as an `reconnectAttempt` event. + @objc open func reconnect() { guard !reconnecting else { return } @@ -579,6 +602,7 @@ open class SocketIOClient : NSObject, SocketIOClientSpec, SocketEngineClient, So /// Removes all handlers. /// Can be used after disconnecting to break any potential remaining retain cycles. + @objc open func removeAllHandlers() { handlers.removeAll(keepingCapacity: false) } diff --git a/Source/SocketIO/Client/SocketIOClientSpec.swift b/Source/SocketIO/Client/SocketIOClientSpec.swift index d707fbf..f53525f 100644 --- a/Source/SocketIO/Client/SocketIOClientSpec.swift +++ b/Source/SocketIO/Client/SocketIOClientSpec.swift @@ -40,7 +40,7 @@ protocol SocketIOClientSpec : class { extension SocketIOClientSpec { func didError(reason: String) { - DefaultSocketLogger.Logger.error("%@", type: "SocketIOClient", args: reason) + DefaultSocketLogger.Logger.error("\(reason)", type: "SocketIOClient") handleClientEvent(.error, data: [reason]) } diff --git a/Source/SocketIO/Engine/SocketEngine.swift b/Source/SocketIO/Engine/SocketEngine.swift index 9995cb9..2a4e699 100644 --- a/Source/SocketIO/Engine/SocketEngine.swift +++ b/Source/SocketIO/Engine/SocketEngine.swift @@ -206,7 +206,7 @@ public final class SocketEngine : NSObject, URLSessionDelegate, SocketEnginePoll private func checkAndHandleEngineError(_ msg: String) { do { - let dict = try msg.toNSDictionary() + let dict = try msg.toDictionary() guard let error = dict["message"] as? String else { return } /* @@ -223,7 +223,7 @@ public final class SocketEngine : NSObject, URLSessionDelegate, SocketEnginePoll private func handleBase64(message: String) { // binary in base64 string - let noPrefix = message[message.index(message.startIndex, offsetBy: 2).. ()) { guard polling && !closed && !invalidated && !fastUpgrade else { return } - DefaultSocketLogger.Logger.log("Doing polling %@ %@", type: "SocketEnginePolling", - args: req.httpMethod ?? "", req) + DefaultSocketLogger.Logger.log("Doing polling \(req.httpMethod ?? "") \(req)", type: "SocketEnginePolling") session?.dataTask(with: req, completionHandler: callback).resume() } @@ -187,7 +186,7 @@ extension SocketEnginePollable { func parsePollingMessage(_ str: String) { guard str.characters.count != 1 else { return } - DefaultSocketLogger.Logger.log("Got poll message: %@", type: "SocketEnginePolling", args: str) + DefaultSocketLogger.Logger.log("Got poll message: \(str)", type: "SocketEnginePolling") var reader = SocketStringReader(message: str) @@ -209,7 +208,7 @@ extension SocketEnginePollable { /// - parameter withType: The type of message to send. /// - parameter withData: The data associated with this message. public func sendPollMessage(_ message: String, withType type: SocketEnginePacketType, withData datas: [Data]) { - DefaultSocketLogger.Logger.log("Sending poll: %@ as type: %@", type: "SocketEnginePolling", args: message, type.rawValue) + DefaultSocketLogger.Logger.log("Sending poll: \(message) as type: \(type.rawValue)", type: "SocketEnginePolling") postWait.append(String(type.rawValue) + message) diff --git a/Source/SocketIO/Engine/SocketEngineSpec.swift b/Source/SocketIO/Engine/SocketEngineSpec.swift index 89f068f..0f549db 100644 --- a/Source/SocketIO/Engine/SocketEngineSpec.swift +++ b/Source/SocketIO/Engine/SocketEngineSpec.swift @@ -161,12 +161,7 @@ extension SocketEngineSpec { func createBinaryDataForSend(using data: Data) -> Either { if websocket { - var byteArray = [UInt8](repeating: 0x4, count: 1) - let mutData = NSMutableData(bytes: &byteArray, length: 1) - - mutData.append(data) - - return .left(mutData as Data) + return .left(Data(bytes: [0x4]) + data) } else { return .right("b4" + data.base64EncodedString(options: Data.Base64EncodingOptions(rawValue: 0))) } diff --git a/Source/SocketIO/Engine/SocketEngineWebsocket.swift b/Source/SocketIO/Engine/SocketEngineWebsocket.swift index 70b885c..e572d96 100644 --- a/Source/SocketIO/Engine/SocketEngineWebsocket.swift +++ b/Source/SocketIO/Engine/SocketEngineWebsocket.swift @@ -54,7 +54,7 @@ extension SocketEngineWebsocket { /// - parameter withType: The type of message to send. /// - parameter withData: The data associated with this message. public func sendWebSocketMessage(_ str: String, withType type: SocketEnginePacketType, withData datas: [Data]) { - DefaultSocketLogger.Logger.log("Sending ws: %@ as type: %@", type: "SocketEngine", args: str, type.rawValue) + DefaultSocketLogger.Logger.log("Sending ws: \(str) as type: \(type.rawValue)", type: "SocketEngineWebSocket") ws?.write(string: "\(type.rawValue)\(str)") diff --git a/Source/SocketIO/Parse/SocketParsable.swift b/Source/SocketIO/Parse/SocketParsable.swift index be82d2d..d99d0c1 100644 --- a/Source/SocketIO/Parse/SocketParsable.swift +++ b/Source/SocketIO/Parse/SocketParsable.swift @@ -63,7 +63,7 @@ extension SocketParsable where Self: SocketIOClientSpec { case .error: handleEvent("error", data: pack.data, isInternalMessage: true, withAck: pack.id) default: - DefaultSocketLogger.Logger.log("Got invalid packet: %@", type: "SocketParser", args: pack.description) + DefaultSocketLogger.Logger.log("Got invalid packet: \(pack.description)", type: "SocketParser") } } @@ -137,16 +137,16 @@ extension SocketParsable where Self: SocketIOClientSpec { func parseSocketMessage(_ message: String) { guard !message.isEmpty else { return } - DefaultSocketLogger.Logger.log("Parsing %@", type: "SocketParser", args: message) + DefaultSocketLogger.Logger.log("Parsing \(message)", type: "SocketParser") do { let packet = try parseString(message) - DefaultSocketLogger.Logger.log("Decoded packet as: %@", type: "SocketParser", args: packet.description) + DefaultSocketLogger.Logger.log("Decoded packet as: \(packet.description)", type: "SocketParser") handlePacket(packet) } catch { - DefaultSocketLogger.Logger.error("\(error): %@", type: "SocketParser", args: message) + DefaultSocketLogger.Logger.error("\(error): \(message)", type: "SocketParser") } } diff --git a/Source/SocketIO/Util/SocketClientManager.swift b/Source/SocketIO/Util/SocketClientManager.swift index db9d722..0c99309 100644 --- a/Source/SocketIO/Util/SocketClientManager.swift +++ b/Source/SocketIO/Util/SocketClientManager.swift @@ -47,6 +47,7 @@ open class SocketClientManager : NSObject { // MARK: Properties. /// The shared manager. + @objc open static let sharedManager = SocketClientManager() private var sockets = [String: SocketIOClient]() @@ -70,6 +71,7 @@ open class SocketClientManager : NSObject { /// /// - parameter socket: The socket to add. /// - parameter labeledAs: The label for this socket. + @objc open func addSocket(_ socket: SocketIOClient, labeledAs label: String) { sockets[label] = socket } @@ -78,6 +80,7 @@ open class SocketClientManager : NSObject { /// /// - parameter withLabel: The label of the socket to remove. /// - returns: The socket for the given label, if one was present. + @objc @discardableResult open func removeSocket(withLabel label: String) -> SocketIOClient? { return sockets.removeValue(forKey: label) @@ -87,6 +90,7 @@ open class SocketClientManager : NSObject { /// /// - parameter socket: The socket to remove. /// - returns: The socket if it was in the manager. + @objc @discardableResult open func removeSocket(_ socket: SocketIOClient) -> SocketIOClient? { var returnSocket: SocketIOClient? @@ -99,6 +103,7 @@ open class SocketClientManager : NSObject { } /// Removes all the sockets in the manager. + @objc open func removeSockets() { sockets.removeAll() } diff --git a/Source/SocketIO/Util/SocketExtensions.swift b/Source/SocketIO/Util/SocketExtensions.swift index ef422c3..3959f6d 100644 --- a/Source/SocketIO/Util/SocketExtensions.swift +++ b/Source/SocketIO/Util/SocketExtensions.swift @@ -111,9 +111,9 @@ extension String { return array } - func toNSDictionary() throws -> NSDictionary { + func toDictionary() throws -> [String: Any] { guard let binData = data(using: .utf16, allowLossyConversion: false) else { return [:] } - guard let json = try JSONSerialization.jsonObject(with: binData, options: .allowFragments) as? NSDictionary else { + guard let json = try JSONSerialization.jsonObject(with: binData, options: .allowFragments) as? [String: Any] else { throw JSONError.notNSDictionary } diff --git a/Source/SocketIO/Util/SocketLogger.swift b/Source/SocketIO/Util/SocketLogger.swift index 0b457ae..46e3f1b 100644 --- a/Source/SocketIO/Util/SocketLogger.swift +++ b/Source/SocketIO/Util/SocketLogger.swift @@ -38,34 +38,31 @@ public protocol SocketLogger : class { /// - parameter message: The message being logged. Can include `%@` that will be replaced with `args` /// - parameter type: The type of entity that called for logging. /// - parameter args: Any args that should be inserted into the message. May be left out. - func log(_ message: String, type: String, args: Any...) + func log(_ message: @autoclosure () -> String, type: String) /// Error Messages /// /// - parameter message: The message being logged. Can include `%@` that will be replaced with `args` /// - parameter type: The type of entity that called for logging. /// - parameter args: Any args that should be inserted into the message. May be left out. - func error(_ message: String, type: String, args: Any...) + func error(_ message: @autoclosure () -> String, type: String) } public extension SocketLogger { /// Default implementation. - func log(_ message: String, type: String, args: Any...) { - abstractLog("LOG", message: message, type: type, args: args) + func log(_ message: @autoclosure () -> String, type: String) { + abstractLog("LOG", message: message, type: type) } /// Default implementation. - func error(_ message: String, type: String, args: Any...) { - abstractLog("ERROR", message: message, type: type, args: args) + func error(_ message: @autoclosure () -> String, type: String) { + abstractLog("ERROR", message: message, type: type) } - private func abstractLog(_ logType: String, message: String, type: String, args: [Any]) { + private func abstractLog(_ logType: String, message: @autoclosure () -> String, type: String) { guard log else { return } - let newArgs = args.map({arg -> CVarArg in String(describing: arg)}) - let messageFormat = String(format: message, arguments: newArgs) - - NSLog("\(logType) \(type): %@", messageFormat) + NSLog("\(logType) \(type): %@", message()) } }