Fix threading

pull/148/head
gmbnt 5 years ago
parent 3467e1bc94
commit 81c36fe5dd

@ -173,41 +173,43 @@ internal enum OnionRequestAPI {
// MARK: Internal API // MARK: Internal API
/// Sends an onion request to `snode`. Builds new paths as needed. /// Sends an onion request to `snode`. Builds new paths as needed.
internal static func invoke(_ method: LokiAPITarget.Method, on snode: LokiAPITarget, parameters: JSON) -> Promise<Any> { internal static func invoke(_ method: LokiAPITarget.Method, on snode: LokiAPITarget, parameters: JSON) -> Promise<Any> {
let parameters: JSON = [ "method" : method.rawValue, "params" : parameters ] let (promise, seal) = Promise<Any>.pending()
let payload: Data workQueue.async {
do { let parameters: JSON = [ "method" : method.rawValue, "params" : parameters ]
guard JSONSerialization.isValidJSONObject(parameters) else { return Promise<Any> { $0.reject(Error.invalidJSON) } } let payload: Data
payload = try JSONSerialization.data(withJSONObject: parameters, options: []) do {
} catch (let error) { guard JSONSerialization.isValidJSONObject(parameters) else { return seal.reject(Error.invalidJSON) }
return Promise<Any> { $0.reject(error) } payload = try JSONSerialization.data(withJSONObject: parameters, options: [])
} } catch (let error) {
return buildOnion(around: payload, targetedAt: snode).then(on: workQueue) { intermediate -> Promise<Any> in return seal.reject(error)
let guardSnode = intermediate.guardSnode }
let encryptionResult = intermediate.encryptionResult buildOnion(around: payload, targetedAt: snode).done(on: workQueue) { intermediate in
let onion = encryptionResult.ciphertext let guardSnode = intermediate.guardSnode
let url = URL(string: "\(guardSnode.address):\(guardSnode.port)/onion_req")! let encryptionResult = intermediate.encryptionResult
var request = URLRequest(url: url) let onion = encryptionResult.ciphertext
request.httpMethod = "POST" let url = URL(string: "\(guardSnode.address):\(guardSnode.port)/onion_req")!
let parameters: JSON = [ var request = URLRequest(url: url)
"ciphertext" : onion.base64EncodedString(), request.httpMethod = "POST"
"ephemeral_key" : encryptionResult.ephemeralPublicKey.toHexString() let parameters: JSON = [
] "ciphertext" : onion.base64EncodedString(),
guard JSONSerialization.isValidJSONObject(parameters) else { throw Error.invalidJSON } "ephemeral_key" : encryptionResult.ephemeralPublicKey.toHexString()
request.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: []) ]
request.timeoutInterval = timeout guard JSONSerialization.isValidJSONObject(parameters) else { return seal.reject(Error.invalidJSON) }
let (promise, seal) = Promise<Any>.pending() request.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: [])
print("[Loki] [Onion Request API] Sending onion request.") request.timeoutInterval = timeout
let task = urlSession.dataTask(with: request) { response, result, error in print("[Loki] [Onion Request API] Sending onion request.")
if let error = error { let task = urlSession.dataTask(with: request) { response, result, error in
seal.reject(error) if let error = error {
} else if let result = result { seal.reject(error)
seal.fulfill(result) } else if let result = result {
} else { seal.fulfill(result)
seal.reject(Error.generic) } else {
seal.reject(Error.generic)
}
} }
task.resume()
} }
task.resume()
return promise
} }
return promise
} }
} }

Loading…
Cancel
Save