diff --git a/Pods b/Pods index 788d43379..232a6f349 160000 --- a/Pods +++ b/Pods @@ -1 +1 @@ -Subproject commit 788d43379038478b34765fbc9538470172ba0730 +Subproject commit 232a6f349bf92766947bc9cdd44dbfe651133629 diff --git a/SignalServiceKit/src/Loki/API/LokiAPI+Request.swift b/SignalServiceKit/src/Loki/API/LokiAPI+Request.swift new file mode 100644 index 000000000..27d0a7f03 --- /dev/null +++ b/SignalServiceKit/src/Loki/API/LokiAPI+Request.swift @@ -0,0 +1,20 @@ + +internal extension LokiAPI { + internal struct Request { + var method: LokiAPITarget.Method + var target: LokiAPITarget + var publicKey: String + var parameters: [String:Any] + var headers: [String:String] + var timeout: TimeInterval? + + init(method: LokiAPITarget.Method, target: LokiAPITarget, publicKey: String, parameters: [String:Any] = [:]) { + self.method = method + self.target = target + self.publicKey = publicKey + self.parameters = parameters + self.headers = [:] + self.timeout = nil + } + } +} diff --git a/SignalServiceKit/src/Loki/API/LokiAPI.swift b/SignalServiceKit/src/Loki/API/LokiAPI.swift index 5559407c9..c30e7f761 100644 --- a/SignalServiceKit/src/Loki/API/LokiAPI.swift +++ b/SignalServiceKit/src/Loki/API/LokiAPI.swift @@ -31,16 +31,20 @@ import PromiseKit override private init() { } // MARK: Internal API - internal static func invoke(_ method: LokiAPITarget.Method, on target: LokiAPITarget, associatedWith hexEncodedPublicKey: String, parameters: [String:Any] = [:], headers: [String:String] = [:], timeout: TimeInterval? = nil) -> RawResponsePromise { - let url = URL(string: "\(target.address):\(target.port)/\(version)/storage_rpc")! - let request = TSRequest(url: url, method: "POST", parameters: [ "method" : method.rawValue, "params" : parameters ]) - request.allHTTPHeaderFields = headers - if let timeout = timeout { - request.timeoutInterval = timeout + internal static func invoke(_ method: LokiAPITarget.Method, on target: LokiAPITarget, associatedWith hexEncodedPublicKey: String, parameters: [String:Any]) -> RawResponsePromise { + return invoke(request: Request(method: method, target: target, publicKey: hexEncodedPublicKey, parameters: parameters)) + } + + internal static func invoke(request: Request) -> RawResponsePromise { + let url = URL(string: "\(request.target.address):\(request.target.port)/\(version)/storage_rpc")! + let networkRequest = TSRequest(url: url, method: "POST", parameters: [ "method" : request.method.rawValue, "params" : request.parameters ]) + networkRequest.allHTTPHeaderFields = request.headers + if let timeout = request.timeout { + networkRequest.timeoutInterval = timeout } - return TSNetworkManager.shared().makePromise(request: request).map { $0.responseObject } - .handlingSwarmSpecificErrorsIfNeeded(for: target, associatedWith: hexEncodedPublicKey).recoveringNetworkErrorsIfNeeded() + return TSNetworkManager.shared().makePromise(request: networkRequest).map { $0.responseObject } + .handlingSwarmSpecificErrorsIfNeeded(for: request.target, associatedWith: request.publicKey).recoveringNetworkErrorsIfNeeded() } @@ -51,10 +55,15 @@ import PromiseKit internal static func getRawMessages(from target: LokiAPITarget, longPolling: Bool = true) -> Promise<[JSON]> { let hexEncodedPublicKey = OWSIdentityManager.shared().identityKeyPair()!.hexEncodedPublicKey let lastHashValue = getLastMessageHashValue(for: target) ?? "" - let parameters: [String:Any] = [ "pubKey" : hexEncodedPublicKey, "lastHash" : lastHashValue ] - let headers = longPolling ? ["X-Loki-Long-Poll" : "true"] : [:] - let timeout: TimeInterval? = longPolling ? 40 : nil // 40 second timeout - return invoke(.getMessages, on: target, associatedWith: hexEncodedPublicKey, parameters: parameters, headers: headers, timeout: timeout).map { rawResponse in + let parameters = [ "pubKey" : hexEncodedPublicKey, "lastHash" : lastHashValue ] + + var request = Request(method: .getMessages, target: target, publicKey: hexEncodedPublicKey, parameters: parameters) + if (longPolling) { + request.headers = ["X-Loki-Long-Poll" : "true"] + request.timeout = 40 // 40 second timeout + } + + return invoke(request: request).map { rawResponse in guard let json = rawResponse as? JSON, let rawMessages = json["messages"] as? [JSON] else { return [] } return rawMessages }