package Ġex h . util Ċ Ċ import Ġkotlinx . coroutines . suspend C ancellable Coroutine Ċ import Ġokhttp 3 . Call Ċ import Ġokhttp 3 . Callback Ċ import Ġokhttp 3 . Response Ċ import Ġokhttp 3 . internal . close Quiet ly Ċ import Ġrx . Observable Ċ import Ġrx . Producer Ċ import Ġrx . Subscription Ċ import Ġjava . io . IOException Ċ import Ġjava . util . concurrent . atomic . Atomic Boolean Ċ import Ġkotlin . coroutines . resume Ċ import Ġkotlin . coroutines . resume With Exception Ċ Ċ fun ĠCall . as Observable With Async Stack trace (): ĠObservable < Pair < Exception , ĠResponse >> Ġ{ ĊĠĠĠ Ġ// ĠRecord Ġstack trace Ġat Ġcreation Ġtime Ġfor Ġeasier Ġdebugging ĊĠĠĠ Ġ// ĠĠ Ġas Observable Ġis Ġinvolved Ġin Ġa Ġlot Ġof Ġcrashes Ġso Ġthis Ġis Ġworth Ġthe Ġperformance Ġhit ĊĠĠĠ Ġval Ġasync StackTrace Ġ= ĠException (" Async Ġstack trace ") ĊĊĠĠĠ Ġreturn ĠObservable . unsafe Create Ġ{ Ġsubscriber Ġ-> ĊĠĠĠĠĠĠĠ Ġ// ĠSince ĠCall Ġis Ġa Ġone - shot Ġtype , Ġclone Ġit Ġfor Ġeach Ġnew Ġsubscriber . ĊĠĠĠĠĠĠĠ Ġval Ġcall Ġ= Ġclone () ĊĊĠĠĠĠĠĠĠ Ġ// ĠWrap Ġthe Ġcall Ġin Ġa Ġhelper Ġwhich Ġhandles Ġboth Ġun subscription Ġand Ġback pressure . ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ar b iter Ġ= Ġobject Ġ: ĠAtomic Boolean (), ĠProducer , ĠSubscription Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexecuted Ġ= ĠAtomic Boolean ( false ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrequest ( n : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( n Ġ== Ġ 0 L Ġ|| Ġ! compare AndSet ( false , Ġtrue )) Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġcall . execute () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecuted . set ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! subscriber . is Un subscribed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubscriber . onNext ( async StackTrace Ġto Ġresponse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubscriber . on Completed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( error : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! subscriber . is Un subscribed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubscriber . onError ( error . with Root Cause ( async StackTrace )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġunsubscribe () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! executed . get ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġis Un subscribed (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcall . is Canceled () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsubscriber . add ( request Ar b iter ) ĊĠĠĠĠĠĠĠ Ġsubscriber . set Producer ( request Ar b iter ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠSimilar Ġto Ġ[ Call . await ] Ġbut Ġit Ġdoesn 't Ġthrow Ġwhen Ġthe Ġresponse Ġis Ġnot Ġsuccessful Ċ Ġ*/ Ċ suspend Ġfun ĠCall . await Response (): ĠResponse Ġ{ ĊĠĠĠ Ġreturn Ġsuspend C ancellable Coroutine Ġ{ Ġcontinuation Ġ-> ĊĠĠĠĠĠĠĠ Ġenqueue ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠCallback Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Response ( call : ĠCall , Ġresponse : ĠResponse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinuation . resume ( response ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . close Quiet ly () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( call : ĠCall , Ġe : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDon 't Ġbother Ġwith Ġres uming Ġthe Ġcontinuation Ġif Ġit Ġis Ġalready Ġcancelled . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( continu ation . is Cancelled ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinuation . resume With Exception ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġcontinuation . invoke On Cancellation Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIgnore Ġcancel Ġexception ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ