From 5b180a0a6dd14efa7050204f5c30cfb8da5e3ee3 Mon Sep 17 00:00:00 2001 From: Erik Date: Wed, 18 Mar 2015 18:04:11 -0400 Subject: [PATCH] fix socketio/socket.io-client-swift#20, change objc api --- README.md | 12 ++++++------ SwiftIO/SocketEngine.swift | 4 ++-- SwiftIO/SocketIOClient.swift | 27 +++++++++++++++------------ SwiftIO/SocketParser.swift | 3 +++ 4 files changed, 26 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index d5c93d5..dd3104e 100644 --- a/README.md +++ b/README.md @@ -47,10 +47,10 @@ Methods ------- 1. `socket.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. `socket.onAny(callback:((event:String, items:AnyObject?)) -> Void)` - Adds a handler for all events. It will be called on any received event. -3. `socket.emit(event:String, args:AnyObject...)` - Sends a message. Can send multiple args. -4. `socket.emitObjc(event:String, args:[AnyObject])` - `emit` for Objective-C -5. `socket.emitWithAck(event:String, args:AnyObject...) -> SocketAckHandler` - Sends a message that requests an acknowledgement from the server. Returns a SocketAckHandler which you can use to add an onAck handler. See example. -6. `socket.emitWithAckObjc(event:String, _ args:[AnyObject]) -> SocketAckHandler` - `emitWithAck` for Objective-C. +3. `socket.emit(event:String, _ args:AnyObject...)` - Sends a message. Can send multiple args. +4. `socket.emitObjc(event:String, withItems items:[AnyObject])` - `emit` for Objective-C +5. `socket.emitWithAck(event:String, _ args:AnyObject...) -> SocketAckHandler` - Sends a message that requests an acknowledgement from the server. Returns a SocketAckHandler which you can use to add an onAck handler. See example. +6. `socket.emitWithAckObjc(event:String, withItems items:[AnyObject]) -> SocketAckHandler` - `emitWithAck` for Objective-C. 7. `socket.connect()` - Establishes a connection to the server. A "connect" event is fired upon successful connection. 8. `socket.connectWithParams(params:[String: AnyObject])` - Establishes a connection to the server passing the specified params. A "connect" event is fired upon successful connection. 9. `socket.close()` - Closes the socket. Once a socket is closed it should not be reopened. @@ -131,8 +131,8 @@ SocketIOClient* socket = [[SocketIOClient alloc] initWithSocketURL:@"localhost:8 [socket on: @"connect" callback: ^(NSArray* data, void (^ack)(NSArray*)) { NSLog(@"connected"); - [socket emitObjc:@"echo" :@[@"echo test"]]; - [[socket emitWithAckObjc:@"ackack" :@[@"test"]] onAck:0 withCallback:^(NSArray* data) { + [socket emitObjc:@"echo" withItems:@[@"echo test"]]; + [[socket emitWithAckObjc:@"ackack" withItems:@[@"test"]] onAck:0 withCallback:^(NSArray* data) { NSLog(@"Got data"); }]; }]; diff --git a/SwiftIO/SocketEngine.swift b/SwiftIO/SocketEngine.swift index a3c43c3..3b6428e 100644 --- a/SwiftIO/SocketEngine.swift +++ b/SwiftIO/SocketEngine.swift @@ -109,7 +109,7 @@ public class SocketEngine: NSObject, WebSocketDelegate { } } - private func createURLs(params:[String: AnyObject]? = nil) -> (String, String) { + private func createURLs(params:[String: AnyObject]?) -> (String, String) { var url = "\(self.client.socketURL)/socket.io/?transport=" var urlPolling:String var urlWebSocket:String @@ -287,7 +287,7 @@ public class SocketEngine: NSObject, WebSocketDelegate { assert(false, "We're in a bad state, this shouldn't happen.") } - let (urlPolling, urlWebSocket) = self.createURLs(params: opts) + let (urlPolling, urlWebSocket) = self.createURLs(opts) self.urlPolling = urlPolling self.urlWebSocket = urlWebSocket let reqPolling = NSMutableURLRequest(URL: NSURL(string: urlPolling + "&b64=1")!) diff --git a/SwiftIO/SocketIOClient.swift b/SwiftIO/SocketIOClient.swift index cf5a837..cb67b6e 100644 --- a/SwiftIO/SocketIOClient.swift +++ b/SwiftIO/SocketIOClient.swift @@ -175,13 +175,13 @@ public class SocketIOClient: NSObject { } // Server wants us to die - func didForceClose() { + func didForceClose(#message:String) { self._closed = true self._connected = false self.reconnects = false self._connecting = false self._reconnecting = false - self.handleEvent("disconnect", data: "closed", isInternalMessage: true) + self.handleEvent("disconnect", data: message, isInternalMessage: true) } // Sends a message with multiple args @@ -199,8 +199,8 @@ public class SocketIOClient: NSObject { } // Objc doesn't have variadics - public func emitObjc(event:String, _ args:[AnyObject]) { - self.emit(event, args) + public func emitObjc(event:String, withItems items:[AnyObject]) { + self.emit(event, items) } public func emitWithAck(event:String, _ args:AnyObject...) -> SocketAckHandler { @@ -221,8 +221,8 @@ public class SocketIOClient: NSObject { return ackHandler } - public func emitWithAckObjc(event:String, _ args:[AnyObject]) -> SocketAckHandler { - return self.emitWithAck(event, args) + public func emitWithAckObjc(event:String, withItems items:[AnyObject]) -> SocketAckHandler { + return self.emitWithAck(event, items) } private func _emit(event:String, _ args:[AnyObject], ack:Int? = nil) { @@ -319,10 +319,13 @@ public class SocketIOClient: NSObject { return } - dispatch_async(dispatch_get_main_queue()) {[weak self] in - self?.anyHandler?((event, data)) - return + if self.anyHandler != nil { + dispatch_async(dispatch_get_main_queue()) {[weak self] in + self?.anyHandler?((event, data)) + return + } } + for handler in self.handlers { if handler.event == event { if data is NSArray { @@ -400,7 +403,7 @@ public class SocketIOClient: NSObject { // We lost connection and should attempt to reestablish func tryReconnect() { if self.reconnectAttempts != -1 && self.currentReconnectAttempt + 1 > self.reconnectAttempts { - self.didForceClose() + self.didForceClose(message: "Reconnect Failed") return } else if self.connected { self._connecting = false @@ -438,7 +441,7 @@ public class SocketIOClient: NSObject { self._connected = false self._connecting = false if self.closed || !self.reconnects { - self.didForceClose() + self.didForceClose(message: "WebSocket closed") } else { self.handleEvent("reconnect", data: reason, isInternalMessage: true) self.tryReconnect() @@ -451,7 +454,7 @@ public class SocketIOClient: NSObject { self._connecting = false self.handleEvent("error", data: error.localizedDescription, isInternalMessage: true) if self.closed || !self.reconnects { - self.didForceClose() + self.didForceClose(message: "WebSocket closed with an error \(error)") } else if !self.reconnecting { self.handleEvent("reconnect", data: error.localizedDescription, isInternalMessage: true) self.tryReconnect() diff --git a/SwiftIO/SocketParser.swift b/SwiftIO/SocketParser.swift index bd0e29b..4e62814 100644 --- a/SwiftIO/SocketParser.swift +++ b/SwiftIO/SocketParser.swift @@ -209,6 +209,9 @@ class SocketParser { socket.didConnect() return } + } else if stringMessage == "1" { + socket.didForceClose(message: "Got disconnect") + return } if stringMessage.hasPrefix("5") || stringMessage.hasPrefix("6") {