/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 , ĠMoment um ĠIde as , ĠCo . ĠAll Ġrights Ġreserved . Ċ Ġ* Ċ Ġ* ĠSource Ġand Ġobject Ġcomputer Ġcode Ġcontained Ġherein Ġis Ġthe Ġprivate Ġintel lectual Ċ Ġ* Ġproperty Ġof ĠMoment um ĠIde as ĠCo ., Ġa ĠDel aware ĠCorporation . ĠUse Ġof Ġthis Ċ Ġ* Ġcode Ġin Ġsource Ġform Ġrequires Ġpermission Ġin Ġwriting Ġbefore Ġuse Ġor Ġthe Ċ Ġ* Ġassembly , Ġdistribution , Ġor Ġpublishing Ġof Ġderivative Ġworks , Ġfor Ġcommercial Ċ Ġ* Ġpurposes Ġor Ġany Ġother Ġpurpose , Ġfrom Ġa Ġd uly Ġauthorized Ġoff icer Ġof ĠMoment um Ċ Ġ* ĠIde as ĠCo . Ċ Ġ* Ċ Ġ* Ġ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 Ġb loom box . client . internals . rpc Ċ Ċ import Ġb loom box . client . ClientException Ċ import Ġb loom box . client . internals . mt ls . Client Credentials Ċ import Ġcom . google . common . util . concurrent . List enable Future Ċ import Ġio . grpc .* Ċ import Ġio . grpc . netty . Grpc Ssl Contexts Ċ import Ġio . grpc . netty . Neg otiation Type Ċ import Ġio . grpc . netty . Net ty Channel Builder Ċ import Ġio . netty . handler . ssl . Client Auth Ċ import Ġio . netty . handler . ssl . Ssl Provider Ċ import Ġjava . io . InputStream Ċ import Ġjava . time . Duration Ċ import Ġjava . util . concurrent . Executor Ċ import Ġjava . util . concurrent . TimeUnit ĊĊ Ċ /** Ċ Ġ* ĠBase ĠRPC Ġclient Ġlogic , Ġspecifies Ġthe Ġclient - side Ġoperator Ġof Ġan ĠRPC Ġconnection Ġwith Ġthe ĠB loom box ĠPlatform . Ċ Ġ*/ Ċ @ Suppress (" unused ") Ċ abstract Ġclass ĠRPC Client ( apiKey : ĠString ) Ġ{ ĊĠ Ġ/** ĊĠĠ Ġ* ĠMode s Ġfor Ġcommunication Ġtransport Ġfor ĠRPC s . ĊĠĠ Ġ*/ ĊĠ Ġenum Ġclass ĠTransport Mode Ġ{ ĊĠĠĠ ĠSE C URE , ĊĠĠĠ ĠC LE ART EXT ; ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠAPI Ġkey Ġheader Ġinterceptor . ĊĠĠ Ġ*/ ĊĠ Ġprotected Ġclass ĠAPI Key Interceptor ( private Ġval Ġapi key : ĠString ?) Ġ: ĠClient Interceptor Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠ Ġ* ĠAPI Ġkey Ġheader Ġsentinel . ĊĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠ Ġval ĠapiKey Header : Ġio . grpc . Metadata . Key < String > Ġ= Ġio . grpc . Metadata . Key . of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" x - api - key ", Ġio . grpc . Metadata . ASCII _ STRING _ MAR SH ALL ER ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< Req T Ġ: ĠAny ?, ĠResp T Ġ: ĠAny ?> Ġintercept Call ( method : ĠMethod Descriptor < Req T , ĠResp T > ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall Options : ĠCall Options ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext : ĠChannel ): ĠClient Call < Req T , ĠResp T >? Ġ{ ĊĠĠĠĠĠ Ġvar Ġcall : ĠClient Call < Req T , ĠResp T > Ġ= Ġnext . new Call ( method , Ġcall Options ) ĊĠĠĠĠĠ Ġcall Ġ= Ġobject Ġ: ĠForward ing Client Call . Simple Forwarding Client Call < Req T , ĠResp T >( call ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġstart ( response Listener : ĠListener < Resp T >, Ġheaders : ĠMetadata ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( apikey Ġ!= Ġnull Ġ&& Ġapi key . length Ġ> Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheaders . put ( apiKey Header , Ġapi key ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġsuper . start ( response Listener , Ġheaders ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn Ġcall ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠManaged Ġchannel . ĊĠĠ Ġ*/ ĊĠ Ġabstract Ġval Ġchannel : ĠManaged Channel ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠHeader Ġinterceptor . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġval Ġinterceptor Ġ= ĠAPI Key Interceptor ( apiKey ) ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠClose Ġactive Ġconnections . ĊĠĠ Ġ*/ ĊĠ Ġfun Ġclose ( soft : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimeout : ĠPair < Long , ĠTimeUnit >) Ġ{ ĊĠĠĠ Ġif Ġ(! channel . is Shutdown ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( soft ) Ġ{ ĊĠĠĠĠĠĠĠ Ġchannel . shutdown () ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġchannel . shutdown Now () ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġif Ġ( block ) ĊĠĠĠĠĠĠĠ Ġchannel . await Termination ( timeout . first , Ġtimeout . second ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDefault Ġauthority Ġroots Ġfile . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġconst Ġval Ġdefault Authority Roots Ġ= Ġ"/ authority - roots . pem " ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSession Ġcache Ġsize . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġconst Ġval Ġsession Cache Size : ĠLong Ġ= Ġ 1 0 0 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSession Ġcache Ġtimeout . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġconst Ġval Ġsession Cache Timeout : ĠLong Ġ= Ġ 3 6 0 0 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWhether Ġto Ġenable Ġkeep alive Ġfor ĠRPC Ġconnections . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġconst Ġval Ġkeep alive : ĠBoolean Ġ= Ġtrue ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠKeep alive Ġtime , Ġin Ġseconds , Ġdefined Ġas Ġ" the Ġdelay Ġtime Ġfor Ġsending Ġthe Ġnext Ġkeep alive Ġping ." ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġconst Ġval Ġkeep alive Time : ĠLong Ġ= Ġ 6 0 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠKeep alive Ġtimeout , Ġin Ġseconds , Ġdefined Ġas Ġ" the Ġtimeout Ġfor Ġkeep alive Ġping Ġrequests ." ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġconst Ġval Ġkeep alive Timeout : ĠLong Ġ= Ġ 9 0 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠId le Ġconnection Ġtimeout , Ġin Ġseconds , Ġafter Ġwhich Ġan Ġidle ĠRPC Ġconnection Ġwill Ġbe Ġsever ed . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġconst Ġval Ġidle Connection Timeout : ĠLong Ġ= Ġ 1 2 0 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠResolve Ġa Ġset Ġof Ġclient Ġauthority Ġroots , Ġeither Ġvia Ġa Ġcustom Ġinput Ġstream , ĊĠĠĠĠ Ġ* Ġor Ġan Ġasset Ġembedded Ġin Ġthe ĠRPC Ġclient ĠJ AR . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġauthority Roots ( custom : ĠInputStream ?): ĠInputStream Ġ{ ĊĠĠĠĠĠ Ġreturn Ġcustom Ġ?: ĠRPC Client :: class . java . getResource AsStream ( default Authority Roots ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHandle Ġan Ġexception Ġencountered Ġin Ġan ĠRPC Ġoperation , Ġdispatch ing Ġthe Ġerror Ġcallback Ġappropriately . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġprivate Ġfun Ġhandle Error ( err : ĠThrowable ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcb k : Ġ(( ClientException ?) Ġ-> ĠUnit )? ) Ġ{ ĊĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġerr Ġis ĠClient Exception Ġ-> Ġcb k ?. invoke ( err ) ĊĠĠĠĠĠĠĠ Ġerr Ġ!= Ġnull Ġ-> Ġthrow Ġerr ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalStateException (" Invalid Ġnull Ġfailure Ġresult .") ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠExecute Ġan Ġoperation , Ġand Ġdispatch Ġa Ġuser Ġcallback Ġaccordingly , Ġhandling Ġunderlying ĊĠĠĠĠ Ġ* Ġerrors Ġaccording Ġto Ġthe Ġprovided Ġerror Ġcallback . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġ< T > Ġexecute And Dispatch Callback ( op : ĠList enable Future < T >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback : Ġ(( T ) Ġ-> ĠUnit )? , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerr : Ġ(( ClientException ?) Ġ-> ĠUnit )? , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimeout : ĠDuration ): ĠList enable Future < T > Ġ{ ĊĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġop . get ( timeout . to Millis (), ĠTimeUnit . MILLISECONDS ) ĊĠĠĠĠĠĠĠ Ġif Ġ( response Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( callback Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ( response ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠClient Exception ) Ġ{ ĊĠĠĠĠĠĠĠ Ġhandle Error ( e , Ġerr ) ĊĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠStatus RuntimeException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġhandle Error ( e , Ġerr ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn Ġop ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠPrepare Ġa Ġchannel Ġbuilder Ġaccording Ġto Ġstandard Ġsettings . ĊĠĠ Ġ*/ ĊĠ Ġfun Ġmanaged Channel ( host : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġport : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransport Mode : ĠTransport Mode , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient Auth : ĠClient Auth , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient Credentials : ĠClient Credentials ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient Authority Roots : ĠInputStream ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecutor : ĠExecutor ): ĠManaged Channel Ġ{ ĊĠĠĠ Ġval Ġbuilder Ġ= ĠNet ty Channel Builder ĊĠĠĠĠĠĠĠĠĠ Ġ. for Address ( host , Ġport ) ĊĠĠĠĠĠĠĠĠĠ Ġ. executor ( executor ) ĊĠĠĠĠĠĠĠĠĠ Ġ. idle Timeout ( idle Connection Timeout , ĠTimeUnit . SECONDS ) ĊĊĠĠĠ Ġbuilder . intercept ( interceptor ) ĊĊĠĠĠ Ġ@ Suppress (" Constant Condition If ") ĊĠĠĠ Ġif Ġ( keep alive ) ĊĠĠĠĠĠ Ġbuilder ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. keep Alive Time ( keep alive Time , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. keep Alive Timeout ( keep alive Timeout , ĠTimeUnit . SECONDS ) ĊĊĠĠĠ Ġval Ġcompression Registry Ġ= ĠCompress or Registry . new Empty Instance () ĊĠĠĠ Ġval Ġde compressor Registry Ġ= ĠDe compressor Registry . empty Instance () ĊĠĠĠĠĠĠĠĠĠ Ġ. with ( Codec . G zip (), Ġtrue ) ĊĠĠĠĠĠĠĠĠĠ Ġ. with ( Codec . Identity . NONE , Ġfalse ) ĊĊĠĠĠ Ġ// Ġregister Ġgzip Ġand Ġ' identity ' Ġ( no Ġcompression ) Ġas Ġavailable Ġtransport Ġen codings ĊĠĠĠ Ġcompression Registry . register ( Codec . G zip ()) ĊĠĠĠ Ġcompression Registry . register ( Codec . Identity . NONE ) ĊĊĠĠĠ Ġ// Ġinstall Ġboth Ġsides Ġof Ġthe Ġcodec Ġregistry Ġset ĊĠĠĠ Ġbuilder . compressor Registry ( compression Registry ) ĊĠĠĠ Ġbuilder . de compressor Registry ( de compressor Registry ) ĊĊĠĠĠ Ġreturn Ġwhen Ġ( transport Mode ) Ġ{ ĊĠĠĠĠĠ ĠRPC Client . Transport Mode . SECURE Ġ-> ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( client Auth Ġ== ĠClient Auth . NONE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġbuilder ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. neg otiation Type ( Neg otiation Type . TLS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. ssl Context ( Grpc Ssl Contexts . for Client () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. trust Manager ( authority Roots ( client Authority Roots )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. ssl Provider ( Ssl Provider . OPEN SSL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. session Cache Size ( 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. enable Oc sp ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build ()). build () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( client Credentials Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Configuration Ġerror : ĠClient Ġauth Ġis Ġactive , Ġbut Ġno Ġcredentials Ġwere Ġprovided .") ĊĠĠĠĠĠĠĠĠĠ Ġbuilder ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. neg otiation Type ( Neg otiation Type . TLS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. ssl Context ( Grpc Ssl Contexts . for Client () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. trust Manager ( authority Roots ( client Authority Roots )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. client Auth ( client Auth ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. key Manager ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient Credentials . certificate , Ġclient Credentials . privateKey , Ġclient Credentials . key Password ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. session Cache Size ( session Cache Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. session Timeout ( session Cache Timeout ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build ()). build () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ ĠRPC Client . Transport Mode . CLE ART EXT Ġ-> ĊĠĠĠĠĠĠĠ ĠNet ty Channel Builder ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. for Address ( host , Ġport ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. executor ( executor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. use Pl aintext (). build () ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ