package Ġdev . k ord . common . rate limit Ċ Ċ import Ġkotlinx . datetime . Clock Ċ import Ġkotlin . contracts . Invocation Kind Ċ import Ġkotlin . contracts . contract Ċ import Ġkotlin . time . Duration Ċ import Ġkotlin . time . Time Source Ċ Ċ /** Ċ Ġ* ĠA Ġrate Ġlimit er Ġthat Ġlimits Ġthe Ġnumber Ġof Ġ[ consume ] Ġinv ocations Ġthat Ġcan Ġbe Ġmade Ġover Ġa Ġcertain Ġperiod . Ċ Ġ*/ Ċ public Ġinterface ĠRate Limiter Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAc quire s Ġa Ġpermit Ġfor Ġa Ġsingle Ġaction . ĠS usp ends Ġif Ġnecessary Ġuntil Ġthe Ġpermit Ġwould Ġnot Ġexceed ĊĠĠĠĠ Ġ* Ġthe Ġmaximum Ġfrequency Ġof Ġpermit s . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġsuspend Ġfun Ġconsume () Ċ } Ċ Ċ /** Ċ Ġ* ĠAc quire s Ġa Ġpermit Ġfor Ġa Ġsingle Ġ[ action ]. ĠS usp ends Ġif Ġnecessary Ġuntil Ġthe Ġpermit Ġwould Ġnot Ġexceed Ċ Ġ* Ġthe Ġmaximum Ġfrequency Ġof Ġpermit s . Ċ Ġ* Ċ Ġ* Ġ@ param Ġaction ĠThe Ġaction Ġthat Ġcorre lates Ġto Ġa Ġsingle Ġpermit . Ċ Ġ*/ Ċ public Ġsuspend Ġinline Ġfun Ġ< T > ĠRate Limiter . consume ( action : Ġ() Ġ-> ĠT ): ĠT Ġ{ ĊĠĠĠ Ġcontract Ġ{ ĊĠĠĠĠĠĠĠ Ġcalls In Place ( action , ĠInvocation Kind . EX ACT LY _ ON CE ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġconsume () ĊĠĠĠ Ġreturn Ġaction () Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġ[ Rate Limiter ] Ġthat Ġrestrict s Ġthe Ġnumber Ġof Ġ[ consume ] Ġinv ocations Ġin Ġ[ intervals ][ interval ] Ġto Ġa Ġgiven Ġ[ limit ]. Ċ Ġ* ĠEx ceeding Ġthis Ġlimit Ġresults Ġin Ġsus pension Ġuntil Ġthe Ġnext Ġinterval . Ċ Ġ*/ Ċ public Ġinterface ĠInterval Rate Limiter Ġ: ĠRate Limiter Ġ{ ĊĊĠĠĠ Ġ/** ĠThe Ġmaximum Ġnumber Ġof Ġ[ consume ] Ġinv ocations Ġallowed Ġfor Ġeach Ġinterval . Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġlimit : ĠInt ĊĊĠĠĠ Ġ/** ĠThe Ġ[ Duration ] Ġof Ġeach Ġinterval . Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġinterval : ĠDuration ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAc quire s Ġa Ġpermit Ġfor Ġa Ġsingle Ġaction . ĠS usp ends Ġuntil Ġthe Ġnext Ġ[ interval ] Ġif Ġ[ limit ] Ġpermit s Ġhave Ġalready Ġbeen ĊĠĠĠĠ Ġ* Ġacquired Ġin Ġthe Ġcurrent Ġinterval . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġconsume () Ċ } Ċ Ċ /** Ċ Ġ* ĠCreates Ġan Ġimplementation Ġof Ġ[ Interval Rate Limiter ] Ġthat Ġuses Ġa Ġ[ Time Source ] Ġfor Ġmeas uring Ġintervals . Ċ Ġ* Ċ Ġ* Ġ@ param Ġlimit ĠThe Ġmaximum Ġnumber Ġof Ġ[ consume ] Ġinv ocations Ġallowed Ġfor Ġeach Ġinterval . Ċ Ġ* Ġ@ param Ġinterval ĠThe Ġ[ Duration ] Ġof Ġeach Ġinterval . Ċ Ġ* Ġ@ param Ġtime Source ĠThe Ġ[ Time Source ] Ġfor Ġmeas uring Ġintervals , Ġ[ Time Source . Mon otonic ] Ġby Ġdefault . Ċ Ġ*/ Ċ public Ġfun ĠInterval Rate Limiter ( ĊĠĠĠ Ġlimit : ĠInt , ĊĠĠĠ Ġinterval : ĠDuration , ĊĠĠĠ Ġtime Source : ĠTime Source Ġ= ĠTime Source . Mon otonic , Ċ ): ĠInterval Rate Limiter Ġ= ĠTime Source Interval Rate Limiter ( limit , Ġinterval , Ġtime Source ) Ċ Ċ /** Ċ Ġ* ĠCreates Ġan Ġimplementation Ġof Ġ[ Interval Rate Limiter ] Ġthat Ġuses Ġa Ġ[ Clock ] Ġfor Ġmeas uring Ġintervals . Ċ Ġ* Ċ Ġ* Ġ@ param Ġlimit ĠThe Ġmaximum Ġnumber Ġof Ġ[ consume ] Ġinv ocations Ġallowed Ġfor Ġeach Ġinterval . Ċ Ġ* Ġ@ param Ġinterval ĠThe Ġ[ Duration ] Ġof Ġeach Ġinterval . Ċ Ġ* Ġ@ param Ġclock ĠThe Ġ[ Clock ] Ġfor Ġmeas uring Ġintervals . Ċ Ġ*/ Ċ public Ġfun ĠInterval Rate Limiter ( limit : ĠInt , Ġinterval : ĠDuration , Ġclock : ĠClock ): ĠInterval Rate Limiter Ġ= ĊĠĠĠ ĠClock Interval Rate Limiter ( limit , Ġinterval , Ġclock ) Ċ