diff --git a/.gitignore b/.gitignore index 8fcf4d1..2f7122e 100644 --- a/.gitignore +++ b/.gitignore @@ -42,3 +42,5 @@ DerivedData *.hmap *.ipa *.xcuserstate + +Socket.IO-Test-Server/node_modules/* diff --git a/README.md b/README.md index 776c43a..cf03197 100644 --- a/README.md +++ b/README.md @@ -26,11 +26,11 @@ socket.connect() ```objective-c SocketIOClient* socket = [[SocketIOClient alloc] initWithSocketURL:@"localhost:8080" options:nil]; -[socket on:@"connect" callback:^(NSArray* data, void (^ack)(NSArray*)) { +[socket onObjectiveC:@"connect" callback:^(NSArray* data, void (^ack)(NSArray*)) { NSLog(@"socket connected"); }]; -[socket on:@"currentAmount" callback:^(NSArray* data, void (^ack)(NSArray*)) { +[socket onObjectiveC:@"currentAmount" callback:^(NSArray* data, void (^ack)(NSArray*)) { double cur = [[data objectAtIndex:0] floatValue]; [socket emitWithAck:@"canUpdate" withItems:@[@(cur)]](0, ^(NSArray* data) { @@ -126,17 +126,18 @@ Options Methods ------- 1. `on(name:String, callback:((data:NSArray?, ack:AckEmitter?) -> Void))` - Adds a handler for an event. Items are passed by an array. `ack` can be used to send an ack when one is requested. See example. -2. `onAny(callback:((event:String, items:AnyObject?)) -> Void)` - Adds a handler for all events. It will be called on any received event. -3. `emit(event:String, _ items:AnyObject...)` - Sends a message. Can send multiple items. -4. `emit(event:String, withItems items:[AnyObject])` - `emit` for Objective-C -5. `emitWithAck(event:String, _ items:AnyObject...) -> (timeoutAfter:UInt64, callback:(NSArray?) -> Void) -> Void` - Sends a message that requests an acknowledgement from the server. Returns a function which you can use to add a handler. See example. Note: The message is not sent until you call the returned function. -6. `emitWithAck(event:String, withItems items:[AnyObject]) -> (UInt64, (NSArray?) -> Void) -> Void` - `emitWithAck` for Objective-C. Note: The message is not sent until you call the returned function. -7. `connect()` - Establishes a connection to the server. A "connect" event is fired upon successful connection. -8. `connect(#timeoutAfter:Int, withTimeoutHandler handler:(() -> Void)?)` - Connect to the server. If it isn't connected after timeoutAfter seconds, the handler is called. -9. `close(#fast:Bool)` - Closes the socket. Once a socket is closed it should not be reopened. Pass true to fast if you're closing from a background task. -10. `reconnect()` - Causes the client to reconnect to the server. -11. `joinNamespace()` - Causes the client to join nsp. Shouldn't need to be called unless you change nsp manually. -12. `leaveNamespace()` - Causes the client to leave the nsp and go back to / +2. `onObjectiveC(name:String, callback:((data:NSArray?, ack:AckEmitter?) -> Void))` - Adds a handler for an event. Items are passed by an array. `ack` can be used to send an ack when one is requested. See example. +3. `onAny(callback:((event:String, items:AnyObject?)) -> Void)` - Adds a handler for all events. It will be called on any received event. +4. `emit(event:String, _ items:AnyObject...)` - Sends a message. Can send multiple items. +5. `emit(event:String, withItems items:[AnyObject])` - `emit` for Objective-C +6. `emitWithAck(event:String, _ items:AnyObject...) -> (timeoutAfter:UInt64, callback:(NSArray?) -> Void) -> Void` - Sends a message that requests an acknowledgement from the server. Returns a function which you can use to add a handler. See example. Note: The message is not sent until you call the returned function. +7. `emitWithAck(event:String, withItems items:[AnyObject]) -> (UInt64, (NSArray?) -> Void) -> Void` - `emitWithAck` for Objective-C. Note: The message is not sent until you call the returned function. +8. `connect()` - Establishes a connection to the server. A "connect" event is fired upon successful connection. +9. `connect(#timeoutAfter:Int, withTimeoutHandler handler:(() -> Void)?)` - Connect to the server. If it isn't connected after timeoutAfter seconds, the handler is called. +10. `close(#fast:Bool)` - Closes the socket. Once a socket is closed it should not be reopened. Pass true to fast if you're closing from a background task. +11. `reconnect()` - Causes the client to reconnect to the server. +12. `joinNamespace()` - Causes the client to join nsp. Shouldn't need to be called unless you change nsp manually. +13. `leaveNamespace()` - Causes the client to leave the nsp and go back to / Client Events ------ diff --git a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj index a54247f..653762f 100644 --- a/Socket.IO-Client-Swift.xcodeproj/project.pbxproj +++ b/Socket.IO-Client-Swift.xcodeproj/project.pbxproj @@ -9,7 +9,6 @@ /* 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 */; }; - 572EF22C1B51F16C00EEBB58 /* SocketIO_iOSTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 572EF22B1B51F16C00EEBB58 /* SocketIO_iOSTests.swift */; }; 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 */; }; 572EF24A1B51F18A00EEBB58 /* SocketIO_MacTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 572EF2491B51F18A00EEBB58 /* SocketIO_MacTests.swift */; }; @@ -39,6 +38,26 @@ 5764DFA01B51F254004FF46E /* SwiftRegex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF871B51F254004FF46E /* SwiftRegex.swift */; }; 5764DFA11B51F254004FF46E /* WebSocket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF881B51F254004FF46E /* WebSocket.swift */; }; 5764DFA21B51F254004FF46E /* WebSocket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF881B51F254004FF46E /* WebSocket.swift */; }; + 941A4ABA1B67A56C00C42318 /* TestKind.swift in Sources */ = {isa = PBXBuildFile; fileRef = 941A4AB91B67A56C00C42318 /* TestKind.swift */; }; + 94242BB81B67B0E500AAAC9D /* SocketNamespaceAcknowledgementTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94242BB71B67B0E500AAAC9D /* SocketNamespaceAcknowledgementTest.swift */; }; + 945B65351B5FCEEA0081E995 /* SocketAckManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF7C1B51F254004FF46E /* SocketAckManager.swift */; }; + 945B65361B5FCEEA0081E995 /* SocketAnyEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF7D1B51F254004FF46E /* SocketAnyEvent.swift */; }; + 945B65371B5FCEEA0081E995 /* SocketEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF7E1B51F254004FF46E /* SocketEngine.swift */; }; + 945B65381B5FCEEA0081E995 /* SocketEngineClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF7F1B51F254004FF46E /* SocketEngineClient.swift */; }; + 945B65391B5FCEEA0081E995 /* SocketEventHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF801B51F254004FF46E /* SocketEventHandler.swift */; }; + 945B653A1B5FCEEA0081E995 /* SocketFixUTF8.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF811B51F254004FF46E /* SocketFixUTF8.swift */; }; + 945B653B1B5FCEEA0081E995 /* SocketIOClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF821B51F254004FF46E /* SocketIOClient.swift */; }; + 945B653C1B5FCEEA0081E995 /* SocketLogger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF831B51F254004FF46E /* SocketLogger.swift */; }; + 945B653D1B5FCEEA0081E995 /* SocketPacket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF841B51F254004FF46E /* SocketPacket.swift */; }; + 945B653E1B5FCEEA0081E995 /* SocketParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF851B51F254004FF46E /* SocketParser.swift */; }; + 945B653F1B5FCEEA0081E995 /* SocketTypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF861B51F254004FF46E /* SocketTypes.swift */; }; + 945B65401B5FCEEA0081E995 /* SwiftRegex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF871B51F254004FF46E /* SwiftRegex.swift */; }; + 945B65411B5FCEEA0081E995 /* WebSocket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF881B51F254004FF46E /* WebSocket.swift */; }; + 945B65431B63D9DB0081E995 /* SocketEmitTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 945B65421B63D9DB0081E995 /* SocketEmitTest.swift */; }; + 94ADAC491B652D3300FD79AE /* SocketNamespaceEmitTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94ADAC481B652D3300FD79AE /* SocketNamespaceEmitTest.swift */; }; + 94ADAC4B1B6632DD00FD79AE /* SocketAcknowledgementTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94ADAC4A1B6632DD00FD79AE /* SocketAcknowledgementTest.swift */; }; + 94CB8F0B1B6E48B90019ED53 /* SocketTestCases.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94CB8F0A1B6E48B90019ED53 /* SocketTestCases.swift */; }; + 94CB8F0D1B6E66E60019ED53 /* AbstractSocketTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94CB8F0C1B6E66E60019ED53 /* AbstractSocketTest.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -64,7 +83,6 @@ 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 = ""; }; - 572EF22B1B51F16C00EEBB58 /* SocketIO_iOSTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SocketIO_iOSTests.swift; sourceTree = ""; }; 572EF2381B51F18A00EEBB58 /* SocketIO.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SocketIO.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 = ""; }; @@ -84,6 +102,13 @@ 5764DF861B51F254004FF46E /* SocketTypes.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SocketTypes.swift; path = SocketIOClientSwift/SocketTypes.swift; sourceTree = ""; }; 5764DF871B51F254004FF46E /* SwiftRegex.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SwiftRegex.swift; path = SocketIOClientSwift/SwiftRegex.swift; sourceTree = ""; }; 5764DF881B51F254004FF46E /* WebSocket.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = WebSocket.swift; path = SocketIOClientSwift/WebSocket.swift; sourceTree = ""; }; + 941A4AB91B67A56C00C42318 /* TestKind.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestKind.swift; sourceTree = ""; }; + 94242BB71B67B0E500AAAC9D /* SocketNamespaceAcknowledgementTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketNamespaceAcknowledgementTest.swift; sourceTree = ""; }; + 945B65421B63D9DB0081E995 /* SocketEmitTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketEmitTest.swift; sourceTree = ""; }; + 94ADAC481B652D3300FD79AE /* SocketNamespaceEmitTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketNamespaceEmitTest.swift; sourceTree = ""; }; + 94ADAC4A1B6632DD00FD79AE /* SocketAcknowledgementTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketAcknowledgementTest.swift; sourceTree = ""; }; + 94CB8F0A1B6E48B90019ED53 /* SocketTestCases.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketTestCases.swift; sourceTree = ""; }; + 94CB8F0C1B6E66E60019ED53 /* AbstractSocketTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AbstractSocketTest.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -163,7 +188,13 @@ 572EF2281B51F16C00EEBB58 /* SocketIO-iOSTests */ = { isa = PBXGroup; children = ( - 572EF22B1B51F16C00EEBB58 /* SocketIO_iOSTests.swift */, + 945B65421B63D9DB0081E995 /* SocketEmitTest.swift */, + 94ADAC4A1B6632DD00FD79AE /* SocketAcknowledgementTest.swift */, + 94ADAC481B652D3300FD79AE /* SocketNamespaceEmitTest.swift */, + 94242BB71B67B0E500AAAC9D /* SocketNamespaceAcknowledgementTest.swift */, + 941A4AB91B67A56C00C42318 /* TestKind.swift */, + 94CB8F0A1B6E48B90019ED53 /* SocketTestCases.swift */, + 94CB8F0C1B6E66E60019ED53 /* AbstractSocketTest.swift */, 572EF2291B51F16C00EEBB58 /* Supporting Files */, ); path = "SocketIO-iOSTests"; @@ -424,7 +455,26 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 572EF22C1B51F16C00EEBB58 /* SocketIO_iOSTests.swift in Sources */, + 945B653E1B5FCEEA0081E995 /* SocketParser.swift in Sources */, + 945B653D1B5FCEEA0081E995 /* SocketPacket.swift in Sources */, + 945B653A1B5FCEEA0081E995 /* SocketFixUTF8.swift in Sources */, + 945B65391B5FCEEA0081E995 /* SocketEventHandler.swift in Sources */, + 94CB8F0B1B6E48B90019ED53 /* SocketTestCases.swift in Sources */, + 945B65371B5FCEEA0081E995 /* SocketEngine.swift in Sources */, + 945B65351B5FCEEA0081E995 /* SocketAckManager.swift in Sources */, + 941A4ABA1B67A56C00C42318 /* TestKind.swift in Sources */, + 94CB8F0D1B6E66E60019ED53 /* AbstractSocketTest.swift in Sources */, + 945B65431B63D9DB0081E995 /* SocketEmitTest.swift in Sources */, + 945B65401B5FCEEA0081E995 /* SwiftRegex.swift in Sources */, + 945B653C1B5FCEEA0081E995 /* SocketLogger.swift in Sources */, + 945B65381B5FCEEA0081E995 /* SocketEngineClient.swift in Sources */, + 945B65361B5FCEEA0081E995 /* SocketAnyEvent.swift in Sources */, + 94ADAC4B1B6632DD00FD79AE /* SocketAcknowledgementTest.swift in Sources */, + 945B653F1B5FCEEA0081E995 /* SocketTypes.swift in Sources */, + 945B653B1B5FCEEA0081E995 /* SocketIOClient.swift in Sources */, + 94ADAC491B652D3300FD79AE /* SocketNamespaceEmitTest.swift in Sources */, + 945B65411B5FCEEA0081E995 /* WebSocket.swift in Sources */, + 94242BB81B67B0E500AAAC9D /* SocketNamespaceAcknowledgementTest.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 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 e9b0653..baf02a7 100644 --- a/Socket.IO-Client-Swift.xcodeproj/xcshareddata/xcschemes/SocketIO-iOS.xcscheme +++ b/Socket.IO-Client-Swift.xcodeproj/xcshareddata/xcschemes/SocketIO-iOS.xcscheme @@ -37,10 +37,11 @@ + codeCoverageEnabled = "YES"> @@ -62,15 +63,18 @@ ReferencedContainer = "container:Socket.IO-Client-Swift.xcodeproj"> + + String { + return rawTestName + testKind!.rawValue + } + + func checkConnectionStatus() { + XCTAssertTrue(socket.connected) + XCTAssertFalse(socket.connecting) + XCTAssertFalse(socket.reconnecting) + XCTAssertFalse(socket.closed) + XCTAssertFalse(socket.secure) + } + + func socketMultipleEmit(testName:String, emitData:Array, callback:NormalCallback){ + let finalTestname = generateTestName(testName) + weak var expection = self.expectationWithDescription(finalTestname) + func didGetEmit(result:NSArray?, ack:AckEmitter?) { + callback(result, ack) + if let expection = expection { + expection.fulfill() + } + } + + socket.emit(finalTestname, withItems: emitData) + socket.on(finalTestname + "Return", callback: didGetEmit) + waitForExpectationsWithTimeout(SocketEmitTest.TEST_TIMEOUT, handler: nil) + } + + + func socketEmit(testName:String, emitData:AnyObject?, callback:NormalCallback){ + let finalTestname = generateTestName(testName) + weak var expection = self.expectationWithDescription(finalTestname) + func didGetEmit(result:NSArray?, ack:AckEmitter?) { + callback(result, ack) + if let expection = expection { + expection.fulfill() + } + + } + + socket.on(finalTestname + "Return", callback: didGetEmit) + if let emitData = emitData { + socket.emit(finalTestname, emitData) + } else { + socket.emit(finalTestname) + } + + waitForExpectationsWithTimeout(SocketEmitTest.TEST_TIMEOUT, handler: nil) + } + + func socketAcknwoledgeMultiple(testName:String, Data:Array, callback:NormalCallback){ + let finalTestname = generateTestName(testName) + weak var expection = self.expectationWithDescription(finalTestname) + func didGetResult(result:NSArray?) { + callback(result, nil) + if let expection = expection { + expection.fulfill() + } + } + + socket.emitWithAck(finalTestname, withItems: Data)(timeoutAfter: 5, callback: didGetResult) + waitForExpectationsWithTimeout(SocketEmitTest.TEST_TIMEOUT, handler: nil) + } + + func socketAcknwoledge(testName:String, Data:AnyObject?, callback:NormalCallback){ + let finalTestname = generateTestName(testName) + weak var expection = self.expectationWithDescription(finalTestname) + func didGet(result:NSArray?) { + callback(result, nil) + if let expection = expection { + expection.fulfill() + } + } + var ack:OnAckCallback! + if let Data = Data { + ack = socket.emitWithAck(finalTestname, Data) + } else { + ack = socket.emitWithAck(finalTestname) + } + ack(timeoutAfter: 20, callback: didGet) + + waitForExpectationsWithTimeout(SocketEmitTest.TEST_TIMEOUT, handler: nil) + } +} diff --git a/SocketIO-iOSTests/SocketAcknowledgementTest.swift b/SocketIO-iOSTests/SocketAcknowledgementTest.swift new file mode 100644 index 0000000..801e852 --- /dev/null +++ b/SocketIO-iOSTests/SocketAcknowledgementTest.swift @@ -0,0 +1,82 @@ +// +// SocketAcknowledgementTest.swift +// Socket.IO-Client-Swift +// +// Created by Lukas Schmidt on 27.07.15. +// +// + +import XCTest + +class SocketAcknowledgementTest: AbstractSocketTest { + + override func setUp() { + super.setUp() + testKind = TestKind.Acknowledgement + socket = SocketIOClient(socketURL: "127.0.0.1:8080", opts: [ + "reconnects": true, // default true + "reconnectAttempts": -1, // default -1 + "reconnectWait": 5, // default 10 + "forcePolling": false, + "forceWebsockets": false,// default false + "path": ""]) + openConnection() + } + + func testConnectionStatus() { + super.checkConnectionStatus() + } + + func testBasic() { + SocketTestCases.testBasic(socketAcknwoledge) + } + + func testNull() { + SocketTestCases.testNull(socketAcknwoledge) + } + + func testBinary() { + SocketTestCases.testBinary(socketAcknwoledge) + } + + func testArray() { + SocketTestCases.testArray(socketAcknwoledge) + } + + func testString() { + SocketTestCases.testString(socketAcknwoledge) + } + + func testBool() { + SocketTestCases.testBool(socketAcknwoledge) + } + + func testInteger() { + SocketTestCases.testInteger(socketAcknwoledge) + } + + func testDouble() { + SocketTestCases.testDouble(socketAcknwoledge) + } + + func testJSON() { + SocketTestCases.testJSON(socketAcknwoledge) + } + + func testJSONWithBuffer() { + SocketTestCases.testJSONWithBuffer(socketAcknwoledge) + } + + func testUnicode() { + SocketTestCases.testUnicode(socketAcknwoledge) + } + + func testMultipleItems() { + SocketTestCases.testMultipleItems(socketAcknwoledgeMultiple) + } + + func testMultipleWithBuffer() { + SocketTestCases.testMultipleItemsWithBuffer(socketAcknwoledgeMultiple) + } + +} diff --git a/SocketIO-iOSTests/SocketEmitTest.swift b/SocketIO-iOSTests/SocketEmitTest.swift new file mode 100644 index 0000000..a970444 --- /dev/null +++ b/SocketIO-iOSTests/SocketEmitTest.swift @@ -0,0 +1,88 @@ +// +// ConvertedSocketTest.swift +// Socket.IO-Client-Swift +// +// Created by Lukas Schmidt on 25.07.15. +// +// + +import XCTest +import Foundation + +class SocketEmitTest: AbstractSocketTest { + override func setUp() { + super.setUp() + testKind = TestKind.Emit + socket = SocketIOClient(socketURL: "127.0.0.1:8080", opts: [ + "reconnects": true, // default true + "reconnectAttempts": -1, // default -1 + "reconnectWait": 5, // default 10 + "forcePolling": false, + "forceWebsockets": false,// default false + "path": ""] + ) + openConnection() + } + + override func tearDown() { + socket.close(fast: false) + super.tearDown() + } + + func testConnectionStatus() { + super.checkConnectionStatus() + } + + func testBasic() { + SocketTestCases.testBasic(socketEmit) + } + + func testNull() { + SocketTestCases.testNull(socketEmit) + } + + func testBinary() { + SocketTestCases.testBinary(socketEmit) + } + + func testArray() { + SocketTestCases.testArray(socketEmit) + } + + func testString() { + SocketTestCases.testString(socketEmit) + } + + func testBool() { + SocketTestCases.testBool(socketEmit) + } + + func testInteger() { + SocketTestCases.testInteger(socketEmit) + } + + func testDouble() { + SocketTestCases.testDouble(socketEmit) + } + + func testJSON() { + SocketTestCases.testJSON(socketEmit) + } + + func testJSONWithBuffer() { + SocketTestCases.testJSONWithBuffer(socketEmit) + } + + func testUnicode() { + SocketTestCases.testUnicode(socketEmit) + } + + func testMultipleItems() { + SocketTestCases.testMultipleItems(socketMultipleEmit) + } + + func testMultipleWithBuffer() { + SocketTestCases.testMultipleItemsWithBuffer(socketMultipleEmit) + } + +} diff --git a/SocketIO-iOSTests/SocketIO_iOSTests.swift b/SocketIO-iOSTests/SocketIO_iOSTests.swift deleted file mode 100644 index 8e9aad8..0000000 --- a/SocketIO-iOSTests/SocketIO_iOSTests.swift +++ /dev/null @@ -1,36 +0,0 @@ -// -// SocketIO_iOSTests.swift -// SocketIO-iOSTests -// -// Created by Nacho Soto on 7/11/15. -// -// - -import UIKit -import XCTest - -class SocketIO_iOSTests: XCTestCase { - - override func setUp() { - super.setUp() - // Put setup code here. This method is called before the invocation of each test method in the class. - } - - override func tearDown() { - // Put teardown code here. This method is called after the invocation of each test method in the class. - super.tearDown() - } - - func testExample() { - // This is an example of a functional test case. - XCTAssert(true, "Pass") - } - - func testPerformanceExample() { - // This is an example of a performance test case. - self.measureBlock() { - // Put the code you want to measure the time of here. - } - } - -} diff --git a/SocketIO-iOSTests/SocketNamespaceAcknowledgementTest.swift b/SocketIO-iOSTests/SocketNamespaceAcknowledgementTest.swift new file mode 100644 index 0000000..d25fecf --- /dev/null +++ b/SocketIO-iOSTests/SocketNamespaceAcknowledgementTest.swift @@ -0,0 +1,82 @@ +// +// SocketNamespaceAcknowledgementTest.swift +// Socket.IO-Client-Swift +// +// Created by Lukas Schmidt on 28.07.15. +// +// + +import XCTest + +class SocketNamespaceAcknowledgementTest: AbstractSocketTest { + + override func setUp() { + super.setUp() + testKind = TestKind.Acknowledgement + socket = SocketIOClient(socketURL: "127.0.0.1:8080", opts: [ + "reconnects": true, // default true + "reconnectAttempts": -1, // default -1 + "reconnectWait": 5, // default 10 + "forcePolling": false, + "forceWebsockets": false,// default false + "path": "", + "nsp": "/swift"]) + openConnection() + } + + func testConnectionStatus() { + super.checkConnectionStatus() + } + + func testBasic() { + SocketTestCases.testBasic(socketAcknwoledge) + } + + func testNull() { + SocketTestCases.testNull(socketAcknwoledge) + } + + func testBinary() { + SocketTestCases.testBinary(socketAcknwoledge) + } + + func testArray() { + SocketTestCases.testArray(socketAcknwoledge) + } + + func testString() { + SocketTestCases.testString(socketAcknwoledge) + } + + func testBool() { + SocketTestCases.testBool(socketAcknwoledge) + } + + func testInteger() { + SocketTestCases.testInteger(socketAcknwoledge) + } + + func testDouble() { + SocketTestCases.testDouble(socketAcknwoledge) + } + + func testJSON() { + SocketTestCases.testJSON(socketAcknwoledge) + } + + func testJSONWithBuffer() { + SocketTestCases.testJSONWithBuffer(socketAcknwoledge) + } + + func testUnicode() { + SocketTestCases.testUnicode(socketAcknwoledge) + } + + func testMultipleItems() { + SocketTestCases.testMultipleItems(socketAcknwoledgeMultiple) + } + + func testMultipleWithBuffer() { + SocketTestCases.testMultipleItemsWithBuffer(socketAcknwoledgeMultiple) + } +} diff --git a/SocketIO-iOSTests/SocketNamespaceEmitTest.swift b/SocketIO-iOSTests/SocketNamespaceEmitTest.swift new file mode 100644 index 0000000..057fcc1 --- /dev/null +++ b/SocketIO-iOSTests/SocketNamespaceEmitTest.swift @@ -0,0 +1,83 @@ +// +// SocketNamespaceEmitTest.swift +// Socket.IO-Client-Swift +// +// Created by Lukas Schmidt on 26.07.15. +// +// + +import XCTest + +class SocketNamespaceEmitTest: AbstractSocketTest { + + override func setUp() { + super.setUp() + testKind = TestKind.Emit + socket = SocketIOClient(socketURL: "127.0.0.1:8080", opts: [ + "reconnects": true, // default true + "reconnectAttempts": -1, // default -1 + "reconnectWait": 5, // default 10 + "forcePolling": false, + "forceWebsockets": false,// default false + "path": "", + "nsp": "/swift"]) + openConnection() + } + + func testConnectionStatus() { + super.checkConnectionStatus() + } + + func testBasic() { + SocketTestCases.testBasic(socketEmit) + } + + func testNull() { + SocketTestCases.testNull(socketEmit) + } + + func testBinary() { + SocketTestCases.testBinary(socketEmit) + } + + func testArray() { + SocketTestCases.testArray(socketEmit) + } + + func testString() { + SocketTestCases.testString(socketEmit) + } + + func testBool() { + SocketTestCases.testBool(socketEmit) + } + + func testInteger() { + SocketTestCases.testInteger(socketEmit) + } + + func testDouble() { + SocketTestCases.testDouble(socketEmit) + } + + func testJSON() { + SocketTestCases.testJSON(socketEmit) + } + + func testJSONWithBuffer() { + SocketTestCases.testJSONWithBuffer(socketEmit) + } + + func testUnicode() { + SocketTestCases.testUnicode(socketEmit) + } + + func testMultipleItems() { + SocketTestCases.testMultipleItems(socketMultipleEmit) + } + + func testMultipleWithBuffer() { + SocketTestCases.testMultipleItemsWithBuffer(socketMultipleEmit) + } + +} diff --git a/SocketIO-iOSTests/SocketTestCases.swift b/SocketIO-iOSTests/SocketTestCases.swift new file mode 100644 index 0000000..e17718e --- /dev/null +++ b/SocketIO-iOSTests/SocketTestCases.swift @@ -0,0 +1,246 @@ +// +// SocketTestCases.swift +// Socket.IO-Client-Swift +// +// Created by Lukas Schmidt on 02.08.15. +// +// + +import XCTest +import Foundation + +class SocketTestCases: NSObject { + typealias SocketSendFunction = (testName:String, emitData:AnyObject?, callback:NormalCallback)->() + + static func testBasic(abstractSocketSend:SocketSendFunction) { + let testName = "basicTest" + func didGetResult(result:NSArray?, ack:AckEmitter?) { + + } + abstractSocketSend(testName: testName, emitData: nil, callback: didGetResult) + } + + static func testNull(abstractSocketSend:SocketSendFunction) { + let testName = "testNull" + func didGetResult(result:NSArray?, ack:AckEmitter?) { + if let _ = result?.firstObject as? NSNull { + + }else + { + XCTFail("Should have NSNull as result") + } + } + abstractSocketSend(testName: testName, emitData: NSNull(), callback: didGetResult) + } + + static func testBinary(abstractSocketSend:SocketSendFunction) { + let testName = "testBinary" + func didGetResult(result:NSArray?, ack:AckEmitter?) { + if let data = result?.firstObject as? NSData { + let string = NSString(data: data, encoding: NSUTF8StringEncoding)! + XCTAssertEqual(string, "gakgakgak2") + }else { + XCTFail("Should have NSData as result") + } + } + let data = NSString(string: "gakgakgak2").dataUsingEncoding(NSUTF8StringEncoding)! + abstractSocketSend(testName: testName, emitData: data, callback: didGetResult) + } + + static func testArray(abstractSocketSend:SocketSendFunction) { + let testName = "testArray" + func didGetResult(result:NSArray?, ack:AckEmitter?) { + if let array = result?.firstObject as? NSArray { + XCTAssertEqual(array.count, 2) + XCTAssertEqual(array.firstObject! as! String, "test3") + XCTAssertEqual(array.lastObject! as! String, "test4") + }else { + XCTFail("Should have NSArray as result") + } + } + abstractSocketSend(testName: testName, emitData: ["test1", "test2"], callback: didGetResult) + } + + static func testString(abstractSocketSend:SocketSendFunction) { + let testName = "testString" + func didGetResult(result:NSArray?, ack:AckEmitter?) { + if let string = result?.firstObject as? String { + XCTAssertEqual(string, "polo") + }else { + XCTFail("Should have String as result") + } + } + abstractSocketSend(testName: testName, emitData: "marco", callback: didGetResult) + } + + static func testBool(abstractSocketSend:SocketSendFunction) { + let testName = "testBool" + func didGetResult(result:NSArray?, ack:AckEmitter?) { + if let bool = result?.firstObject as? NSNumber { + XCTAssertTrue(bool.boolValue) + }else { + XCTFail("Should have Boolean as result") + } + } + abstractSocketSend(testName: testName, emitData: false, callback: didGetResult) + } + + static func testInteger(abstractSocketSend:SocketSendFunction) { + let testName = "testInteger" + func didGetResult(result:NSArray?, ack:AckEmitter?) { + if let integer = result?.firstObject as? Int { + XCTAssertEqual(integer, 20) + }else { + XCTFail("Should have Integer as result") + } + } + abstractSocketSend(testName: testName, emitData: 10, callback: didGetResult) + } + + static func testDouble(abstractSocketSend:SocketSendFunction) { + let testName = "testDouble" + func didGetResult(result:NSArray?, ack:AckEmitter?) { + if let double = result?.firstObject as? NSNumber { + XCTAssertEqual(double.floatValue, 1.2) + }else { + XCTFail("Should have Double as result") + } + } + abstractSocketSend(testName: testName, emitData: 1.1, callback: didGetResult) + } + + static func testJSONWithBuffer(abstractSocketSend:SocketSendFunction) { + let testName = "testJSONWithBuffer" + func didGetResult(result:NSArray?, ack:AckEmitter?) { + if let json = result?.firstObject as? NSDictionary { + XCTAssertEqual(json.valueForKey("testString")! as! String, "test") + XCTAssertEqual(json.valueForKey("testNumber")! as! Int, 15) + XCTAssertEqual((json.valueForKey("testArray")! as! Array).count, 2) + XCTAssertEqual((json.valueForKey("testArray")! as! Array).last! as! Int, 1) + let string = NSString(data: (json.valueForKey("testArray")! as! Array).first! as! NSData, encoding: NSUTF8StringEncoding)! + XCTAssertEqual(string, "gakgakgak2") + }else { + XCTFail("Should have NSDictionary as result") + } + } + let json = ["name": "test", "testArray": ["hallo"], "nestedTest": ["test": "test"], "number": 15] + + abstractSocketSend(testName: testName, emitData: json, callback: didGetResult) + } + + static func testJSON(abstractSocketSend:SocketSendFunction) { + let testName = "testJSON" + func didGetResult(result:NSArray?, ack:AckEmitter?) { + if let json = result?.firstObject as? NSDictionary { + XCTAssertEqual(json.valueForKey("testString")! as! String, "test") + XCTAssertEqual(json.valueForKey("testNumber")! as! Int, 15) + XCTAssertEqual((json.valueForKey("testArray")! as! Array).count, 2) + XCTAssertEqual((json.valueForKey("testArray")! as! Array).first! as! Int, 1) + XCTAssertEqual((json.valueForKey("testArray")! as! Array).last! as! Int, 1) + + }else { + XCTFail("Should have NSDictionary as result") + } + } + let json = ["name": "test", "testArray": ["hallo"], "nestedTest": ["test": "test"], "number": 15] + + abstractSocketSend(testName: testName, emitData: json, callback: didGetResult) + } + + static func testUnicode(abstractSocketSend:SocketSendFunction) { + let testName = "testUnicode" + func didGetResult(result:NSArray?, ack:AckEmitter?) { + if let unicode = result?.firstObject as? String { + XCTAssertEqual(unicode, "🚄") + }else { + XCTFail("Should have String as result") + } + } + abstractSocketSend(testName: testName, emitData: "🚀", callback: didGetResult) + } + + static func testMultipleItemsWithBuffer(abstractSocketMultipleSend:(testName:String, emitData:Array, callback:NormalCallback)->()) { + let testName = "testMultipleItemsWithBuffer" + func didGetResult(result:NSArray?, ack:AckEmitter?) { + XCTAssertEqual(result!.count, 5) + if result!.count != 5 { + XCTFail("Fatal Fail. Lost some Data") + return + } + if let array = result?.firstObject as? Array { + XCTAssertEqual(array.last! as! Int, 2) + XCTAssertEqual(array.first! as! Int, 1) + }else { + XCTFail("Should have Array as result") + } + if let dict = result?[1] as? NSDictionary { + XCTAssertEqual(dict.valueForKey("test") as! String, "bob") + + }else { + XCTFail("Should have NSDictionary as result") + } + if let number = result?[2] as? Int { + XCTAssertEqual(number, 25) + + }else { + XCTFail("Should have Integer as result") + } + if let string = result?[3] as? String { + XCTAssertEqual(string, "polo") + + }else { + XCTFail("Should have Integer as result") + } + if let data = result?[4] as? NSData { + let string = NSString(data: data, encoding: NSUTF8StringEncoding)! + XCTAssertEqual(string, "gakgakgak2") + }else { + XCTFail("Should have NSData as result") + } + } + let data = NSString(string: "gakgakgak2").dataUsingEncoding(NSUTF8StringEncoding)! + let emitArray = [["test1", "test2"], ["test": "test"], 15, "marco", data] + abstractSocketMultipleSend(testName: testName, emitData: emitArray, callback: didGetResult) + } + + static func testMultipleItems(abstractSocketMultipleSend:(testName:String, emitData:Array, callback:NormalCallback)->()) { + let testName = "testMultipleItems" + func didGetResult(result:NSArray?, ack:AckEmitter?) { + XCTAssertEqual(result!.count, 5) + if result!.count != 5 { + XCTFail("Fatal Fail. Lost some Data") + return + } + if let array = result?.firstObject as? Array { + XCTAssertEqual(array.last! as! Int, 2) + XCTAssertEqual(array.first! as! Int, 1) + }else { + XCTFail("Should have Array as result") + } + if let dict = result?[1] as? NSDictionary { + XCTAssertEqual(dict.valueForKey("test") as! String, "bob") + + }else { + XCTFail("Should have NSDictionary as result") + } + if let number = result?[2] as? Int { + XCTAssertEqual(number, 25) + + }else { + XCTFail("Should have Integer as result") + } + if let string = result?[3] as? String { + XCTAssertEqual(string, "polo") + }else { + XCTFail("Should have Integer as result") + } + if let bool = result?[4] as? NSNumber { + XCTAssertFalse(bool.boolValue) + }else { + XCTFail("Should have NSNumber as result") + } + } + let emitArray = [["test1", "test2"], ["test": "test"], 15, "marco", false] + abstractSocketMultipleSend(testName: testName, emitData: emitArray, callback: didGetResult) + } +} diff --git a/SocketIO-iOSTests/TestKind.swift b/SocketIO-iOSTests/TestKind.swift new file mode 100644 index 0000000..d83c59b --- /dev/null +++ b/SocketIO-iOSTests/TestKind.swift @@ -0,0 +1,13 @@ +// +// TestKind.swift +// Socket.IO-Client-Swift +// +// Created by Lukas Schmidt on 28.07.15. +// +// + +import Foundation + +enum TestKind: String { + case Emit, Acknowledgement +} \ No newline at end of file diff --git a/SocketIOClientSwift/SocketAckManager.swift b/SocketIOClientSwift/SocketAckManager.swift index a68d247..c206109 100644 --- a/SocketIOClientSwift/SocketAckManager.swift +++ b/SocketIOClientSwift/SocketAckManager.swift @@ -25,38 +25,38 @@ import Foundation private struct SocketAck: Hashable, Equatable { - let ack:Int - var callback:AckCallback! - var hashValue:Int { + let ack: Int + var callback: AckCallback! + var hashValue: Int { return ack.hashValue } - init(ack:Int) { + init(ack: Int) { self.ack = ack } - init(ack:Int, callback:AckCallback) { + init(ack: Int, callback: AckCallback) { self.ack = ack self.callback = callback } } -private func <(lhs:SocketAck, rhs:SocketAck) -> Bool { +private func <(lhs: SocketAck, rhs: SocketAck) -> Bool { return lhs.ack < rhs.ack } -private func ==(lhs:SocketAck, rhs:SocketAck) -> Bool { +private func ==(lhs: SocketAck, rhs: SocketAck) -> Bool { return lhs.ack == rhs.ack } struct SocketAckManager { private var acks = Set(minimumCapacity: 1) - mutating func addAck(ack:Int, callback:AckCallback) { + mutating func addAck(ack: Int, callback: AckCallback) { acks.insert(SocketAck(ack: ack, callback: callback)) } - mutating func executeAck(ack:Int, items:[AnyObject]?) { + mutating func executeAck(ack: Int, items: [AnyObject]?) { let callback = acks.remove(SocketAck(ack: ack)) dispatch_async(dispatch_get_main_queue()) { @@ -64,7 +64,7 @@ struct SocketAckManager { } } - mutating func timeoutAck(ack:Int) { + mutating func timeoutAck(ack: Int) { let callback = acks.remove(SocketAck(ack: ack)) dispatch_async(dispatch_get_main_queue()) { diff --git a/SocketIOClientSwift/SocketAnyEvent.swift b/SocketIOClientSwift/SocketAnyEvent.swift index 9926bc5..3b3e97e 100644 --- a/SocketIOClientSwift/SocketAnyEvent.swift +++ b/SocketIOClientSwift/SocketAnyEvent.swift @@ -25,10 +25,10 @@ import Foundation public final class SocketAnyEvent: NSObject { - public let event:String! - public let items:NSArray? + public let event: String! + public let items: NSArray? - init(event:String, items:NSArray?) { + init(event: String, items: NSArray?) { self.event = event self.items = items } diff --git a/SocketIOClientSwift/SocketEngine.swift b/SocketIOClientSwift/SocketEngine.swift index c321833..92e873c 100644 --- a/SocketIOClientSwift/SocketEngine.swift +++ b/SocketIOClientSwift/SocketEngine.swift @@ -25,7 +25,7 @@ import Foundation public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { - private typealias Probe = (msg:String, type:PacketType, data:[NSData]?) + private typealias Probe = (msg: String, type: PacketType, data: [NSData]?) private typealias ProbeWaitQueue = [Probe] private let allowedCharacterSet = NSCharacterSet(charactersInString: "!*'();:@&=+$,/?%#[]\" {}").invertedSet @@ -37,12 +37,12 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { private var closed = false private var _connected = false - private var extraHeaders:[String: String]? + private var extraHeaders: [String: String]? private var fastUpgrade = false private var forcePolling = false private var forceWebsockets = false - private var pingInterval:Double? - private var pingTimer:NSTimer? + private var pingInterval: Double? + private var pingTimer: NSTimer? private var pingTimeout = 0.0 { didSet { pongsMissedMax = Int(pingTimeout / (pingInterval ?? 25)) @@ -61,25 +61,25 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { let logType = "SocketEngine" - var connected:Bool { + var connected: Bool { return _connected } - weak var client:SocketEngineClient? - var cookies:[NSHTTPCookie]? + weak var client: SocketEngineClient? + var cookies: [NSHTTPCookie]? var log = false - var polling:Bool { + var polling: Bool { return _polling } var sid = "" var socketPath = "" - var urlPolling:String? - var urlWebSocket:String? - var websocket:Bool { + var urlPolling: String? + var urlWebSocket: String? + var websocket: Bool { return _websocket } var ws:WebSocket? - public enum PacketType:Int { + public enum PacketType: Int { case OPEN = 0 case CLOSE = 1 case PING = 2 @@ -88,7 +88,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { case UPGRADE = 5 case NOOP = 6 - init?(str:String?) { + init?(str: String?) { if let value = Int(str ?? ""), raw = PacketType(rawValue: value) { self = raw } else { @@ -97,13 +97,13 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } } - public init(client:SocketEngineClient, sessionDelegate:NSURLSessionDelegate?) { + public init(client: SocketEngineClient, sessionDelegate: NSURLSessionDelegate?) { self.client = client self.session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration(), delegate: sessionDelegate, delegateQueue: workQueue) } - public convenience init(client:SocketEngineClient, opts:NSDictionary?) { + public convenience init(client: SocketEngineClient, opts: NSDictionary?) { self.init(client: client, sessionDelegate: opts?["sessionDelegate"] as? NSURLSessionDelegate) forceWebsockets = opts?["forceWebsockets"] as? Bool ?? false forcePolling = opts?["forcePolling"] as? Bool ?? false @@ -117,7 +117,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { SocketLogger.log("Engine is being deinit", client: self) } - public func close(fast fast:Bool) { + public func close(fast fast: Bool) { SocketLogger.log("Engine is being closed. Fast: %@", client: self, args: fast) pingTimer?.invalidate() @@ -133,7 +133,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { stopPolling() } - private func createBinaryDataForSend(data:NSData) -> (NSData?, String?) { + private func createBinaryDataForSend(data: NSData) -> (NSData?, String?) { if websocket { var byteArray = [UInt8](count: 1, repeatedValue: 0x0) byteArray[0] = 4 @@ -151,7 +151,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } } - private func createURLs(params:[String: AnyObject]?) -> (String?, String?) { + private func createURLs(params: [String: AnyObject]?) -> (String?, String?) { if client == nil { return (nil, nil) } @@ -159,8 +159,8 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { let path = socketPath == "" ? "/socket.io" : socketPath let url = "\(client!.socketURL)\(path)/?transport=" - var urlPolling:String - var urlWebSocket:String + var urlPolling: String + var urlWebSocket: String if client!.secure { urlPolling = "https://" + url + "polling" @@ -193,7 +193,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { return (urlPolling, urlWebSocket) } - private func createWebsocket(andConnect connect:Bool) { + private func createWebsocket(andConnect connect: Bool) { let wsUrl = urlWebSocket! + (sid == "" ? "" : "&sid=\(sid)") ws = WebSocket(url: NSURL(string: wsUrl)!, @@ -249,7 +249,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { doRequest(req) } - private func doRequest(req:NSMutableURLRequest) { + private func doRequest(req: NSMutableURLRequest) { if !polling { return } @@ -380,7 +380,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } } - private func checkIfMessageIsBase64Binary(var message:String) { + private func checkIfMessageIsBase64Binary(var message: String) { if message.hasPrefix("b4") { // binary in base64 string message.removeRange(Range(start: message.startIndex, @@ -395,7 +395,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } } - private func handleMessage(message:String) { + private func handleMessage(message: String) { if let client = client { dispatch_async(client.handleQueue) {[weak client] in client?.parseSocketMessage(message) @@ -407,7 +407,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { doPoll() } - private func handleOpen(openData:String) { + private func handleOpen(openData: String) { let mesData = openData.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)! do { @@ -437,7 +437,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } } - private func handlePong(pongMessage:String) { + private func handlePong(pongMessage: String) { pongsMissed = 0 // We should upgrade @@ -447,7 +447,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } // A poll failed, tell the client about it - private func handlePollingFailed(reason:String) { + private func handlePollingFailed(reason: String) { _connected = false ws?.disconnect() pingTimer?.invalidate() @@ -465,7 +465,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } } - public func open(opts:[String: AnyObject]? = nil) { + public func open(opts: [String: AnyObject]? = nil) { if connected { SocketLogger.err("Tried to open while connected", client: self) client?.didError("Tried to open while connected") @@ -504,7 +504,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } // Translatation of engine.io-parser#decodePayload - private func parsePollingMessage(str:String) { + private func parsePollingMessage(str: String) { if str.characters.count == 1 { return } @@ -557,7 +557,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } } - private func parseEngineData(data:NSData) { + private func parseEngineData(data: NSData) { if let client = client { dispatch_async(client.handleQueue) {[weak self] in self?.client?.parseBinaryData(data.subdataWithRange(NSMakeRange(1, data.length - 1))) @@ -565,7 +565,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } } - private func parseEngineMessage(var message:String, fromPolling:Bool) { + private func parseEngineMessage(var message: String, fromPolling: Bool) { SocketLogger.log("Got message: %@", client: self, args: message) if fromPolling { @@ -602,7 +602,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } /// Send an engine message (4) - public func send(msg:String, withData datas:[NSData]?) { + public func send(msg: String, withData datas: [NSData]?) { if probing { probeWait.append((msg, PacketType.MESSAGE, datas)) } else { @@ -624,7 +624,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { /// Send polling message. /// Only call on emitQueue - private func sendPollMessage(var msg:String, withType type:PacketType, + private func sendPollMessage(var msg: String, withType type: PacketType, datas:[NSData]? = nil) { SocketLogger.log("Sending poll: %@ as type: %@", client: self, args: msg, type.rawValue) @@ -648,7 +648,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { /// Send message on WebSockets /// Only call on emitQueue - private func sendWebSocketMessage(str:String, withType type:PacketType, + private func sendWebSocketMessage(str: String, withType type: PacketType, datas:[NSData]? = nil) { SocketLogger.log("Sending ws: %@ as type: %@", client: self, args: str, type.rawValue) @@ -696,7 +696,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { /** Write a message, independent of transport. */ - public func write(msg:String, withType type:PacketType, withData data:[NSData]?) { + public func write(msg: String, withType type: PacketType, withData data: [NSData]?) { dispatch_async(emitQueue) {[weak self] in if let this = self where this.connected { if this.websocket { @@ -715,7 +715,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { /** Write a message, independent of transport. For Objective-C. withData should be an NSArray of NSData */ - public func writeObjc(msg:String, withType type:Int, withData data:NSArray?) { + public func writeObjc(msg: String, withType type: Int, withData data: NSArray?) { if let pType = PacketType(rawValue: type) { var arr = [NSData]() @@ -744,7 +744,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } } - public func websocketDidDisconnect(socket:WebSocket, error:NSError?) { + public func websocketDidDisconnect(socket: WebSocket, error: NSError?) { websocketConnected = false probing = false @@ -770,11 +770,11 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { } } - public func websocketDidReceiveMessage(socket:WebSocket, text:String) { + public func websocketDidReceiveMessage(socket: WebSocket, text: String) { parseEngineMessage(text, fromPolling: false) } - public func websocketDidReceiveData(socket:WebSocket, data:NSData) { + public func websocketDidReceiveData(socket: WebSocket, data: NSData) { parseEngineData(data) } } diff --git a/SocketIOClientSwift/SocketEngineClient.swift b/SocketIOClientSwift/SocketEngineClient.swift index 3824722..fe16367 100644 --- a/SocketIOClientSwift/SocketEngineClient.swift +++ b/SocketIOClientSwift/SocketEngineClient.swift @@ -26,12 +26,12 @@ import Foundation @objc public protocol SocketEngineClient { - var handleQueue:dispatch_queue_t! {get} - var socketURL:String {get} - var secure:Bool {get} + var handleQueue: dispatch_queue_t! {get} + var socketURL: String {get} + var secure: Bool {get} - func didError(reason:AnyObject) - func engineDidClose(reason:String) - func parseSocketMessage(msg:String) - func parseBinaryData(data:NSData) + func didError(reason: AnyObject) + func engineDidClose(reason: String) + func parseSocketMessage(msg: String) + func parseBinaryData(data: NSData) } diff --git a/SocketIOClientSwift/SocketEventHandler.swift b/SocketIOClientSwift/SocketEventHandler.swift index 7b2d92b..f145600 100644 --- a/SocketIOClientSwift/SocketEventHandler.swift +++ b/SocketIOClientSwift/SocketEventHandler.swift @@ -24,24 +24,39 @@ import Foundation -private func emitAckCallback(socket:SocketIOClient?, num:Int?) - (items:AnyObject...) -> Void { +private func emitAckCallback(socket: SocketIOClient?, num: Int?) + (items: AnyObject...) -> Void { socket?.emitAck(num ?? -1, withData: items) } +private func emitAckCallbackObjectiveC(socket: SocketIOClient?, num: Int?) + (items: NSArray) -> Void { + socket?.emitAck(num ?? -1, withData: items as [AnyObject]) +} + struct SocketEventHandler { - let event:String - let callback:NormalCallback + let event: String + let callback: NormalCallback? + let callBackObjectiveC: NormalCallbackObjectiveC? - init(event:String, callback:NormalCallback) { + init(event: String, callback: NormalCallback) { self.event = event self.callback = callback + self.callBackObjectiveC = nil } - func executeCallback(items:NSArray? = nil, withAck ack:Int? = nil, withAckType type:Int? = nil, - withSocket socket:SocketIOClient? = nil) { + init(event: String, callback: NormalCallbackObjectiveC) { + self.event = event + self.callback = nil + self.callBackObjectiveC = callback + } + + func executeCallback(items: [AnyObject]? = nil, withAck ack: Int? = nil, withAckType type: Int? = nil, + withSocket socket: SocketIOClient? = nil) { dispatch_async(dispatch_get_main_queue()) { - self.callback(items, emitAckCallback(socket, num: ack)) + self.callback != nil ? + self.callback?(items, emitAckCallback(socket, num: ack)) + : self.callBackObjectiveC?(items, emitAckCallbackObjectiveC(socket, num: ack)) } } } diff --git a/SocketIOClientSwift/SocketFixUTF8.swift b/SocketIOClientSwift/SocketFixUTF8.swift index c8ea8ef..4061303 100644 --- a/SocketIOClientSwift/SocketFixUTF8.swift +++ b/SocketIOClientSwift/SocketFixUTF8.swift @@ -25,13 +25,13 @@ import Foundation -func fixDoubleUTF8(inout name:String) { +func fixDoubleUTF8(inout name: String) { let utf8 = name.dataUsingEncoding(NSISOLatin1StringEncoding)! let latin1 = NSString(data: utf8, encoding: NSUTF8StringEncoding)! name = latin1 as String } -func doubleEncodeUTF8(inout str:String) { +func doubleEncodeUTF8(inout str: String) { let latin1 = str.dataUsingEncoding(NSUTF8StringEncoding)! let utf8 = NSString(data: latin1, encoding: NSISOLatin1StringEncoding)! str = utf8 as String diff --git a/SocketIOClientSwift/SocketIOClient.swift b/SocketIOClientSwift/SocketIOClient.swift index 2660092..e664193 100644 --- a/SocketIOClientSwift/SocketIOClient.swift +++ b/SocketIOClientSwift/SocketIOClient.swift @@ -31,51 +31,50 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient private var _connecting = false private var currentReconnectAttempt = 0 private var handlers = ContiguousArray() - private var connectParams:[String: AnyObject]? + private var connectParams: [String: AnyObject]? private var _secure = false private var _reconnecting = false - private var reconnectTimer:NSTimer? + private var reconnectTimer: NSTimer? - let reconnectAttempts:Int! + let reconnectAttempts: Int! let logType = "SocketClient" var ackHandlers = SocketAckManager() var currentAck = -1 var log = false var waitingData = [SocketPacket]() - var sessionDelegate:NSURLSessionDelegate? - public let socketURL:String + public let socketURL: String public let handleAckQueue = dispatch_queue_create("handleAckQueue", DISPATCH_QUEUE_SERIAL) public let handleQueue = dispatch_queue_create("handleQueue", DISPATCH_QUEUE_SERIAL) public let emitQueue = dispatch_queue_create("emitQueue", DISPATCH_QUEUE_SERIAL) - public var closed:Bool { + public var closed: Bool { return _closed } - public var connected:Bool { + public var connected: Bool { return _connected } - public var connecting:Bool { + public var connecting: Bool { return _connecting } public var engine:SocketEngine? public var nsp = "/" - public var opts:[String: AnyObject]? + public var opts: [String: AnyObject]? public var reconnects = true - public var reconnecting:Bool { + public var reconnecting: Bool { return _reconnecting } public var reconnectWait = 10 - public var secure:Bool { + public var secure: Bool { return _secure } - public var sid:String? { + public var sid: String? { return engine?.sid } /** Create a new SocketIOClient. opts can be omitted */ - public init(var socketURL:String, opts:[String: AnyObject]? = nil) { + public init(var socketURL: String, opts: [String: AnyObject]? = nil) { if socketURL["https://"].matches().count != 0 { self._secure = true } @@ -86,11 +85,6 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient self.socketURL = socketURL self.opts = opts - // Set options - if let sessionDelegate = opts?["sessionDelegate"] as? NSURLSessionDelegate { - self.sessionDelegate = sessionDelegate - } - if let connectParams = opts?["connectParams"] as? [String: AnyObject] { self.connectParams = connectParams } @@ -141,7 +135,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient Will turn off automatic reconnects. Pass true to fast if you're closing from a background task */ - public func close(fast fast:Bool) { + public func close(fast fast: Bool) { SocketLogger.log("Closing socket", client: self) reconnects = false @@ -162,7 +156,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient /** Connect to the server. If we aren't connected after timeoutAfter, call handler */ - public func connect(timeoutAfter timeoutAfter:Int, withTimeoutHandler handler:(() -> Void)?) { + public func connect(timeoutAfter timeoutAfter: Int, withTimeoutHandler handler: (() -> Void)?) { if closed { SocketLogger.log("Warning! This socket was previously closed. This might be dangerous!", client: self) _closed = false @@ -191,7 +185,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient } } - private func createOnAck(event:String, items:[AnyObject]) -> OnAckCallback { + private func createOnAck(event: String, items: [AnyObject]) -> OnAckCallback { return {[weak self, ack = ++currentAck] timeout, callback in if let this = self { this.ackHandlers.addAck(ack, callback: callback) @@ -226,7 +220,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient handleEvent("connect", data: nil, isInternalMessage: false) } - func didDisconnect(reason:String) { + func didDisconnect(reason: String) { if closed { return } @@ -245,7 +239,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient } /// error - public func didError(reason:AnyObject) { + public func didError(reason: AnyObject) { SocketLogger.err("%@", client: self, args: reason) handleEvent("error", data: reason as? [AnyObject] ?? [reason], @@ -255,14 +249,14 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient /** Same as close */ - public func disconnect(fast fast:Bool) { + public func disconnect(fast fast: Bool) { close(fast: fast) } /** Send a message to the server */ - public func emit(event:String, _ items:AnyObject...) { + public func emit(event:String, _ items: AnyObject...) { if !connected { return } @@ -275,7 +269,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient /** Same as emit, but meant for Objective-C */ - public func emit(event:String, withItems items:[AnyObject]) { + public func emit(event: String, withItems items: [AnyObject]) { if !connected { return } @@ -289,7 +283,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient Sends a message to the server, requesting an ack. Use the onAck method of SocketAckHandler to add an ack. */ - public func emitWithAck(event:String, _ items:AnyObject...) -> OnAckCallback { + public func emitWithAck(event: String, _ items: AnyObject...) -> OnAckCallback { if !connected { return createOnAck(event, items: items) } @@ -300,7 +294,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient /** Same as emitWithAck, but for Objective-C */ - public func emitWithAck(event:String, withItems items:[AnyObject]) -> OnAckCallback { + public func emitWithAck(event: String, withItems items: [AnyObject]) -> OnAckCallback { if !connected { return createOnAck(event, items: items) } @@ -308,7 +302,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient return createOnAck(event, items: items) } - private func _emit(event:String, _ args:[AnyObject], ack:Int? = nil) { + private func _emit(event: String, _ args: [AnyObject], ack: Int? = nil) { if !connected { return } @@ -326,7 +320,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient } // If the server wants to know that the client received data - func emitAck(ack:Int, withData args:[AnyObject]) { + func emitAck(ack: Int, withData args: [AnyObject]) { dispatch_async(emitQueue) {[weak self] in if let this = self where this.connected { let packet = SocketPacket.packetFromEmitAckWithData(args, id: ack ?? -1, nsp: this.nsp) @@ -344,7 +338,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient } } - public func engineDidClose(reason:String) { + public func engineDidClose(reason: String) { _connected = false _connecting = false @@ -357,7 +351,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?) { + func handleAck(ack: Int, data: AnyObject?) { SocketLogger.log("Handling ack: %@ with data: %@", client: self, args: ack, data ?? "") @@ -368,8 +362,8 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient /** Causes an event to be handled. Only use if you know what you're doing. */ - public func handleEvent(event:String, data:[AnyObject]?, isInternalMessage:Bool = false, - wantsAck ack:Int? = nil) { + public func handleEvent(event: String, data: [AnyObject]?, isInternalMessage: Bool = false, + wantsAck ack: Int? = nil) { // println("Should do event: \(event) with data: \(data)") if !connected && !isInternalMessage { return @@ -417,7 +411,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient /** Removes handler(s) */ - public func off(event:String) { + public func off(event: String) { SocketLogger.log("Removing handler for event: %@", client: self, args: event) handlers = ContiguousArray(handlers.filter {!($0.event == event)}) @@ -426,7 +420,14 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient /** Adds a handler for an event. */ - public func on(event:String, callback:NormalCallback) { + public func on(event: String, callback: NormalCallback) { + SocketLogger.log("Adding handler for event: %@", client: self, args: event) + + let handler = SocketEventHandler(event: event, callback: callback) + handlers.append(handler) + } + + public func onObjectiveC(event: String, callback: NormalCallbackObjectiveC) { SocketLogger.log("Adding handler for event: %@", client: self, args: event) let handler = SocketEventHandler(event: event, callback: callback) @@ -444,7 +445,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient /** Adds a handler that will be called on every event. */ - public func onAny(handler:(SocketAnyEvent) -> Void) { + public func onAny(handler: (SocketAnyEvent) -> Void) { anyHandler = handler } @@ -455,11 +456,11 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient connect() } - public func parseSocketMessage(msg:String) { + public func parseSocketMessage(msg: String) { SocketParser.parseSocketMessage(msg, socket: self) } - public func parseBinaryData(data:NSData) { + public func parseBinaryData(data: NSData) { SocketParser.parseBinaryData(data, socket: self) } @@ -475,7 +476,6 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient tryReconnect() } - // We lost connection and should attempt to reestablish @objc private func tryReconnect() { if reconnectAttempts != -1 && currentReconnectAttempt + 1 > reconnectAttempts || !reconnects { clearReconnectTimer() diff --git a/SocketIOClientSwift/SocketLogger.swift b/SocketIOClientSwift/SocketLogger.swift index 3f524bf..65f1156 100644 --- a/SocketIOClientSwift/SocketLogger.swift +++ b/SocketIOClientSwift/SocketLogger.swift @@ -25,18 +25,18 @@ import Foundation protocol SocketLogClient { - var log:Bool {get set} - var logType:String {get} + var log: Bool {get set} + var logType: String {get} } final class SocketLogger { private static let printQueue = dispatch_queue_create("printQueue", DISPATCH_QUEUE_SERIAL) - private static func toCVArgType(item:AnyObject) -> CVarArgType { + private static func toCVArgType(item: AnyObject) -> CVarArgType { return String(item) } - static func log(message:String, client:SocketLogClient, altType:String? = nil, args:AnyObject...) { + static func log(message: String, client: SocketLogClient, altType: String? = nil, args: AnyObject...) { if !client.log { return } @@ -49,7 +49,7 @@ final class SocketLogger { } } - static func err(message:String, client:SocketLogClient, altType:String? = nil, args:AnyObject...) { + static func err(message: String, client: SocketLogClient, altType: String? = nil, args: AnyObject...) { if !client.log { return } diff --git a/SocketIOClientSwift/SocketPacket.swift b/SocketIOClientSwift/SocketPacket.swift index 1287f3b..a127143 100644 --- a/SocketIOClientSwift/SocketPacket.swift +++ b/SocketIOClientSwift/SocketPacket.swift @@ -25,10 +25,12 @@ import Foundation struct SocketPacket { - let nsp:String - let id:Int + let nsp: String + let id: Int + let placeholders: Int + let type: PacketType - enum PacketType:Int { + enum PacketType: Int { case CONNECT = 0 case DISCONNECT = 1 case EVENT = 2 @@ -37,7 +39,7 @@ struct SocketPacket { case BINARY_EVENT = 5 case BINARY_ACK = 6 - init?(str:String) { + init?(str: String) { if let int = Int(str), raw = PacketType(rawValue: int) { self = raw } else { @@ -47,11 +49,9 @@ struct SocketPacket { } var currentPlace = 0 - var binary:[NSData] - var data:[AnyObject] - var placeholders:Int - var type:PacketType - var description:String { + var binary: [NSData] + var data: [AnyObject] + var description: String { var better = "SocketPacket {type: ~~0; data: ~~1; " + "id: ~~2; placeholders: ~~3;}" @@ -63,8 +63,8 @@ struct SocketPacket { return better } - init(type:SocketPacket.PacketType, data:[AnyObject] = [AnyObject](), id:Int = -1, - nsp:String, placeholders:Int = 0, binary:[NSData] = [NSData]()) { + init(type: SocketPacket.PacketType, data: [AnyObject] = [AnyObject](), id: Int = -1, + nsp: String, placeholders: Int = 0, binary: [NSData] = [NSData]()) { self.data = data self.id = id self.nsp = nsp @@ -73,23 +73,7 @@ struct SocketPacket { self.binary = binary } - static func packetFromEmitWithData(data:[AnyObject], id:Int, nsp:String) -> SocketPacket { - let (parsedData, binary) = deconstructData(data) - let packet = SocketPacket(type: findType(binary.count, ack: false), data: parsedData, - id: id, nsp: nsp, placeholders: -1, binary: binary) - - return packet - } - - static func packetFromEmitAckWithData(data:[AnyObject], id:Int, nsp:String) -> SocketPacket { - let (parsedData, binary) = deconstructData(data) - let packet = SocketPacket(type: findType(binary.count, ack: true), data: parsedData, - id: id, nsp: nsp, placeholders: -1, binary: binary) - - return packet - } - - mutating func addData(data:NSData) -> Bool { + mutating func addData(data: NSData) -> Bool { if placeholders == currentPlace { return true } @@ -105,7 +89,7 @@ struct SocketPacket { } } - private func completeMessage(var message:String, ack:Bool = false) -> String { + private func completeMessage(var message: String, ack: Bool) -> String { if data.count == 0 { return message + "]" } else if !ack { @@ -114,16 +98,15 @@ struct SocketPacket { for arg in data { if arg is NSDictionary || arg is [AnyObject] { - let jsonSend: NSData? do { - jsonSend = try NSJSONSerialization.dataWithJSONObject(arg, + let jsonSend = try NSJSONSerialization.dataWithJSONObject(arg, options: NSJSONWritingOptions(rawValue: 0)) + let jsonString = NSString(data: jsonSend, encoding: NSUTF8StringEncoding) + + message += jsonString! as String + "," } catch { - jsonSend = nil + print("Error creating JSON object in SocketPacket.completeMessage") } - let jsonString = NSString(data: jsonSend!, encoding: NSUTF8StringEncoding) - - message += jsonString! as String + "," } else if var str = arg as? String { str = str["\n"] ~= "\\\\n" str = str["\r"] ~= "\\\\r" @@ -144,7 +127,7 @@ struct SocketPacket { } func createAck() -> String { - var msg:String + let msg: String if type == PacketType.ACK { if nsp == "/" { @@ -164,8 +147,8 @@ struct SocketPacket { } - func createMessageForEvent(event:String) -> String { - let message:String + func createMessageForEvent(event: String) -> String { + let message: String if type == PacketType.EVENT { if nsp == "/" { @@ -197,7 +180,7 @@ struct SocketPacket { } } - return completeMessage(message) + return completeMessage(message, ack: false) } mutating func fillInPlaceholders() { @@ -214,7 +197,7 @@ struct SocketPacket { data = newArr as [AnyObject] } - private mutating func _fillInPlaceholders(data:AnyObject) -> AnyObject { + private mutating func _fillInPlaceholders(data: AnyObject) -> AnyObject { if let str = data as? String { if let num = str["~~(\\d)"].groups() { return binary[Int(num[1])!] @@ -242,7 +225,28 @@ struct SocketPacket { } } - private static func findType(binCount:Int, ack:Bool) -> PacketType { + func getEvent() -> String { + return data[0] as! String + } + + func getArgs() -> [AnyObject]? { + var arr = data + + if data.count == 0 { + return nil + } else { + if type == PacketType.EVENT || type == PacketType.BINARY_EVENT { + arr.removeAtIndex(0) + return arr + } else { + return arr + } + } + } +} + +extension SocketPacket { + private static func findType(binCount: Int, ack: Bool) -> PacketType { switch binCount { case 0 where !ack: return PacketType.EVENT @@ -257,22 +261,25 @@ struct SocketPacket { } } - func getEvent() -> String { - return data[0] as! String - } - - func getArgs() -> [AnyObject]? { - var arr = data + static func packetFromEmitWithData(data: [AnyObject], id: Int, nsp: String) -> SocketPacket { + let (parsedData, binary) = deconstructData(data) + let packet = SocketPacket(type: findType(binary.count, ack: false), data: parsedData, + id: id, nsp: nsp, placeholders: -1, binary: binary) - if data.count == 0 { - return nil - } else { - arr.removeAtIndex(0) - return arr - } + return packet } - private static func shred(data:AnyObject, inout binary:[NSData]) -> AnyObject { + static func packetFromEmitAckWithData(data: [AnyObject], id: Int, nsp: String) -> SocketPacket { + let (parsedData, binary) = deconstructData(data) + let packet = SocketPacket(type: findType(binary.count, ack: true), data: parsedData, + id: id, nsp: nsp, placeholders: -1, binary: binary) + + return packet + } +} + +extension SocketPacket { + private static func shred(data: AnyObject, inout binary: [NSData]) -> AnyObject { if let bin = data as? NSData { let placeholder = ["_placeholder" :true, "num": binary.count] @@ -300,7 +307,7 @@ struct SocketPacket { } } - private static func deconstructData(var data:[AnyObject]) -> ([AnyObject], [NSData]) { + private static func deconstructData(var data: [AnyObject]) -> ([AnyObject], [NSData]) { var binary = [NSData]() for i in 0.. Bool { + private static func isCorrectNamespace(nsp: String, _ socket: SocketIOClient) -> Bool { return nsp == socket.nsp } - private static func handleAck(p:SocketPacket, socket:SocketIOClient) { + private static func handleAck(p: SocketPacket, socket: SocketIOClient) { if !isCorrectNamespace(p.nsp, socket) { return } @@ -35,7 +35,7 @@ class SocketParser { socket.handleAck(p.id, data: p.data) } - private static func handleBinaryAck(p:SocketPacket, socket:SocketIOClient) { + private static func handleBinaryAck(p: SocketPacket, socket: SocketIOClient) { if !isCorrectNamespace(p.nsp, socket) { return } @@ -43,7 +43,7 @@ class SocketParser { socket.waitingData.append(p) } - private static func handleBinaryEvent(p:SocketPacket, socket:SocketIOClient) { + private static func handleBinaryEvent(p: SocketPacket, socket: SocketIOClient) { if !isCorrectNamespace(p.nsp, socket) { return } @@ -51,7 +51,7 @@ class SocketParser { socket.waitingData.append(p) } - private static func handleConnect(p:SocketPacket, socket:SocketIOClient) { + private static func handleConnect(p: SocketPacket, socket: SocketIOClient) { if p.nsp == "/" && socket.nsp != "/" { socket.joinNamespace() } else if p.nsp != "/" && socket.nsp == "/" { @@ -61,7 +61,7 @@ class SocketParser { } } - private static func handleEvent(p:SocketPacket, socket:SocketIOClient) { + private static func handleEvent(p: SocketPacket, socket: SocketIOClient) { if !isCorrectNamespace(p.nsp, socket) { return } @@ -71,7 +71,7 @@ class SocketParser { } // Translation of socket.io-client#decodeString - static func parseString(str:String) -> SocketPacket? { + static func parseString(str: String) -> SocketPacket? { let arr = Array(str.characters) let type = String(arr[0]) @@ -79,7 +79,7 @@ class SocketParser { return SocketPacket(type: SocketPacket.PacketType(str: type)!, nsp: "/") } - var id = nil as Int? + var id: Int? var nsp:String? var i = 0 var placeholders = -1 @@ -150,10 +150,11 @@ class SocketParser { } // Parses data for events - static func parseData(data:String) -> AnyObject? { - var err:NSError? + static func parseData(data: String) -> AnyObject? { + var err: NSError? let stringData = data.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) - let parsed:AnyObject? + let parsed: AnyObject? + do { parsed = try NSJSONSerialization.JSONObjectWithData(stringData!, options: NSJSONReadingOptions.MutableContainers) @@ -171,14 +172,14 @@ class SocketParser { } // Parses messages recieved - static func parseSocketMessage(stringMessage:String, socket:SocketIOClient) { + static func parseSocketMessage(stringMessage: String, socket: SocketIOClient) { if stringMessage == "" { return } SocketLogger.log("Parsing %@", client: socket, altType: "SocketParser", args: stringMessage) - let p:SocketPacket + let p: SocketPacket if let pack = parseString(stringMessage) { p = pack @@ -207,7 +208,7 @@ class SocketParser { } } - static func parseBinaryData(data:NSData, socket:SocketIOClient) { + static func parseBinaryData(data: NSData, socket: SocketIOClient) { if socket.waitingData.count == 0 { SocketLogger.err("Got data when not remaking packet", client: socket, altType: "SocketParser") return diff --git a/SocketIOClientSwift/SocketTypes.swift b/SocketIOClientSwift/SocketTypes.swift index e5198f9..342564c 100644 --- a/SocketIOClientSwift/SocketTypes.swift +++ b/SocketIOClientSwift/SocketTypes.swift @@ -26,5 +26,7 @@ import Foundation public typealias AckCallback = (NSArray?) -> Void public typealias AckEmitter = (AnyObject...) -> Void +public typealias AckEmitterObjectiveC = (NSArray) -> Void public typealias NormalCallback = (NSArray?, AckEmitter?) -> Void -public typealias OnAckCallback = (timeoutAfter:UInt64, callback:AckCallback) -> Void +public typealias NormalCallbackObjectiveC = (NSArray?, AckEmitterObjectiveC?) -> Void +public typealias OnAckCallback = (timeoutAfter: UInt64, callback: AckCallback) -> Void