package Ġio . ktor . server . netty Ċ Ċ import Ġio . ktor . util . c io .* Ċ import Ġio . netty . channel .* Ċ import Ġio . netty . util . concurrent .* Ċ import Ġio . netty . util . concurrent . Future Ċ import Ġkotlinx . coroutines .* Ċ import Ġjava . io .* Ċ import Ġjava . util . concurrent .* Ċ import Ġkotlin . coroutines .* Ċ Ċ private Ġval Ġidentity ErrorHandler Ġ= Ġ{ Ġt : ĠThrowable , Ġc : ĠContinu ation < *> Ġ-> ĊĠĠĠ Ġc . resume With Exception ( t ) Ċ } Ċ Ċ /** Ċ Ġ* ĠS uspend Ġuntil Ġthe Ġfuture Ġcompletion . Ċ Ġ* ĠRes umes Ġwith Ġthe Ġsame Ġexception Ġif Ġthe Ġfuture Ġcompletes Ġexception ally Ċ Ġ*/ Ċ suspend Ġfun Ġ< T > ĠFuture < T >. suspend Await (): ĠT Ġ{ ĊĠĠĠ Ġreturn Ġsuspend Await ( identity ErrorHandler ) Ċ } Ċ Ċ private Ġval Ġwrapping ErrorHandler Ġ= Ġ{ Ġt : ĠThrowable , Ġc : ĠContinu ation < *> Ġ-> ĊĠĠĠ Ġif Ġ( t Ġis ĠIOException ) Ġc . resume With Exception ( Channel Write Exception (" Write Ġoperation Ġfuture Ġfailed ", Ġt )) ĊĠĠĠ Ġelse Ġc . resume With Exception ( t ) Ċ } Ċ Ċ /** Ċ Ġ* ĠS uspend Ġuntil Ġthe Ġfuture Ġcompletion . Ċ Ġ* ĠWrap s Ġfutures Ġcompletion Ġexceptions Ġinto Ġ[ Channel Write Exception ] Ċ Ġ*/ Ċ suspend Ġfun Ġ< T > ĠFuture < T >. suspend Write Await (): ĠT Ġ{ ĊĠĠĠ Ġreturn Ġsuspend Await ( wrapping ErrorHandler ) Ċ } Ċ Ċ /** Ċ Ġ* ĠS uspend Ġuntil Ġthe Ġfuture Ġcompletion Ġhandling Ġexception Ġfrom Ġthe Ġfuture Ġusing Ġ[ exception ] Ġfunction Ċ Ġ*/ Ċ suspend Ġfun Ġ< T > ĠFuture < T >. suspend Await ( exception : Ġ( Throwable , ĠContinu ation < T >) Ġ-> ĠUnit ): ĠT Ġ{ ĊĠĠĠ Ġ@ Suppress (" Blocking Method In Non Blocking Context ") ĊĠĠĠ Ġif Ġ( is Done ) Ġreturn Ġtry Ġ{ Ġget () Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ Ġthrow Ġt . unwrap () Ġ} ĊĊĠĠĠ Ġreturn Ġsuspend C ancellable Coroutine Ġ{ Ġcontinuation Ġ-> ĊĠĠĠĠĠĠĠ Ġadd Listener ( Coroutine Listener ( this , Ġcontinuation , Ġexception )) ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġobject ĠNet ty Dispatcher Ġ: ĠCor outine Dispatcher () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġis Dispatch Needed ( context : ĠCor outine Context ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ! context [ Current Context Key ] !!. context . executor (). in EventLoop () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdispatch ( context : ĠCor outine Context , Ġblock : ĠRunnable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnet ty Context Ġ= Ġcontext [ Current Context Key ] !!. context ĊĠĠĠĠĠĠĠ Ġnet ty Context . executor (). execute ( block ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠCurrent Context ( val Ġcontext : ĠChannel HandlerContext ) Ġ: ĠAbstract Coroutine Context Element ( Current Context Key ) ĊĠĠĠ Ġobject ĠCurrent Context Key Ġ: ĠCor outine Context . Key < Current Context > Ċ } Ċ Ċ @ Use Experimental ( Internal Cor outines Api :: class ) Ċ private Ġclass ĠCor outine Listener < T , ĠF Ġ: ĠFuture < T >>( private Ġval Ġfuture : ĠF , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġcontinuation : ĠC ancellable Continuation < T >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġexception : Ġ( Throwable , ĠContinu ation < T >) Ġ-> ĠUnit Ċ ) Ġ: ĠGeneric Future Listener < F >, ĠDis posable Handle Ġ{ ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġcontinuation . dispose On Cancellation ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġoperation Complete ( future : ĠF ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfuture . get () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexception ( t . unwrap (), Ġcontinuation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcontinuation . resume ( value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdispose () Ġ{ ĊĠĠĠĠĠĠĠ Ġfuture . remove Listener ( this ) ĊĠĠĠĠĠĠĠ Ġif Ġ( continu ation . is Cancelled ) Ġfuture . cancel ( false ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġtail rec Ġfun ĠThrowable . unwrap (): ĠThrowable Ġ= Ġif Ġ( this Ġis ĠExecution Exception Ġ&& Ġcause Ġ!= Ġnull ) Ġcause !!. unwrap () Ġelse Ġthis Ċ