Rocket.Chat.ReactNative/ios/Shared/RocketChat/API/API.swift

92 lines
2.0 KiB
Swift
Raw Normal View History

[NEW] E2E Encryption push (iOS) (#2463) * link pods to notification service * push encryption poc * decrypt room key poc * read user key from mmkv and cast into a pkcs * push decrypt poc (iOS) * expose needed watermelon methods * watermelon -> database * indent & simple-crypto update * string extensions * storage * toBase64 -> toData * remove a forced unwrap * remove unused import * database driver * improvement * folder structure & watermelon bridge * more improvement stuff * watermelon -> database * reuse database instance * improvement * database fix: bypass watermelon cache * some code improvements * encryption instances * start api stuff * network layer * improve notification service * improve folder structure * watermelon patch * retry fetch logic * rocketchat class * fix try to decrypt without a roomKey * fallback to original content that is translated * some fixes to rocketchat logic * merge develop * remove unnecessary extension * [CHORE] Improve reply notification code (iOS) * undo sign changes * remove mocked value * import direct from library * send message request * reply notification with encrypted message working properly * revert apple sign * fix api onerror * trick to display sender name on group notifications * revert data.host change * fix some multithread issues * use sendername sent by server * small improvement * Bump crypto lib * Update ios/NotificationService/NotificationService.swift * add experimental string * remove trailing slash * remove trailing slash on reply * fix decrypt messages Co-authored-by: Diego Mello <diegolmello@gmail.com>
2020-09-24 18:34:13 +00:00
//
// API.swift
// NotificationService
//
// Created by Djorkaeff Alexandre Vilela Pereira on 9/16/20.
// Copyright © 2020 Rocket.Chat. All rights reserved.
//
import Foundation
struct Retry {
let retries: Int
let retryTimeout = [10.0, 5.0, 3.0, 1.0]
init(retries: Int) {
if retries < 0 {
self.retries = 0
} else if retries > retryTimeout.count {
self.retries = retryTimeout.count
} else {
self.retries = retries
}
}
var timeout: Double {
return retryTimeout[retries - 1]
}
}
final class API {
typealias Server = String
final let server: URL
final let credentials: Credentials?
final let decoder = JSONDecoder()
static var instances: [Server: API] = [:]
convenience init?(server: Server) {
guard let server = URL(string: server.removeTrailingSlash()) else {
return nil
}
self.init(server: server)
}
init(server: URL) {
self.server = server
self.credentials = Storage.shared.getCredentials(server: server.absoluteString)
}
func fetch<T: Request>(request: T, retry: Retry? = nil, completion: @escaping((APIResponse<T.ResponseType>) -> Void)) {
func onError() {
if let retry = retry, retry.retries > 0 {
DispatchQueue.main.asyncAfter(deadline: .now() + retry.timeout, execute: {
self.fetch(request: request, retry: Retry(retries: retry.retries - 1), completion: completion)
})
return
}
completion(.error)
}
guard let request = request.request(for: self) else {
completion(.error)
return
}
let task = URLSession.shared.dataTask(with: request) {(data, _, error) in
if let _ = error as NSError? {
onError()
return
}
guard let data = data else {
onError()
return
}
if let response = try? self.decoder.decode(T.ResponseType.self, from: data), response.success {
completion(.resource(response))
return
}
onError()
}
task.resume()
}
}