/* Ċ Ġ* Ġ ĠCopyright Ġ( C ) Ġ 2 0 2 2 ĠAb hi j ith ĠSh ivas w amy Ċ Ġ* ĠĠ ĠSee Ġthe Ġnotice . md Ġfile Ġdistributed Ġwith Ġthis Ġwork Ġfor Ġadditional Ċ Ġ* ĠĠ Ġinformation Ġregarding Ġcopyright Ġownership . Ċ Ġ* Ċ Ġ* ĠĠ Ġ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 Ġio . github . cr ack the code ab hi . k red s . connection Ċ Ċ import Ġio . github . cr ack the code ab hi . k red s . Re entrant Mutex Context Key Ċ import Ġio . github . cr ack the code ab hi . k red s . args . Argument Ċ import Ġio . github . cr ack the code ab hi . k red s . commands .* Ċ import Ġio . github . cr ack the code ab hi . k red s . pipeline . Pipeline Ċ import Ġio . github . cr ack the code ab hi . k red s . pipeline . Pipeline Impl Ċ import Ġio . github . cr ack the code ab hi . k red s . pipeline . Transaction Ċ import Ġio . github . cr ack the code ab hi . k red s . pipeline . Transaction Impl Ċ import Ġio . github . cr ack the code ab hi . k red s . protocol . Command Executor Ċ import Ġio . github . cr ack the code ab hi . k red s . protocol . IC ommand Processor Ċ import Ġio . github . cr ack the code ab hi . k red s . with Re entrant Lock Ċ import Ġio . netty . channel . EventLoop Group Ċ import Ġio . netty . channel . nio . Nio EventLoop Group Ċ import Ġio . netty . handler . codec . redis . Redis Message Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġkotlinx . coroutines . sync . Mutex ĊĊ Ċ // TODO : ĠIN CR BY Ġcan Ġbe Ġnegative Ġalso ! Ġcheck Ġthat Ġin Ġapi , Ġshould Ġaccept Ġlong , Ġnot Ġulong Ċ Ċ private Ġval Ġevent Loop Group Ġ= ĠN io EventLoop Group () Ċ Ċ public Ġfun ĠCor outine Scope . new Subscriber Client ( ĊĠĠĠ Ġendpoint : ĠEndpoint , ĊĠĠĠ Ġhandler : ĠK red s Subscriber , ĊĠĠĠ Ġconfig : ĠK red s ClientConfig Ġ= Ġdefault Subscriber ClientConfig Ċ ): ĠK red s Subscriber Client Ġ= ĊĠĠĠ ĠDefault K red s Subscriber Client ( endpoint , Ġevent Loop Group , Ġcoroutine Context , Ġhandler , Ġconfig ) Ċ Ċ public Ġfun Ġnew Client ( endpoint : ĠEndpoint , Ġconfig : ĠK red s ClientConfig Ġ= Ġdefault ClientConfig ): ĠK red s Client Ġ= ĊĠĠĠ ĠDefault K red s Client ( endpoint , Ġevent Loop Group , Ġconfig ) Ċ Ċ public Ġfun Ġnew Blocking Client ( ĊĠĠĠ Ġendpoint : ĠEndpoint , ĊĠĠĠ Ġconfig : ĠK red s ClientConfig Ġ= Ġdefault Blocking K red s ClientConfig Ċ ): ĠBlock ing K red s Client Ġ= ĊĠĠĠ ĠDefault K red s Client ( endpoint , Ġevent Loop Group , Ġconfig ) Ċ Ċ public Ġsuspend Ġfun Ġshutdown () Ġ{ ĊĠĠĠ Ġevent Loop Group . shutdown Grace fully (). suspend able Await () Ċ } Ċ Ċ public Ġinterface ĠK red s Client Ġ: ĠAuto Closeable , ĠKey Commands , ĠString Commands , ĠConnection Commands , ĠPublisher Commands , ĊĠĠĠ ĠHash Commands , ĠSet Commands , ĊĠĠĠ ĠList Commands , ĠHyper Log Log Commands , ĠServer Commands , ĠZ Set Commands Ġ{ ĊĠĠĠ Ġpublic Ġfun Ġp ipel ined (): ĠPipeline ĊĠĠĠ Ġpublic Ġfun Ġtransaction (): ĠTransaction Ċ } Ċ Ċ internal Ġinterface ĠInternal K red s Client Ġ: ĠK red s Client Ġ{ ĊĠĠĠ Ġval Ġendpoint : ĠEndpoint Ċ } Ċ Ċ public Ġinterface ĠBlock ing K red s Client Ġ: ĠAuto Closeable , ĠBlock ing List Commands , ĠBlock ing Z Set Commands Ċ Ċ internal Ġabstract Ġclass ĠAbstract K red s Client ( ĊĠĠĠ Ġendpoint : ĠEndpoint , ĊĠĠĠ Ġevent Loop Group : ĠEvent Loop Group , ĊĠĠĠ Ġconfig : ĠK red s ClientConfig Ċ ) Ġ: ĊĠĠĠ ĠKon nection Impl ( endpoint , Ġevent Loop Group , Ġconfig ), ĠCommand Executor Ġ{ ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġ< T > Ġexecute ( command : ĠCommand , Ġprocessor : ĠICommand Processor < T >, Ġvar arg Ġargs : ĠArgument ): ĠT Ġ= ĊĠĠĠĠĠĠĠĠ Ġwith Re entrant Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnect Write And Flush ( processor . encode ( command , Ġ* args )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocessor . decode ( read ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġ< T > Ġexecute ( command Execution : ĠCommand Execution < T >): ĠT Ġ= Ġwith Re entrant Lock Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ( command Execution ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnect Write And Flush ( processor . encode ( command , Ġ* args )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocessor . decode ( read ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġexecute Commands ( commands : ĠList < Command Execution <* >> ): ĠList < Redis Message > Ġ= Ġwith Re entrant Lock Ġ{ ĊĠĠĠĠĠĠĠ Ġconnect () ĊĠĠĠĠĠĠĠ Ġcommands . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite ( processor . encode ( command , Ġ* args )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġflush () ĊĠĠĠĠĠĠĠ Ġ// Ġcollect Ġthe Ġresponse Ġmessages . ĊĠĠĠĠĠĠĠ Ġval Ġresponse List Ġ= Ġmutable ListOf < Redis Message >() ĊĠĠĠĠĠĠĠ Ġrepeat ( commands . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse List . add ( it , Ġread ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġresponse List ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġclass ĠDefault K red s Client ( ĊĠĠĠ Ġoverride Ġval Ġendpoint : ĠEndpoint , ĊĠĠĠ Ġevent Loop Group : ĠEvent Loop Group , ĊĠĠĠ Ġconfig : ĠK red s ClientConfig Ċ ) Ġ: ĊĠĠĠ ĠAbstract K red s Client ( endpoint , Ġevent Loop Group , Ġconfig ), ĠK red s Client , ĠInternal K red s Client , ĠKey Command Executor , ĊĠĠĠ ĠString Commands Executor , ĠConnection Commands Executor , ĠPublish Command Executor , ĠHash Commands Executor , ĊĠĠĠ ĠSet Command Executor , ĠList Command Executor , ĠHyper Log Log Command Executor , ĠServer Command Executor , ĠBlock ing K red s Client , ĊĠĠĠ ĠZ Set Command Executor Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġmutex : ĠMutex Ġ= ĠMutex () ĊĊĠĠĠ Ġoverride Ġval Ġkey : ĠRe entrant Mutex Context Key Ġ= ĠRe entrant Mutex Context Key ( mutex ) ĊĊĠĠĠ Ġoverride Ġfun Ġp ipel ined (): ĠPipeline Ġ= ĠPipeline Impl ( this ) ĊĊĠĠĠ Ġoverride Ġfun Ġtransaction (): ĠTransaction Ġ= ĠTransaction Impl ( this ) ĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Re entrant Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisconnect () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ