package Ġorg . dx works . github miner . http Ċ Ċ import Ġcom . google . api . client . http . Generic Url Ċ import Ġcom . google . api . client . http . HttpRequest Initializer Ċ import Ġcom . google . api . client . http . HttpResponse Exception Ċ import Ġcom . google . api . client . http . HttpStatusCode s . STATUS _ CODE _ FOR BID DEN Ċ import Ġcom . google . api . client . http . HttpStatusCode s . STATUS _ CODE _ NOT _ FOUND Ċ import Ġorg . dx works . github miner . constants . AN ONY MO US Ċ import Ġorg . dx works . github miner . constants . RATE _ LIMIT _ PATH Ċ import Ġorg . dx works . github miner . dto . rate . RateLimit Ċ import Ġorg . dx works . github miner . utils . Github Bearer Authentication Provider Ċ import Ġorg . dx works . utils . java . rest . client . HttpClient Ċ import Ġorg . dx works . utils . java . rest . client . response . HttpResponse Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . time . Zone Offset Ċ import Ġjava . time . Z onedDateTime Ċ import Ġjava . util .* Ċ Ċ class ĠGithub HttpClient ( private Ġval Ġgithub Tokens : ĠList < String >, Ġprivate Ġval Ġgithub BasePath : ĠString ) Ġ: ĠHttpClient ( default HttpRequest Initializer ) Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġrate Limit Enabled Ġ= Ġtrue ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠgetToken Rate Limits () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget ( url : ĠGeneric Url , Ġcustom Request Initializer : ĠHttpRequest Initializer ?): ĠHttpResponse Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . info ("[ GET ] Ġ$ url ") ĊĠĠĠĠĠĠĠ Ġreturn Ġperform Request Ġ{ ĠGithub HttpResponse ( super . get ( url , ĠGithub Bearer Authentication Provider ( it ))) Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpatch ( url : ĠGeneric Url , Ġbody : ĠAny ?, Ġcustom Request Initializer : ĠHttpRequest Initializer ?): ĠHttpResponse Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . info ("[ PATCH ] Ġ$ url ") ĊĠĠĠĠĠĠĠ Ġreturn Ġperform Request Ġ{ ĠGithub HttpResponse ( super . patch ( url , Ġbody , ĠGithub Bearer Authentication Provider ( it ))) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpost ( url : ĠGeneric Url , Ġbody : ĠAny ?, Ġcustom Request Initializer : ĠHttpRequest Initializer ?): ĠHttpResponse Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . info ("[ POST ] Ġ$ url ") ĊĠĠĠĠĠĠĠ Ġreturn Ġperform Request Ġ{ ĠGithub HttpResponse ( super . post ( url , Ġbody , ĠGithub Bearer Authentication Provider ( it ))) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġput ( url : ĠGeneric Url ?, Ġbody : ĠAny ?, Ġcustom Request Initializer : ĠHttpRequest Initializer ?): ĠHttpResponse Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . info ("[ PUT ] Ġ$ url ") ĊĠĠĠĠĠĠĠ Ġreturn Ġperform Request Ġ{ ĠGithub HttpResponse ( super . put ( url , Ġbody , ĠGithub Bearer Authentication Provider ( it ))) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetToken Rate Limits () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresponse : ĠGithub HttpResponse ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġfor Ġ( token Ġin Ġgithub Tokens ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Ġ= ĠGithub HttpResponse ( super . get ( Generic Url ("$ github BasePath /$ RATE _ LIMIT _ PATH "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGithub Bearer Authentication Provider ( token ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Rate Limits [ token ] Ġ= Ġresponse . rate Limit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠHttpResponse Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( se ver RateLimit Disabled ( e )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . rate Limit Enabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġperform Request ( do Request : Ġ( token : ĠString ) Ġ-> ĠGithub HttpResponse ): ĠHttpResponse Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! rate Limit Enabled ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdo Request ( github Tokens . first OrNull () Ġ?: ĠAN ONY MO US ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtry Perform Request Consider ing RateLimit ( do Request ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtry Perform Request Consider ing RateLimit ( do Request : Ġ( token : ĠString ) Ġ-> ĠGithub HttpResponse ): ĠGithub HttpResponse Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactive Tokens Ġ= Ġretrieve Active Tokens () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġresponse : ĠGithub HttpResponse ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( active Tokens . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwait Until So on est RateLimit Reset () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġused Token Ġ= Ġactive Tokens . first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Ġ= Ġdo Request ( used Token ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Rate Limits [ used Token ] Ġ= Ġit . rate Limit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresponse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠHttpResponse Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rate Limit Exceeded ( e )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Rate Limits [ used Token ] Ġ= ĠGithub HttpResponse ( super . get ( Generic Url ("$ github BasePath /$ RATE _ LIMIT _ PATH "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGithub Bearer Authentication Provider ( used Token ))). rate Limit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġthrow Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwait Until So on est RateLimit Reset () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwait Until Ġ= Ġtoken Rate Limits . values . min By Ġ{ Ġit . reset Timestamp Ġ} !!. reset Timestamp ĊĠĠĠĠĠĠĠ Ġlog . info (" Waiting Ġuntil Ġ$ wait Until ") ĊĠĠĠĠĠĠĠ ĠThread . sleep (( wait Until . to Epoch Second ( Zone Offset . UTC ) Ġ- ĠZ onedDateTime . now ( Zone Offset . UTC ). to Epoch Second () Ġ+ Ġ 1 ) Ġ* Ġ 1 0 0 0 ) ĊĠĠĠĠĠĠĠ ĠgetToken Rate Limits () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġretrieve Active Tokens (): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtoken Rate Limits ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . value . remaining Requests Ġ> Ġ 0 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . key Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsever RateLimit Disabled ( e : ĠHttpResponse Exception ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . statusCode Ġ== ĠSTATUS _ CODE _ NOT _ FOUND Ġ&& Ġe . content . contains (" Rate Ġlimiting Ġis Ġnot Ġenabled ") ĊĊĠĠĠ Ġprivate Ġfun Ġrate Limit Exceeded ( e : ĠHttpResponse Exception ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . statusCode Ġ== ĠSTATUS _ CODE _ FOR BID DEN Ġ&& Ġe . content . contains (" API Ġrate Ġlimit Ġexceeded Ġfor ") ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtoken Rate Limits : ĠMutable Map < String , ĠRate Limit > Ġ= ĠHashMap () ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdefault HttpRequest Initializer Ġ= ĠHttpRequest Initializer Ġ{ Ġit . read Timeout Ġ= Ġ 5 0 0 0 Ġ} ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠLoggerFactory . getLogger ( Github HttpClient :: class . java ) ĊĠĠĠ Ġ} Ċ } ĊĊ