@ -1,10 +1,12 @@
import PromiseKit
import PromiseKit
extension String : Error { }
public extension LokiAPI {
public extension LokiAPI {
// MARK: S e t t i n g s
// MARK: S e t t i n g s
private static let minimumSnodeCount = 2 // TODO: F o r d e b u g g i n g p u r p o s e s
private static let minimumSnodeCount = 2
private static let targetSnodeCount = 3 // TODO: F o r d e b u g g i n g p u r p o s e s
private static let targetSnodeCount = 3
private static let defaultSnodePort : UInt16 = 8080
private static let defaultSnodePort : UInt16 = 8080
// MARK: C a c h i n g
// MARK: C a c h i n g
@ -34,10 +36,27 @@ public extension LokiAPI {
}
}
}
}
// MARK: C l e a r n e t S e t u p
private static var randomSnodePool : Set < LokiAPITarget > = [ ]
// MARK: I n t e r n a l A P I
// MARK: I n t e r n a l A P I
private static func getRandomSnode ( ) -> Promise < LokiAPITarget > {
private static func getRandomSnode ( ) -> Promise < LokiAPITarget > {
return Promise < LokiAPITarget > { seal in
if randomSnodePool . isEmpty {
seal . fulfill ( LokiAPITarget ( address : " http://13.236.173.190 " , port : defaultSnodePort ) ) // TODO: F o r d e b u g g i n g p u r p o s e s
let url = URL ( string : " http://3.104.19.14:22023/json_rpc " ) !
let request = TSRequest ( url : url , method : " POST " , parameters : [ " method " : " get_service_nodes " ] )
return TSNetworkManager . shared ( ) . makePromise ( request : request ) . map { intermediate in
let rawResponse = intermediate . responseObject
guard let json = rawResponse as ? JSON , let intermediate = json [ " result " ] as ? JSON , let rawTargets = intermediate [ " service_node_states " ] as ? [ JSON ] else { throw " Failed to update random snode pool from: \( rawResponse ) . " }
randomSnodePool = try Set ( rawTargets . flatMap { rawTarget in
guard let address = rawTarget [ " public_ip " ] as ? String , let port = rawTarget [ " storage_port " ] as ? Int else { throw " Failed to update random snode pool from: \( rawTarget ) . " }
return LokiAPITarget ( address : " https:// \( address ) " , port : UInt16 ( port ) )
} )
return randomSnodePool . randomElement ( ) !
}
} else {
return Promise < LokiAPITarget > { seal in
seal . fulfill ( randomSnodePool . randomElement ( ) ! )
}
}
}
}
}