diff --git a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj index 6760c64..3211562 100644 --- a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj +++ b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj @@ -846,6 +846,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + APPLICATION_EXTENSION_API_ONLY = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; @@ -892,6 +893,7 @@ SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; @@ -902,6 +904,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + APPLICATION_EXTENSION_API_ONLY = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; @@ -941,6 +944,7 @@ PRODUCT_BUNDLE_IDENTIFIER = io.socket.SocketIOClientSwift; SDKROOT = iphoneos; SKIP_INSTALL = YES; + SWIFT_VERSION = 3.0; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; diff --git a/SocketIO-MacTests/SocketAckManagerTest.swift b/SocketIO-MacTests/SocketAckManagerTest.swift index fab681a..a90db13 100644 --- a/SocketIO-MacTests/SocketAckManagerTest.swift +++ b/SocketIO-MacTests/SocketAckManagerTest.swift @@ -13,14 +13,14 @@ class SocketAckManagerTest: XCTestCase { var ackManager = SocketAckManager() func testAddAcks() { - let callbackExpection = self.expectation(withDescription: "callbackExpection") + let callbackExpection = self.expectation(description: "callbackExpection") let itemsArray = ["Hi", "ho"] func callback(_ items: [AnyObject]) { callbackExpection.fulfill() } ackManager.addAck(1, callback: callback) ackManager.executeAck(1, with: itemsArray, onQueue: DispatchQueue.main) - waitForExpectations(withTimeout: 3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) } } diff --git a/SocketIO-MacTests/SocketBasicPacketTest.swift b/SocketIO-MacTests/SocketBasicPacketTest.swift index 78a04eb..7526fe7 100644 --- a/SocketIO-MacTests/SocketBasicPacketTest.swift +++ b/SocketIO-MacTests/SocketBasicPacketTest.swift @@ -154,8 +154,8 @@ class SocketBasicPacketTest: XCTestCase { if case let .right(packet) = socket.parseString(engineString) { var packet = packet XCTAssertEqual(packet.event, "test") - packet.addData(data) - packet.addData(data2) + _ = packet.addData(data) + _ = packet.addData(data2) XCTAssertEqual(packet.args[0] as? String, "~~0") } else { XCTFail() diff --git a/SocketIO-MacTests/SocketEngineTest.swift b/SocketIO-MacTests/SocketEngineTest.swift index 005623c..4c54833 100644 --- a/SocketIO-MacTests/SocketEngineTest.swift +++ b/SocketIO-MacTests/SocketEngineTest.swift @@ -22,17 +22,17 @@ class SocketEngineTest: XCTestCase { } func testBasicPollingMessage() { - let expect = expectation(withDescription: "Basic polling test") + let expect = expectation(description: "Basic polling test") client.on("blankTest") {data, ack in expect.fulfill() } engine.parsePollingMessage("15:42[\"blankTest\"]") - waitForExpectations(withTimeout: 3, handler: nil) + waitForExpectations(timeout: 3, handler: nil) } func testTwoPacketsInOnePollTest() { - let finalExpectation = expectation(withDescription: "Final packet in poll test") + let finalExpectation = expectation(description: "Final packet in poll test") var gotBlank = false client.on("blankTest") {data, ack in @@ -40,7 +40,7 @@ class SocketEngineTest: XCTestCase { } client.on("stringTest") {data, ack in - if let str = data[0] as? String where gotBlank { + if let str = data[0] as? String, gotBlank { if str == "hello" { finalExpectation.fulfill() } @@ -48,35 +48,35 @@ class SocketEngineTest: XCTestCase { } engine.parsePollingMessage("15:42[\"blankTest\"]24:42[\"stringTest\",\"hello\"]") - waitForExpectations(withTimeout: 3, handler: nil) + waitForExpectations(timeout: 3, handler: nil) } func testEngineDoesErrorOnUnknownTransport() { - let finalExpectation = expectation(withDescription: "Unknown Transport") + let finalExpectation = expectation(description: "Unknown Transport") client.on("error") {data, ack in - if let error = data[0] as? String where error == "Unknown transport" { + if let error = data[0] as? String, error == "Unknown transport" { finalExpectation.fulfill() } } engine.parseEngineMessage("{\"code\": 0, \"message\": \"Unknown transport\"}", fromPolling: false) - waitForExpectations(withTimeout: 3, handler: nil) + waitForExpectations(timeout: 3, handler: nil) } func testEngineDoesErrorOnUnknownMessage() { - let finalExpectation = expectation(withDescription: "Engine Errors") + let finalExpectation = expectation(description: "Engine Errors") client.on("error") {data, ack in finalExpectation.fulfill() } engine.parseEngineMessage("afafafda", fromPolling: false) - waitForExpectations(withTimeout: 3, handler: nil) + waitForExpectations(timeout: 3, handler: nil) } func testEngineDecodesUTF8Properly() { - let expect = expectation(withDescription: "Engine Decodes utf8") + let expect = expectation(description: "Engine Decodes utf8") client.on("stringTest") {data, ack in XCTAssertEqual(data[0] as? String, "lïne one\nlīne \rtwo", "Failed string test") @@ -84,7 +84,7 @@ class SocketEngineTest: XCTestCase { } engine.parsePollingMessage("41:42[\"stringTest\",\"lïne one\\nlÄ«ne \\rtwo\"]") - waitForExpectations(withTimeout: 3, handler: nil) + waitForExpectations(timeout: 3, handler: nil) } func testEncodeURLProperly() { @@ -102,4 +102,23 @@ class SocketEngineTest: XCTestCase { XCTAssertEqual(engine.urlPolling.query, "transport=polling&b64=1&forbidden=%21%2A%27%28%29%3B%3A%40%26%3D%2B%24%2C%2F%3F%25%23%5B%5D%22%20%7B%7D") XCTAssertEqual(engine.urlWebSocket.query, "transport=websocket&forbidden=%21%2A%27%28%29%3B%3A%40%26%3D%2B%24%2C%2F%3F%25%23%5B%5D%22%20%7B%7D") } + + func testBase64Data() { + let expect = expectation(description: "Engine Decodes base64 data") + let b64String = "b4aGVsbG8NCg==" + let packetString = "451-[\"test\",{\"test\":{\"_placeholder\":true,\"num\":0}}]" + + client.on("test") {data, ack in + if let data = data[0] as? Data, let string = String(data: data, encoding: .utf8) { + XCTAssertEqual(string, "hello") + } + + expect.fulfill() + } + + engine.parseEngineMessage(packetString, fromPolling: false) + engine.parseEngineMessage(b64String, fromPolling: false) + + waitForExpectations(timeout: 3, handler: nil) + } } diff --git a/SocketIO-MacTests/SocketParserTest.swift b/SocketIO-MacTests/SocketParserTest.swift index 62e1d1f..cb1e8d0 100644 --- a/SocketIO-MacTests/SocketParserTest.swift +++ b/SocketIO-MacTests/SocketParserTest.swift @@ -136,7 +136,7 @@ class SocketParserTest: XCTestCase { let keys = Array(SocketParserTest.packetTypes.keys) measure { for item in keys.enumerated() { - self.testSocket.parseString(item.element) + _ = self.testSocket.parseString(item.element) } } } diff --git a/SocketIO-MacTests/SocketSideEffectTest.swift b/SocketIO-MacTests/SocketSideEffectTest.swift index 7f4bba6..8b5f611 100644 --- a/SocketIO-MacTests/SocketSideEffectTest.swift +++ b/SocketIO-MacTests/SocketSideEffectTest.swift @@ -37,18 +37,18 @@ class SocketSideEffectTest: XCTestCase { } func testHandleAck() { - let expect = expectation(withDescription: "handled ack") + let expect = expectation(description: "handled ack") socket.emitWithAck("test")(timeoutAfter: 0) {data in XCTAssertEqual(data[0] as? String, "hello world") expect.fulfill() } socket.parseSocketMessage("30[\"hello world\"]") - waitForExpectations(withTimeout: 3, handler: nil) + waitForExpectations(timeout: 3, handler: nil) } func testHandleAck2() { - let expect = expectation(withDescription: "handled ack2") + let expect = expectation(description: "handled ack2") socket.emitWithAck("test")(timeoutAfter: 0) {data in XCTAssertTrue(data.count == 2, "Wrong number of ack items") expect.fulfill() @@ -56,33 +56,33 @@ class SocketSideEffectTest: XCTestCase { socket.parseSocketMessage("61-0[{\"_placeholder\":true,\"num\":0},{\"test\":true}]") socket.parseBinaryData(Data()) - waitForExpectations(withTimeout: 3, handler: nil) + waitForExpectations(timeout: 3, handler: nil) } func testHandleEvent() { - let expect = expectation(withDescription: "handled event") + let expect = expectation(description: "handled event") socket.on("test") {data, ack in XCTAssertEqual(data[0] as? String, "hello world") expect.fulfill() } socket.parseSocketMessage("2[\"test\",\"hello world\"]") - waitForExpectations(withTimeout: 3, handler: nil) + waitForExpectations(timeout: 3, handler: nil) } func testHandleStringEventWithQuotes() { - let expect = expectation(withDescription: "handled event") + let expect = expectation(description: "handled event") socket.on("test") {data, ack in XCTAssertEqual(data[0] as? String, "\"hello world\"") expect.fulfill() } socket.parseSocketMessage("2[\"test\",\"\\\"hello world\\\"\"]") - waitForExpectations(withTimeout: 3, handler: nil) + waitForExpectations(timeout: 3, handler: nil) } func testHandleOnceEvent() { - let expect = expectation(withDescription: "handled event") + let expect = expectation(description: "handled event") socket.once("test") {data, ack in XCTAssertEqual(data[0] as? String, "hello world") XCTAssertEqual(self.socket.testHandlers.count, 0) @@ -90,7 +90,7 @@ class SocketSideEffectTest: XCTestCase { } socket.parseSocketMessage("2[\"test\",\"hello world\"]") - waitForExpectations(withTimeout: 3, handler: nil) + waitForExpectations(timeout: 3, handler: nil) } func testOffWithEvent() { @@ -112,21 +112,21 @@ class SocketSideEffectTest: XCTestCase { } func testHandlesErrorPacket() { - let expect = expectation(withDescription: "Handled error") + let expect = expectation(description: "Handled error") socket.on("error") {data, ack in - if let error = data[0] as? String where error == "test error" { + if let error = data[0] as? String, error == "test error" { expect.fulfill() } } socket.parseSocketMessage("4\"test error\"") - waitForExpectations(withTimeout: 3, handler: nil) + waitForExpectations(timeout: 3, handler: nil) } func testHandleBinaryEvent() { - let expect = expectation(withDescription: "handled binary event") + let expect = expectation(description: "handled binary event") socket.on("test") {data, ack in - if let dict = data[0] as? NSDictionary, data = dict["test"] as? NSData { + if let dict = data[0] as? NSDictionary, let data = dict["test"] as? NSData { XCTAssertEqual(data, self.data) expect.fulfill() } @@ -134,7 +134,7 @@ class SocketSideEffectTest: XCTestCase { socket.parseSocketMessage("51-[\"test\",{\"test\":{\"_placeholder\":true,\"num\":0}}]") socket.parseBinaryData(data) - waitForExpectations(withTimeout: 3, handler: nil) + waitForExpectations(timeout: 3, handler: nil) } func testSocketDataToAnyObject() { @@ -144,10 +144,10 @@ class SocketSideEffectTest: XCTestCase { } func testHandleMultipleBinaryEvent() { - let expect = expectation(withDescription: "handled multiple binary event") + let expect = expectation(description: "handled multiple binary event") socket.on("test") {data, ack in - if let dict = data[0] as? NSDictionary, data = dict["test"] as? NSData, - data2 = dict["test2"] as? NSData { + if let dict = data[0] as? NSDictionary, let data = dict["test"] as? NSData, + let data2 = dict["test2"] as? NSData { XCTAssertEqual(data, self.data) XCTAssertEqual(data2, self.data2) expect.fulfill() @@ -157,7 +157,7 @@ class SocketSideEffectTest: XCTestCase { socket.parseSocketMessage("52-[\"test\",{\"test\":{\"_placeholder\":true,\"num\":0},\"test2\":{\"_placeholder\":true,\"num\":1}}]") socket.parseBinaryData(data) socket.parseBinaryData(data2) - waitForExpectations(withTimeout: 3, handler: nil) + waitForExpectations(timeout: 3, handler: nil) } func testSocketManager() { diff --git a/Source/SocketEngine.swift b/Source/SocketEngine.swift index 4ca63a6..b01a2e4 100644 --- a/Source/SocketEngine.swift +++ b/Source/SocketEngine.swift @@ -151,8 +151,7 @@ public final class SocketEngine : NSObject, SocketEnginePollable, SocketEngineWe if message.hasPrefix("b4") { // binary in base64 string let noPrefix = message[message.characters.index(message.startIndex, offsetBy: 2).. String { if let latin1 = string.data(using: String.Encoding.utf8), - utf8 = NSString(data: latin1, encoding: String.Encoding.isoLatin1.rawValue) { + let utf8 = NSString(data: latin1, encoding: String.Encoding.isoLatin1.rawValue) { return utf8 as String } else { return string @@ -101,7 +101,7 @@ extension SocketEngineSpec { func fixDoubleUTF8(_ string: String) -> String { if let utf8 = string.data(using: String.Encoding.isoLatin1), - latin1 = NSString(data: utf8, encoding: String.Encoding.utf8.rawValue) { + let latin1 = NSString(data: utf8, encoding: String.Encoding.utf8.rawValue) { return latin1 as String } else { return string diff --git a/Source/SocketIOClient.swift b/Source/SocketIOClient.swift index fdc2a2f..478790b 100644 --- a/Source/SocketIOClient.swift +++ b/Source/SocketIOClient.swift @@ -150,7 +150,7 @@ public final class SocketIOClient : NSObject, SocketEngineClient, SocketParsable let time = DispatchTime.now() + Double(Int64(timeoutAfter) * Int64(NSEC_PER_SEC)) / Double(NSEC_PER_SEC) handleQueue.after(when: time) {[weak self] in - if let this = self where this.status != .connected && this.status != .disconnected { + if let this = self, this.status != .connected && this.status != .disconnected { this.status = .disconnected this.engine?.disconnect(reason: "Connect timeout") diff --git a/Source/SocketIOClientOption.swift b/Source/SocketIOClientOption.swift index c06a245..db860c9 100644 --- a/Source/SocketIOClientOption.swift +++ b/Source/SocketIOClientOption.swift @@ -217,7 +217,7 @@ extension NSDictionary { var options = Set() for (rawKey, value) in self { - if let key = rawKey as? String, opt = NSDictionary.keyValueToSocketIOClientOption(key, value: value) { + if let key = rawKey as? String, let opt = NSDictionary.keyValueToSocketIOClientOption(key, value: value) { options.insertIgnore(opt) } } diff --git a/Source/WebSocket/SSLSecurity.swift b/Source/WebSocket/SSLSecurity.swift index b93e55b..7ed067e 100644 --- a/Source/WebSocket/SSLSecurity.swift +++ b/Source/WebSocket/SSLSecurity.swift @@ -96,7 +96,7 @@ public class SSLSecurity : NSObject { DispatchQueue.global(attributes: DispatchQueue.GlobalAttributes.qosDefault).async { let pubKeys = certs.reduce([SecKey]()) { (pubKeys: [SecKey], cert: SSLCert) -> [SecKey] in var pubKeys = pubKeys - if let data = cert.certData where cert.key == nil { + if let data = cert.certData, cert.key == nil { cert.key = self.extractPublicKey(data) } if let key = cert.key { diff --git a/Source/WebSocket/WebSocket.swift b/Source/WebSocket/WebSocket.swift index 5dce627..73fc664 100644 --- a/Source/WebSocket/WebSocket.swift +++ b/Source/WebSocket/WebSocket.swift @@ -305,7 +305,7 @@ public class WebSocket : NSObject, StreamDelegate { } if let cipherSuites = self.enabledSSLCipherSuites { if let sslContextIn = CFReadStreamCopyProperty(inputStream, CFStreamPropertyKey(rawValue: kCFStreamPropertySSLContext)) as! SSLContext?, - sslContextOut = CFWriteStreamCopyProperty(outputStream, CFStreamPropertyKey(rawValue: kCFStreamPropertySSLContext)) as! SSLContext? { + let sslContextOut = CFWriteStreamCopyProperty(outputStream, CFStreamPropertyKey(rawValue: kCFStreamPropertySSLContext)) as! SSLContext? { let resIn = SSLSetEnabledCiphers(sslContextIn, cipherSuites, cipherSuites.count) let resOut = SSLSetEnabledCiphers(sslContextOut, cipherSuites, cipherSuites.count) if resIn != errSecSuccess { @@ -349,7 +349,7 @@ public class WebSocket : NSObject, StreamDelegate { //delegate for the stream methods. Processes incoming bytes public func stream(_ aStream: Stream, handle eventCode: Stream.Event) { - if let sec = security where !certValidated && [.hasBytesAvailable, .hasSpaceAvailable].contains(eventCode) { + if let sec = security, !certValidated && [.hasBytesAvailable, .hasSpaceAvailable].contains(eventCode) { let possibleTrust: AnyObject? = aStream.property(forKey: kCFStreamPropertySSLPeerTrust as Stream.PropertyKey) if let trust: AnyObject = possibleTrust { let domain: AnyObject? = aStream.property(forKey: kCFStreamSSLPeerName as Stream.PropertyKey) @@ -534,7 +534,7 @@ public class WebSocket : NSObject, StreamDelegate { } /// Process one message at the start of `buffer`. Return another buffer (sharing storage) that contains the leftover contents of `buffer` that I didn't process. - @warn_unused_result + private func processOneRawMessage(inBuffer buffer: UnsafeBufferPointer) -> UnsafeBufferPointer { let response = readStack.last guard let baseAddress = buffer.baseAddress else { fatalError("") } @@ -543,7 +543,7 @@ public class WebSocket : NSObject, StreamDelegate { fragBuffer = Data(buffer: buffer) return emptyBuffer } - if let response = response where response.bytesLeft > 0 { + if let response = response, response.bytesLeft > 0 { var len = response.bytesLeft var extra = bufferLen - response.bytesLeft if response.bytesLeft > bufferLen { @@ -612,10 +612,10 @@ public class WebSocket : NSObject, StreamDelegate { var dataLength = UInt64(payloadLen) if dataLength == 127 { dataLength = WebSocket.readUint64(baseAddress, offset: offset) - offset += sizeof(UInt64) + offset += sizeof(UInt64.self) } else if dataLength == 126 { dataLength = UInt64(WebSocket.readUint16(baseAddress, offset: offset)) - offset += sizeof(UInt16) + offset += sizeof(UInt16.self) } if bufferLen < offset || UInt64(bufferLen - offset) < dataLength { fragBuffer = Data(bytes: baseAddress, count: bufferLen) @@ -754,10 +754,10 @@ public class WebSocket : NSObject, StreamDelegate { ///write a an error to the socket private func writeError(_ code: UInt16) { - let buf = NSMutableData(capacity: sizeof(UInt16)) + let buf = NSMutableData(capacity: sizeof(UInt16.self)) let buffer = UnsafeMutablePointer(buf!.bytes) WebSocket.writeUint16(buffer, offset: 0, value: code) - dequeueWrite(Data(bytes: buffer, count: sizeof(UInt16)), code: .connectionClose) + dequeueWrite(Data(bytes: buffer, count: sizeof(UInt16.self)), code: .connectionClose) } ///used to write things to the stream private func dequeueWrite(_ data: Data, code: OpCode, writeCompletion: (() -> ())? = nil) { @@ -775,19 +775,19 @@ public class WebSocket : NSObject, StreamDelegate { } else if dataLength <= Int(UInt16.max) { buffer[1] = 126 WebSocket.writeUint16(buffer, offset: offset, value: UInt16(dataLength)) - offset += sizeof(UInt16) + offset += sizeof(UInt16.self) } else { buffer[1] = 127 WebSocket.writeUint64(buffer, offset: offset, value: UInt64(dataLength)) - offset += sizeof(UInt64) + offset += sizeof(UInt64.self) } buffer[1] |= s.MaskMask let maskKey = UnsafeMutablePointer(buffer + offset) - SecRandomCopyBytes(kSecRandomDefault, Int(sizeof(UInt32)), maskKey) - offset += sizeof(UInt32) + _ = SecRandomCopyBytes(kSecRandomDefault, Int(sizeof(UInt32.self)), maskKey) + offset += sizeof(UInt32.self) for i in 0..= offset { - if let queue = self?.queue, callback = writeCompletion { - queue.asynchronously() { + if let queue = self?.queue, let callback = writeCompletion { + queue.async { callback() } }