package Ġcom . world re mit . base . tracing . br ave Ċ Ċ import Ġarrow . core . comp ut ations . nullable Ċ import Ġarrow . core . getOrElse Ċ import Ġarrow . core . to Option Ċ import Ġbr ave . Request Ċ import Ġbr ave . Span Ċ import Ġbr ave . Tracing Ċ import Ġbr ave . propagation . Current Trace Context Ċ import Ġbr ave . propagation . Current Trace Context . Scope Ċ import Ġbr ave . propagation . Propagation Ċ import Ġbr ave . propagation . Trace Context Ċ import Ġcom . world re mit . base . tracing . Tracing Context Ċ import Ġkotlin . coroutines . Coroutine Context Ċ import Ġkotlin . coroutines . Empty Coroutine Context Ċ Ċ class ĠMap Request ( initial : ĠMap < String , ĠString > Ġ= Ġmap Of ()) Ġ: ĠRequest () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġmapping : ĠMutable Map < String , ĠString > Ġ= Ġinitial . to Mutable Map () ĊĊĠĠĠ Ġoverride Ġfun Ġspan Kind (): ĠSpan . Kind Ġ= ĠSpan . Kind . SERVER ĊĊĠĠĠ Ġoverride Ġfun Ġunwrap (): ĠAny Ġ= Ġcontext ĊĊĠĠĠ Ġval Ġcontext : ĠMap < String , ĠString > Ġget () Ġ= Ġmapping . toMap () ĊĊĠĠĠ Ġfun Ġset Context ( key : ĠString , Ġvalue : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmapping [ key ] Ġ= Ġvalue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetContext ( key : ĠString ): ĠString ? Ġ= Ġmapping [ key ] Ċ } Ċ Ċ object ĠMap Request Getter Ġ: ĠPro pagation . Getter < Map Request , ĠString > Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġget ( request : ĠMap Request , Ġkey : ĠString ): ĠString ? Ġ= Ġrequest . getContext ( key ) Ċ } Ċ Ċ object ĠMap Request Setter Ġ: ĠPro pagation . Setter < Map Request , ĠString > Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġput ( request : ĠMap Request , Ġkey : ĠString , Ġvalue : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequest . set Context ( key , Ġvalue ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġcapture Br ave Tracing Context ( tracing : ĠTr acing ): ĠTr acing Context Ġ{ ĊĠĠĠ Ġval Ġtrace Context Ġ= Ġtracing . current Trace Context (). get () Ġ?: Ġreturn ĠTr acing Context ( empty Map ()) ĊĠĠĠ Ġval Ġrequest Ġ= ĠMap Request () ĊĠĠĠ Ġtracing . propagation (). injector ( Map Request Setter ). inject ( trace Context , Ġrequest ) ĊĠĠĠ Ġreturn ĠTr acing Context ( request . context ) Ċ } Ċ Ċ type alias ĠCreate Trace Context Ġ= Ġ( Tracing , ĠTr acing Context ) Ġ-> ĠTrace Context ? Ċ Ċ fun Ġcreate Br ave Trace Context ( tracing : ĠTr acing , Ġcontext : ĠTr acing Context ): ĠTrace Context ? Ġ= ĊĠĠĠ Ġtracing . propagation (). extractor ( Map Request Getter ) ĊĠĠĠĠĠĠĠ Ġ. extract ( Map Request ( context . value )) ĊĠĠĠĠĠĠĠ Ġ. context () Ċ Ċ fun Ġ< R > Ġrun In Tracing Context ( ĊĠĠĠ Ġcreate Trace Context : ĠCreate Trace Context , ĊĠĠĠ Ġtracing : ĠTr acing , ĊĠĠĠ Ġtracing Context : ĠTr acing Context , ĊĠĠĠ Ġblock : Ġ() Ġ-> ĠR Ċ ): ĠR Ġ{ ĊĠĠĠ Ġval Ġrestored Scope Ġ= Ġnullable . e ager < Scope > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġcreate Trace Context ( tracing , Ġtracing Context ). bind () ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Trace Context Ġ= Ġcurrent Trace Context (). bind () ĊĠĠĠĠĠĠĠ Ġcurrent Trace Context . new Scope ( context ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġactive Scope Ġ= Ġrestored Scope Ġ?: ĠScope . NO OP ĊĠĠĠ Ġreturn Ġactive Scope . use Ġ{ ĊĠĠĠĠĠĠĠ Ġblock () ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġcreate Br ave Tracing Coroutine Context ( ĊĠĠĠ Ġcreate Trace Context : ĠCreate Trace Context , ĊĠĠĠ Ġtracing : ĠTr acing , ĊĠĠĠ Ġcontext : ĠTr acing Context Ċ ): ĠCor outine Context Ġ= ĊĠĠĠ Ġcreate Trace Context ( tracing , Ġcontext ) ĊĠĠĠĠĠĠĠ Ġ. to Option () ĊĠĠĠĠĠĠĠ Ġ. map (:: Trace Context Element ) ĊĠĠĠĠĠĠĠ Ġ. getOrElse Ġ{ ĠEmpty Coroutine Context Ġ} ĊĊ Ċ fun Ġtrace Context (): ĠTrace Context ? Ġ= Ġcurrent Trace Context ()?. get () Ċ Ċ fun Ġcurrent Trace Context (): ĠCurrent Trace Context ? Ġ= ĠTr acing . current ()?. current Trace Context () Ċ