/* Ċ Ġ* ĠLicensed Ġto Ġthe ĠApache ĠSoftware ĠFoundation Ġ( ASF ) Ġunder Ġone Ġor Ġmore Ċ Ġ* Ġcontributor Ġlicense Ġagreements . Ġ ĠSee Ġthe ĠNOTICE Ġfile Ġdistributed Ġwith Ċ Ġ* Ġthis Ġwork Ġfor Ġadditional Ġinformation Ġregarding Ġcopyright Ġownership . Ċ Ġ* ĠThe ĠASF Ġlicenses Ġthis Ġfile Ġto ĠYou Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ċ Ġ* Ġ( the Ġ" License "); Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ċ Ġ* Ġthe ĠLicense . Ġ ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġorg . apache . tu w eni . eth client Ċ Ċ import Ġkotlinx . coroutines . as Coroutine Dispatcher Ċ import Ġkotlinx . coroutines . launch Ċ import Ġorg . apache . tu w eni . dev p 2 p . eth . Eth Requests Manager Ċ import Ġorg . apache . tu w eni . eth . Hash Ċ import Ġorg . apache . tu w eni . eth . repository . Blockchain Repository Ċ import Ġjava . util . concurrent . ExecutorService Ċ import Ġjava . util . concurrent . Executors Ċ import Ġkotlin . coroutines . Coroutine Context Ċ Ċ const Ġval ĠHEADER _ REQUEST _ SIZE Ġ= Ġ 1 0 2 4 L Ċ Ċ /** Ċ Ġ* ĠSynchron izer Ġresponsible Ġfor Ġpulling Ġblocks Ġuntil Ġsuch Ġtime Ġthe Ġhighest Ġknown Ġblock Ġis Ġmet , Ġor Ġclose Ġenough . Ċ Ġ* Ċ Ġ* ĠList ens Ġto Ġnew Ġstatus Ġmessages , Ġand Ġsync s Ġbackwards Ġfrom Ġthem . Ċ Ġ* Ċ Ġ*/ Ċ class ĠPeer Status Eth Synchron izer ( ĊĠ Ġexecutor : ĠExecutor Service Ġ= ĠExec utors . new Single Thread Executor (), ĊĠ Ġcoroutine Context : ĠCor outine Context Ġ= Ġexecutor . as Coroutine Dispatcher (), ĊĠ Ġrepository : ĠBlock chain Repository , ĊĠ Ġclient : ĠE th Requests Manager , ĊĠ Ġpeer Repository : ĠEthereum Peer Repository , ĊĠ Ġprivate Ġval Ġadapter : ĠWire Connection Peer Repository Adapter Ċ ) Ġ: ĠSynchron izer ( executor , Ġcoroutine Context , Ġrepository , Ġclient , Ġpeer Repository ) Ġ{ ĊĊĠ Ġvar Ġlistener Id : ĠString ? Ġ= Ġnull ĊĊĠ Ġoverride Ġfun Ġstart () Ġ{ ĊĠĠĠ Ġlistener Id Ġ= Ġpeer Repository . add Status Listener (:: listen To Status ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġstop () Ġ{ ĊĠĠĠ Ġlistener Id ?. let Ġ{ ĊĠĠĠĠĠ Ġpeer Repository . remove Status Listener ( it ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġexecutor . shutdown () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġlisten To Status ( ethereum Connection : ĠEthereum Connection ) Ġ{ ĊĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠ Ġval Ġbest Hash Ġ= Ġe thereum Connection . status () !!. best Hash ĊĠĠĠĠĠ Ġif Ġ(! repository . has Block Header ( best Hash )) Ġ{ ĊĠĠĠĠĠĠĠ Ġclient . request Block Headers ( ĊĠĠĠĠĠĠĠĠĠ ĠHash . from Bytes ( best Hash ), ĊĠĠĠĠĠĠĠĠĠ ĠHEADER _ REQUEST _ SIZE , ĊĠĠĠĠĠĠĠĠĠĠ 0 L , ĊĠĠĠĠĠĠĠĠĠ Ġtrue , ĊĠĠĠĠĠĠĠĠĠ Ġadapter . get ( ethereum Connection ) ĊĠĠĠĠĠĠĠ Ġ). then Accept (:: add Headers ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ