package Ġcom . github . dav in ke vin . podcast server . messaging Ċ Ċ import Ġcom . fasterxml . jackson . annotation . JsonProperty Ċ import Ġcom . fasterxml . jackson . databind . JsonNode Ċ import Ġcom . fasterxml . jackson . databind . ObjectMapper Ċ import Ġcom . fasterxml . jackson . module . kotlin . tree To Value Ċ import Ġcom . github . dav in ke vin . podcast server . entity . Status Ċ import Ġcom . github . dav in ke vin . podcast server . manager . downloader . Downloading Item Ċ import Ġorg . springframework . http . codec . Server Sent Event Ċ import Ġorg . springframework . web . reactive . function . server .* Ċ import Ġorg . springframework . web . reactive . function . server . Server Response . ok Ċ import Ġreactor . core . publisher . Flux Ċ import Ġreactor . core . publisher . Mono Ċ import Ġreactor . core . publisher . Sink s Ċ import Ġreactor . kotlin . core . publisher . to Mono Ċ import Ġjava . net . URI Ċ import Ġjava . time . Duration . ZERO Ċ import Ġjava . time . Duration . of Seconds Ċ import Ġjava . util .* Ċ Ċ class ĠMessage Handler ( private Ġval Ġmt : ĠMessaging Template ) Ġ{ ĊĊĠĠĠ Ġfun Ġs se Messages (@ Suppress (" UNUSED _ PARAMETER ") Ġs : ĠServer Request ): ĠMono < Server Response > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġheart Beat Ġ= ĠFlux . interval ( ZERO , Ġof Seconds ( 5 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġto Heart Beat ( it ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġmessages Ġ= Ġmt . messages . as Flux () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġto SSE ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. share () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġok () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sse () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. body ( Flux . merge ( messages , Ġheart Beat )) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġ< T > Ġto SSE ( v : ĠMessage < T >): ĠServer Sent Event < out ĠAny > Ġ{ ĊĠĠĠ Ġval Ġbody : ĠAny Ġ= Ġwhen ( v ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠUpdate Message Ġ-> Ġv . value ĊĠĠĠĠĠĠĠ Ġis ĠWaiting Queue Message Ġ-> Ġv . value . map (:: to Downloading Item HAL ) ĊĠĠĠĠĠĠĠ Ġis ĠDownloading Item Message Ġ-> Ġto Downloading Item HAL ( v . value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġto Server Sent Event ( v . topic , Ġbody ) Ċ } Ċ Ċ private Ġfun Ġto Heart Beat ( v : ĠLong ): ĠServer Sent Event < out ĠAny > Ġ= ĠServer Sent Event ĊĠĠĠĠĠĠĠ Ġ. builder ( v ) ĊĠĠĠĠĠĠĠ Ġ. event (" heartbeat ") ĊĠĠĠĠĠĠĠ Ġ. build () Ċ Ċ private Ġfun Ġ< T > Ġto Server Sent Event ( event : ĠString , Ġbody : ĠT ): ĠServer Sent Event < T > Ġ{ ĊĠĠĠ Ġreturn ĠServer Sent Event ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. builder ( body !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. event ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () Ċ } Ċ Ċ internal Ġdata Ġclass ĠDownloading Item HAL ( ĊĠĠĠĠĠĠĠ Ġval Ġid : ĠUUID , ĊĠĠĠĠĠĠĠ Ġval Ġtitle : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġstatus : ĠStatus , ĊĠĠĠĠĠĠĠ Ġval Ġurl : ĠURI , ĊĠĠĠĠĠĠĠ Ġval Ġprogress ion : ĠInt , ĊĠĠĠĠĠĠĠ Ġval Ġpod cast : ĠPod cast , ĊĠĠĠĠĠĠĠ Ġval Ġcover : ĠCover Ċ ) Ġ{ ĊĊĠĠĠ Ġ@ JsonProperty (" is Downloaded ") ĊĠĠĠ Ġval Ġis Downloaded Ġ= ĠStatus . FIN ISH Ġ== Ġstatus ĊĊĠĠĠ Ġdata Ġclass ĠPod cast ( val Ġid : ĠUUID , Ġval Ġtitle : ĠString ) ĊĠĠĠ Ġdata Ġclass ĠCover ( val Ġid : ĠUUID , Ġval Ġurl : ĠURI ) Ċ } Ċ Ċ internal Ġfun Ġto Downloading Item HAL ( item : ĠDownloading Item ) Ġ= ĠDownloading Item HAL ( ĊĠĠĠĠĠĠĠ Ġid Ġ= Ġitem . id , ĊĠĠĠĠĠĠĠ Ġtitle Ġ= Ġitem . title , ĊĠĠĠĠĠĠĠ Ġstatus Ġ= Ġitem . status , ĊĠĠĠĠĠĠĠ Ġurl Ġ= Ġitem . url , ĊĠĠĠĠĠĠĠ Ġprogress ion Ġ= Ġitem . progress ion , ĊĠĠĠĠĠĠĠ Ġpod cast Ġ= ĠDownloading Item HAL . Pod cast ( item . podcast . id , Ġitem . podcast . title ), ĊĠĠĠĠĠĠĠ Ġcover Ġ= ĠDownloading Item HAL . Cover ( item . cover . id , Ġitem . cover . url ) Ċ ) Ċ