package Ġcom . bin ance . api . client . service Ċ Ċ import Ġcom . bin ance . api . client . domain . rest . Bin ance ApiError Ċ import Ġcom . bin ance . api . client . exception . Bin ance ApiException Ċ import Ġcom . bin ance . api . client . security . Authentication Interceptor Ċ import Ġcom . fasterxml . jackson . databind . ObjectMapper Ċ import Ġcom . fasterxml . jackson . module . kotlin . register Kotlin Module Ċ import Ġokhttp 3 . Ok HttpClient Ċ import Ġokhttp 3 . ResponseBody Ċ import Ġorg . apache . commons . lang 3 . StringUtils Ċ import Ġretrofit 2 . Call Ċ import Ġretrofit 2 . Converter Ċ import Ġretrofit 2 . Response Ċ import Ġretrofit 2 . Ret rofit Ċ import Ġretrofit 2 . converter . jackson . Jack son Converter Factory Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ /** Ċ Ġ* ĠGenerates Ġa ĠBin ance ĠAPI Ġimplementation Ġbased Ġon Ġ@ see Ġ[ Bin ance ApiService Spot ]. Ċ Ġ*/ Ċ object ĠBin ance ApiService Generator Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġshared ĠOk HttpClient Ġinstance . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġshared Client : ĠOk HttpClient Ġ= ĠOk HttpClient . Builder () Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ. ping Interval ( 2 0 , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠ Ġ. read Timeout ( 3 0 , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠ Ġ. connect Timeout ( 3 0 , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġprivate Ġval Ġconverter Factory : ĠConverter . Factory Ġ= ĊĠĠĠĠĠĠĠ ĠJack son Converter Factory . create ( ObjectMapper (). register Kotlin Module ()) ĊĠĠĠ Ġprivate Ġval Ġerror Body Converter Ġ= Ġconverter Factory . response Body Converter ( ĊĠĠĠĠĠĠĠ ĠBin ance ApiError :: class . java , ĊĠĠĠĠĠĠĠ ĠarrayOf Null s ( 0 ), ĊĠĠĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ) Ġas ĠConverter < ResponseBody , ĠBin ance ApiError > ĊĊĠĠĠ Ġfun Ġ< S > Ġcreate Service ( service Class : ĠClass < S >, ĠapiKey : ĠString ?, Ġsecret : ĠString ?, ĠbaseUrl : ĠString ): ĠS Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġretrofit Builder Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRet rofit . Builder (). baseUrl ( baseUrl ). add Converter Factory ( converter Factory ) ĊĠĠĠĠĠĠĠ Ġif Ġ( StringUtils . isEmpty ( apiKey ) Ġ|| ĠStringUtils . isEmpty ( secret )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġretrofit Builder . client ( shared Client ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ` adapt ed Client ` Ġwill Ġuse Ġits Ġown Ġinterceptor , Ġbut Ġshare Ġthread Ġpool Ġetc Ġwith Ġthe Ġ' parent ' Ġclient ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadapted Client Ġ= ĠAuthentication Interceptor ( apiKey , Ġsecret ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshared Client . newBuilder (). add Interceptor ( it ). build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġretrofit Builder . client ( adapt ed Client ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġretrofit Builder . build (). create ( service Class ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠExecute Ġa ĠREST Ġcall Ġand Ġblock Ġuntil Ġthe Ġresponse Ġis Ġreceived . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< T > Ġexecute Sync ( call : ĠCall < T >): ĠResponse < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġcall . execute () ĊĠĠĠĠĠĠĠ Ġif Ġ( response . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresponse ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapi Error Ġ= Ġerror Body Converter . convert ( response . error Body () !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠBin ance ApiException ( call . request (), Ġresponse , Ġapi Error ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }