From 8985244f7e364c4dfd088cac41139ed2c0a87f52 Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Thu, 29 Aug 2019 15:52:51 +1000 Subject: [PATCH] Merge LokiAPI+Convenience & LokiAPI --- .../src/Loki/API/LokiAPI+Convenience.swift | 49 ------------------- SignalServiceKit/src/Loki/API/LokiAPI.swift | 47 ++++++++++++++++++ 2 files changed, 47 insertions(+), 49 deletions(-) delete mode 100644 SignalServiceKit/src/Loki/API/LokiAPI+Convenience.swift diff --git a/SignalServiceKit/src/Loki/API/LokiAPI+Convenience.swift b/SignalServiceKit/src/Loki/API/LokiAPI+Convenience.swift deleted file mode 100644 index 0ebca88e4..000000000 --- a/SignalServiceKit/src/Loki/API/LokiAPI+Convenience.swift +++ /dev/null @@ -1,49 +0,0 @@ -import PromiseKit - -internal extension LokiAPI { - - private static let receivedMessageHashValuesKey = "receivedMessageHashValuesKey" - private static let receivedMessageHashValuesCollection = "receivedMessageHashValuesCollection" - - internal static func getLastMessageHashValue(for target: LokiAPITarget) -> String? { - var result: String? = nil - // Uses a read/write connection because getting the last message hash value also removes expired messages as needed - // TODO: This shouldn't be the case; a getter shouldn't have an unexpected side effect - storage.dbReadWriteConnection.readWrite { transaction in - result = storage.getLastMessageHash(forServiceNode: target.address, transaction: transaction) - } - return result - } - - internal static func setLastMessageHashValue(for target: LokiAPITarget, hashValue: String, expirationDate: UInt64) { - storage.dbReadWriteConnection.readWrite { transaction in - storage.setLastMessageHash(forServiceNode: target.address, hash: hashValue, expiresAt: expirationDate, transaction: transaction) - } - } - - internal static func getReceivedMessageHashValues() -> Set? { - var result: Set? = nil - storage.dbReadConnection.read { transaction in - result = transaction.object(forKey: receivedMessageHashValuesKey, inCollection: receivedMessageHashValuesCollection) as! Set? - } - return result - } - - internal static func setReceivedMessageHashValues(to receivedMessageHashValues: Set) { - storage.dbReadWriteConnection.readWrite { transaction in - transaction.setObject(receivedMessageHashValues, forKey: receivedMessageHashValuesKey, inCollection: receivedMessageHashValuesCollection) - } - } -} - -internal extension Promise { - - internal func recoveringNetworkErrorsIfNeeded() -> Promise { - return recover() { error -> Promise in - switch error { - case NetworkManagerError.taskError(_, let underlyingError): throw underlyingError - default: throw error - } - } - } -} diff --git a/SignalServiceKit/src/Loki/API/LokiAPI.swift b/SignalServiceKit/src/Loki/API/LokiAPI.swift index 04e74f481..c81a39589 100644 --- a/SignalServiceKit/src/Loki/API/LokiAPI.swift +++ b/SignalServiceKit/src/Loki/API/LokiAPI.swift @@ -173,4 +173,51 @@ public final class LokiAPI : NSObject { return envelope } } + + // MARK: Caching + private static let receivedMessageHashValuesKey = "receivedMessageHashValuesKey" + private static let receivedMessageHashValuesCollection = "receivedMessageHashValuesCollection" + + private static func getLastMessageHashValue(for target: LokiAPITarget) -> String? { + var result: String? = nil + // Uses a read/write connection because getting the last message hash value also removes expired messages as needed + // TODO: This shouldn't be the case; a getter shouldn't have an unexpected side effect + storage.dbReadWriteConnection.readWrite { transaction in + result = storage.getLastMessageHash(forServiceNode: target.address, transaction: transaction) + } + return result + } + + private static func setLastMessageHashValue(for target: LokiAPITarget, hashValue: String, expirationDate: UInt64) { + storage.dbReadWriteConnection.readWrite { transaction in + storage.setLastMessageHash(forServiceNode: target.address, hash: hashValue, expiresAt: expirationDate, transaction: transaction) + } + } + + private static func getReceivedMessageHashValues() -> Set? { + var result: Set? = nil + storage.dbReadConnection.read { transaction in + result = transaction.object(forKey: receivedMessageHashValuesKey, inCollection: receivedMessageHashValuesCollection) as! Set? + } + return result + } + + private static func setReceivedMessageHashValues(to receivedMessageHashValues: Set) { + storage.dbReadWriteConnection.readWrite { transaction in + transaction.setObject(receivedMessageHashValues, forKey: receivedMessageHashValuesKey, inCollection: receivedMessageHashValuesCollection) + } + } +} + +// MARK: Error Handling +private extension Promise { + + fileprivate func recoveringNetworkErrorsIfNeeded() -> Promise { + return recover() { error -> Promise in + switch error { + case NetworkManagerError.taskError(_, let underlyingError): throw underlyingError + default: throw error + } + } + } }