refactor closing engine
This commit is contained in:
parent
024384dc82
commit
d6c521123b
@ -132,8 +132,7 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb
|
|||||||
case 0: // Unknown transport
|
case 0: // Unknown transport
|
||||||
didError(error)
|
didError(error)
|
||||||
case 1: // Unknown sid. clear and retry connect
|
case 1: // Unknown sid. clear and retry connect
|
||||||
sid = ""
|
didError(error)
|
||||||
open(connectParams)
|
|
||||||
case 2: // Bad handshake request
|
case 2: // Bad handshake request
|
||||||
didError(error)
|
didError(error)
|
||||||
case 3: // Bad request
|
case 3: // Bad request
|
||||||
@ -164,22 +163,29 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb
|
|||||||
}
|
}
|
||||||
|
|
||||||
public func close(reason: String) {
|
public func close(reason: String) {
|
||||||
DefaultSocketLogger.Logger.log("Engine is being closed.", type: logType)
|
func postSendClose(data: NSData?, _ res: NSURLResponse?, _ err: NSError?) {
|
||||||
|
sid = ""
|
||||||
|
closed = true
|
||||||
|
invalidated = true
|
||||||
|
connected = false
|
||||||
|
|
||||||
pingTimer?.invalidate()
|
pingTimer?.invalidate()
|
||||||
closed = true
|
ws?.disconnect()
|
||||||
invalidated = true
|
stopPolling()
|
||||||
connected = false
|
client?.engineDidClose(reason)
|
||||||
|
}
|
||||||
|
|
||||||
|
DefaultSocketLogger.Logger.log("Engine is being closed.", type: logType)
|
||||||
|
|
||||||
if websocket {
|
if websocket {
|
||||||
sendWebSocketMessage("", withType: .Close, withData: [])
|
sendWebSocketMessage("", withType: .Close, withData: [])
|
||||||
|
postSendClose(nil, nil, nil)
|
||||||
} else {
|
} else {
|
||||||
sendPollMessage("", withType: .Close, withData: [])
|
// We need to take special care when we're polling that we send it ASAP
|
||||||
|
postWait.append("1")
|
||||||
|
let req = createRequestForPostWithPostWait()
|
||||||
|
doRequest(req, withCallback: postSendClose)
|
||||||
}
|
}
|
||||||
|
|
||||||
ws?.disconnect()
|
|
||||||
stopPolling()
|
|
||||||
client?.engineDidClose(reason)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private func createURLs(params: [String: AnyObject]?) -> (String, String) {
|
private func createURLs(params: [String: AnyObject]?) -> (String, String) {
|
||||||
@ -250,14 +256,9 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb
|
|||||||
}
|
}
|
||||||
|
|
||||||
public func didError(error: String) {
|
public func didError(error: String) {
|
||||||
connected = false
|
|
||||||
ws?.disconnect()
|
|
||||||
stopPolling()
|
|
||||||
pingTimer?.invalidate()
|
|
||||||
|
|
||||||
DefaultSocketLogger.Logger.error(error, type: logType)
|
DefaultSocketLogger.Logger.error(error, type: logType)
|
||||||
client?.engineDidError(error)
|
client?.engineDidError(error)
|
||||||
client?.engineDidClose(error)
|
close(error)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func doFastUpgrade() {
|
public func doFastUpgrade() {
|
||||||
@ -364,16 +365,15 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public func open(opts: [String: AnyObject]? = nil) {
|
public func open(opts: [String: AnyObject]?) {
|
||||||
connectParams = opts
|
|
||||||
|
|
||||||
if connected {
|
if connected {
|
||||||
DefaultSocketLogger.Logger.error("Tried to open while connected", type: logType)
|
DefaultSocketLogger.Logger.error("Engine tried opening while connected. This is probably a programming error. "
|
||||||
didError("Tried to open engine while connected")
|
+ "Abandoning open attempt", type: logType)
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
connectParams = opts
|
||||||
|
|
||||||
DefaultSocketLogger.Logger.log("Starting engine", type: logType)
|
DefaultSocketLogger.Logger.log("Starting engine", type: logType)
|
||||||
DefaultSocketLogger.Logger.log("Handshaking", type: logType)
|
DefaultSocketLogger.Logger.log("Handshaking", type: logType)
|
||||||
|
|
||||||
|
|||||||
@ -58,6 +58,33 @@ extension SocketEnginePollable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func createRequestForPostWithPostWait() -> NSURLRequest {
|
||||||
|
var postStr = ""
|
||||||
|
|
||||||
|
for packet in postWait {
|
||||||
|
let len = packet.characters.count
|
||||||
|
|
||||||
|
postStr += "\(len):\(packet)"
|
||||||
|
}
|
||||||
|
|
||||||
|
postWait.removeAll(keepCapacity: false)
|
||||||
|
|
||||||
|
let req = NSMutableURLRequest(URL: NSURL(string: urlPolling + "&sid=\(sid)")!)
|
||||||
|
|
||||||
|
addHeaders(req)
|
||||||
|
|
||||||
|
req.HTTPMethod = "POST"
|
||||||
|
req.setValue("text/plain; charset=UTF-8", forHTTPHeaderField: "Content-Type")
|
||||||
|
|
||||||
|
let postData = postStr.dataUsingEncoding(NSUTF8StringEncoding,
|
||||||
|
allowLossyConversion: false)!
|
||||||
|
|
||||||
|
req.HTTPBody = postData
|
||||||
|
req.setValue(String(postData.length), forHTTPHeaderField: "Content-Length")
|
||||||
|
|
||||||
|
return req
|
||||||
|
}
|
||||||
|
|
||||||
public func doPoll() {
|
public func doPoll() {
|
||||||
if websocket || waitingForPoll || !connected || closed {
|
if websocket || waitingForPoll || !connected || closed {
|
||||||
return
|
return
|
||||||
@ -70,10 +97,9 @@ extension SocketEnginePollable {
|
|||||||
doLongPoll(req)
|
doLongPoll(req)
|
||||||
}
|
}
|
||||||
|
|
||||||
private func doRequest(req: NSURLRequest,
|
func doRequest(req: NSURLRequest, withCallback callback: (NSData?, NSURLResponse?, NSError?) -> Void) {
|
||||||
withCallback callback: (NSData?, NSURLResponse?, NSError?) -> Void) {
|
|
||||||
if !polling || closed || invalidated {
|
if !polling || closed || invalidated {
|
||||||
DefaultSocketLogger.Logger.error("Tried to do polling request when not supposed to", type: "SocketEngine")
|
DefaultSocketLogger.Logger.error("Tried to do polling request when not supposed to", type: "SocketEnginePolling")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -87,7 +113,7 @@ extension SocketEnginePollable {
|
|||||||
guard let this = self else {return}
|
guard let this = self else {return}
|
||||||
|
|
||||||
if err != nil || data == nil {
|
if err != nil || data == nil {
|
||||||
DefaultSocketLogger.Logger.error(err?.localizedDescription ?? "Error", type: "SocketEngine")
|
DefaultSocketLogger.Logger.error(err?.localizedDescription ?? "Error", type: "SocketEnginePolling")
|
||||||
|
|
||||||
if this.polling {
|
if this.polling {
|
||||||
this.didError(err?.localizedDescription ?? "Error")
|
this.didError(err?.localizedDescription ?? "Error")
|
||||||
@ -96,7 +122,7 @@ extension SocketEnginePollable {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
DefaultSocketLogger.Logger.log("Got polling response", type: "SocketEngine")
|
DefaultSocketLogger.Logger.log("Got polling response", type: "SocketEnginePolling")
|
||||||
|
|
||||||
if let str = String(data: data!, encoding: NSUTF8StringEncoding) {
|
if let str = String(data: data!, encoding: NSUTF8StringEncoding) {
|
||||||
dispatch_async(this.parseQueue) {
|
dispatch_async(this.parseQueue) {
|
||||||
@ -122,38 +148,17 @@ extension SocketEnginePollable {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
var postStr = ""
|
let req = createRequestForPostWithPostWait()
|
||||||
|
|
||||||
for packet in postWait {
|
|
||||||
let len = packet.characters.count
|
|
||||||
|
|
||||||
postStr += "\(len):\(packet)"
|
|
||||||
}
|
|
||||||
|
|
||||||
postWait.removeAll(keepCapacity: false)
|
|
||||||
|
|
||||||
let req = NSMutableURLRequest(URL: NSURL(string: urlPolling + "&sid=\(sid)")!)
|
|
||||||
|
|
||||||
addHeaders(req)
|
|
||||||
|
|
||||||
req.HTTPMethod = "POST"
|
|
||||||
req.setValue("text/plain; charset=UTF-8", forHTTPHeaderField: "Content-Type")
|
|
||||||
|
|
||||||
let postData = postStr.dataUsingEncoding(NSUTF8StringEncoding,
|
|
||||||
allowLossyConversion: false)!
|
|
||||||
|
|
||||||
req.HTTPBody = postData
|
|
||||||
req.setValue(String(postData.length), forHTTPHeaderField: "Content-Length")
|
|
||||||
|
|
||||||
waitingForPost = true
|
waitingForPost = true
|
||||||
|
|
||||||
DefaultSocketLogger.Logger.log("POSTing: %@", type: "SocketEngine", args: postStr)
|
DefaultSocketLogger.Logger.log("POSTing: %@", type: "SocketEngine", args: postWait)
|
||||||
|
|
||||||
doRequest(req) {[weak self] data, res, err in
|
doRequest(req) {[weak self] data, res, err in
|
||||||
guard let this = self else {return}
|
guard let this = self else { return }
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
DefaultSocketLogger.Logger.error(err?.localizedDescription ?? "Error", type: "SocketEngine")
|
DefaultSocketLogger.Logger.error(err?.localizedDescription ?? "Error", type: "SocketEnginePolling")
|
||||||
|
|
||||||
if this.polling {
|
if this.polling {
|
||||||
this.didError(err?.localizedDescription ?? "Error")
|
this.didError(err?.localizedDescription ?? "Error")
|
||||||
@ -199,7 +204,7 @@ extension SocketEnginePollable {
|
|||||||
/// Send polling message.
|
/// Send polling message.
|
||||||
/// Only call on emitQueue
|
/// Only call on emitQueue
|
||||||
public func sendPollMessage(message: String, withType type: SocketEnginePacketType, withData datas: [NSData]) {
|
public func sendPollMessage(message: String, withType type: SocketEnginePacketType, withData datas: [NSData]) {
|
||||||
DefaultSocketLogger.Logger.log("Sending poll: %@ as type: %@", type: "SocketEngine", args: message, type.rawValue)
|
DefaultSocketLogger.Logger.log("Sending poll: %@ as type: %@", type: "SocketEnginePolling", args: message, type.rawValue)
|
||||||
let fixedMessage = doubleEncodeUTF8(message)
|
let fixedMessage = doubleEncodeUTF8(message)
|
||||||
let strMsg = "\(type.rawValue)\(fixedMessage)"
|
let strMsg = "\(type.rawValue)\(fixedMessage)"
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user