merge master

This commit is contained in:
Erik 2015-04-06 13:05:21 -04:00
commit eb56a8de9c
4 changed files with 69 additions and 33 deletions

View File

@ -96,8 +96,8 @@ Methods
2. `onAny(callback:((event:String, items:AnyObject?)) -> Void)` - Adds a handler for all events. It will be called on any received event. 2. `onAny(callback:((event:String, items:AnyObject?)) -> Void)` - Adds a handler for all events. It will be called on any received event.
3. `emit(event:String, _ items:AnyObject...)` - Sends a message. Can send multiple items. 3. `emit(event:String, _ items:AnyObject...)` - Sends a message. Can send multiple items.
4. `emitObjc(event:String, withItems items:[AnyObject])` - `emit` for Objective-C 4. `emitObjc(event:String, withItems items:[AnyObject])` - `emit` for Objective-C
5. `emitWithAck(event:String, _ items:AnyObject...) -> (timeout: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. 5. `emitWithAck(event:String, _ items:AnyObject...) -> (timeout:UInt64, callback:(NSArray?) -> Void) -> Void` - Sends a message that requests an acknowledgement from the server. Returns a function which you can use to add a handler. See example. Note: The message is not sent until you call the returned function.
6. `emitWithAckObjc(event:String, withItems items:[AnyObject]) -> (UInt64, (NSArray?) -> Void) -> Void` - `emitWithAck` for Objective-C. 6. `emitWithAckObjc(event:String, withItems items:[AnyObject]) -> (UInt64, (NSArray?) -> Void) -> Void` - `emitWithAck` for Objective-C. Note: The message is not sent until you call the returned function.
7. `connect()` - Establishes a connection to the server. A "connect" event is fired upon successful connection. 7. `connect()` - Establishes a connection to the server. A "connect" event is fired upon successful connection.
8. `connectWithParams(params:[String: AnyObject])` - Establishes a connection to the server passing the specified params. A "connect" event is fired upon successful connection. 8. `connectWithParams(params:[String: AnyObject])` - Establishes a connection to the server passing the specified params. 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. `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.

View File

@ -1,6 +1,6 @@
Pod::Spec.new do |s| Pod::Spec.new do |s|
s.name = "Socket.IO-Client-Swift" s.name = "Socket.IO-Client-Swift"
s.version = "1.5.0" s.version = "1.5.1"
s.summary = "Socket.IO-client for Swift" s.summary = "Socket.IO-client for Swift"
s.description = <<-DESC s.description = <<-DESC
Socket.IO-client for Swift. Socket.IO-client for Swift.
@ -12,7 +12,7 @@ Pod::Spec.new do |s|
s.author = { "Erik" => "nuclear.ace@gmail.com" } s.author = { "Erik" => "nuclear.ace@gmail.com" }
s.ios.deployment_target = '8.0' s.ios.deployment_target = '8.0'
s.osx.deployment_target = '10.10' s.osx.deployment_target = '10.10'
s.source = { :git => "https://github.com/socketio/socket.io-client-swift.git", :tag => 'v1.5.0' } s.source = { :git => "https://github.com/socketio/socket.io-client-swift.git", :tag => 'v1.5.1' }
s.source_files = "SwiftIO/**/*.swift" s.source_files = "SwiftIO/**/*.swift"
s.requires_arc = true s.requires_arc = true
# s.dependency 'Starscream', '~> 0.9' # currently this repo includes Starscream swift files # s.dependency 'Starscream', '~> 0.9' # currently this repo includes Starscream swift files

View File

@ -44,7 +44,6 @@ public enum PacketType:String {
} }
public class SocketEngine: NSObject, WebSocketDelegate { public class SocketEngine: NSObject, WebSocketDelegate {
unowned let client:SocketEngineClient
private let workQueue = NSOperationQueue() private let workQueue = NSOperationQueue()
private let emitQueue = dispatch_queue_create( private let emitQueue = dispatch_queue_create(
"engineEmitQueue".cStringUsingEncoding(NSUTF8StringEncoding), DISPATCH_QUEUE_SERIAL) "engineEmitQueue".cStringUsingEncoding(NSUTF8StringEncoding), DISPATCH_QUEUE_SERIAL)
@ -70,6 +69,8 @@ public class SocketEngine: NSObject, WebSocketDelegate {
var connected:Bool { var connected:Bool {
return self._connected return self._connected
} }
weak var client:SocketEngineClient?
var cookies:[NSHTTPCookie]? var cookies:[NSHTTPCookie]?
var pingInterval:Int? var pingInterval:Int?
var polling:Bool { var polling:Bool {
@ -97,15 +98,11 @@ public class SocketEngine: NSObject, WebSocketDelegate {
self.pingTimer?.invalidate() self.pingTimer?.invalidate()
self.closed = true self.closed = true
if self.polling { self.write("", withType: PacketType.CLOSE, withData: nil)
self.write("", withType: PacketType.CLOSE, withData: nil) self.ws?.disconnect()
self.client.didForceClose("Disconnect")
} else {
self.ws?.disconnect()
if fast { if fast || self.polling {
self.client.didForceClose("Fast Disconnect") self.client?.didForceClose("Disconnect")
}
} }
} }
@ -126,11 +123,15 @@ public class SocketEngine: NSObject, WebSocketDelegate {
} }
private func createURLs(params:[String: AnyObject]?) -> (String, String) { private func createURLs(params:[String: AnyObject]?) -> (String, String) {
var url = "\(self.client.socketURL)/socket.io/?transport=" if self.client == nil {
return ("", "")
}
var url = "\(self.client!.socketURL)/socket.io/?transport="
var urlPolling:String var urlPolling:String
var urlWebSocket:String var urlWebSocket:String
if self.client.secure { if self.client!.secure {
urlPolling = "https://" + url + "polling" urlPolling = "https://" + url + "polling"
urlWebSocket = "wss://" + url + "websocket" urlWebSocket = "wss://" + url + "websocket"
} else { } else {
@ -171,7 +172,12 @@ public class SocketEngine: NSObject, WebSocketDelegate {
} }
private func doFastUpgrade() { private func doFastUpgrade() {
self.sendWebSocketMessage("", withType: PacketType.UPGRADE) if self.waitingForPoll {
NSLog("Outstanding poll when switched to websockets," +
"we'll probably disconnect soon. You should report this.")
}
self.sendWebSocketMessage("", withType: PacketType.UPGRADE, datas: nil)
self._websocket = true self._websocket = true
self._polling = false self._polling = false
self.fastUpgrade = false self.fastUpgrade = false
@ -204,6 +210,8 @@ public class SocketEngine: NSObject, WebSocketDelegate {
} else if err != nil { } else if err != nil {
if self!.polling { if self!.polling {
self?.handlePollingFailed(err.localizedDescription) self?.handlePollingFailed(err.localizedDescription)
} else {
NSLog(err.localizedDescription)
} }
return return
@ -223,7 +231,7 @@ public class SocketEngine: NSObject, WebSocketDelegate {
if self!.fastUpgrade { if self!.fastUpgrade {
self?.doFastUpgrade() self?.doFastUpgrade()
return return
} else if !self!.closed && !self!.websocket { } else if !self!.closed && self!.polling {
self?.doPoll() self?.doPoll()
} }
}.resume() }.resume()
@ -288,14 +296,14 @@ public class SocketEngine: NSObject, WebSocketDelegate {
} else if err != nil && self!.polling { } else if err != nil && self!.polling {
self?.handlePollingFailed(err.localizedDescription) self?.handlePollingFailed(err.localizedDescription)
return return
} else if err != nil {
NSLog(err.localizedDescription)
return
} }
self?.waitingForPost = false self?.waitingForPost = false
dispatch_async(self!.emitQueue) { dispatch_async(self!.emitQueue) {
if self!.fastUpgrade { if !self!.fastUpgrade {
self?.doFastUpgrade()
return
} else {
self?.flushWaitingForPost() self?.flushWaitingForPost()
self?.doPoll() self?.doPoll()
} }
@ -321,10 +329,14 @@ public class SocketEngine: NSObject, WebSocketDelegate {
self.waitingForPoll = false self.waitingForPoll = false
self.waitingForPost = false self.waitingForPost = false
if !self.closed && !self.client.reconnecting { if self.client == nil {
self.client.pollingDidFail(reason) return
} else if !self.client.reconnecting { }
self.client.didForceClose(reason)
if !self.closed && !self.client!.reconnecting {
self.client?.pollingDidFail(reason)
} else if !self.client!.reconnecting {
self.client?.didForceClose(reason)
} }
} }
@ -414,8 +426,12 @@ public class SocketEngine: NSObject, WebSocketDelegate {
} }
private func parseEngineData(data:NSData) { private func parseEngineData(data:NSData) {
dispatch_async(self.client.handleQueue) {[weak self] in if self.client == nil {
self?.client.parseBinaryData(data.subdataWithRange(NSMakeRange(1, data.length - 1))) return
}
dispatch_async(self.client!.handleQueue) {[weak self] in
self?.client?.parseBinaryData(data.subdataWithRange(NSMakeRange(1, data.length - 1)))
return return
} }
} }
@ -439,8 +455,13 @@ public class SocketEngine: NSObject, WebSocketDelegate {
if let data = NSData(base64EncodedString: message, if let data = NSData(base64EncodedString: message,
options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters) { options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters) {
// println("sending \(data)") // println("sending \(data)")
dispatch_async(self.client.handleQueue) {[weak self] in
self?.client.parseBinaryData(data) if self.client == nil {
return
}
dispatch_async(self.client!.handleQueue) {[weak self] in
self?.client?.parseBinaryData(data)
return return
} }
} }
@ -492,8 +513,12 @@ public class SocketEngine: NSObject, WebSocketDelegate {
return return
} else if type == PacketType.CLOSE.rawValue { } else if type == PacketType.CLOSE.rawValue {
if self.client == nil {
return
}
if self.polling { if self.polling {
self.client.didForceClose("Disconnect") self.client!.didForceClose("Disconnect")
} }
return return
@ -505,8 +530,12 @@ public class SocketEngine: NSObject, WebSocketDelegate {
// Remove message type // Remove message type
message.removeAtIndex(message.startIndex) message.removeAtIndex(message.startIndex)
dispatch_async(self.client.handleQueue) {[weak self] in if self.client == nil {
self?.client.parseSocketMessage(message) return
}
dispatch_async(self.client!.handleQueue) {[weak self] in
self?.client?.parseSocketMessage(message)
return return
} }
} }
@ -588,6 +617,7 @@ public class SocketEngine: NSObject, WebSocketDelegate {
if self.websocketConnected { if self.websocketConnected {
// NSLog("Doing fast upgrade") // NSLog("Doing fast upgrade")
// Do a fast upgrade // Do a fast upgrade
// At this point, we should not send anymore polling messages-
self.fastUpgrade = true self.fastUpgrade = true
self.sendPollMessage("", withType: PacketType.NOOP) self.sendPollMessage("", withType: PacketType.NOOP)
} }
@ -628,13 +658,18 @@ public class SocketEngine: NSObject, WebSocketDelegate {
self.websocketConnected = false self.websocketConnected = false
self.probing = false self.probing = false
if self.closed {
self.client?.didForceClose("Disconnect")
return
}
if self.websocket { if self.websocket {
self.pingTimer?.invalidate() self.pingTimer?.invalidate()
self._connected = false self._connected = false
self._websocket = false self._websocket = false
let reason = error?.localizedDescription let reason = error?.localizedDescription
self.client.webSocketDidCloseWithCode(1, self.client?.webSocketDidCloseWithCode(1,
reason: reason == nil ? "Socket Disconnected" : reason!) reason: reason == nil ? "Socket Disconnected" : reason!)
} else { } else {
self.flushProbeWait() self.flushProbeWait()

View File

@ -204,6 +204,7 @@ public class SocketIOClient: NSObject, SocketEngineClient {
if timeout != 0 { if timeout != 0 {
let time = dispatch_time(DISPATCH_TIME_NOW, Int64(timeout * NSEC_PER_SEC)) let time = dispatch_time(DISPATCH_TIME_NOW, Int64(timeout * NSEC_PER_SEC))
dispatch_after(time, dispatch_get_main_queue()) { dispatch_after(time, dispatch_get_main_queue()) {
self?.ackHandlers.timeoutAck(ack) self?.ackHandlers.timeoutAck(ack)
return return