pull/214/head
nielsandriesse 5 years ago
parent 1b45a50fe2
commit 6533af8ba9

@ -4,55 +4,14 @@ public extension LokiAPI {
fileprivate static let seedNodePool: Set<String> = [ "https://storage.seed1.loki.network", "https://storage.seed3.loki.network", "https://public.loki.foundation" ] fileprivate static let seedNodePool: Set<String> = [ "https://storage.seed1.loki.network", "https://storage.seed3.loki.network", "https://public.loki.foundation" ]
internal static var _snodeFailureCount: [LokiAPITarget:UInt] = [:] /// - Note: Should only be accessed from `LokiAPI.workQueue` to avoid race conditions.
internal static var snodeFailureCount: [LokiAPITarget:UInt] { internal static var snodeFailureCount: [LokiAPITarget:UInt] = [:]
get {
let (promise, seal) = Promise<[LokiAPITarget:UInt]>.pending()
stateQueue.async {
seal.fulfill(_snodeFailureCount)
}
return try! promise.wait()
}
set {
LokiAPI.stateQueue.async {
_snodeFailureCount = newValue
}
}
}
// TODO: Read/write this directly from/to the database // TODO: Read/write this directly from/to the database
internal static var _snodePool: Set<LokiAPITarget> = [] /// - Note: Should only be accessed from `LokiAPI.workQueue` to avoid race conditions.
internal static var snodePool: Set<LokiAPITarget> { internal static var snodePool: Set<LokiAPITarget> = []
get {
let (promise, seal) = Promise<Set<LokiAPITarget>>.pending()
stateQueue.async {
seal.fulfill(_snodePool)
}
return try! promise.wait()
}
set {
LokiAPI.stateQueue.async {
_snodePool = newValue
}
}
}
// TODO: Read/write this directly from/to the database // TODO: Read/write this directly from/to the database
internal static var _swarmCache: [String:[LokiAPITarget]] = [:] /// - Note: Should only be accessed from `LokiAPI.workQueue` to avoid race conditions.
internal static var swarmCache: [String:[LokiAPITarget]] { internal static var swarmCache: [String:[LokiAPITarget]] = [:]
get {
let (promise, seal) = Promise<[String:[LokiAPITarget]]>.pending()
stateQueue.async {
seal.fulfill(_swarmCache)
}
return try! promise.wait()
}
set {
LokiAPI.stateQueue.async {
_swarmCache = newValue
}
}
}
// MARK: Settings // MARK: Settings
private static let minimumSnodePoolCount = 32 private static let minimumSnodePoolCount = 32

@ -2,7 +2,7 @@ import PromiseKit
@objc(LKAPI) @objc(LKAPI)
public final class LokiAPI : NSObject { public final class LokiAPI : NSObject {
internal static let stateQueue = DispatchQueue(label: "LokiAPI.stateQueue", qos: .userInitiated) internal static let workQueue = DispatchQueue(label: "LokiAPI.workQueue", qos: .userInitiated)
internal static var storage: OWSPrimaryStorage { OWSPrimaryStorage.shared() } internal static var storage: OWSPrimaryStorage { OWSPrimaryStorage.shared() }

@ -3,22 +3,10 @@ import PromiseKit
@objc(LKMentionsManager) @objc(LKMentionsManager)
public final class MentionsManager : NSObject { public final class MentionsManager : NSObject {
@objc public static var _userPublicKeyCache: [String:Set<String>] = [:]
/// A mapping from thread ID to set of user hex encoded public keys. /// A mapping from thread ID to set of user hex encoded public keys.
@objc public static var userPublicKeyCache: [String:Set<String>] { ///
get { /// - Note: Should only be accessed from the main queue to avoid race conditions.
let (promise, seal) = Promise<[String:Set<String>]>.pending() @objc public static var userPublicKeyCache: [String:Set<String>] = [:]
LokiAPI.stateQueue.async {
seal.fulfill(_userPublicKeyCache)
}
return try! promise.wait()
}
set {
LokiAPI.stateQueue.async {
_userPublicKeyCache = newValue
}
}
}
internal static var storage: OWSPrimaryStorage { OWSPrimaryStorage.shared() } internal static var storage: OWSPrimaryStorage { OWSPrimaryStorage.shared() }

@ -15,22 +15,10 @@ import PromiseKit
@objc(LKMultiDeviceProtocol) @objc(LKMultiDeviceProtocol)
public final class MultiDeviceProtocol : NSObject { public final class MultiDeviceProtocol : NSObject {
public static var _lastDeviceLinkUpdate: [String:Date] = [:]
/// A mapping from hex encoded public key to date updated. /// A mapping from hex encoded public key to date updated.
public static var lastDeviceLinkUpdate: [String:Date] { ///
get { /// - Note: Should only be accessed from `LokiAPI.workQueue` to avoid race conditions.
let (promise, seal) = Promise<[String:Date]>.pending() public static var lastDeviceLinkUpdate: [String:Date] = [:]
LokiAPI.stateQueue.async {
seal.fulfill(_lastDeviceLinkUpdate)
}
return try! promise.wait()
}
set {
LokiAPI.stateQueue.async {
_lastDeviceLinkUpdate = newValue
}
}
}
internal static var storage: OWSPrimaryStorage { OWSPrimaryStorage.shared() } internal static var storage: OWSPrimaryStorage { OWSPrimaryStorage.shared() }

@ -3,74 +3,74 @@ import PromiseKit
public extension Thenable { public extension Thenable {
func then2<U>(_ body: @escaping (T) throws -> U) -> Promise<U.T> where U : Thenable { func then2<U>(_ body: @escaping (T) throws -> U) -> Promise<U.T> where U : Thenable {
return then(on: DispatchQueue.global(qos: .default), body) return then(on: LokiAPI.workQueue, body)
} }
func map2<U>(_ transform: @escaping (T) throws -> U) -> Promise<U> { func map2<U>(_ transform: @escaping (T) throws -> U) -> Promise<U> {
return map(on: DispatchQueue.global(qos: .default), transform) return map(on: LokiAPI.workQueue, transform)
} }
func done2(_ body: @escaping (T) throws -> Void) -> Promise<Void> { func done2(_ body: @escaping (T) throws -> Void) -> Promise<Void> {
return done(on: DispatchQueue.global(qos: .default), body) return done(on: LokiAPI.workQueue, body)
} }
func get2(_ body: @escaping (T) throws -> Void) -> Promise<T> { func get2(_ body: @escaping (T) throws -> Void) -> Promise<T> {
return get(on: DispatchQueue.global(qos: .default), body) return get(on: LokiAPI.workQueue, body)
} }
} }
public extension Thenable where T: Sequence { public extension Thenable where T: Sequence {
func mapValues2<U>(_ transform: @escaping (T.Iterator.Element) throws -> U) -> Promise<[U]> { func mapValues2<U>(_ transform: @escaping (T.Iterator.Element) throws -> U) -> Promise<[U]> {
return mapValues(on: DispatchQueue.global(qos: .default), transform) return mapValues(on: LokiAPI.workQueue, transform)
} }
} }
public extension Guarantee { public extension Guarantee {
func then2<U>(_ body: @escaping (T) -> Guarantee<U>) -> Guarantee<U> { func then2<U>(_ body: @escaping (T) -> Guarantee<U>) -> Guarantee<U> {
return then(on: DispatchQueue.global(qos: .default), body) return then(on: LokiAPI.workQueue, body)
} }
func map2<U>(_ body: @escaping (T) -> U) -> Guarantee<U> { func map2<U>(_ body: @escaping (T) -> U) -> Guarantee<U> {
return map(on: DispatchQueue.global(qos: .default), body) return map(on: LokiAPI.workQueue, body)
} }
func done2(_ body: @escaping (T) -> Void) -> Guarantee<Void> { func done2(_ body: @escaping (T) -> Void) -> Guarantee<Void> {
return done(on: DispatchQueue.global(qos: .default), body) return done(on: LokiAPI.workQueue, body)
} }
func get2(_ body: @escaping (T) -> Void) -> Guarantee<T> { func get2(_ body: @escaping (T) -> Void) -> Guarantee<T> {
return get(on: DispatchQueue.global(qos: .default), body) return get(on: LokiAPI.workQueue, body)
} }
} }
public extension CatchMixin { public extension CatchMixin {
func catch2(_ body: @escaping (Error) -> Void) -> PMKFinalizer { func catch2(_ body: @escaping (Error) -> Void) -> PMKFinalizer {
return self.catch(on: DispatchQueue.global(qos: .default), body) return self.catch(on: LokiAPI.workQueue, body)
} }
func recover2<U: Thenable>(_ body: @escaping(Error) throws -> U) -> Promise<T> where U.T == T { func recover2<U: Thenable>(_ body: @escaping(Error) throws -> U) -> Promise<T> where U.T == T {
return recover(on: DispatchQueue.global(qos: .default), body) return recover(on: LokiAPI.workQueue, body)
} }
func recover2(_ body: @escaping(Error) -> Guarantee<T>) -> Guarantee<T> { func recover2(_ body: @escaping(Error) -> Guarantee<T>) -> Guarantee<T> {
return recover(on: DispatchQueue.global(qos: .default), body) return recover(on: LokiAPI.workQueue, body)
} }
func ensure2(_ body: @escaping () -> Void) -> Promise<T> { func ensure2(_ body: @escaping () -> Void) -> Promise<T> {
return ensure(on: DispatchQueue.global(qos: .default), body) return ensure(on: LokiAPI.workQueue, body)
} }
} }
public extension CatchMixin where T == Void { public extension CatchMixin where T == Void {
func recover2(_ body: @escaping(Error) -> Void) -> Guarantee<Void> { func recover2(_ body: @escaping(Error) -> Void) -> Guarantee<Void> {
return recover(on: DispatchQueue.global(qos: .default), body) return recover(on: LokiAPI.workQueue, body)
} }
func recover2(_ body: @escaping(Error) throws -> Void) -> Promise<Void> { func recover2(_ body: @escaping(Error) throws -> Void) -> Promise<Void> {
return recover(on: DispatchQueue.global(qos: .default), body) return recover(on: LokiAPI.workQueue, body)
} }
} }

@ -23,7 +23,8 @@ NS_ASSUME_NONNULL_BEGIN
static dispatch_once_t onceToken; static dispatch_once_t onceToken;
static dispatch_queue_t queue; static dispatch_queue_t queue;
dispatch_once(&onceToken, ^{ dispatch_once(&onceToken, ^{
queue = dispatch_queue_create("org.whispersystems.signal.sendQueue", NULL); dispatch_queue_attr_t attributes = dispatch_queue_attr_make_with_qos_class(DISPATCH_QUEUE_SERIAL, QOS_CLASS_USER_INITIATED, 0);
queue = dispatch_queue_create("org.whispersystems.signal.sendQueue", attributes);
}); });
return queue; return queue;
} }

Loading…
Cancel
Save