package Ġcom . ap ol log raph ql . apollo . interceptor Ċ Ċ import Ġcom . ap ol log raph ql . apollo . A pol lo HttpException Ċ import Ġcom . ap ol log raph ql . apollo . A pol lo Bearer Token Exception Ċ import Ġcom . ap ol log raph ql . apollo . api . A pol lo Experimental Ċ import Ġcom . ap ol log raph ql . apollo . api . Response Ċ import Ġcom . ap ol log raph ql . apollo . network . Http ExecutionContext Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . catch Ċ import Ġkotlinx . coroutines . flow . flatMap Concat Ċ import Ġkotlinx . coroutines . flow . flow Ċ import Ġkotlinx . coroutines . flow . retry Ċ import Ġkotlinx . coroutines . sync . Mutex Ċ import Ġkotlinx . coroutines . sync . with Lock Ċ Ċ @ A pol lo Experimental Ċ class ĠBearer Token Interceptor ( private Ġval Ġtoken Provider : ĠToken Provider ) Ġ: ĠApollo Request Interceptor Ġ{ ĊĠ Ġval Ġmutex Ġ= ĠMutex () ĊĊĠ Ġprivate Ġfun Ġ< T > ĠApollo Request < T >. with Header ( name : ĠString , Ġvalue : ĠString ): ĠApollo Request < T > Ġ{ ĊĠĠĠ Ġval ĠhttpRequest Context Ġ= Ġ( executionContext [ Http ExecutionContext . Request ] ĊĠĠĠĠĠĠĠ Ġ?: ĠHttp ExecutionContext . Request ( empty Map ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . copy ( headers Ġ= Ġit . headers Ġ+ Ġ( name Ġto Ġvalue )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn ĠApollo Request ( ĊĠĠĠĠĠĠĠ Ġoperation Ġ= Ġoperation , ĊĠĠĠĠĠĠĠ Ġscalar Type Adapters Ġ= Ġscalar Type Adapters , ĊĠĠĠĠĠĠĠ Ġexecution Context Ġ= Ġexecution Context Ġ+ ĠhttpRequest Context ĊĠĠĠ Ġ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġ< T > Ġproceed With Token ( request : ĠApollo Request < T >, Ġinterceptor Chain : ĠApollo Interceptor Chain , Ġtoken : ĠString ): ĠFlow < Response < T >> Ġ{ ĊĠĠĠ Ġval Ġnew Request Ġ= Ġrequest . with Header (" Authorization ", Ġ" Bearer Ġ$ token ") ĊĠĠĠ Ġreturn Ġinterceptor Chain . proceed ( new Request ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġ< T > Ġintercept ( request : ĠApollo Request < T >, Ġinterceptor Chain : ĠApollo Interceptor Chain ): ĠFlow < Response < T >> Ġ{ ĊĠĠĠ Ġreturn Ġflow Ġ{ ĊĠĠĠĠĠ Ġval Ġtoken Ġ= Ġmutex . with Lock Ġ{ Ġtoken Provider . current Token () Ġ} ĊĠĠĠĠĠ Ġemit ( token ) ĊĠĠĠ Ġ}. flatMap Concat Ġ{ Ġtoken Ġ-> ĊĠĠĠĠĠ Ġproceed With Token ( request , Ġinterceptor Chain , Ġtoken ). catch Ġ{ Ġexception -> ĊĠĠĠĠĠĠĠ Ġif Ġ( exception Ġis ĠApollo HttpException Ġ&& Ġexception . statusCode Ġ== Ġ 4 0 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġthrow ĠApollo Bearer Token Exception ( message Ġ= Ġ" Request Ġfailed Ġwith Ġstatus Ġcode Ġ` 4 0 1 `", Ġcause Ġ= Ġexception , Ġtoken Ġ= Ġtoken ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġthrow Ġexception ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}. retry ( retries Ġ= Ġ 1 ) Ġ{ Ġerror Ġ-> ĊĠĠĠĠĠ Ġif Ġ( error Ġis ĠApollo Bearer Token Exception ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtoken Provider . refresh Token ( error . token ) ĊĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ }