Ċ import Ġcom . github . ben man es . caffe ine . cache . Cache Ċ import Ġcom . github . ben man es . caffe ine . cache . C affe ine Ċ import Ġcom . launch dark ly . event source .* Ċ import Ġio . ktor . client .* Ċ import Ġio . ktor . client . call .* Ċ import Ġio . ktor . client . engine . c io .* Ċ import Ġio . ktor . client . features .* Ċ import Ġio . ktor . client . features . json .* Ċ import Ġio . ktor . client . features . json . serializer .* Ċ import Ġio . ktor . client . request .* Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġio . ktor . client . statement .* Ċ import Ġkotlinx . serialization . json . JsonObject Ċ import Ġkotlinx . serialization . json . jsonObject Ċ import Ġjava . net . URI Ċ import Ġjava . time .* Ċ import Ġjava . time . temporal . Temporal Adjust ers Ċ import Ġjava . util . concurrent . Executors Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġkotlin . collections . HashMap Ċ import Ġno . nav . f amil ie . End ring Json Ċ import Ġno . nav . f amil ie . Slide Image Dl Ċ import Ġno . nav . f amil ie . Slide Image Json Ċ import Ġno . nav . f amil ie . Sub scribed App Ċ import Ġokhttp 3 . internal . http 2 . Stream Reset Exception Ċ import Ġorg . slf 4 j . LoggerFactory Ċ Ċ sealed Ġclass ĠResult < out ĠT , Ġout ĠE > Ċ class ĠOk < out ĠT >( val Ġvalue : ĠT ) Ġ: ĠResult < T , ĠNothing >() Ċ class ĠErr < out ĠE >( val Ġerror : ĠE ) Ġ: ĠResult < Nothing , ĠE >() Ċ Ċ class ĠSan ity Client ( ĊĠĠĠ Ġprivate Ġval Ġproj Id : ĠString , ĊĠĠĠ ĠapiVersion : ĠString , Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger ( java Class ) ĊĠĠĠ Ġprivate Ġval ĠbaseUrl : ĠString Ġ= Ġ" https :// $ proj Id . api . san ity . io /$ apiVersion " ĊĠĠĠ Ġprivate Ġval Ġclient Ġ= ĠHttpClient ( C IO ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinstall ( Json Feature ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserializer Ġ= ĠKotlin x Serializer ( kotlin x . serialization . json . Json Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpretty Print Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġignore Unknown Keys Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġsubscribed Apps : ĠHashMap < String , ĠSub scribed App > Ġ= Ġhash Map Of () ĊĊĠĠĠ Ġprivate Ġfun Ġimage Obj To ByteArray ( obj : ĠJsonObject , Ġdataset : ĠString ): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġref Json : ĠString Ġ= Ġobj [" asset "] !!. jsonObject [" _ ref "]. toString (). replace (" \"", Ġ"") ĊĠĠĠĠĠĠĠ Ġval Ġref Ġ= Ġref Json . replace (" (- ([ A - Za - z ]+ )) \$ ". to Regex (), Ġ". \$ 2 "). drop ( 6 ) ĊĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġ" https :// cdn . san ity . io / images /$ proj Id /$ dataset /$ ref " ĊĠĠĠĠĠĠĠ Ġval Ġhttp Resp : ĠHttpResponse ĊĠĠĠĠĠĠĠ Ġval Ġbyte Arr : ĠByteArray ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhttp Resp Ġ= Ġclient . get ( url ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbyte Arr Ġ= Ġhttp Resp . receive () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbyte Arr ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġquery ( queryString : ĠString , Ġdataset : ĠString ): ĠResult < End ring Json , ĠClient RequestException > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Cache First ( query Cache , ĠqueryString , Ġdataset ) Ġ{ Ġq , Ġd Ġ-> Ġquery San ity ( q , Ġd ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġquery Cache : ĠCache < String , ĠEnd ring Json > Ġ= ĠC affe ine . newBuilder () ĊĠĠĠĠĠĠĠ Ġ. expire After Write ( 1 , ĠTimeUnit . HOUR S ) Ġ// ĊĠĠĠĠĠĠĠ Ġ. maximum Size ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠ Ġ@ Throws ( Client RequestException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġquery San ity ( queryString : ĠString , Ġdataset : ĠString ): ĠEnd ring Json Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresponse : ĠEnd ring Json ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Ġ= Ġclient . get ("$ baseUrl / data / query /$ dataset ? query =$ queryString ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġresponse With Image Ġ= ĠEnd ring Json ( response . result . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodal Ġ= Ġit . modal ?. copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġslides Ġ= Ġit . modal . slides . map Ġ{ Ġs Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( s . image ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSlide Image Json Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Ġ= ĠSlide Image Dl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Obj To ByteArray ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs . image . slide Image . jsonObject , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdataset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġs ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġval Ġlisten Url Ġ= Ġ"$ baseUrl / data / listen /$ dataset ? query =$ queryString & include Result = false & visibility = query " ĊĠĠĠĠĠĠĠ Ġ// Ġcall Ġwas Ġsuccessful . Ġmust Ġthen Ġcheck Ġif Ġthe Ġresponse Ġis Ġempty . ĠIf Ġempty Ġ-> Ġdon 't Ġsubscribe ĊĠĠĠĠĠĠĠ Ġif Ġ( response . result . isNotEmpty () Ġand Ġ! subscribed Apps . contains ( listen Url )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubscribe ToS an ity App ( listen Url , ĠqueryString , Ġdataset ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresponse With Image ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< V > Ġtry Cache First ( ĊĠĠĠĠĠĠĠ Ġcache : ĠCache < String , ĠV >, ĊĠĠĠĠĠĠĠ Ġquery : ĠString , ĊĠĠĠĠĠĠĠ Ġdataset : ĠString , ĊĠĠĠĠĠĠĠ Ġvalue Supplier : Ġ( queryString : ĠString , Ġdataset String : ĠString ) Ġ-> ĠV ĊĠĠĠ Ġ): ĠResult < V , ĠClient RequestException > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġ"$ query .$ dataset " ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġcache . get ( key ) Ġ{ Ġvalue Supplier ( query , Ġdataset ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOk ( value ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠClient RequestException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠErr ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< V > Ġupdate Cache ( ĊĠĠĠĠĠĠĠ Ġcache : ĠCache < String , ĠV >, ĊĠĠĠĠĠĠĠ Ġquery : ĠString , ĊĠĠĠĠĠĠĠ Ġdataset : ĠString , ĊĠĠĠĠĠĠĠ Ġvalue Supplier : Ġ( queryString : ĠString , Ġdataset String : ĠString ) Ġ-> ĠV ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġ"$ query .$ dataset " ĊĠĠĠĠĠĠĠ Ġval ĠnewValue Ġ= Ġvalue Supplier ( query , Ġdataset ) ĊĠĠĠĠĠĠĠ Ġcache . put ( key , ĠnewValue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsubscribe ToS an ity App ( listen Url : ĠString , ĠqueryString : ĠString , Ġdataset : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġevent Handler Ġ= ĠMessage EventHandler () ĊĠĠĠĠĠĠĠ Ġval Ġevent Source : ĠEvent Source Ġ= ĠEvent Source . Builder ( event Handler , ĠURI . create ( listen Url )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. reconnect Time ( Duration . of Millis ( 3 0 0 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. connection ErrorHandler ( San ity Connection ErrorHandler ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġevent Source . start () ĊĠĠĠĠĠĠĠ Ġif Ġ(! subscribed Apps . containsKey ( listen Url )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubscribed Apps [ listen Url ] Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSub scribed App ( listen Url , ĠqueryString , Ġdataset , Ġ"$ queryString .$ dataset ", Ġevent Source ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠSchedule Ġtask Ġto Ġensure Ġthat Ġconnection Ġhas Ġbeen Ġestablished . ĠIf Ġnot , Ġremove Ġdata Ġfrom Ġcache ĊĠĠĠĠĠĠĠ ĠExec utors . new Single Thread Scheduled Executor (). schedule ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! subscribed Apps [ listen Url ]?. connection Est ab lished !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠ Ġlogger . warn (" Connection Ġto Ġ$ listen Url Ġnot Ġestablished .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠ Ġsubscribed Apps [ listen Url ]?. event Source ?. close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠ Ġsubscribed Apps . remove ( listen Url ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠ Ġquery Cache . as Map (). remove ( subscribed Apps [ listen Url ]?. cacheKey ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ 2 0 , ĠTimeUnit . SECONDS ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* Ġcalculates Ġmilliseconds Ġfrom Ġnow Ġuntil Ġnext Ġgiven Ġweek day Ġwith Ġhourly Ġoffset Ġin ĠUTC Ġtime Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġms To Next Day ( day OfWeek : ĠDay OfWeek , Ġhour Offset : ĠLong ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnext Day Ġ= ĠLocalDate . now ( Clock . system UTC ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with ( Temporal Adjust ers . next Or Same ( day OfWeek )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. at Start OfDay () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. plus Hours ( hour Offset ) ĊĠĠĠĠĠĠĠ Ġval Ġduration Ġ= ĠDuration . between ( LocalDateTime . now ( Clock . system UTC ()), Ġnext Day ). to Millis () ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( duration Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ+ ĠTimeUnit . DAYS . to Millis ( 7 ) Ġ Ġ// Ġadd Ġone Ġweek Ġif Ġcalculated Ġduration Ġis Ġnegative ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġduration ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĠClass Ġto Ġhandle Ġevents Ġfrom ĠEventHandler Ġ*/ ĊĠĠĠ Ġprivate Ġinner Ġclass ĠMessage EventHandler Ġ: ĠEventHandler Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Open () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Ã ħ p ner Ġstream Ġmot ĠSan ity ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Closed () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" L uk ker Ġstream Ġmot ĠSan ity ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/* ĠHandles Ġevents Ġfrom ĠSan ity Ġlisten ĠAPI */ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Message ( event : ĠString , Ġmessage Event : ĠMessage Event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġorigin Ġ= Ġmessage Event . origin . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" welcome " Ġ-> Ġ{ Ġ// Ġconnection Ġis Ġestablished ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcancel s Ġsubscription , Ġand Ġclears Ġcache Ġevery ĠS aturday Ġmorning Ġ 0 1 . 0 0 ĠUTC Ġtime ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! subscribed Apps [ origin ] !!. connection Est ab lished ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExec utors . new Single Thread Scheduled Executor (). schedule ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubscribed Apps [ origin ]?. connection Est ab lished Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubscribed Apps [ origin ]?. event Source ?. close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery Cache . as Map (). remove ( subscribed Apps [ origin ]?. cacheKey ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubscribed Apps . remove ( origin ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Un subscribed Ġfrom Ġlistening ĠAPI : Ġ$ origin ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġms To Next Day ( DayOfWeek . S ATUR DAY , Ġ 1 ), ĠTimeUnit . MILLISECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubscribed Apps [ origin ]?. connection Est ab lished Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Sub scri bing Ġto Ġlistening ĠAPI : Ġ$ origin ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" mutation " Ġ-> Ġ{ Ġ// Ġa Ġchange Ġis Ġdiscovered Ġin ĠSan ity Ġ-> Ġupdate Ġcache ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Mutation Ġin Ġ$ origin Ġdiscovered , Ġupdating Ġcache .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Cache ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery Cache , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubscribed Apps [ origin ] !!. queryString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubscribed Apps [ origin ] !!. dataset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġq , Ġp Ġ-> Ġquery San ity ( q , Ġp ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" disconnect " Ġ-> Ġ{ Ġ// Ġclient Ġshould Ġdisconnect Ġand Ġstay Ġdisconnected . ĠL ik ely Ġdue Ġto Ġa Ġquery Ġerror ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Listening ĠAPI Ġfor Ġ$ origin Ġrequested Ġdis connection Ġwith Ġerror Ġmessage : Ġ${ message Event . data }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubscribed Apps [ origin ]?. connection Est ab lished Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubscribed Apps [ origin ]?. event Source ?. close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery Cache . as Map (). remove ( subscribed Apps [ origin ]?. cacheKey ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubscribed Apps . remove ( origin ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( t Ġis ĠStream Reset Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Stream Ġmot ĠSan ity Ġble Ġres att ", Ġt ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" En Ġfe il Ġopp st od ", Ġt ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Comment ( comment : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug (" Holder Ġstream Ġmot ĠSan ity Ġi Ġg ang ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĠSh uts Ġdown Ġconnection Ġwhen Ġconnection Ġattempt Ġfails */ ĊĠĠĠ Ġprivate Ġinner Ġclass ĠSan ity Connection ErrorHandler Ġ: ĠConnection ErrorHandler Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Connection Error ( t : ĠThrowable ?): ĠConnection ErrorHandler . Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( t Ġis ĠStream Reset Exception ) Ġ{ Ġ// Ġto Ġhandle Ġstream Ġresets Ġevery Ġ 3 0 Ġminutes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConnection ErrorHandler . Action . PRO CE ED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConnection ErrorHandler . Action . SHUT DOWN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }