From 012f0099a528ed6c498d9de1a2ab23270e2e1785 Mon Sep 17 00:00:00 2001 From: Kristaps Grinbergs Date: Thu, 3 Oct 2019 10:44:20 +0300 Subject: [PATCH 1/7] Importing UIKit/Appkit Need to import UIKit/AppKit if using -passthroughCustomScalars when building and SwiftPM --- Tests/GitHubAPI/API.swift | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Tests/GitHubAPI/API.swift b/Tests/GitHubAPI/API.swift index 602f091394..0f74306ddd 100644 --- a/Tests/GitHubAPI/API.swift +++ b/Tests/GitHubAPI/API.swift @@ -1,5 +1,11 @@ // This file was automatically generated and should not be edited. +#if canImport(UIKit) +import UIKit +#elseif canImport(AppKit) +import AppKit +#endif + import Apollo public final class RepositoryQuery: GraphQLQuery { From 8a21b047e853516c8a38ed258c286739e3745b90 Mon Sep 17 00:00:00 2001 From: Kristaps Grinbergs Date: Wed, 5 Feb 2020 15:44:50 +0200 Subject: [PATCH 2/7] Add options: * allow to specify if sending duplicate messages when reconnecing * opt out for auto-reconnection --- Sources/ApolloWebSocket/WebSocketTransport.swift | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/Sources/ApolloWebSocket/WebSocketTransport.swift b/Sources/ApolloWebSocket/WebSocketTransport.swift index 724b9902e3..09796134df 100644 --- a/Sources/ApolloWebSocket/WebSocketTransport.swift +++ b/Sources/ApolloWebSocket/WebSocketTransport.swift @@ -44,6 +44,7 @@ public class WebSocketTransport { private let sendOperationIdentifiers: Bool private let reconnectionInterval: TimeInterval + private let allowSendingDuplicates: Bool fileprivate let sequenceNumberCounter = Atomic(0) fileprivate var reconnected = false @@ -74,12 +75,16 @@ public class WebSocketTransport { clientName: String = WebSocketTransport.defaultClientName, clientVersion: String = WebSocketTransport.defaultClientVersion, sendOperationIdentifiers: Bool = false, + reconnect: Bool = true, reconnectionInterval: TimeInterval = 0.5, + allowSendingDuplicates: Bool = true, connectingPayload: GraphQLMap? = [:], requestCreator: RequestCreator = ApolloRequestCreator()) { self.connectingPayload = connectingPayload self.sendOperationIdentifiers = sendOperationIdentifiers + self.reconnect.value = reconnect self.reconnectionInterval = reconnectionInterval + self.allowSendingDuplicates = allowSendingDuplicates self.requestCreator = requestCreator self.websocket = WebSocketTransport.provider.init(request: request, protocols: protocols) self.clientName = clientName @@ -176,7 +181,7 @@ public class WebSocketTransport { let queue = self.queue.sorted(by: { $0.0 < $1.0 }) self.queue.removeAll() for (id, msg) in queue { - self.write(msg,id: id) + self.write(msg, id: id) } } @@ -291,13 +296,14 @@ extension WebSocketTransport: WebSocketDelegate { public func websocketDidConnect(socket: WebSocketClient) { self.error.value = nil - initServer() + initServer(reconnect: reconnect.value) if reconnected { self.delegate?.webSocketTransportDidReconnect(self) // re-send the subscriptions whenever we are re-connected // for the first connect, any subscriptions are already in queue for (_,msg) in self.subscriptions { - write(msg) + let id = allowSendingDuplicates ? nil : queue.first { $0.value == msg }?.key + write(msg, id: id) } } else { self.delegate?.webSocketTransportDidConnect(self) From 36c1c04e924900b5faceb28f12fd7ba08a74b3e3 Mon Sep 17 00:00:00 2001 From: Kristaps Grinbergs Date: Wed, 5 Feb 2020 15:51:32 +0200 Subject: [PATCH 3/7] Revert some old changes --- Tests/GitHubAPI/API.swift | 6 ------ 1 file changed, 6 deletions(-) diff --git a/Tests/GitHubAPI/API.swift b/Tests/GitHubAPI/API.swift index 6a99da17fd..172aaaa2ef 100644 --- a/Tests/GitHubAPI/API.swift +++ b/Tests/GitHubAPI/API.swift @@ -1,11 +1,5 @@ // This file was automatically generated and should not be edited. -#if canImport(UIKit) -import UIKit -#elseif canImport(AppKit) -import AppKit -#endif - import Apollo import Foundation From 34e56574fe26301ab75da819ebee4dafb13ffe0e Mon Sep 17 00:00:00 2001 From: Kristaps Grinbergs Date: Tue, 11 Feb 2020 21:19:58 +0200 Subject: [PATCH 4/7] Setting reconnect in init method --- Sources/ApolloWebSocket/WebSocketTransport.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sources/ApolloWebSocket/WebSocketTransport.swift b/Sources/ApolloWebSocket/WebSocketTransport.swift index f802f65b3b..6e3609305d 100644 --- a/Sources/ApolloWebSocket/WebSocketTransport.swift +++ b/Sources/ApolloWebSocket/WebSocketTransport.swift @@ -25,7 +25,7 @@ public class WebSocketTransport { public static var provider: ApolloWebSocketClient.Type = ApolloWebSocket.self public weak var delegate: WebSocketTransportDelegate? - let reconnect: Atomic = Atomic(false) + let reconnect: Atomic var websocket: ApolloWebSocketClient let error: Atomic = Atomic(nil) let serializationFormat = JSONSerializationFormat.self @@ -82,7 +82,7 @@ public class WebSocketTransport { requestCreator: RequestCreator = ApolloRequestCreator()) { self.connectingPayload = connectingPayload self.sendOperationIdentifiers = sendOperationIdentifiers - self.reconnect.value = reconnect + self.reconnect = Atomic(reconnect) self.reconnectionInterval = reconnectionInterval self.allowSendingDuplicates = allowSendingDuplicates self.requestCreator = requestCreator From 94c0099e2cd6b46585f905ffb19eb00449bcb85c Mon Sep 17 00:00:00 2001 From: Kristaps Grinbergs Date: Wed, 12 Feb 2020 16:56:03 +0200 Subject: [PATCH 5/7] Remove ternary operator --- Sources/ApolloWebSocket/WebSocketTransport.swift | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Sources/ApolloWebSocket/WebSocketTransport.swift b/Sources/ApolloWebSocket/WebSocketTransport.swift index 6e3609305d..24093c3c67 100644 --- a/Sources/ApolloWebSocket/WebSocketTransport.swift +++ b/Sources/ApolloWebSocket/WebSocketTransport.swift @@ -302,8 +302,14 @@ extension WebSocketTransport: WebSocketDelegate { // re-send the subscriptions whenever we are re-connected // for the first connect, any subscriptions are already in queue for (_,msg) in self.subscriptions { - let id = allowSendingDuplicates ? nil : queue.first { $0.value == msg }?.key - write(msg, id: id) + if allowSendingDuplicates { + write(msg) + } else { + // search duplicate message from the queue + // do not send multiple times + let id = queue.first { $0.value == msg }?.key + write(msg, id: id) + } } } else { self.delegate?.webSocketTransportDidConnect(self) From 575bc98e1aa814bfc60413af6f10a5fafab95823 Mon Sep 17 00:00:00 2001 From: Kristaps Grinbergs Date: Wed, 12 Feb 2020 17:45:43 +0200 Subject: [PATCH 6/7] Remove loop with reconnect.value setting --- Sources/ApolloWebSocket/WebSocketTransport.swift | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Sources/ApolloWebSocket/WebSocketTransport.swift b/Sources/ApolloWebSocket/WebSocketTransport.swift index 24093c3c67..87c428f6de 100644 --- a/Sources/ApolloWebSocket/WebSocketTransport.swift +++ b/Sources/ApolloWebSocket/WebSocketTransport.swift @@ -68,7 +68,9 @@ public class WebSocketTransport { /// - Parameter clientName: The client name to use for this client. Defaults to `Self.defaultClientName` /// - Parameter clientVersion: The client version to use for this client. Defaults to `Self.defaultClientVersion`. /// - Parameter sendOperationIdentifiers: Whether or not to send operation identifiers with operations. Defaults to false. + /// - Paremeter reconnect: Wether to auto reconnect when websocket looses connection. Defaults to true. /// - Parameter reconnectionInterval: How long to wait before attempting to reconnect. Defaults to half a second. + /// - Parameter allowSendingDuplicates: Allow sending duplicate messages. Important when reconnected. Defaults to true. /// - Parameter connectingPayload: [optional] The payload to send on connection. Defaults to an empty `GraphQLMap`. /// - Parameter requestCreator: The request creator to use when serializing requests. Defaults to an `ApolloRequestCreator`. public init(request: URLRequest, @@ -189,8 +191,7 @@ public class WebSocketTransport { print("WebSocketTransport::unprocessed event \(data)") } - public func initServer(reconnect: Bool = true) { - self.reconnect.value = reconnect + public func initServer() { self.acked = false if let str = OperationMessage(payload: self.connectingPayload, type: .connectionInit).rawMessage { @@ -296,7 +297,7 @@ extension WebSocketTransport: WebSocketDelegate { public func websocketDidConnect(socket: WebSocketClient) { self.error.value = nil - initServer(reconnect: reconnect.value) + initServer() if reconnected { self.delegate?.webSocketTransportDidReconnect(self) // re-send the subscriptions whenever we are re-connected From 4177ad46f77045c9c899f72ae0695624ef243ab9 Mon Sep 17 00:00:00 2001 From: Kristaps Grinbergs Date: Thu, 13 Feb 2020 10:34:47 +0200 Subject: [PATCH 7/7] Remove mislieading comment --- Sources/ApolloWebSocket/WebSocketTransport.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/Sources/ApolloWebSocket/WebSocketTransport.swift b/Sources/ApolloWebSocket/WebSocketTransport.swift index 87c428f6de..da6fb3d8ee 100644 --- a/Sources/ApolloWebSocket/WebSocketTransport.swift +++ b/Sources/ApolloWebSocket/WebSocketTransport.swift @@ -307,7 +307,6 @@ extension WebSocketTransport: WebSocketDelegate { write(msg) } else { // search duplicate message from the queue - // do not send multiple times let id = queue.first { $0.value == msg }?.key write(msg, id: id) }