package Ġdev . k ord . gateway Ċ Ċ import Ġio . ktor . util . error Ċ import Ġkotlinx . coroutines .* Ċ import Ġkotlinx . coroutines . channels . Receive Channel Ċ import Ġkotlinx . coroutines . channels . consume Each Ċ import Ġkotlinx . coroutines . channels . ticker Ċ import Ġkotlinx . coroutines . sync . Mutex Ċ import Ġkotlinx . coroutines . sync . with Lock Ċ import Ġmu . Kotlin Logging Ċ import Ġkotlin . coroutines . Coroutine Context Ċ Ċ private Ġval Ġlogger Ġ= ĠKotlin Logging . logger Ġ{ Ġ} Ċ Ċ /** Ċ Ġ* ĠA Ġre usable Ġfixed Ġrate Ġticker . Ċ Ġ* Ċ Ġ* Ġ@ param Ġdispatcher ĠThe Ġdispatch ers Ġthe Ġevents Ġwill Ġbe Ġfired Ġon . Ċ Ġ*/ Ċ @ Obsolete Cor outines Api Ċ class ĠT icker ( private Ġval Ġdispatcher : ĠCor outine Dispatcher Ġ= ĠDispatch ers . Default ) Ġ: ĠCor outine Scope Ġ{ ĊĊĊĠĠĠ Ġoverride Ġval Ġcoroutine Context : ĠCor outine Context Ġ= ĠSuper visor Job () Ġ+ Ġdispatcher ĊĊĠĠĠ Ġprivate Ġval Ġmutex Ġ= ĠMutex () ĊĊĠĠĠ Ġprivate Ġvar Ġticker : ĠReceive Channel < Unit >? Ġ= Ġnull ĊĊĠĠĠ Ġsuspend Ġfun Ġtick At ( interval Millis : ĠLong , Ġblock : Ġsuspend Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstop () ĊĠĠĠĠĠĠĠ Ġmutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġticker Ġ= Ġticker ( interval Millis ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġticker ?. consume Each Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error ( exception ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġstop () Ġ{ ĊĠĠĠĠĠĠĠ Ġmutex . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġticker ?. cancel () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }