/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠSquare ĠInc . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġcom . squareup . wire Ċ Ċ import Ġcom . squareup . wire . internal . Blocking Message Source Ċ import Ġcom . squareup . wire . internal . generic ParameterType Ċ import Ġcom . squareup . wire . internal . invoke Sus pending Ċ import Ġcom . squareup . wire . internal . message Sink Ċ import Ġcom . squareup . wire . internal . new Dup lex RequestBody Ċ import Ġcom . squareup . wire . internal . new RequestBody Ċ import Ġcom . squareup . wire . internal . raw Type Ċ import Ġcom . squareup . wire . internal . read From ResponseBody Callback Ċ import Ġcom . squareup . wire . internal . un conf ined Coroutine Scope Ċ import Ġcom . squareup . wire . internal . writeTo RequestBody Ċ import Ġkotlinx . coroutines . Coroutine Start Ċ import Ġkotlinx . coroutines . Deferred Ċ import Ġkotlinx . coroutines . Job Ċ import Ġkotlinx . coroutines . async Ċ import Ġkotlinx . coroutines . channels . Channel Ċ import Ġkotlinx . coroutines . channels . Receive Channel Ċ import Ġkotlinx . coroutines . channels . Send Channel Ċ import Ġkotlinx . coroutines . channels . consume Ċ import Ġkotlinx . coroutines . channels . produce Ċ import Ġkotlinx . coroutines . channels . to Channel Ċ import Ġokhttp 3 . Call Ċ import Ġokhttp 3 . RequestBody Ċ import Ġjava . lang . reflect . Method Ċ import Ġjava . lang . reflect . Parameterized Type Ċ import Ġjava . net . Protocol Exception Ċ import Ġkotlin . coroutines . Continuation Ċ Ċ internal Ġsealed Ġclass ĠGr pc Method < S Ġ: ĠAny , ĠR Ġ: ĠAny >( ĊĠ Ġval Ġpath : ĠString , ĊĠ Ġval Ġrequest Adapter : ĠProto Adapter < S >, ĊĠ Ġval Ġresponse Adapter : ĠProto Adapter < R > Ċ ) Ġ{ ĊĠ Ġ/** ĠHandle Ġa Ġdynamic Ġproxy Ġmethod Ġcall Ġto Ġthis . Ġ*/ ĊĠ Ġabstract Ġfun Ġinvoke ( grpc Client : ĠGr pc Client , Ġargs : ĠArray < Any >): ĠAny ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠC ancellation Ġof Ġthe Ġ[ Call ] Ġis Ġalways Ġtied Ġto Ġthe Ġresponse . ĠTo Ġcancel Ġthe Ġcall , Ġeither Ġcancel ĊĠĠ Ġ* Ġthe Ġresponse Ġchannel , Ġdeferred , Ġor Ġsus pending Ġfunction Ġcall . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġcall With Channels ( grpc Client : ĠGr pc Client ): ĠPair < Channel < S >, ĠChannel < R >> Ġ{ ĊĠĠĠ Ġval Ġrequest Channel Ġ= ĠChannel < S >( 1 ) ĊĠĠĠ Ġval Ġresponse Channel Ġ= ĠChannel < R >( 1 ) ĊĊĠĠĠ Ġval Ġrequest Body Ġ= Ġnew Dup lex RequestBody () ĊĠĠĠ Ġval Ġcall Ġ= Ġgrpc Client . new Call ( path , Ġrequest Body ) ĊĠĠĠ Ġrequest Channel . writeTo RequestBody ( request Body , Ġrequest Adapter , Ġcall ) ĊĠĠĠ Ġcall . enqueue ( response Channel . read From ResponseBody Callback ( response Adapter )) ĊĊĠĠĠ Ġresponse Channel . invoke On Close Ġ{ Ġcause Ġ-> ĊĠĠĠĠĠ Ġcall . cancel () ĊĠĠĠĠĠ Ġrequest Channel . cancel () ĊĠĠĠĠĠ Ġresponse Channel . cancel () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġrequest Channel Ġto Ġresponse Channel ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcall Blocking ( ĊĠĠĠ Ġgrpc Client : ĠGr pc Client , ĊĠĠĠ Ġrequest Body : ĠRequest Body ĊĠ Ġ): ĠMessage Source < R > Ġ{ ĊĠĠĠ Ġval Ġcall Ġ= Ġgrpc Client . new Call ( path , Ġrequest Body ) ĊĠĠĠ Ġval Ġmessage Source Ġ= ĠBlock ing Message Source ( call , Ġresponse Adapter ) ĊĠĠĠ Ġcall . enqueue ( message Source . read From ResponseBody Callback ()) ĊĠĠĠ Ġreturn Ġmessage Source ĊĠ Ġ} ĊĊĠ Ġ/** ĠSingle Ġrequest , Ġsingle Ġresponse . Ġ*/ ĊĠ Ġclass ĠRequest Response < S Ġ: ĠAny , ĠR Ġ: ĠAny >( ĊĠĠĠ Ġpath : ĠString , ĊĠĠĠ Ġrequest Adapter : ĠProto Adapter < S >, ĊĠĠĠ Ġresponse Adapter : ĠProto Adapter < R > ĊĠ Ġ) Ġ: ĠGr pc Method < S , ĠR >( path , Ġrequest Adapter , Ġresponse Adapter ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġinvoke ( grpc Client : ĠGr pc Client , Ġargs : ĠArray < Any >): ĠAny Ġ{ ĊĠĠĠĠĠ Ġreturn Ġ( args . last () Ġas ĠContinu ation < Any >). invoke Sus pending Ġ{ ĊĠĠĠĠĠĠĠ Ġinvoke ( grpc Client , Ġparameter Ġ= Ġargs [ 0 ]) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġinvoke ( ĊĠĠĠĠĠ Ġgrpc Client : ĠGr pc Client , ĊĠĠĠĠĠ Ġparameter : ĠAny ĊĠĠĠ Ġ): ĠR Ġ{ ĊĠĠĠĠĠ Ġval Ġ( request Channel , Ġresponse Channel ) Ġ= Ġsuper . call With Channels ( grpc Client ) ĊĊĠĠĠĠĠ Ġresponse Channel . consume Ġ{ ĊĠĠĠĠĠĠĠ Ġrequest Channel . send ( parameter Ġas ĠS ) ĊĠĠĠĠĠĠĠ Ġrequest Channel . close () ĊĠĠĠĠĠĠĠ Ġreturn Ġreceive () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĠSingle Ġrequest , Ġsingle Ġresponse . Ġ*/ ĊĠ Ġclass ĠBlock ing Request Response < S Ġ: ĠAny , ĠR Ġ: ĠAny >( ĊĠĠĠ Ġpath : ĠString , ĊĠĠĠ Ġrequest Adapter : ĠProto Adapter < S >, ĊĠĠĠ Ġresponse Adapter : ĠProto Adapter < R > ĊĠ Ġ) Ġ: ĠGr pc Method < S , ĠR >( path , Ġrequest Adapter , Ġresponse Adapter ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġinvoke ( grpc Client : ĠGr pc Client , Ġargs : ĠArray < Any >): ĠAny Ġ{ ĊĠĠĠĠĠ Ġval Ġrequest Body Ġ= Ġnew RequestBody ( request Adapter , Ġargs [ 0 ] Ġas ĠS ) ĊĠĠĠĠĠ Ġval Ġmessage Source Ġ= Ġsuper . call Blocking ( grpc Client , Ġrequest Body ) ĊĊĠĠĠĠĠ Ġmessage Source . use Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmessage Source . read () Ġ?: Ġthrow ĠProtocol Exception (" required Ġmessage Ġnot Ġsent ") ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĠRequest Ġis Ġstreaming , Ġwith Ġone Ġsingle Ġresponse . Ġ*/ ĊĠ Ġclass ĠStreaming Request < S Ġ: ĠAny , ĠR Ġ: ĠAny >( ĊĠĠĠ Ġpath : ĠString , ĊĠĠĠ Ġrequest Adapter : ĠProto Adapter < S >, ĊĠĠĠ Ġresponse Adapter : ĠProto Adapter < R > ĊĠ Ġ) Ġ: ĠGr pc Method < S , ĠR >( path , Ġrequest Adapter , Ġresponse Adapter ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġinvoke ( ĊĠĠĠĠĠ Ġgrpc Client : ĠGr pc Client , ĊĠĠĠĠĠ Ġargs : ĠArray < Any > ĊĠĠĠ Ġ): ĠPair < Send Channel < S >, ĠDeferred < R >> Ġ{ ĊĠĠĠĠĠ Ġval Ġ( request Channel , Ġresponse Channel ) Ġ= Ġsuper . call With Channels ( grpc Client ) ĊĊĠĠĠĠĠ Ġreturn ĠPair ( ĊĠĠĠĠĠĠĠĠĠ Ġrequest Channel , ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġuse ĠA TO MIC Ġto Ġguarantee Ġthe Ġcoroutine Ġdoesn 't Ġstart Ġafter Ġpotential Ġcancell ations ĊĠĠĠĠĠĠĠĠĠ Ġ// Ġhappen . ĊĠĠĠĠĠĠĠĠĠ Ġun conf ined Coroutine Scope . async ( start Ġ= ĠCor outine Start . ATOMIC ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Channel . consume Ġ{ Ġreceive () Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĠSingle Ġrequest , Ġand Ġresponse Ġis Ġstreaming . Ġ*/ ĊĠ Ġclass ĠStreaming Response < S Ġ: ĠAny , ĠR Ġ: ĠAny >( ĊĠĠĠ Ġpath : ĠString , ĊĠĠĠ Ġrequest Adapter : ĠProto Adapter < S >, ĊĠĠĠ Ġresponse Adapter : ĠProto Adapter < R > ĊĠ Ġ) Ġ: ĠGr pc Method < S , ĠR >( path , Ġrequest Adapter , Ġresponse Adapter ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġinvoke ( grpc Client : ĠGr pc Client , Ġargs : ĠArray < Any >): ĠAny Ġ{ ĊĠĠĠĠĠ Ġval Ġ( request Channel , Ġresponse Channel ) Ġ= Ġsuper . call With Channels ( grpc Client ) ĊĊĠĠĠĠĠ Ġ// ĠTODO ( b eno it ) ĠRemove Ġthe Ġcancellation Ġhandling Ġonce Ġthis Ġsh ips : ĊĠĠĠĠĠ Ġ// ĠĠĠĠ Ġhttps :// github . com / Kotlin / kotlin x . coroutines / issues / 8 4 5 ĊĠĠĠĠĠ Ġun conf ined Coroutine Scope . coroutine Context [ Job ] !!. invoke On Completion Ġ{ ĊĠĠĠĠĠĠĠ Ġresponse Channel . cancel () ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn Ġun conf ined Coroutine Scope . produce < Any > Ġ{ ĊĠĠĠĠĠĠĠ Ġrequest Channel . send ( args [ 0 ] Ġas ĠS ) ĊĠĠĠĠĠĠĠ Ġrequest Channel . close () ĊĠĠĠĠĠĠĠ Ġresponse Channel . to Channel ( channel ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĠSingle Ġrequest , Ġand Ġresponse Ġis Ġstreaming . Ġ*/ ĊĠ Ġclass ĠBlock ing Streaming Response < S Ġ: ĠAny , ĠR Ġ: ĠAny >( ĊĠĠĠ Ġpath : ĠString , ĊĠĠĠ Ġrequest Adapter : ĠProto Adapter < S >, ĊĠĠĠ Ġresponse Adapter : ĠProto Adapter < R > ĊĠ Ġ) Ġ: ĠGr pc Method < S , ĠR >( path , Ġrequest Adapter , Ġresponse Adapter ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġinvoke ( grpc Client : ĠGr pc Client , Ġargs : ĠArray < Any >): ĠAny Ġ{ ĊĠĠĠĠĠ Ġval Ġrequest Body Ġ= Ġnew RequestBody ( request Adapter , Ġargs [ 0 ] Ġas ĠS ) ĊĠĠĠĠĠ Ġreturn Ġsuper . call Blocking ( grpc Client , Ġrequest Body ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĠRequest Ġand Ġresponse Ġare Ġboth Ġstreaming . Ġ*/ ĊĠ Ġclass ĠFull Dup lex < S Ġ: ĠAny , ĠR Ġ: ĠAny >( ĊĠĠĠ Ġpath : ĠString , ĊĠĠĠ Ġrequest Adapter : ĠProto Adapter < S >, ĊĠĠĠ Ġresponse Adapter : ĠProto Adapter < R > ĊĠ Ġ) Ġ: ĠGr pc Method < S , ĠR >( path , Ġrequest Adapter , Ġresponse Adapter ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġinvoke ( ĊĠĠĠĠĠ Ġgrpc Client : ĠGr pc Client , ĊĠĠĠĠĠ Ġargs : ĠArray < Any > ĊĠĠĠ Ġ): ĠPair < Send Channel < S >, ĠReceive Channel < R >> Ġ= Ġsuper . call With Channels ( grpc Client ) ĊĠ Ġ} ĊĊĠ Ġ/** ĠRequest Ġand Ġresponse Ġare Ġboth Ġstreaming . Ġ*/ ĊĠ Ġclass ĠBlock ing Full Dup lex < S Ġ: ĠAny , ĠR Ġ: ĠAny >( ĊĠĠĠ Ġpath : ĠString , ĊĠĠĠ Ġrequest Adapter : ĠProto Adapter < S >, ĊĠĠĠ Ġresponse Adapter : ĠProto Adapter < R > ĊĠ Ġ) Ġ: ĠGr pc Method < S , ĠR >( path , Ġrequest Adapter , Ġresponse Adapter ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġinvoke ( ĊĠĠĠĠĠ Ġgrpc Client : ĠGr pc Client , Ġargs : ĠArray < Any > ĊĠĠĠ Ġ): ĠPair < Message Sink < S >, ĠMessage Source < R >> Ġ{ ĊĠĠĠĠĠ Ġval Ġrequest Body Ġ= Ġnew Dup lex RequestBody () ĊĠĠĠĠĠ Ġval Ġcall Ġ= Ġgrpc Client . new Call ( super . path , Ġrequest Body ) ĊĠĠĠĠĠ Ġval Ġmessage Source Ġ= ĠBlock ing Message Source ( call , Ġsuper . response Adapter ) ĊĠĠĠĠĠ Ġval Ġmessage Sink Ġ= Ġrequest Body . message Sink ( request Adapter , Ġcall ) ĊĠĠĠĠĠ Ġcall . enqueue ( message Source . read From ResponseBody Callback ()) ĊĠĠĠĠĠ Ġreturn Ġmessage Sink Ġto Ġmessage Source ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġinternal Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġinternal Ġfun Ġ< S Ġ: ĠAny , ĠR Ġ: ĠAny > ĠMethod . to Grpc (): ĠGr pc Method < S , ĠR > Ġ{ ĊĠĠĠĠĠ Ġval Ġwire Rpc Ġ= Ġget Annotation ( Wire Rpc :: class . java ) ĊĠĠĠĠĠ Ġval Ġrequest Adapter Ġ= ĠProto Adapter . get ( wire Rpc . request Adapter ) Ġas ĠProto Adapter < S > ĊĠĠĠĠĠ Ġval Ġresponse Adapter Ġ= ĠProto Adapter . get ( wire Rpc . response Adapter ) Ġas ĠProto Adapter < R > ĊĠĠĠĠĠ Ġval Ġparameter Types Ġ= Ġgeneric Parameter Types ĊĠĠĠĠĠ Ġval ĠreturnType Ġ= Ġgeneric ReturnType ĊĊĠĠĠĠĠ Ġif Ġ( parameter Types . size Ġ== Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠCor outines Ġrequest - response . ĊĠĠĠĠĠĠĠ Ġ// ĠObject ĠmethodName ( RequestType , ĠContinu ation ) ĊĠĠĠĠĠĠĠ Ġif Ġ( parameter Types [ 1 ]. raw Type () Ġ== ĠContinu ation :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġreturn ĠRequest Response ( wire Rpc . path , Ġrequest Adapter , Ġresponse Adapter ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( parameter Types . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠCor outines Ġstreaming Ġresponse . ĊĠĠĠĠĠĠĠ Ġ// ĠReceive Channel < ResponseType > ĠmethodName ( RequestType ) ĊĠĠĠĠĠĠĠ Ġif Ġ( returnType . raw Type () Ġ== ĠReceive Channel :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġreturn ĠStreaming Response ( wire Rpc . path , Ġrequest Adapter , Ġresponse Adapter ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠBlock ing Ġstreaming Ġresponse . ĊĠĠĠĠĠĠĠ Ġ// ĠMessage Source < ResponseType > ĠmethodName ( RequestType ) ĊĠĠĠĠĠĠĠ Ġif Ġ( returnType . raw Type () Ġ== ĠMessage Source :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġreturn ĠBlock ing Streaming Response ( wire Rpc . path , Ġrequest Adapter , Ġresponse Adapter ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠBlock ing Ġrequest - response . ĊĠĠĠĠĠĠĠ Ġ// ĠResponse Type ĠmethodName ( RequestType ) ĊĠĠĠĠĠĠĠ Ġreturn ĠBlock ing Request Response ( wire Rpc . path , Ġrequest Adapter , Ġresponse Adapter ) ĊĊĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( parameter Types . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( returnType . raw Type () Ġ== ĠPair :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġpair Type Ġ= ĠreturnType Ġas ĠParameter ized Type ĊĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Type Ġ= Ġpair Type . generic ParameterType ( index Ġ= Ġ 0 ). raw Type () ĊĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Type Ġ= Ġpair Type . generic ParameterType ( index Ġ= Ġ 1 ). raw Type () ĊĊĠĠĠĠĠĠĠĠĠ Ġ// ĠCor outines Ġfull Ġdup lex . ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠPair < Send Channel < RequestType >, ĠReceive Channel < ResponseType >> ĠmethodName () ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( request Type Ġ== ĠSend Channel :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġresponse Type Ġ== ĠReceive Channel :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠFull Dup lex ( wire Rpc . path , Ġrequest Adapter , Ġresponse Adapter ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠ Ġ// ĠCor outines Ġstreaming Ġrequest . ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠPair < Send Channel < RequestType >, ĠDeferred < ResponseType >> ĠmethodName () ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( request Type Ġ== ĠSend Channel :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġresponse Type Ġ== ĠDeferred :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠStreaming Request ( wire Rpc . path , Ġrequest Adapter , Ġresponse Adapter ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠ Ġ// ĠBlock ing Ġfull Ġdup lex ĠOR Ġstreaming Ġrequest . Ġ( single Ġresponse Ġcould Ġbe ĠFuture Ġinstead ?) ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠPair < Message Sink < RequestType >, ĠMessage Source < ResponseType >> ĠmethodName () ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( request Type Ġ== ĠMessage Sink :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġresponse Type Ġ== ĠMessage Source :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠBlock ing Full Dup lex ( wire Rpc . path , Ġrequest Adapter , Ġresponse Adapter ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġerror (" unexpected ĠgRPC Ġmethod : Ġ$ this ") ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ