@ file : Suppress (" UN CHECK ED _ CAST ") Ċ Ċ package Ġcom . github . kr 3 2 8 . k rest ful . internal Ċ Ċ import Ġcom . github . kr 3 2 8 . k rest ful . Content Ċ import Ġcom . github . kr 3 2 8 . k rest ful . Remote Exception Ċ import Ġio . ktor . client .* Ċ import Ġio . ktor . client . call .* Ċ import Ġio . ktor . client . plugins .* Ċ import Ġio . ktor . client . plugins . websocket .* Ċ import Ġio . ktor . client . request .* Ċ import Ġio . ktor . client . statement .* Ċ import Ġio . ktor . content .* Ċ import Ġio . ktor . http .* Ċ import Ġio . ktor . http . content . Text Content Ċ import Ġio . ktor . util .* Ċ import Ġio . ktor . websocket .* Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . consume As Flow Ċ import Ġkotlinx . coroutines . flow . flow Ċ import Ġkotlinx . coroutines . flow . map Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . serialization . json . Json Ċ import Ġkotlinx . serialization . json . Json Element Ċ import Ġkotlinx . serialization . json . JsonObject Ċ import Ġkotlinx . serialization . json . Json Primitive Ċ import Ġkotlin . collections . set Ċ Ċ class ĠRequest Builder Ġ{ ĊĠĠĠ Ġprivate Ġval Ġqueries : ĠMutable List < Pair < String , ĠString >> Ġ= Ġmutable ListOf () ĊĠĠĠ Ġprivate Ġval Ġheaders : ĠMutable List < Pair < String , ĠString >> Ġ= Ġmutable ListOf () ĊĠĠĠ Ġprivate Ġvar Ġfields : ĠMutable Map < String , ĠJson Element >? Ġ= Ġmutable Map Of () ĊĠĠĠ Ġprivate Ġvar Ġbody : ĠContent ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġoutgoing : ĠFlow < Content >? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġheader ( key : ĠString , Ġvalue : ĠString ): ĠRequest Builder Ġ= Ġapply Ġ{ ĊĠĠĠĠĠĠĠ Ġheaders . add ( key Ġto Ġvalue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Name (" header Nullable ") ĊĠĠĠ Ġfun Ġheader ( key : ĠString , Ġvalue : ĠString ?): ĠRequest Builder Ġ= Ġapply Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheader ( key , Ġvalue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġquery ( key : ĠString , Ġvalue : ĠString ): ĠRequest Builder Ġ= Ġapply Ġ{ ĊĠĠĠĠĠĠĠ Ġqueries . add ( key Ġto Ġvalue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Name (" query Nullable ") ĊĠĠĠ Ġfun Ġquery ( key : ĠString , Ġvalue : ĠString ?): ĠRequest Builder Ġ= Ġapply Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquery ( key , Ġvalue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > Ġbody ( value : ĠT , Ġmapping : ĠMapping < T >): ĠRequest Builder Ġ= Ġapply Ġ{ ĊĠĠĠĠĠĠĠ Ġbody Ġ= Ġmapping . mapping To Content ( value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Name (" body Nullable ") ĊĠĠĠ Ġfun Ġ< T > Ġbody ( value : ĠT ?, Ġmapping : ĠMapping < T >): ĠRequest Builder Ġ= Ġapply Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody ( value , Ġmapping ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > Ġoutgoing ( value : ĠFlow < T >, Ġmapping : ĠMapping < T >): ĠRequest Builder Ġ= Ġapply Ġ{ ĊĠĠĠĠĠĠĠ Ġoutgoing Ġ= Ġvalue . map Ġ{ Ġmapping . mapping To Content ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Name (" outgoing Nullable ") ĊĠĠĠ Ġfun Ġ< T > Ġoutgoing ( value : ĠFlow < T > ?, Ġmapping : ĠMapping < T >): ĠRequest Builder Ġ= Ġapply Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutgoing ( value , Ġmapping ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > Ġfield ( key : ĠString , Ġvalue : ĠT , Ġmapping : ĠMapping < T >): ĠRequest Builder Ġ= Ġapply Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfields Ġ= Ġfields Ġ?: Ġmutable Map Of () ĊĊĠĠĠĠĠĠĠ Ġthis . fields Ġ= Ġfields ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( mapping ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMapping . Content Binary Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfields [ key ] Ġ= ĠJson Primitive (( value Ġas ĠContent . Binary ). bytes . encode Base 6 4 ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMapping . Content Text Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfields [ key ] Ġ= ĠJson Primitive (( value Ġas ĠContent . Text ). text ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMapping . String Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfields [ key ] Ġ= ĠJson Primitive ( value Ġas ĠString ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMapping . ByteArray Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfields [ key ] Ġ= ĠJson Primitive (( value Ġas ĠByteArray ). toString ( Charsets . UTF _ 8 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMapping . Boolean Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfields [ key ] Ġ= ĠJson Primitive ( value Ġas ĠBoolean ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMapping . Double Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfields [ key ] Ġ= ĠJson Primitive ( value Ġas ĠDouble ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMapping . Float Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfields [ key ] Ġ= ĠJson Primitive ( value Ġas ĠFloat ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMapping . Int Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfields [ key ] Ġ= ĠJson Primitive ( value Ġas ĠInt ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMapping . Long Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfields [ key ] Ġ= ĠJson Primitive ( value Ġas ĠLong ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMapping . Unit Ġ-> ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMapping . Serializable Json Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfields [ key ] Ġ= Ġmapping . json . encode ToJson Element ( mapping . serializer , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Name (" field Nullable ") ĊĠĠĠ Ġfun Ġ< T > Ġfield ( key : ĠString , Ġvalue : ĠT ?, Ġmapping : ĠMapping < T >): ĠRequest Builder Ġ= Ġapply Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . fields Ġ= Ġfields Ġ?: Ġmutable Map Of () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield ( key , Ġvalue , Ġmapping ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġconstruct Request ( builder : ĠHttpRequest Builder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġqueries . forEach Ġ{ Ġ( key , Ġvalue ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . url . parameters . append ( key , Ġvalue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġheaders . forEach Ġ{ Ġ( key , Ġvalue ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . headers . append ( key , Ġvalue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġbody Ġ= Ġbody ĊĠĠĠĠĠĠĠ Ġif Ġ( body Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . set Body ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( body ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠContent . Binary Ġ-> ĠByteArray Content ( body . bytes , Ġbody . contentType ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠContent . Text Ġ-> ĠText Content ( body . text , Ġbody . contentType ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfields Ġ= Ġthis @ RequestBuilder . fields ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fields Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . set Body ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText Content ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJson . Default . encode ToString ( JsonObject . serializer (), ĠJsonObject ( fields )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContentType . Application . Json ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġrelay To ( session : ĠWebSocket Session ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoutgoing ?. let Ġ{ Ġoutgoing Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutgoing . collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġframe Ġ= Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠContent . Binary Ġ-> ĠFrame . Binary ( false , Ġit . bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠContent . Text Ġ-> ĠFrame . Text ( it . text ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession . send ( frame ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ suspend Ġfun Ġ< T > ĠHttpClient . request ( ĊĠĠĠ ĠbaseUrl : ĠUrl , ĊĠĠĠ Ġpath : ĠString , ĊĠĠĠ Ġmethod : ĠHttpMethod , ĊĠĠĠ Ġreturning : ĠMapping < T >, ĊĠĠĠ Ġbuilder Block : ĠRequest Builder . () Ġ-> ĠUnit , Ċ ): ĠT Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠRequest Builder (). apply ( builder Block ) ĊĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġrequest Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . expect Success Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . method Ġ= Ġmethod ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . url . take From ( baseUrl ). append Path Segments ( path ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . construct Request ( this ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( return ing Ġis ĠMapping . Serializable Json <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccept ( ContentType . Application . Json ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġreturning . mapping To Value ( Content . Binary ( response . body (), Ġresponse . contentType () Ġ?: ĠContentType . Any )) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠResponse Exception ) Ġ{ ĊĠĠĠĠĠĠĠ Ġe . throw Remote Exception If Available () ĊĊĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġ< T > ĠHttpClient . web Socket ( ĊĠĠĠ ĠbaseUrl : ĠUrl , ĊĠĠĠ Ġpath : ĠString , ĊĠĠĠ Ġreturning : ĠMapping < T >, ĊĠĠĠ Ġbuilder Block : ĠRequest Builder . () Ġ-> ĠUnit , Ċ ): ĠFlow < T > Ġ= Ġflow Ġ{ ĊĠĠĠ Ġval Ġbuilder Ġ= ĠRequest Builder (). apply ( builder Block ) ĊĊĠĠĠ Ġweb Socket ( request Ġ= Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . expect Success Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġthis . method Ġ= ĠHttpMethod . Get ĊĠĠĠĠĠĠĠ Ġthis . url Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtake From ( baseUrl ). append Path Segments ( path ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! url . protocol . is Websocket ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( url . protocol . is Secure ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl . protocol Ġ= ĠURL Protocol . W SS ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl . protocol Ġ= ĠURL Protocol . WS ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbuilder . construct Request ( this ) ĊĠĠĠ Ġ}) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsession Ġ= Ġthis ĊĊĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . relay To ( session ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval ĠcontentType Ġ= Ġcall . response . contentType () Ġ?: ĠContentType . Any ĊĊĠĠĠĠĠĠĠ Ġincoming . consume As Flow (). collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Ġ= Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFrame . Binary Ġ-> ĠContent . Binary ( it . data , ĠcontentType ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFrame . Text Ġ-> ĠContent . Text ( it . data . toString ( Charsets . UTF _ 8 ), ĠcontentType ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" Unsupported Ġframe : Ġ$ it ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( return ing . mapping To Value ( content )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġsuspend Ġfun ĠResponse Exception . throw Remote Exception If Available () Ġ{ ĊĠĠĠ Ġval ĠcontentType Ġ= Ġresponse . contentType () Ġ?: Ġreturn ĊĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ ĠcontentType . without Parameters () Ġ!= ĠContentType . Application . Json Ġ-> Ġreturn ĊĠĠĠĠĠĠĠ ĠcontentType . parameter ( CONTENT _ TYPE _ PARAMETER _ CLASS _ NAME ) Ġ!= ĠRemoteException :: class . java . name Ġ-> Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġextras Ġ= ĠJson . Default . decode FromString ( JsonObject . serializer (), Ġresponse . body As Text ()) ĊĊĠĠĠ Ġthrow ĠRemoteException ( response . status , Ġextras . map Values Ġ{ Ġit . value . toString () Ġ}) Ċ }