use connect/disconnect for engine
This commit is contained in:
parent
70283acc1f
commit
2f4c942dcf
@ -186,32 +186,42 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb
|
|||||||
}
|
}
|
||||||
|
|
||||||
public func close(reason: String) {
|
public func close(reason: String) {
|
||||||
func postSendClose(data: NSData?, _ res: NSURLResponse?, _ err: NSError?) {
|
disconnect(reason)
|
||||||
sid = ""
|
}
|
||||||
closed = true
|
|
||||||
invalidated = true
|
/// Starts the connection to the server
|
||||||
connected = false
|
public func connect() {
|
||||||
|
if connected {
|
||||||
pingTimer?.invalidate()
|
DefaultSocketLogger.Logger.error("Engine tried opening while connected. Assuming this was a reconnect", type: logType)
|
||||||
ws?.disconnect()
|
close("reconnect")
|
||||||
stopPolling()
|
|
||||||
client?.engineDidClose(reason)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DefaultSocketLogger.Logger.log("Engine is being closed.", type: logType)
|
DefaultSocketLogger.Logger.log("Starting engine", type: logType)
|
||||||
|
DefaultSocketLogger.Logger.log("Handshaking", type: logType)
|
||||||
|
|
||||||
if websocket {
|
resetEngine()
|
||||||
sendWebSocketMessage("", withType: .Close, withData: [])
|
|
||||||
postSendClose(nil, nil, nil)
|
if forceWebsockets {
|
||||||
} else {
|
polling = false
|
||||||
// We need to take special care when we're polling that we send it ASAP
|
websocket = true
|
||||||
// Also make sure we're on the emitQueue since we're touching postWait
|
createWebsocketAndConnect()
|
||||||
dispatch_sync(emitQueue) {
|
return
|
||||||
self.postWait.append(String(SocketEnginePacketType.Close.rawValue))
|
}
|
||||||
let req = self.createRequestForPostWithPostWait()
|
|
||||||
self.doRequest(req, withCallback: postSendClose)
|
let reqPolling = NSMutableURLRequest(URL: urlPolling)
|
||||||
|
|
||||||
|
if cookies != nil {
|
||||||
|
let headers = NSHTTPCookie.requestHeaderFieldsWithCookies(cookies!)
|
||||||
|
reqPolling.allHTTPHeaderFields = headers
|
||||||
|
}
|
||||||
|
|
||||||
|
if let extraHeaders = extraHeaders {
|
||||||
|
for (headerName, value) in extraHeaders {
|
||||||
|
reqPolling.setValue(value, forHTTPHeaderField: headerName)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
doLongPoll(reqPolling)
|
||||||
}
|
}
|
||||||
|
|
||||||
private func createURLs() -> (NSURL, NSURL) {
|
private func createURLs() -> (NSURL, NSURL) {
|
||||||
@ -277,6 +287,35 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb
|
|||||||
client?.engineDidError(error)
|
client?.engineDidError(error)
|
||||||
close(error)
|
close(error)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public func disconnect(reason: String) {
|
||||||
|
func postSendClose(data: NSData?, _ res: NSURLResponse?, _ err: NSError?) {
|
||||||
|
sid = ""
|
||||||
|
closed = true
|
||||||
|
invalidated = true
|
||||||
|
connected = false
|
||||||
|
|
||||||
|
pingTimer?.invalidate()
|
||||||
|
ws?.disconnect()
|
||||||
|
stopPolling()
|
||||||
|
client?.engineDidClose(reason)
|
||||||
|
}
|
||||||
|
|
||||||
|
DefaultSocketLogger.Logger.log("Engine is being closed.", type: logType)
|
||||||
|
|
||||||
|
if websocket {
|
||||||
|
sendWebSocketMessage("", withType: .Close, withData: [])
|
||||||
|
postSendClose(nil, nil, nil)
|
||||||
|
} else {
|
||||||
|
// We need to take special care when we're polling that we send it ASAP
|
||||||
|
// Also make sure we're on the emitQueue since we're touching postWait
|
||||||
|
dispatch_sync(emitQueue) {
|
||||||
|
self.postWait.append(String(SocketEnginePacketType.Close.rawValue))
|
||||||
|
let req = self.createRequestForPostWithPostWait()
|
||||||
|
self.doRequest(req, withCallback: postSendClose)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public func doFastUpgrade() {
|
public func doFastUpgrade() {
|
||||||
if waitingForPoll {
|
if waitingForPoll {
|
||||||
@ -383,37 +422,7 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb
|
|||||||
}
|
}
|
||||||
|
|
||||||
public func open() {
|
public func open() {
|
||||||
if connected {
|
connect()
|
||||||
DefaultSocketLogger.Logger.error("Engine tried opening while connected. Assuming this was a reconnect", type: logType)
|
|
||||||
close("reconnect")
|
|
||||||
}
|
|
||||||
|
|
||||||
DefaultSocketLogger.Logger.log("Starting engine", type: logType)
|
|
||||||
DefaultSocketLogger.Logger.log("Handshaking", type: logType)
|
|
||||||
|
|
||||||
resetEngine()
|
|
||||||
|
|
||||||
if forceWebsockets {
|
|
||||||
polling = false
|
|
||||||
websocket = true
|
|
||||||
createWebsocketAndConnect()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
let reqPolling = NSMutableURLRequest(URL: urlPolling)
|
|
||||||
|
|
||||||
if cookies != nil {
|
|
||||||
let headers = NSHTTPCookie.requestHeaderFieldsWithCookies(cookies!)
|
|
||||||
reqPolling.allHTTPHeaderFields = headers
|
|
||||||
}
|
|
||||||
|
|
||||||
if let extraHeaders = extraHeaders {
|
|
||||||
for (headerName, value) in extraHeaders {
|
|
||||||
reqPolling.setValue(value, forHTTPHeaderField: headerName)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
doLongPoll(reqPolling)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public func parseEngineData(data: NSData) {
|
public func parseEngineData(data: NSData) {
|
||||||
@ -457,6 +466,7 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Puts the engine back in its default state
|
||||||
private func resetEngine() {
|
private func resetEngine() {
|
||||||
closed = false
|
closed = false
|
||||||
connected = false
|
connected = false
|
||||||
@ -485,12 +495,11 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb
|
|||||||
write("", withType: .Ping, withData: [])
|
write("", withType: .Ping, withData: [])
|
||||||
}
|
}
|
||||||
|
|
||||||
// Starts the ping timer
|
|
||||||
private func startPingTimer() {
|
private func startPingTimer() {
|
||||||
if let pingInterval = pingInterval {
|
if let pingInterval = pingInterval {
|
||||||
pingTimer?.invalidate()
|
pingTimer?.invalidate()
|
||||||
pingTimer = nil
|
pingTimer = nil
|
||||||
|
|
||||||
dispatch_async(dispatch_get_main_queue()) {
|
dispatch_async(dispatch_get_main_queue()) {
|
||||||
self.pingTimer = NSTimer.scheduledTimerWithTimeInterval(pingInterval, target: self,
|
self.pingTimer = NSTimer.scheduledTimerWithTimeInterval(pingInterval, target: self,
|
||||||
selector: Selector("sendPing"), userInfo: nil, repeats: true)
|
selector: Selector("sendPing"), userInfo: nil, repeats: true)
|
||||||
@ -498,6 +507,7 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Moves from long-polling to websockets
|
||||||
private func upgradeTransport() {
|
private func upgradeTransport() {
|
||||||
if ws?.isConnected ?? false {
|
if ws?.isConnected ?? false {
|
||||||
DefaultSocketLogger.Logger.log("Upgrading transport to WebSockets", type: logType)
|
DefaultSocketLogger.Logger.log("Upgrading transport to WebSockets", type: logType)
|
||||||
@ -508,9 +518,7 @@ public final class SocketEngine: NSObject, SocketEnginePollable, SocketEngineWeb
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/// Write a message, independent of transport.
|
||||||
Write a message, independent of transport.
|
|
||||||
*/
|
|
||||||
public func write(msg: String, withType type: SocketEnginePacketType, withData data: [NSData]) {
|
public func write(msg: String, withType type: SocketEnginePacketType, withData data: [NSData]) {
|
||||||
dispatch_async(emitQueue) {
|
dispatch_async(emitQueue) {
|
||||||
guard self.connected else { return }
|
guard self.connected else { return }
|
||||||
|
|||||||
@ -50,11 +50,13 @@ import Foundation
|
|||||||
|
|
||||||
init(client: SocketEngineClient, url: NSURL, options: NSDictionary?)
|
init(client: SocketEngineClient, url: NSURL, options: NSDictionary?)
|
||||||
|
|
||||||
func close(reason: String)
|
@available(*, deprecated=5.5, message="Please use disconnect") func close(reason: String)
|
||||||
|
func connect()
|
||||||
func didError(error: String)
|
func didError(error: String)
|
||||||
|
func disconnect(reason: String)
|
||||||
func doFastUpgrade()
|
func doFastUpgrade()
|
||||||
func flushWaitingForPostToWebSocket()
|
func flushWaitingForPostToWebSocket()
|
||||||
func open()
|
@available(*, deprecated=5.5, message="Please use connect") func open()
|
||||||
func parseEngineData(data: NSData)
|
func parseEngineData(data: NSData)
|
||||||
func parseEngineMessage(message: String, fromPolling: Bool)
|
func parseEngineMessage(message: String, fromPolling: Bool)
|
||||||
func write(msg: String, withType type: SocketEnginePacketType, withData data: [NSData])
|
func write(msg: String, withType type: SocketEnginePacketType, withData data: [NSData])
|
||||||
|
|||||||
@ -116,7 +116,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketParsable
|
|||||||
|
|
||||||
deinit {
|
deinit {
|
||||||
DefaultSocketLogger.Logger.log("Client is being released", type: logType)
|
DefaultSocketLogger.Logger.log("Client is being released", type: logType)
|
||||||
engine?.close("Client Deinit")
|
engine?.disconnect("Client Deinit")
|
||||||
}
|
}
|
||||||
|
|
||||||
private func addEngine() -> SocketEngineSpec {
|
private func addEngine() -> SocketEngineSpec {
|
||||||
@ -159,9 +159,9 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketParsable
|
|||||||
status = .Connecting
|
status = .Connecting
|
||||||
|
|
||||||
if engine == nil || forceNew {
|
if engine == nil || forceNew {
|
||||||
addEngine().open()
|
addEngine().connect()
|
||||||
} else {
|
} else {
|
||||||
engine?.open()
|
engine?.connect()
|
||||||
}
|
}
|
||||||
|
|
||||||
guard timeoutAfter != 0 else { return }
|
guard timeoutAfter != 0 else { return }
|
||||||
@ -171,7 +171,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketParsable
|
|||||||
dispatch_after(time, handleQueue) {[weak self] in
|
dispatch_after(time, handleQueue) {[weak self] in
|
||||||
if let this = self where this.status != .Connected || this.status != .Closed {
|
if let this = self where this.status != .Connected || this.status != .Closed {
|
||||||
this.status = .Closed
|
this.status = .Closed
|
||||||
this.engine?.close("Connect timeout")
|
this.engine?.disconnect("Connect timeout")
|
||||||
|
|
||||||
handler?()
|
handler?()
|
||||||
}
|
}
|
||||||
@ -220,7 +220,7 @@ public final class SocketIOClient: NSObject, SocketEngineClient, SocketParsable
|
|||||||
reconnects = false
|
reconnects = false
|
||||||
|
|
||||||
// Make sure the engine is actually dead.
|
// Make sure the engine is actually dead.
|
||||||
engine?.close(reason)
|
engine?.disconnect(reason)
|
||||||
handleEvent("disconnect", data: [reason], isInternalMessage: true)
|
handleEvent("disconnect", data: [reason], isInternalMessage: true)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user