From 81c36fe5dd1a360481431d99b1cd5c225e46e4e2 Mon Sep 17 00:00:00 2001 From: gmbnt Date: Tue, 31 Mar 2020 16:49:07 +1100 Subject: [PATCH] Fix threading --- .../API/Onion Requests/OnionRequestAPI.swift | 68 ++++++++++--------- 1 file changed, 35 insertions(+), 33 deletions(-) diff --git a/SignalServiceKit/src/Loki/API/Onion Requests/OnionRequestAPI.swift b/SignalServiceKit/src/Loki/API/Onion Requests/OnionRequestAPI.swift index e9b63de62..73724f081 100644 --- a/SignalServiceKit/src/Loki/API/Onion Requests/OnionRequestAPI.swift +++ b/SignalServiceKit/src/Loki/API/Onion Requests/OnionRequestAPI.swift @@ -173,41 +173,43 @@ internal enum OnionRequestAPI { // MARK: Internal API /// Sends an onion request to `snode`. Builds new paths as needed. internal static func invoke(_ method: LokiAPITarget.Method, on snode: LokiAPITarget, parameters: JSON) -> Promise { - let parameters: JSON = [ "method" : method.rawValue, "params" : parameters ] - let payload: Data - do { - guard JSONSerialization.isValidJSONObject(parameters) else { return Promise { $0.reject(Error.invalidJSON) } } - payload = try JSONSerialization.data(withJSONObject: parameters, options: []) - } catch (let error) { - return Promise { $0.reject(error) } - } - return buildOnion(around: payload, targetedAt: snode).then(on: workQueue) { intermediate -> Promise in - let guardSnode = intermediate.guardSnode - let encryptionResult = intermediate.encryptionResult - let onion = encryptionResult.ciphertext - let url = URL(string: "\(guardSnode.address):\(guardSnode.port)/onion_req")! - var request = URLRequest(url: url) - request.httpMethod = "POST" - let parameters: JSON = [ - "ciphertext" : onion.base64EncodedString(), - "ephemeral_key" : encryptionResult.ephemeralPublicKey.toHexString() - ] - guard JSONSerialization.isValidJSONObject(parameters) else { throw Error.invalidJSON } - request.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: []) - request.timeoutInterval = timeout - let (promise, seal) = Promise.pending() - print("[Loki] [Onion Request API] Sending onion request.") - let task = urlSession.dataTask(with: request) { response, result, error in - if let error = error { - seal.reject(error) - } else if let result = result { - seal.fulfill(result) - } else { - seal.reject(Error.generic) + let (promise, seal) = Promise.pending() + workQueue.async { + let parameters: JSON = [ "method" : method.rawValue, "params" : parameters ] + let payload: Data + do { + guard JSONSerialization.isValidJSONObject(parameters) else { return seal.reject(Error.invalidJSON) } + payload = try JSONSerialization.data(withJSONObject: parameters, options: []) + } catch (let error) { + return seal.reject(error) + } + buildOnion(around: payload, targetedAt: snode).done(on: workQueue) { intermediate in + let guardSnode = intermediate.guardSnode + let encryptionResult = intermediate.encryptionResult + let onion = encryptionResult.ciphertext + let url = URL(string: "\(guardSnode.address):\(guardSnode.port)/onion_req")! + var request = URLRequest(url: url) + request.httpMethod = "POST" + let parameters: JSON = [ + "ciphertext" : onion.base64EncodedString(), + "ephemeral_key" : encryptionResult.ephemeralPublicKey.toHexString() + ] + guard JSONSerialization.isValidJSONObject(parameters) else { return seal.reject(Error.invalidJSON) } + request.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: []) + request.timeoutInterval = timeout + print("[Loki] [Onion Request API] Sending onion request.") + let task = urlSession.dataTask(with: request) { response, result, error in + if let error = error { + seal.reject(error) + } else if let result = result { + seal.fulfill(result) + } else { + seal.reject(Error.generic) + } } + task.resume() } - task.resume() - return promise } + return promise } }