Merge branch 'swift-2' of https://github.com/socketio/socket.io-client-swift into API-improvements

# Conflicts:
#	SocketIOClientSwift/SocketEngine.swift
#	SocketIOClientSwift/SocketIOClient.swift
#	SocketIOClientSwift/SocketTypes.swift

Signed-off-by: Lukas Schmidt <lukas.schmi@gmail.com>
This commit is contained in:
Lukas Schmidt 2015-08-10 06:18:28 +02:00
commit 643ddb5bf9
29 changed files with 1254 additions and 235 deletions

2
.gitignore vendored
View File

@ -42,3 +42,5 @@ DerivedData
*.hmap *.hmap
*.ipa *.ipa
*.xcuserstate *.xcuserstate
Socket.IO-Test-Server/node_modules/*

View File

@ -26,11 +26,11 @@ socket.connect()
```objective-c ```objective-c
SocketIOClient* socket = [[SocketIOClient alloc] initWithSocketURL:@"localhost:8080" options:nil]; 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"); 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]; double cur = [[data objectAtIndex:0] floatValue];
[socket emitWithAck:@"canUpdate" withItems:@[@(cur)]](0, ^(NSArray* data) { [socket emitWithAck:@"canUpdate" withItems:@[@(cur)]](0, ^(NSArray* data) {
@ -122,21 +122,23 @@ Options
- `sessionDelegate: NSURLSessionDelegate` Sets an NSURLSessionDelegate for the underlying engine. Useful if you need to handle self-signed certs. Default is nil. - `sessionDelegate: NSURLSessionDelegate` Sets an NSURLSessionDelegate for the underlying engine. Useful if you need to handle self-signed certs. Default is nil.
- `path: String` - If the server uses a custom path. ex: `"/swift"`. Default is `""` - `path: String` - If the server uses a custom path. ex: `"/swift"`. Default is `""`
- `extraHeaders: [String: String]?` - Adds custom headers to the initial request. Default is nil. - `extraHeaders: [String: String]?` - Adds custom headers to the initial request. Default is nil.
- `handleQueue: dispatch_queue_t` - The dispatch queue that handlers are run on. Default is the main queue.
Methods 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. 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. 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. `emit(event:String, _ items:AnyObject...)` - Sends a message. Can send multiple items. 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, withItems items:[AnyObject])` - `emit` for Objective-C 4. `emit(event:String, _ items:AnyObject...)` - Sends a message. Can send multiple items.
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. 5. `emit(event:String, withItems items:[AnyObject])` - `emit` for Objective-C
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. 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. `connect()` - Establishes a connection to the server. A "connect" event is fired upon successful connection. 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(#timeoutAfter:Int, withTimeoutHandler handler:(() -> Void)?)` - Connect to the server. If it isn't connected after timeoutAfter seconds, the handler is called. 8. `connect()` - Establishes a connection to the server. A "connect" event is fired upon successful connection.
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. 9. `connect(#timeoutAfter:Int, withTimeoutHandler handler:(() -> Void)?)` - Connect to the server. If it isn't connected after timeoutAfter seconds, the handler is called.
10. `reconnect()` - Causes the client to reconnect to the server. 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. `joinNamespace()` - Causes the client to join nsp. Shouldn't need to be called unless you change nsp manually. 11. `reconnect()` - Causes the client to reconnect to the server.
12. `leaveNamespace()` - Causes the client to leave the nsp and go back to / 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 Client Events
------ ------

View File

@ -9,7 +9,6 @@
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
572EF21F1B51F16C00EEBB58 /* SocketIO-iOS.h in Headers */ = {isa = PBXBuildFile; fileRef = 572EF21E1B51F16C00EEBB58 /* SocketIO-iOS.h */; settings = {ATTRIBUTES = (Public, ); }; }; 572EF21F1B51F16C00EEBB58 /* SocketIO-iOS.h in Headers */ = {isa = PBXBuildFile; fileRef = 572EF21E1B51F16C00EEBB58 /* SocketIO-iOS.h */; settings = {ATTRIBUTES = (Public, ); }; };
572EF2251B51F16C00EEBB58 /* SocketIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 572EF2191B51F16C00EEBB58 /* SocketIO.framework */; }; 572EF2251B51F16C00EEBB58 /* 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, ); }; }; 572EF23D1B51F18A00EEBB58 /* SocketIO-Mac.h in Headers */ = {isa = PBXBuildFile; fileRef = 572EF23C1B51F18A00EEBB58 /* SocketIO-Mac.h */; settings = {ATTRIBUTES = (Public, ); }; };
572EF2431B51F18A00EEBB58 /* SocketIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 572EF2381B51F18A00EEBB58 /* SocketIO.framework */; }; 572EF2431B51F18A00EEBB58 /* SocketIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 572EF2381B51F18A00EEBB58 /* SocketIO.framework */; };
572EF24A1B51F18A00EEBB58 /* SocketIO_MacTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 572EF2491B51F18A00EEBB58 /* SocketIO_MacTests.swift */; }; 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 */; }; 5764DFA01B51F254004FF46E /* SwiftRegex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF871B51F254004FF46E /* SwiftRegex.swift */; };
5764DFA11B51F254004FF46E /* WebSocket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF881B51F254004FF46E /* WebSocket.swift */; }; 5764DFA11B51F254004FF46E /* WebSocket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5764DF881B51F254004FF46E /* WebSocket.swift */; };
5764DFA21B51F254004FF46E /* 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 */ /* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */ /* Begin PBXContainerItemProxy section */
@ -64,7 +83,6 @@
572EF21E1B51F16C00EEBB58 /* SocketIO-iOS.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SocketIO-iOS.h"; sourceTree = "<group>"; }; 572EF21E1B51F16C00EEBB58 /* SocketIO-iOS.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SocketIO-iOS.h"; sourceTree = "<group>"; };
572EF2241B51F16C00EEBB58 /* SocketIO-iOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "SocketIO-iOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 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 = "<group>"; }; 572EF22A1B51F16C00EEBB58 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
572EF22B1B51F16C00EEBB58 /* SocketIO_iOSTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SocketIO_iOSTests.swift; sourceTree = "<group>"; };
572EF2381B51F18A00EEBB58 /* SocketIO.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SocketIO.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 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 = "<group>"; }; 572EF23B1B51F18A00EEBB58 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
572EF23C1B51F18A00EEBB58 /* SocketIO-Mac.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SocketIO-Mac.h"; sourceTree = "<group>"; }; 572EF23C1B51F18A00EEBB58 /* SocketIO-Mac.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SocketIO-Mac.h"; sourceTree = "<group>"; };
@ -84,6 +102,13 @@
5764DF861B51F254004FF46E /* SocketTypes.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SocketTypes.swift; path = SocketIOClientSwift/SocketTypes.swift; sourceTree = "<group>"; }; 5764DF861B51F254004FF46E /* SocketTypes.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SocketTypes.swift; path = SocketIOClientSwift/SocketTypes.swift; sourceTree = "<group>"; };
5764DF871B51F254004FF46E /* SwiftRegex.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SwiftRegex.swift; path = SocketIOClientSwift/SwiftRegex.swift; sourceTree = "<group>"; }; 5764DF871B51F254004FF46E /* SwiftRegex.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SwiftRegex.swift; path = SocketIOClientSwift/SwiftRegex.swift; sourceTree = "<group>"; };
5764DF881B51F254004FF46E /* WebSocket.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = WebSocket.swift; path = SocketIOClientSwift/WebSocket.swift; sourceTree = "<group>"; }; 5764DF881B51F254004FF46E /* WebSocket.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = WebSocket.swift; path = SocketIOClientSwift/WebSocket.swift; sourceTree = "<group>"; };
941A4AB91B67A56C00C42318 /* TestKind.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestKind.swift; sourceTree = "<group>"; };
94242BB71B67B0E500AAAC9D /* SocketNamespaceAcknowledgementTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketNamespaceAcknowledgementTest.swift; sourceTree = "<group>"; };
945B65421B63D9DB0081E995 /* SocketEmitTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketEmitTest.swift; sourceTree = "<group>"; };
94ADAC481B652D3300FD79AE /* SocketNamespaceEmitTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketNamespaceEmitTest.swift; sourceTree = "<group>"; };
94ADAC4A1B6632DD00FD79AE /* SocketAcknowledgementTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketAcknowledgementTest.swift; sourceTree = "<group>"; };
94CB8F0A1B6E48B90019ED53 /* SocketTestCases.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocketTestCases.swift; sourceTree = "<group>"; };
94CB8F0C1B6E66E60019ED53 /* AbstractSocketTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AbstractSocketTest.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */ /* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */ /* Begin PBXFrameworksBuildPhase section */
@ -163,7 +188,13 @@
572EF2281B51F16C00EEBB58 /* SocketIO-iOSTests */ = { 572EF2281B51F16C00EEBB58 /* SocketIO-iOSTests */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( 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 */, 572EF2291B51F16C00EEBB58 /* Supporting Files */,
); );
path = "SocketIO-iOSTests"; path = "SocketIO-iOSTests";
@ -424,7 +455,26 @@
isa = PBXSourcesBuildPhase; isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( 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; runOnlyForDeploymentPostprocessing = 0;
}; };

View File

@ -37,10 +37,11 @@
</BuildActionEntries> </BuildActionEntries>
</BuildAction> </BuildAction>
<TestAction <TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES" shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Debug"> codeCoverageEnabled = "YES">
<Testables> <Testables>
<TestableReference <TestableReference
skipped = "NO"> skipped = "NO">
@ -62,15 +63,18 @@
ReferencedContainer = "container:Socket.IO-Client-Swift.xcodeproj"> ReferencedContainer = "container:Socket.IO-Client-Swift.xcodeproj">
</BuildableReference> </BuildableReference>
</MacroExpansion> </MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</TestAction> </TestAction>
<LaunchAction <LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0" launchStyle = "0"
useCustomWorkingDirectory = "NO" useCustomWorkingDirectory = "NO"
buildConfiguration = "Debug"
ignoresPersistentStateOnLaunch = "NO" ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES" debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES"> allowLocationSimulation = "YES">
<MacroExpansion> <MacroExpansion>
<BuildableReference <BuildableReference
@ -85,10 +89,10 @@
</AdditionalOptions> </AdditionalOptions>
</LaunchAction> </LaunchAction>
<ProfileAction <ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES" shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = "" savedToolIdentifier = ""
useCustomWorkingDirectory = "NO" useCustomWorkingDirectory = "NO"
buildConfiguration = "Release"
debugDocumentVersioning = "YES"> debugDocumentVersioning = "YES">
<MacroExpansion> <MacroExpansion>
<BuildableReference <BuildableReference

View File

@ -0,0 +1,95 @@
var assert = require("assert")
module.exports = {
basicTest: {
assert: function(inputData) {
},
returnData: []
},
testNull: {
assert: function(inputData) {
assert(!inputData)
},
returnData: [null]
},
testBinary: {
assert: function(inputData) {
assert.equal(inputData.toString(), "gakgakgak2")
},
returnData: [new Buffer("gakgakgak2", "utf-8")]
},
testArray: {
assert: function(inputData) {
assert.equal(inputData.length, 2)
assert.equal(inputData[0], "test1")
assert.equal(inputData[1], "test2")
},
returnData: [["test3", "test4"]]
},
testString: {
assert: function(inputData) {
assert.equal(inputData, "marco")
},
returnData: ["polo"]
},
testBool: {
assert: function(inputData) {
assert(!inputData)
},
returnData: [true]
},
testInteger: {
assert: function(inputData) {
assert.equal(inputData, 10)
},
returnData: [20]
},
testDouble: {
assert: function(inputData) {
assert.equal(inputData, 1.1)
},
returnData: [1.2]
},
testJSON: {
assert: function(inputData) {
assert.equal(inputData.name, "test")
assert.equal(inputData.nestedTest.test, "test")
assert.equal(inputData.testArray.length, 1)
},
returnData: [{testString: "test", testNumber: 15, nestedTest: {test: "test"}, testArray: [1, 1]}]
},
testJSONWithBuffer: {
assert: function(inputData) {
assert.equal(inputData.name, "test")
assert.equal(inputData.nestedTest.test, "test")
assert.equal(inputData.testArray.length, 1)
},
returnData: [{testString: "test", testNumber: 15, nestedTest: {test: "test"}, testArray: [new Buffer("gakgakgak2", "utf-8"), 1]}]
},testUnicode: {
assert: function(inputData) {
assert.equal(inputData, "🚀")
},
returnData: ["🚄"]
},testMultipleItems: {
assert: function(array, object, number, string, bool) {
assert.equal(array.length, 2)
assert.equal(array[0], "test1")
assert.equal(array[1], "test2")
assert.equal(number, 15)
assert.equal(string, "marco")
assert.equal(bool, false)
},
returnData: [[1, 2], {test: "bob"}, 25, "polo", false]
},testMultipleItemsWithBuffer: {
assert: function(array, object, number, string, binary) {
assert.equal(array.length, 2)
assert.equal(array[0], "test1")
assert.equal(array[1], "test2")
assert.equal(number, 15)
assert.equal(string, "marco")
assert.equal(binary.toString(), "gakgakgak2")
},
returnData: [[1, 2], {test: "bob"}, 25, "polo", new Buffer("gakgakgak2")]
}
}

View File

@ -0,0 +1,10 @@
function socketCallback(testKey, socket, testCase) {
return function() {
testCase.assert.apply(undefined , arguments)
var emitArguments = testCase.returnData;
var ack = arguments[arguments.length - 1]
ack.apply(socket, emitArguments)
}
}
module.exports.socketCallback = socketCallback

View File

@ -0,0 +1,20 @@
function socketCallback(testKey, socket, testCase) {
return function() {
testCase.assert.apply(undefined , arguments)
var emitArguments = addArrays([testKey + "EmitReturn"], testCase.returnData)
socket.emit.apply(socket, emitArguments)
}
}
function addArrays(firstArray, secondArray) {
var length = secondArray.length
var i;
for(i = 0; i < length; i++) {
firstArray.push(secondArray[i])
}
return firstArray;
}
module.exports.socketCallback = socketCallback

View File

@ -0,0 +1,13 @@
var app = require('express')()
var server = app.listen(8080)
var io = require('socket.io')(server)
var acknowledgementsEvents = require("./acknowledgementEvents.js")
var emitEvents = require("./emitEvents.js")
var socketEventRegister = require("./socketEventRegister.js")
socketEventRegister.register(io, emitEvents.socketCallback, "Emit")
socketEventRegister.register(io, acknowledgementsEvents.socketCallback, "Acknowledgement")
var nsp = io.of("/swift")
socketEventRegister.register(nsp, emitEvents.socketCallback, "Emit")
socketEventRegister.register(nsp, acknowledgementsEvents.socketCallback, "Acknowledgement")

View File

@ -0,0 +1,15 @@
{
"name": "socket.io-client-swift-test-server",
"version": "0.0.1",
"description": "A simple server to test aginst",
"main": "main.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "Lukas Schmidt",
"license": "MIT",
"dependencies": {
"express": "^4.13.1",
"socket.io": "^1.3.6"
}
}

View File

@ -0,0 +1,13 @@
var testCases = require("./TestCases.js")
function registerSocketForEvents(ioSocket, socketCallback, testKind) {
ioSocket.on('connection', function(socket) {
var testCase;
for(testKey in testCases) {
testCase = testCases[testKey]
socket.on((testKey + testKind), socketCallback(testKey, socket, testCase))
}
})
}
module.exports.register = registerSocketForEvents

View File

@ -0,0 +1,113 @@
//
// AbstractSocketTest.swift
// Socket.IO-Client-Swift
//
// Created by Lukas Schmidt on 02.08.15.
//
//
import XCTest
class AbstractSocketTest: XCTestCase {
static let TEST_TIMEOUT = 8.0
var socket:SocketIOClient!
var testKind:TestKind?
override func tearDown() {
super.tearDown()
socket.close(fast: false)
}
func openConnection() {
let expection = self.expectationWithDescription("connect")
socket.on("connect") {data, ack in
expection.fulfill()
}
socket.connect()
XCTAssertTrue(socket.connecting)
waitForExpectationsWithTimeout(AbstractSocketTest.TEST_TIMEOUT, handler: nil)
}
func generateTestName(rawTestName:String) ->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<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.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<AnyObject>, 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)
}
}

View File

@ -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)
}
}

View File

@ -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)
}
}

View File

@ -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.
}
}
}

View File

@ -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)
}
}

View File

@ -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)
}
}

View File

@ -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<AnyObject>).count, 2)
XCTAssertEqual((json.valueForKey("testArray")! as! Array<AnyObject>).last! as! Int, 1)
let string = NSString(data: (json.valueForKey("testArray")! as! Array<AnyObject>).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<AnyObject>).count, 2)
XCTAssertEqual((json.valueForKey("testArray")! as! Array<AnyObject>).first! as! Int, 1)
XCTAssertEqual((json.valueForKey("testArray")! as! Array<AnyObject>).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<AnyObject>, 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<AnyObject> {
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<AnyObject>, 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<AnyObject> {
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)
}
}

View File

@ -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
}

View File

@ -25,38 +25,38 @@
import Foundation import Foundation
private struct SocketAck: Hashable, Equatable { private struct SocketAck: Hashable, Equatable {
let ack:Int let ack: Int
var callback:AckCallback! var callback: AckCallback!
var hashValue:Int { var hashValue: Int {
return ack.hashValue return ack.hashValue
} }
init(ack:Int) { init(ack: Int) {
self.ack = ack self.ack = ack
} }
init(ack:Int, callback:AckCallback) { init(ack: Int, callback: AckCallback) {
self.ack = ack self.ack = ack
self.callback = callback self.callback = callback
} }
} }
private func <(lhs:SocketAck, rhs:SocketAck) -> Bool { private func <(lhs: SocketAck, rhs: SocketAck) -> Bool {
return lhs.ack < rhs.ack return lhs.ack < rhs.ack
} }
private func ==(lhs:SocketAck, rhs:SocketAck) -> Bool { private func ==(lhs: SocketAck, rhs: SocketAck) -> Bool {
return lhs.ack == rhs.ack return lhs.ack == rhs.ack
} }
struct SocketAckManager { struct SocketAckManager {
private var acks = Set<SocketAck>(minimumCapacity: 1) private var acks = Set<SocketAck>(minimumCapacity: 1)
mutating func addAck(ack:Int, callback:AckCallback) { mutating func addAck(ack: Int, callback: AckCallback) {
acks.insert(SocketAck(ack: ack, callback: callback)) 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)) let callback = acks.remove(SocketAck(ack: ack))
dispatch_async(dispatch_get_main_queue()) { 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)) let callback = acks.remove(SocketAck(ack: ack))
dispatch_async(dispatch_get_main_queue()) { dispatch_async(dispatch_get_main_queue()) {

View File

@ -25,10 +25,10 @@
import Foundation import Foundation
public final class SocketAnyEvent: NSObject { public final class SocketAnyEvent: NSObject {
public let event:String! public let event: String!
public let items:NSArray? public let items: NSArray?
init(event:String, items:NSArray?) { init(event: String, items: NSArray?) {
self.event = event self.event = event
self.items = items self.items = items
} }

View File

@ -25,7 +25,7 @@
import Foundation import Foundation
public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient { 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 typealias ProbeWaitQueue = [Probe]
private let allowedCharacterSet = NSCharacterSet(charactersInString: "!*'();:@&=+$,/?%#[]\" {}").invertedSet private let allowedCharacterSet = NSCharacterSet(charactersInString: "!*'();:@&=+$,/?%#[]\" {}").invertedSet
@ -37,12 +37,12 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
private var closed = false private var closed = false
private var _connected = false private var _connected = false
private var extraHeaders:[String: String]? private var extraHeaders: [String: String]?
private var fastUpgrade = false private var fastUpgrade = false
private var forcePolling = false private var forcePolling = false
private var forceWebsockets = false private var forceWebsockets = false
private var pingInterval:Double? private var pingInterval: Double?
private var pingTimer:NSTimer? private var pingTimer: NSTimer?
private var pingTimeout = 0.0 { private var pingTimeout = 0.0 {
didSet { didSet {
pongsMissedMax = Int(pingTimeout / (pingInterval ?? 25)) pongsMissedMax = Int(pingTimeout / (pingInterval ?? 25))
@ -61,25 +61,25 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
let logType = "SocketEngine" let logType = "SocketEngine"
var connected:Bool { var connected: Bool {
return _connected return _connected
} }
weak var client:SocketEngineClient? weak var client: SocketEngineClient?
var cookies:[NSHTTPCookie]? var cookies: [NSHTTPCookie]?
var log = false var log = false
var polling:Bool { var polling: Bool {
return _polling return _polling
} }
var sid = "" var sid = ""
var socketPath = "" var socketPath = ""
var urlPolling:String? var urlPolling: String?
var urlWebSocket:String? var urlWebSocket: String?
var websocket:Bool { var websocket: Bool {
return _websocket return _websocket
} }
var ws:WebSocket? var ws:WebSocket?
public enum PacketType:Int { public enum PacketType: Int {
case OPEN = 0 case OPEN = 0
case CLOSE = 1 case CLOSE = 1
case PING = 2 case PING = 2
@ -88,7 +88,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
case UPGRADE = 5 case UPGRADE = 5
case NOOP = 6 case NOOP = 6
init?(str:String?) { init?(str: String?) {
if let value = Int(str ?? ""), raw = PacketType(rawValue: value) { if let value = Int(str ?? ""), raw = PacketType(rawValue: value) {
self = raw self = raw
} else { } 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.client = client
self.session = NSURLSession(configuration: NSURLSessionConfiguration.ephemeralSessionConfiguration(), self.session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration(),
delegate: sessionDelegate, delegateQueue: workQueue) 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) self.init(client: client, sessionDelegate: opts?["sessionDelegate"] as? NSURLSessionDelegate)
forceWebsockets = opts?["forceWebsockets"] as? Bool ?? false forceWebsockets = opts?["forceWebsockets"] as? Bool ?? false
forcePolling = opts?["forcePolling"] 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) 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) SocketLogger.log("Engine is being closed. Fast: %@", client: self, args: fast)
pingTimer?.invalidate() pingTimer?.invalidate()
@ -133,7 +133,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
stopPolling() stopPolling()
} }
private func createBinaryDataForSend(data:NSData) -> (NSData?, String?) { private func createBinaryDataForSend(data: NSData) -> (NSData?, String?) {
if websocket { if websocket {
var byteArray = [UInt8](count: 1, repeatedValue: 0x0) var byteArray = [UInt8](count: 1, repeatedValue: 0x0)
byteArray[0] = 4 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 { if client == nil {
return (nil, nil) return (nil, nil)
} }
@ -159,8 +159,8 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
let path = socketPath == "" ? "/socket.io" : socketPath let path = socketPath == "" ? "/socket.io" : socketPath
let url = "\(client!.socketURL)\(path)/?transport=" let url = "\(client!.socketURL)\(path)/?transport="
var urlPolling:String var urlPolling: String
var urlWebSocket:String var urlWebSocket: String
if client!.secure { if client!.secure {
urlPolling = "https://" + url + "polling" urlPolling = "https://" + url + "polling"
@ -193,7 +193,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
return (urlPolling, urlWebSocket) return (urlPolling, urlWebSocket)
} }
private func createWebsocket(andConnect connect:Bool) { private func createWebsocket(andConnect connect: Bool) {
let wsUrl = urlWebSocket! + (sid == "" ? "" : "&sid=\(sid)") let wsUrl = urlWebSocket! + (sid == "" ? "" : "&sid=\(sid)")
ws = WebSocket(url: NSURL(string: wsUrl)!, ws = WebSocket(url: NSURL(string: wsUrl)!,
@ -249,7 +249,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
doRequest(req) doRequest(req)
} }
private func doRequest(req:NSMutableURLRequest) { private func doRequest(req: NSMutableURLRequest) {
if !polling { if !polling {
return 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") { if message.hasPrefix("b4") {
// binary in base64 string // binary in base64 string
message.removeRange(Range<String.Index>(start: message.startIndex, message.removeRange(Range<String.Index>(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 { if let client = client {
dispatch_async(client.handleQueue) {[weak client] in dispatch_async(client.handleQueue) {[weak client] in
client?.parseSocketMessage(message) client?.parseSocketMessage(message)
@ -407,7 +407,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
doPoll() doPoll()
} }
private func handleOpen(openData:String) { private func handleOpen(openData: String) {
let mesData = openData.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)! let mesData = openData.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!
do { do {
@ -437,7 +437,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
} }
} }
private func handlePong(pongMessage:String) { private func handlePong(pongMessage: String) {
pongsMissed = 0 pongsMissed = 0
// We should upgrade // We should upgrade
@ -447,7 +447,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
} }
// A poll failed, tell the client about it // A poll failed, tell the client about it
private func handlePollingFailed(reason:String) { private func handlePollingFailed(reason: String) {
_connected = false _connected = false
ws?.disconnect() ws?.disconnect()
pingTimer?.invalidate() 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 { if connected {
SocketLogger.err("Tried to open while connected", client: self) SocketLogger.err("Tried to open while connected", client: self)
client?.didError("Tried to open while connected") client?.didError("Tried to open while connected")
@ -556,7 +556,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
} }
} }
private func parseEngineData(data:NSData) { private func parseEngineData(data: NSData) {
if let client = client { if let client = client {
dispatch_async(client.handleQueue) {[weak self] in dispatch_async(client.handleQueue) {[weak self] in
self?.client?.parseBinaryData(data.subdataWithRange(NSMakeRange(1, data.length - 1))) self?.client?.parseBinaryData(data.subdataWithRange(NSMakeRange(1, data.length - 1)))
@ -564,7 +564,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) SocketLogger.log("Got message: %@", client: self, args: message)
if fromPolling { if fromPolling {
@ -601,7 +601,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
} }
/// Send an engine message (4) /// Send an engine message (4)
public func send(msg:String, withData datas:[NSData]?) { public func send(msg: String, withData datas: [NSData]?) {
if probing { if probing {
probeWait.append((msg, PacketType.MESSAGE, datas)) probeWait.append((msg, PacketType.MESSAGE, datas))
} else { } else {
@ -623,7 +623,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
/// Send polling message. /// Send polling message.
/// Only call on emitQueue /// 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) { datas:[NSData]? = nil) {
SocketLogger.log("Sending poll: %@ as type: %@", client: self, args: msg, type.rawValue) SocketLogger.log("Sending poll: %@ as type: %@", client: self, args: msg, type.rawValue)
@ -647,7 +647,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
/// Send message on WebSockets /// Send message on WebSockets
/// Only call on emitQueue /// Only call on emitQueue
private func sendWebSocketMessage(str:String, withType type:PacketType, private func sendWebSocketMessage(str: String, withType type: PacketType,
datas:[NSData]? = nil) { datas:[NSData]? = nil) {
SocketLogger.log("Sending ws: %@ as type: %@", client: self, args: str, type.rawValue) SocketLogger.log("Sending ws: %@ as type: %@", client: self, args: str, type.rawValue)
@ -695,7 +695,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
/** /**
Write a message, independent of transport. 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 dispatch_async(emitQueue) {[weak self] in
if let this = self where this.connected { if let this = self where this.connected {
if this.websocket { if this.websocket {
@ -714,7 +714,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
/** /**
Write a message, independent of transport. For Objective-C. withData should be an NSArray of NSData 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) { if let pType = PacketType(rawValue: type) {
var arr = [NSData]() var arr = [NSData]()
@ -743,7 +743,7 @@ public final class SocketEngine: NSObject, WebSocketDelegate, SocketLogClient {
} }
} }
public func websocketDidDisconnect(socket:WebSocket, error:NSError?) { public func websocketDidDisconnect(socket: WebSocket, error: NSError?) {
websocketConnected = false websocketConnected = false
probing = false probing = false
@ -769,11 +769,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) parseEngineMessage(text, fromPolling: false)
} }
public func websocketDidReceiveData(socket:WebSocket, data:NSData) { public func websocketDidReceiveData(socket: WebSocket, data: NSData) {
parseEngineData(data) parseEngineData(data)
} }
} }

View File

@ -26,12 +26,12 @@
import Foundation import Foundation
@objc public protocol SocketEngineClient { @objc public protocol SocketEngineClient {
var handleQueue:dispatch_queue_t! {get} var handleQueue: dispatch_queue_t! {get}
var socketURL:String {get} var socketURL: String {get}
var secure:Bool {get} var secure: Bool {get}
func didError(reason:AnyObject) func didError(reason: AnyObject)
func engineDidClose(reason:String) func engineDidClose(reason: String)
func parseSocketMessage(msg:String) func parseSocketMessage(msg: String)
func parseBinaryData(data:NSData) func parseBinaryData(data: NSData)
} }

View File

@ -24,24 +24,37 @@
import Foundation import Foundation
private func emitAckCallback(socket:SocketIOClient?, num:Int?) private func emitAckCallback(socket: SocketIOClient?, num: Int?)
(items:AnyObject...) -> Void { (items: AnyObject...) -> Void {
socket?.emitAck(num ?? -1, withData: items) socket?.emitAck(num ?? -1, withData: items)
} }
struct SocketEventHandler { private func emitAckCallbackObjectiveC(socket: SocketIOClient?, num: Int?)
let event:String (items: NSArray) -> Void {
let callback:NormalCallback socket?.emitAck(num ?? -1, withData: items as [AnyObject])
}
init(event:String, callback:NormalCallback) { struct SocketEventHandler {
let event: String
let callback: NormalCallback?
let callBackObjectiveC: NormalCallbackObjectiveC?
init(event: String, callback: NormalCallback) {
self.event = event self.event = event
self.callback = callback self.callback = callback
self.callBackObjectiveC = nil
}
init(event: String, callback: NormalCallbackObjectiveC) {
self.event = event
self.callback = nil
self.callBackObjectiveC = callback
} }
func executeCallback(items:NSArray? = nil, withAck ack:Int? = nil, withAckType type:Int? = nil, func executeCallback(items:NSArray? = nil, withAck ack:Int? = nil, withAckType type:Int? = nil,
withSocket socket:SocketIOClient? = nil) { withSocket socket:SocketIOClient? = nil) {
dispatch_async(dispatch_get_main_queue()) { self.callback != nil ?
self.callback(items, emitAckCallback(socket, num: ack)) self.callback?(items, emitAckCallback(socket, num: ack))
} : self.callBackObjectiveC?(items, emitAckCallbackObjectiveC(socket, num: ack))
} }
} }

View File

@ -25,13 +25,13 @@
import Foundation import Foundation
func fixDoubleUTF8(inout name:String) { func fixDoubleUTF8(inout name: String) {
let utf8 = name.dataUsingEncoding(NSISOLatin1StringEncoding)! let utf8 = name.dataUsingEncoding(NSISOLatin1StringEncoding)!
let latin1 = NSString(data: utf8, encoding: NSUTF8StringEncoding)! let latin1 = NSString(data: utf8, encoding: NSUTF8StringEncoding)!
name = latin1 as String name = latin1 as String
} }
func doubleEncodeUTF8(inout str:String) { func doubleEncodeUTF8(inout str: String) {
let latin1 = str.dataUsingEncoding(NSUTF8StringEncoding)! let latin1 = str.dataUsingEncoding(NSUTF8StringEncoding)!
let utf8 = NSString(data: latin1, encoding: NSISOLatin1StringEncoding)! let utf8 = NSString(data: latin1, encoding: NSISOLatin1StringEncoding)!
str = utf8 as String str = utf8 as String

View File

@ -29,36 +29,65 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
public private(set) var status = SocketIOClientStatus.NotConnected public private(set) var status = SocketIOClientStatus.NotConnected
private var currentReconnectAttempt = 0 private var currentReconnectAttempt = 0
private var handlers = ContiguousArray<SocketEventHandler>() private var handlers = ContiguousArray<SocketEventHandler>()
<<<<<<< HEAD
private var connectParams:[String: AnyObject]? private var connectParams:[String: AnyObject]?
public private(set) var secure = false public private(set) var secure = false
private var reconnectTimer:NSTimer? private var reconnectTimer:NSTimer?
=======
private var connectParams: [String: AnyObject]?
private var _secure = false
private var _reconnecting = false
private var reconnectTimer: NSTimer?
>>>>>>> 514193e6ec46854097ead71c4b3efde292915938
let reconnectAttempts:Int! let reconnectAttempts: Int!
let logType = "SocketClient" let logType = "SocketClient"
var ackHandlers = SocketAckManager() var ackHandlers = SocketAckManager()
var currentAck = -1 var currentAck = -1
var log = false var log = false
var waitingData = [SocketPacket]() 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 handleAckQueue = dispatch_queue_create("handleAckQueue", DISPATCH_QUEUE_SERIAL)
public let handleQueue = dispatch_queue_create("handleQueue", DISPATCH_QUEUE_SERIAL) public let handleQueue: dispatch_queue_t!
public let emitQueue = dispatch_queue_create("emitQueue", DISPATCH_QUEUE_SERIAL) public let emitQueue = dispatch_queue_create("emitQueue", DISPATCH_QUEUE_SERIAL)
<<<<<<< HEAD
=======
public var closed: Bool {
return _closed
}
public var connected: Bool {
return _connected
}
public var connecting: Bool {
return _connecting
}
>>>>>>> 514193e6ec46854097ead71c4b3efde292915938
public var engine:SocketEngine? public var engine:SocketEngine?
public var nsp = "/" public var nsp = "/"
public var opts:[String: AnyObject]? public var opts: [String: AnyObject]?
public var reconnects = true public var reconnects = true
<<<<<<< HEAD
public var reconnectWait = 10 public var reconnectWait = 10
public var sid:String? { public var sid:String? {
=======
public var reconnecting: Bool {
return _reconnecting
}
public var reconnectWait = 10
public var secure: Bool {
return _secure
}
public var sid: String? {
>>>>>>> 514193e6ec46854097ead71c4b3efde292915938
return engine?.sid return engine?.sid
} }
/** /**
Create a new SocketIOClient. opts can be omitted 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 { if socketURL["https://"].matches().count != 0 {
self.secure = true self.secure = true
} }
@ -69,11 +98,6 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
self.socketURL = socketURL self.socketURL = socketURL
self.opts = opts self.opts = opts
// Set options
if let sessionDelegate = opts?["sessionDelegate"] as? NSURLSessionDelegate {
self.sessionDelegate = sessionDelegate
}
if let connectParams = opts?["connectParams"] as? [String: AnyObject] { if let connectParams = opts?["connectParams"] as? [String: AnyObject] {
self.connectParams = connectParams self.connectParams = connectParams
} }
@ -100,6 +124,12 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
self.reconnectWait = abs(reconnectWait) self.reconnectWait = abs(reconnectWait)
} }
if let handleQueue = opts?["handleQueue"] as? dispatch_queue_t {
self.handleQueue = handleQueue
} else {
self.handleQueue = dispatch_get_main_queue()
}
super.init() super.init()
} }
@ -124,7 +154,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
Will turn off automatic reconnects. Will turn off automatic reconnects.
Pass true to fast if you're closing from a background task 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) SocketLogger.log("Closing socket", client: self)
reconnects = false reconnects = false
@ -143,8 +173,16 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
/** /**
Connect to the server. If we aren't connected after timeoutAfter, call handler Connect to the server. If we aren't connected after timeoutAfter, call handler
*/ */
<<<<<<< HEAD
public func connect(timeoutAfter timeoutAfter:Int, withTimeoutHandler handler:(() -> Void)?) { public func connect(timeoutAfter timeoutAfter:Int, withTimeoutHandler handler:(() -> Void)?) {
guard status == SocketIOClientStatus.Connected else { guard status == SocketIOClientStatus.Connected else {
=======
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
} else if connected {
>>>>>>> 514193e6ec46854097ead71c4b3efde292915938
return return
} }
if status == SocketIOClientStatus.Closed { if status == SocketIOClientStatus.Closed {
@ -171,7 +209,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 return {[weak self, ack = ++currentAck] timeout, callback in
if let this = self { if let this = self {
this.ackHandlers.addAck(ack, callback: callback) this.ackHandlers.addAck(ack, callback: callback)
@ -202,8 +240,13 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
handleEvent("connect", data: nil, isInternalMessage: false) handleEvent("connect", data: nil, isInternalMessage: false)
} }
<<<<<<< HEAD
func didDisconnect(reason:String) { func didDisconnect(reason:String) {
guard status == SocketIOClientStatus.Closed else { guard status == SocketIOClientStatus.Closed else {
=======
func didDisconnect(reason: String) {
if closed {
>>>>>>> 514193e6ec46854097ead71c4b3efde292915938
return return
} }
@ -219,7 +262,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
} }
/// error /// error
public func didError(reason:AnyObject) { public func didError(reason: AnyObject) {
SocketLogger.err("%@", client: self, args: reason) SocketLogger.err("%@", client: self, args: reason)
handleEvent("error", data: reason as? [AnyObject] ?? [reason], handleEvent("error", data: reason as? [AnyObject] ?? [reason],
@ -229,15 +272,20 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
/** /**
Same as close Same as close
*/ */
public func disconnect(fast fast:Bool) { public func disconnect(fast fast: Bool) {
close(fast: fast) close(fast: fast)
} }
/** /**
Send a message to the server Send a message to the server
*/ */
<<<<<<< HEAD
public func emit(event:String, _ items:AnyObject...) { public func emit(event:String, _ items:AnyObject...) {
guard status == SocketIOClientStatus.Connected else { guard status == SocketIOClientStatus.Connected else {
=======
public func emit(event:String, _ items: AnyObject...) {
if !connected {
>>>>>>> 514193e6ec46854097ead71c4b3efde292915938
return return
} }
dispatch_async(emitQueue) {[weak self] in dispatch_async(emitQueue) {[weak self] in
@ -248,8 +296,13 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
/** /**
Same as emit, but meant for Objective-C Same as emit, but meant for Objective-C
*/ */
<<<<<<< HEAD
public func emit(event:String, withItems items:[AnyObject]) { public func emit(event:String, withItems items:[AnyObject]) {
guard status != SocketIOClientStatus.Connected else { guard status != SocketIOClientStatus.Connected else {
=======
public func emit(event: String, withItems items: [AnyObject]) {
if !connected {
>>>>>>> 514193e6ec46854097ead71c4b3efde292915938
return return
} }
@ -262,19 +315,40 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
Sends a message to the server, requesting an ack. Use the onAck method of SocketAckHandler to add Sends a message to the server, requesting an ack. Use the onAck method of SocketAckHandler to add
an ack. an ack.
*/ */
<<<<<<< HEAD
public func emitWithAck(event:String, _ items:AnyObject...) -> OnAckCallback { public func emitWithAck(event:String, _ items:AnyObject...) -> OnAckCallback {
=======
public func emitWithAck(event: String, _ items: AnyObject...) -> OnAckCallback {
if !connected {
return createOnAck(event, items: items)
}
>>>>>>> 514193e6ec46854097ead71c4b3efde292915938
return createOnAck(event, items: items) return createOnAck(event, items: items)
} }
/** /**
Same as emitWithAck, but for Objective-C Same as emitWithAck, but for Objective-C
*/ */
<<<<<<< HEAD
public func emitWithAck(event:String, withItems items:[AnyObject]) -> OnAckCallback { public func emitWithAck(event:String, withItems items:[AnyObject]) -> OnAckCallback {
return createOnAck(event, items: items) 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) {
guard status != SocketIOClientStatus.Connected else { guard status != SocketIOClientStatus.Connected else {
=======
public func emitWithAck(event: String, withItems items: [AnyObject]) -> OnAckCallback {
if !connected {
return createOnAck(event, items: items)
}
return createOnAck(event, items: items)
}
private func _emit(event: String, _ args: [AnyObject], ack: Int? = nil) {
if !connected {
>>>>>>> 514193e6ec46854097ead71c4b3efde292915938
return return
} }
@ -291,7 +365,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
} }
// If the server wants to know that the client received data // 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 dispatch_async(emitQueue) {[weak self] in
if let this = self where this.status == SocketIOClientStatus.Connected { if let this = self where this.status == SocketIOClientStatus.Connected {
let packet = SocketPacket.packetFromEmitAckWithData(args, id: ack ?? -1, nsp: this.nsp) let packet = SocketPacket.packetFromEmitAckWithData(args, id: ack ?? -1, nsp: this.nsp)
@ -309,8 +383,16 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
} }
} }
<<<<<<< HEAD
public func engineDidClose(reason:String) { public func engineDidClose(reason:String) {
if status == SocketIOClientStatus.Closed || !reconnects { if status == SocketIOClientStatus.Closed || !reconnects {
=======
public func engineDidClose(reason: String) {
_connected = false
_connecting = false
if closed || !reconnects {
>>>>>>> 514193e6ec46854097ead71c4b3efde292915938
didDisconnect(reason) didDisconnect(reason)
} else if status != SocketIOClientStatus.Reconnecting { } else if status != SocketIOClientStatus.Reconnecting {
handleEvent("reconnect", data: [reason], isInternalMessage: true) handleEvent("reconnect", data: [reason], isInternalMessage: true)
@ -319,7 +401,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
} }
// Called when the socket gets an ack for something it sent // 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, SocketLogger.log("Handling ack: %@ with data: %@", client: self,
args: ack, data ?? "") args: ack, data ?? "")
@ -330,9 +412,16 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
/** /**
Causes an event to be handled. Only use if you know what you're doing. Causes an event to be handled. Only use if you know what you're doing.
*/ */
<<<<<<< HEAD
public func handleEvent(event:String, data:[AnyObject]?, isInternalMessage:Bool = false, public func handleEvent(event:String, data:[AnyObject]?, isInternalMessage:Bool = false,
wantsAck ack:Int? = nil) { wantsAck ack:Int? = nil) {
guard status != SocketIOClientStatus.Connected && !isInternalMessage else { guard status != SocketIOClientStatus.Connected && !isInternalMessage else {
=======
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 {
>>>>>>> 514193e6ec46854097ead71c4b3efde292915938
return return
} }
// println("Should do event: \(event) with data: \(data)") // println("Should do event: \(event) with data: \(data)")
@ -341,16 +430,20 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
args: event, data ?? "") args: event, data ?? "")
if anyHandler != nil { if anyHandler != nil {
dispatch_async(dispatch_get_main_queue()) {[weak self] in dispatch_async(handleQueue) {[weak self] in
self?.anyHandler?(SocketAnyEvent(event: event, items: data)) self?.anyHandler?(SocketAnyEvent(event: event, items: data))
} }
} }
for handler in handlers where handler.event == event { for handler in handlers where handler.event == event {
if ack != nil { if ack != nil {
handler.executeCallback(data, withAck: ack!, withSocket: self) dispatch_async(handleQueue) {[weak self] in
handler.executeCallback(data, withAck: ack!, withSocket: self)
}
} else { } else {
handler.executeCallback(data) dispatch_async(handleQueue) {
handler.executeCallback(data)
}
} }
} }
} }
@ -387,7 +480,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
/** /**
Removes handler(s) Removes handler(s)
*/ */
public func off(event:String) { public func off(event: String) {
SocketLogger.log("Removing handler for event: %@", client: self, args: event) SocketLogger.log("Removing handler for event: %@", client: self, args: event)
handlers = ContiguousArray(handlers.filter {!($0.event == event)}) handlers = ContiguousArray(handlers.filter {!($0.event == event)})
@ -396,25 +489,35 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
/** /**
Adds a handler for an event. 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) SocketLogger.log("Adding handler for event: %@", client: self, args: event)
let handler = SocketEventHandler(event: event, callback: callback) let handler = SocketEventHandler(event: event, callback: callback)
handlers.append(handler) handlers.append(handler)
} }
/** /**
Removes all handlers. Adds a handler for an event.
Can be used after disconnecting to break any potential remaining retain cycles. */
*/ public func onObjectiveC(event: String, callback: NormalCallbackObjectiveC) {
public func removeAllHandlers() { SocketLogger.log("Adding handler for event: %@", client: self, args: event)
handlers.removeAll(keepCapacity: false)
} let handler = SocketEventHandler(event: event, callback: callback)
handlers.append(handler)
}
/**
Removes all handlers.
Can be used after disconnecting to break any potential remaining retain cycles.
*/
public func removeAllHandlers() {
handlers.removeAll(keepCapacity: false)
}
/** /**
Adds a handler that will be called on every event. Adds a handler that will be called on every event.
*/ */
public func onAny(handler:(SocketAnyEvent) -> Void) { public func onAny(handler: (SocketAnyEvent) -> Void) {
anyHandler = handler anyHandler = handler
} }
@ -425,11 +528,11 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
connect() connect()
} }
public func parseSocketMessage(msg:String) { public func parseSocketMessage(msg: String) {
SocketParser.parseSocketMessage(msg, socket: self) SocketParser.parseSocketMessage(msg, socket: self)
} }
public func parseBinaryData(data:NSData) { public func parseBinaryData(data: NSData) {
SocketParser.parseBinaryData(data, socket: self) SocketParser.parseBinaryData(data, socket: self)
} }
@ -442,7 +545,6 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketLogClient
tryReconnect() tryReconnect()
} }
// We lost connection and should attempt to reestablish
@objc private func tryReconnect() { @objc private func tryReconnect() {
guard status == SocketIOClientStatus.Connected else { guard status == SocketIOClientStatus.Connected else {
return return

View File

@ -25,18 +25,18 @@
import Foundation import Foundation
protocol SocketLogClient { protocol SocketLogClient {
var log:Bool {get set} var log: Bool {get set}
var logType:String {get} var logType: String {get}
} }
final class SocketLogger { final class SocketLogger {
private static let printQueue = dispatch_queue_create("printQueue", DISPATCH_QUEUE_SERIAL) 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) 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 { if !client.log {
return 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 { if !client.log {
return return
} }

View File

@ -25,10 +25,12 @@
import Foundation import Foundation
struct SocketPacket { struct SocketPacket {
let nsp:String let nsp: String
let id:Int let id: Int
let placeholders: Int
let type: PacketType
enum PacketType:Int { enum PacketType: Int {
case CONNECT = 0 case CONNECT = 0
case DISCONNECT = 1 case DISCONNECT = 1
case EVENT = 2 case EVENT = 2
@ -37,7 +39,7 @@ struct SocketPacket {
case BINARY_EVENT = 5 case BINARY_EVENT = 5
case BINARY_ACK = 6 case BINARY_ACK = 6
init?(str:String) { init?(str: String) {
if let int = Int(str), raw = PacketType(rawValue: int) { if let int = Int(str), raw = PacketType(rawValue: int) {
self = raw self = raw
} else { } else {
@ -47,11 +49,9 @@ struct SocketPacket {
} }
var currentPlace = 0 var currentPlace = 0
var binary:[NSData] var binary: [NSData]
var data:[AnyObject] var data: [AnyObject]
var placeholders:Int var description: String {
var type:PacketType
var description:String {
var better = "SocketPacket {type: ~~0; data: ~~1; " + var better = "SocketPacket {type: ~~0; data: ~~1; " +
"id: ~~2; placeholders: ~~3;}" "id: ~~2; placeholders: ~~3;}"
@ -63,8 +63,8 @@ struct SocketPacket {
return better return better
} }
init(type:SocketPacket.PacketType, data:[AnyObject] = [AnyObject](), id:Int = -1, init(type: SocketPacket.PacketType, data: [AnyObject] = [AnyObject](), id: Int = -1,
nsp:String, placeholders:Int = 0, binary:[NSData] = [NSData]()) { nsp: String, placeholders: Int = 0, binary: [NSData] = [NSData]()) {
self.data = data self.data = data
self.id = id self.id = id
self.nsp = nsp self.nsp = nsp
@ -73,23 +73,7 @@ struct SocketPacket {
self.binary = binary self.binary = binary
} }
static func packetFromEmitWithData(data:[AnyObject], id:Int, nsp:String) -> SocketPacket { mutating func addData(data: NSData) -> Bool {
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 {
if placeholders == currentPlace { if placeholders == currentPlace {
return true 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 { if data.count == 0 {
return message + "]" return message + "]"
} else if !ack { } else if !ack {
@ -114,16 +98,15 @@ struct SocketPacket {
for arg in data { for arg in data {
if arg is NSDictionary || arg is [AnyObject] { if arg is NSDictionary || arg is [AnyObject] {
let jsonSend: NSData?
do { do {
jsonSend = try NSJSONSerialization.dataWithJSONObject(arg, let jsonSend = try NSJSONSerialization.dataWithJSONObject(arg,
options: NSJSONWritingOptions(rawValue: 0)) options: NSJSONWritingOptions(rawValue: 0))
} catch { let jsonString = NSString(data: jsonSend, encoding: NSUTF8StringEncoding)
jsonSend = nil
}
let jsonString = NSString(data: jsonSend!, encoding: NSUTF8StringEncoding)
message += jsonString! as String + "," message += jsonString! as String + ","
} catch {
print("Error creating JSON object in SocketPacket.completeMessage")
}
} else if var str = arg as? String { } else if var str = arg as? String {
str = str["\n"] ~= "\\\\n" str = str["\n"] ~= "\\\\n"
str = str["\r"] ~= "\\\\r" str = str["\r"] ~= "\\\\r"
@ -144,7 +127,7 @@ struct SocketPacket {
} }
func createAck() -> String { func createAck() -> String {
var msg:String let msg: String
if type == PacketType.ACK { if type == PacketType.ACK {
if nsp == "/" { if nsp == "/" {
@ -164,8 +147,8 @@ struct SocketPacket {
} }
func createMessageForEvent(event:String) -> String { func createMessageForEvent(event: String) -> String {
let message:String let message: String
if type == PacketType.EVENT { if type == PacketType.EVENT {
if nsp == "/" { if nsp == "/" {
@ -197,7 +180,7 @@ struct SocketPacket {
} }
} }
return completeMessage(message) return completeMessage(message, ack: false)
} }
mutating func fillInPlaceholders() { mutating func fillInPlaceholders() {
@ -214,7 +197,7 @@ struct SocketPacket {
data = newArr as [AnyObject] 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 str = data as? String {
if let num = str["~~(\\d)"].groups() { if let num = str["~~(\\d)"].groups() {
return binary[Int(num[1])!] 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 { switch binCount {
case 0 where !ack: case 0 where !ack:
return PacketType.EVENT return PacketType.EVENT
@ -257,22 +261,25 @@ struct SocketPacket {
} }
} }
func getEvent() -> String { static func packetFromEmitWithData(data: [AnyObject], id: Int, nsp: String) -> SocketPacket {
return data[0] as! String 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
} }
func getArgs() -> [AnyObject]? { static func packetFromEmitAckWithData(data: [AnyObject], id: Int, nsp: String) -> SocketPacket {
var arr = data let (parsedData, binary) = deconstructData(data)
let packet = SocketPacket(type: findType(binary.count, ack: true), data: parsedData,
id: id, nsp: nsp, placeholders: -1, binary: binary)
if data.count == 0 { return packet
return nil
} else {
arr.removeAtIndex(0)
return arr
}
} }
}
private static func shred(data:AnyObject, inout binary:[NSData]) -> AnyObject { extension SocketPacket {
private static func shred(data: AnyObject, inout binary: [NSData]) -> AnyObject {
if let bin = data as? NSData { if let bin = data as? NSData {
let placeholder = ["_placeholder" :true, "num": binary.count] 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]() var binary = [NSData]()
for i in 0..<data.count { for i in 0..<data.count {

View File

@ -23,11 +23,11 @@
import Foundation import Foundation
class SocketParser { class SocketParser {
private static func isCorrectNamespace(nsp:String, _ socket:SocketIOClient) -> Bool { private static func isCorrectNamespace(nsp: String, _ socket: SocketIOClient) -> Bool {
return nsp == socket.nsp 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) { if !isCorrectNamespace(p.nsp, socket) {
return return
} }
@ -35,7 +35,7 @@ class SocketParser {
socket.handleAck(p.id, data: p.data) 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) { if !isCorrectNamespace(p.nsp, socket) {
return return
} }
@ -43,7 +43,7 @@ class SocketParser {
socket.waitingData.append(p) 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) { if !isCorrectNamespace(p.nsp, socket) {
return return
} }
@ -51,7 +51,7 @@ class SocketParser {
socket.waitingData.append(p) 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 != "/" { if p.nsp == "/" && socket.nsp != "/" {
socket.joinNamespace() socket.joinNamespace()
} else if p.nsp != "/" && socket.nsp == "/" { } 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) { if !isCorrectNamespace(p.nsp, socket) {
return return
} }
@ -71,7 +71,7 @@ class SocketParser {
} }
// Translation of socket.io-client#decodeString // Translation of socket.io-client#decodeString
static func parseString(str:String) -> SocketPacket? { static func parseString(str: String) -> SocketPacket? {
let arr = Array(str.characters) let arr = Array(str.characters)
let type = String(arr[0]) let type = String(arr[0])
@ -79,7 +79,7 @@ class SocketParser {
return SocketPacket(type: SocketPacket.PacketType(str: type)!, nsp: "/") return SocketPacket(type: SocketPacket.PacketType(str: type)!, nsp: "/")
} }
var id = nil as Int? var id: Int?
var nsp:String? var nsp:String?
var i = 0 var i = 0
var placeholders = -1 var placeholders = -1
@ -150,10 +150,11 @@ class SocketParser {
} }
// Parses data for events // Parses data for events
static func parseData(data:String) -> AnyObject? { static func parseData(data: String) -> AnyObject? {
var err:NSError? var err: NSError?
let stringData = data.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) let stringData = data.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
let parsed:AnyObject? let parsed: AnyObject?
do { do {
parsed = try NSJSONSerialization.JSONObjectWithData(stringData!, parsed = try NSJSONSerialization.JSONObjectWithData(stringData!,
options: NSJSONReadingOptions.MutableContainers) options: NSJSONReadingOptions.MutableContainers)
@ -171,14 +172,14 @@ class SocketParser {
} }
// Parses messages recieved // Parses messages recieved
static func parseSocketMessage(stringMessage:String, socket:SocketIOClient) { static func parseSocketMessage(stringMessage: String, socket: SocketIOClient) {
if stringMessage == "" { if stringMessage == "" {
return return
} }
SocketLogger.log("Parsing %@", client: socket, altType: "SocketParser", args: stringMessage) SocketLogger.log("Parsing %@", client: socket, altType: "SocketParser", args: stringMessage)
let p:SocketPacket let p: SocketPacket
if let pack = parseString(stringMessage) { if let pack = parseString(stringMessage) {
p = pack 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 { if socket.waitingData.count == 0 {
SocketLogger.err("Got data when not remaking packet", client: socket, altType: "SocketParser") SocketLogger.err("Got data when not remaking packet", client: socket, altType: "SocketParser")
return return

View File

@ -26,10 +26,11 @@ import Foundation
public typealias AckCallback = (NSArray?) -> Void public typealias AckCallback = (NSArray?) -> Void
public typealias AckEmitter = (AnyObject...) -> Void public typealias AckEmitter = (AnyObject...) -> Void
public typealias NormalCallback = (NSArray?, AckEmitter?) -> Void public typealias AckEmitterObjectiveC = (NSArray) -> Void
public typealias NormalCallbackObjectiveC = (NSArray?, AckEmitterObjectiveC?) -> Void
public typealias OnAckCallback = (timeoutAfter:UInt64, callback:AckCallback) -> Void public typealias OnAckCallback = (timeoutAfter:UInt64, callback:AckCallback) -> Void
public enum SocketIOClientStatus { public enum SocketIOClientStatus {
case NotConnected, Closed, Connecting, Connected, Reconnecting case NotConnected, Closed, Connecting, Connected, Reconnecting
} }