package Ġcom . as ark ar . ok grpc . test Ċ Ċ import Ġcom . fasterxml . jackson . module . kotlin . readValue Ċ import Ġio . grpc . Context Ċ import Ġio . grpc . stub . Stream Observer Ċ Ċ public Ġclass ĠEcho ServiceImpl Ġ: ĠEcho Service Grpc . Echo ServiceImpl Base () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġecho ( ping : ĠPing , Ġresponse Observer : ĠStream Observer < P ong >) Ġ{ ĊĠĠĠĠĠĠĠ Ġresponse Observer . onNext ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠP ong . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMessage ( ping . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġbuilder Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheaders Ġ= Ġmetadata Ctx Key [ Context . current ()] ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmapper . readValue < Map < String , ĠString >>( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpairs Ġ= Ġheaders ?. entries ?. map Ġ{ Ġheader Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair . newBuilder (). set Key ( header . key ). setValue ( header . value ). build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pairs Ġ!= Ġnull Ġ&& Ġpairs . isNotEmpty ()) Ġbuilder . addAll Headers ( pairs ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġresponse Observer . on Completed () ĊĠĠĠ Ġ} Ċ } Ċ