/* Ċ Ġ* ĠCopyright ĠAmazon . com , ĠInc . Ġor Ġits Ġaffiliates . ĠAll ĠRights ĠReserved . Ċ Ġ* ĠSPDX - License - Identifier : ĠApache - 2 . 0 . Ċ Ġ*/ Ċ Ċ package Ġaws . smithy . kotlin . runtime . retries . delay Ċ Ċ import Ġkotlinx . coroutines . delay Ċ import Ġkotlin . math . min Ċ import Ġkotlin . math . pow Ċ import Ġkotlin . random . Random Ċ import Ġkotlin . time . Duration Ċ import Ġkotlin . time . Duration . Companion . milliseconds Ċ import Ġkotlin . time . Duration Unit Ċ Ċ /** Ċ Ġ* ĠA Ġ[ Delay Provider ] Ġthat Ġimplements Ġexponent ially Ġincreasing Ġdelays Ġand Ġj itter Ġ( i . e ., Ġrandom ization Ġof Ġdelay Ġamount ). Ċ Ġ* ĠThis Ġde layer Ġcalculates Ġa Ġmaximum Ġdelay Ġtime Ġfrom Ġthe Ġinitial Ġdelay Ġamount , Ġthe Ġscale Ġfactor , Ġand Ġthe Ġattempt Ġnumber . Ċ Ġ* ĠIt Ġthen Ġrandomly Ġreduces Ġthat Ġtime Ġdown Ġto Ġsomething Ġless Ġbased Ġon Ġthe Ġj itter Ġconfiguration . Ċ Ġ* Ċ Ġ* ĠFor Ġinstance , Ġa Ġj itter Ċ Ġ* Ġconfiguration Ġof Ġ 0 . 5 Ġmeans Ġthat Ġup Ġto Ġ 5 0 % Ġof Ġthe Ġmax Ġdelay Ġtime Ġcould Ġbe Ġreduced . ĠA Ġj itter Ġconfiguration Ġof Ġ 1 . 0 Ġmeans Ċ Ġ* Ġthat Ġ 1 0 0 % Ġof Ġthe Ġmax Ġdelay Ġtime Ġcould Ġbe Ġreduced Ġ( pot entially Ġdown Ġto Ġ 0 ). ĠA Ġj itter Ġconfiguration Ġof Ġ 0 . 0 Ġmeans Ġj itter Ċ Ġ* Ġis Ġdisabled . Ċ Ġ* Ċ Ġ* Ġ@ param Ġoptions ĠThe Ġconfiguration Ġto Ġuse Ġfor Ġthis Ġde layer . Ċ Ġ*/ Ċ class ĠExp onent ial Backoff With J itter ( val Ġoptions : ĠExp onent ial Backoff With J itter Options ) Ġ: ĠDelay Provider Ġ{ ĊĠĠĠ Ġprivate Ġval Ġrandom Ġ= ĠRandom . Default ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDel ays Ġfor Ġan Ġappropriate Ġamount Ġof Ġtime Ġafter Ġthe Ġgiven Ġattempt Ġnumber . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġbackoff ( attempt : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( attempt Ġ> Ġ 0 ) Ġ{ Ġ" attempt Ġwas Ġ$ attempt Ġbut Ġmust Ġbe Ġgreater Ġthan Ġ 0 " Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcalculated Delay Ms Ġ= Ġoptions . initial Delay . in Whole Milliseconds Ġ* Ġoptions . scale Factor . pow ( attempt Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġmax Delay Ms Ġ= Ġmin ( calculated Delay Ms , Ġoptions . max Backoff . toDouble ( Duration Unit . MILLISECONDS )) ĊĠĠĠĠĠĠĠ Ġval Ġj itter Pro portion Ġ= Ġif Ġ( options . j itter Ġ> Ġ 0 . 0 ) Ġrandom . next Double ( options . j itter ) Ġelse Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġval Ġdelay Ms Ġ= Ġmax Delay Ms Ġ* Ġ( 1 . 0 Ġ- Ġj itter Pro portion ) ĊĠĠĠĠĠĠĠ Ġdelay ( delay Ms . to Long ()) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠThe Ġconfiguration Ġoptions Ġfor Ġa Ġ[ Delay Provider ]. Ċ Ġ* Ġ@ param Ġinitial Delay ĠThe Ġinitial Ġamount Ġof Ġdelay Ċ Ġ* Ġ@ param Ġscale Factor Ġscale Ġfactor Ġfor Ġdetermining Ġbackoff Ċ Ġ* Ġ@ param Ġj itter Ġamount Ġof Ġj itter Ġused Ġin Ġcalculating Ġdelay Ċ Ġ* Ġ@ param Ġmax Backoff Ġmaximum Ġamount Ġof Ġdelay Ċ Ġ*/ Ċ data Ġclass ĠExp onent ial Backoff With J itter Options ( ĊĠĠĠ Ġval Ġinitial Delay : ĠDuration , ĊĠĠĠ Ġval Ġscale Factor : ĠDouble , ĊĠĠĠ Ġval Ġj itter : ĠDouble , ĊĠĠĠ Ġval Ġmax Backoff : ĠDuration , Ċ ) Ġ{ ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( initial Delay . is Positive ()) Ġ{ Ġ" initial Delay Ms Ġmust Ġbe Ġat Ġleast Ġ 0 " Ġ} ĊĠĠĠĠĠĠĠ Ġrequire ( scale Factor Ġ>= Ġ 1 . 0 ) Ġ{ Ġ" scale Factor Ġmust Ġbe Ġat Ġleast Ġ 1 " Ġ} ĊĠĠĠĠĠĠĠ Ġrequire ( j itter Ġin Ġ 0 . 0 .. 1 . 0 ) Ġ{ Ġ" j itter Ġmust Ġbe Ġbetween Ġ 0 Ġand Ġ 1 " Ġ} ĊĠĠĠĠĠĠĠ Ġrequire (! max Backoff . is Negative ()) Ġ{ Ġ" max Backoff Ms Ġmust Ġbe Ġat Ġleast Ġ 0 " Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġdefault Ġbackoff Ġconfiguration Ġto Ġuse . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval ĠDefault Ġ= ĠExp onent ial Backoff With J itter Options ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitial Delay Ġ= Ġ 1 0 . milliseconds , Ġ// Ġstart Ġwith Ġ 1 0 ms ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscale Factor Ġ= Ġ 1 . 5 , Ġ// Ġ 1 0 ms Ġ-> Ġ 1 5 ms Ġ-> Ġ 2 2 . 5 ms Ġ-> Ġ 3 3 . 8 ms Ġ-> Ġ 5 0 . 6 ms Ġ-> ĠâĢ¦ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġj itter Ġ= Ġ 1 . 0 , Ġ// ĠFull Ġj itter , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax Backoff Ġ= Ġ 2 0 _ 0 0 0 . milliseconds , Ġ// Ġ 2 0 s ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ