/* Ċ Ġ* ĠCopyright Ġ 2 0 1 5 - 2 0 2 0 Ġthe Ġoriginal Ġauthor Ġor Ġauthors . Ċ Ġ* Ċ Ġ* Ġ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 . r socket . kotlin . core Ċ Ċ import Ġio . r socket . kotlin .* Ċ import Ġio . r socket . kotlin . internal .* Ċ import Ġio . r socket . kotlin . keep alive .* Ċ import Ġio . r socket . kotlin . logging .* Ċ import Ġio . r socket . kotlin . payload .* Ċ import Ġkotlinx . coroutines .* Ċ Ċ public Ġclass ĠR Socket Connector Builder Ġinternal Ġconstructor () Ġ{ ĊĠĠĠ Ġ@ R Socket Logging Api ĊĠĠĠ Ġpublic Ġvar Ġlogger Factory : ĠLoggerFactory Ġ= ĠDefault LoggerFactory ĊĊĠĠĠ Ġprivate Ġval Ġconnection Config : ĠConnection Config Builder Ġ= ĠConnection Config Builder () ĊĠĠĠ Ġprivate Ġval Ġintercept ors : ĠInter cept ors Builder Ġ= ĠInter cept ors Builder () ĊĠĠĠ Ġprivate Ġvar Ġaccept or : ĠConnection Accept or ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġreconnect Predicate : ĠRe connect Predicate ? Ġ= Ġnull ĊĊĠĠĠ Ġpublic Ġfun Ġconnection Config ( configure : ĠConnection Config Builder . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġconnection Config . configure () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġfun Ġintercept ors ( configure : ĠInter cept ors Builder . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġintercept ors . configure () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġfun Ġaccept or ( block : ĠConnection Accept or ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġaccept or Ġ= Ġblock ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWhen Ġconfigured , Ġ[ R Socket Connector . connect ] Ġwill Ġreturn Ġcustom Ġ[ R Socket ] Ġimplementation , ĊĠĠĠĠ Ġ* Ġwhich Ġwill Ġtry Ġto Ġreconnect Ġif Ġconnection Ġlost Ġand Ġ[ retries ] Ġare Ġnot Ġex hausted Ġwith Ġ[ predicate ] Ġreturning Ġ` true `. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ** This Ġis Ġnot ĠRes umption **: Ġby Ġusing Ġ[ reconnect able ] Ġonly Ġconnection Ġwill Ġbe Ġre - est ab lished , Ġstreams Ġwill Ġfail ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġretries Ġnumber Ġof Ġretries Ġto Ġdo , Ġif Ġconnection Ġestablish ment Ġfailed ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġreconnect able ( retries : ĠLong , Ġpredicate : Ġsuspend Ġ( cause : ĠThrowable ) Ġ-> ĠBoolean Ġ= Ġ{ Ġtrue Ġ}) Ġ{ ĊĠĠĠĠĠĠĠ Ġreconnect Predicate Ġ= Ġ{ Ġcause , Ġattempt Ġ-> Ġpredicate ( cause ) Ġ&& Ġattempt Ġ< Ġretries Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWhen Ġconfigured , Ġ[ R Socket Connector . connect ] Ġwill Ġreturn Ġcustom Ġ[ R Socket ] Ġimplementation , ĊĠĠĠĠ Ġ* Ġwhich Ġwill Ġtry Ġto Ġreconnect Ġif Ġconnection Ġlost Ġand Ġ[ predicate ] Ġreturns Ġ` true `. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ** This Ġis Ġnot ĠRes umption **: Ġby Ġusing Ġ[ reconnect able ] Ġonly Ġconnection Ġwill Ġbe Ġre - est ab lished , Ġstreams Ġwill Ġfail ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġpredicate Ġpredicate Ġfor Ġretry Ġlogic ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġreconnect able ( predicate : Ġsuspend Ġ( cause : ĠThrowable , Ġattempt : ĠLong ) Ġ-> ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreconnect Predicate Ġ= Ġpredicate ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġclass ĠConnection Config Builder Ġinternal Ġconstructor () Ġ{ ĊĠĠĠĠĠĠĠ Ġpublic Ġvar Ġkeep Alive : ĠKeep Alive Ġ= ĠDefault KeepAlive ĊĠĠĠĠĠĠĠ Ġpublic Ġvar Ġpayload MimeType : ĠPayload MimeType Ġ= ĠDefault Payload MimeType ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġsetup Payload : Ġ(() Ġ-> ĠPayload )? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġpublic Ġfun Ġsetup Payload ( block : Ġ(() Ġ-> ĠPayload )? ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsetup Payload Ġ= Ġblock ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġpublic Ġfun Ġsetup Payload ( payload : ĠPayload ): ĠUnit Ġ= Ġsetup Payload Ġ{ Ġpayload . copy () Ġ} ĊĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġproducer (): Ġ() Ġ-> ĠConnection Config Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkeep Alive Ġ= Ġthis . keep Alive ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpayload MimeType Ġ= Ġthis . payload MimeType ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsetup Payload Ġ= Ġthis . setup Payload ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConnection Config ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeep Alive Ġ= Ġkeep Alive , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpayload MimeType Ġ= Ġpayload MimeType , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsetup Payload Ġ= Ġsetup Payload ?. invoke () Ġ?: ĠPayload . Empty ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Opt In ( R Socket Logging Api :: class ) ĊĠĠĠ Ġinternal Ġfun Ġbuild (): ĠR Socket Connector Ġ= ĠR Socket Connector ( ĊĠĠĠĠĠĠĠ Ġlogger Factory , ĊĠĠĠĠĠĠĠ Ġintercept ors . build (), ĊĠĠĠĠĠĠĠ Ġconnection Config . producer (), ĊĠĠĠĠĠĠĠ Ġaccept or Ġ?: Ġdefault Accept or , ĊĠĠĠĠĠĠĠ Ġreconnect Predicate ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdefault Accept or : ĠConnection Accept or Ġ= ĠConnection Accept or Ġ{ ĠEmpty R Socket () Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġclass ĠEmpty R Socket Ġ: ĠR Socket Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġjob : ĠJob Ġ= ĠJob () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ public Ġfun ĠR Socket Connector ( configure : ĠR Socket Connector Builder . () Ġ-> ĠUnit Ġ= Ġ{} ): ĠR Socket Connector Ġ{ ĊĠĠĠ Ġval Ġbuilder Ġ= ĠR Socket Connector Builder () ĊĠĠĠ Ġbuilder . configure () ĊĠĠĠ Ġreturn Ġbuilder . build () Ċ } Ċ