/* Ċ Ġ* ĠLicensed Ġto Ġthe ĠApache ĠSoftware ĠFoundation Ġ( ASF ) Ġunder Ġone Ġor Ġmore Ċ Ġ* Ġcontributor Ġlicense Ġagreements . Ġ ĠSee Ġthe ĠNOTICE Ġfile Ġdistributed Ġwith Ċ Ġ* Ġthis Ġwork Ġfor Ġadditional Ġinformation Ġregarding Ġcopyright Ġownership . Ċ Ġ* ĠThe ĠASF Ġlicenses Ġthis Ġfile Ġto ĠYou Ġ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 Ġorg . apache . tu w eni . str atum . server Ċ Ċ import Ġio . vertx . core . Vert x Ċ import Ġio . vertx . core . buffer . Buffer Ċ import Ġio . vertx . core . net . Key Cert Options Ċ import Ġio . vertx . core . net . Net Server Ċ import Ġio . vertx . core . net . Net Server Options Ċ import Ġio . vertx . core . net . Net Socket Ċ import Ġio . vertx . core . net . Self Signed Certificate Ċ import Ġio . vertx . kotlin . coroutines . await Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġorg . apache . tu w eni . bytes . Bytes Ċ import Ġorg . apache . tu w eni . bytes . Bytes 3 2 Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . util . concurrent . atomic . Atomic Boolean Ċ Ċ /** Ċ Ġ* ĠSimple Ġmain Ġfunction Ġto Ġrun Ġthe Ġserver Ġwith Ġa Ġself - signed Ġcertificate . Ċ Ġ*/ Ċ fun Ġmain () Ġ= Ġrun Blocking Ġ{ ĊĠ Ġval Ġself Signed Certificate Ġ= ĠSelf Signed Certificate . create () ĊĠ Ġval Ġserver Ġ= ĠStr atum Server ( ĊĠĠĠ ĠVert x . vertx (), Ġport Ġ= Ġ 1 0 0 0 0 , Ġnetwork Interface Ġ= Ġ" 0 . 0 . 0 . 0 ", Ġssl Options Ġ= Ġself Signed Certificate . key Cert Options (), ĊĠĠĠ Ġsubmit Callback Ġ= Ġ{ Ġtrue Ġ}, Ġseed Supplier Ġ= Ġ{ ĠBytes 3 2 . random () Ġ}, Ġhash rate Callback Ġ= Ġ{ Ġ_, Ġ_ Ġ-> Ġtrue Ġ} ĊĠ Ġ) ĊĠ Ġserver . start () ĊĠ ĠRuntime . get Runtime (). add Shutdown Hook ( ĊĠĠĠ ĠThread Ġ{ ĊĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ ĠStr atum Server . logger . info (" Shut ting Ġdown ...") ĊĠĠĠĠĠĠĠ Ġserver . stop () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ) Ċ } Ċ Ċ /** Ċ Ġ* ĠServer Ġcapable Ġof Ġhandling Ġconnections Ġfrom ĠStr atum Ġclients , Ġauthenticate Ġand Ġserve Ġcontent Ġfor Ġthem . Ċ Ġ*/ Ċ class ĠStr atum Server ( ĊĠ Ġval Ġvert x : ĠVert x , ĊĠ Ġprivate Ġval Ġport : ĠInt , ĊĠ Ġval Ġnetwork Interface : ĠString , ĊĠ Ġprivate Ġval Ġssl Options : ĠKey Cert Options ?, ĊĠ Ġex tran once : ĠString Ġ= Ġ"", ĊĠ Ġsubmit Callback : Ġ( Po WS olution ) Ġ-> ĠBoolean , ĊĠ Ġseed Supplier : Ġ() Ġ-> ĠBytes 3 2 , ĊĠ Ġhash rate Callback : Ġ( Bytes , ĠLong ) Ġ-> ĠBoolean , Ċ ) Ġ{ ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger ( Str atum Server :: class . java ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġval Ġprotocols Ġ= ĠarrayOf ( ĊĠĠĠ ĠStr atum 1 Eth Proxy Protocol ( submit Callback , Ġseed Supplier , Ġhash rate Callback ), ĊĠĠĠ ĠStr atum 1 Protocol ( ex tran once , Ġsubmit Callback Ġ= Ġsubmit Callback , Ġseed Supplier Ġ= Ġseed Supplier ) ĊĠ Ġ) ĊĊĠ Ġprivate Ġval Ġstarted Ġ= ĠAtomic Boolean ( false ) ĊĠ Ġprivate Ġvar Ġtcp Server : ĠNet Server ? Ġ= Ġnull ĊĊĠ Ġsuspend Ġfun Ġstart () Ġ{ ĊĠĠĠ Ġif Ġ( started . compare AndSet ( false , Ġtrue )) Ġ{ ĊĠĠĠĠĠ Ġval Ġoptions Ġ= ĠNet Server Options (). set Port ( port ). set Host ( network Interface ). set Tcp KeepAlive ( true ) ĊĠĠĠĠĠ Ġssl Options ?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġoptions . set Key Cert Options ( it ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġval Ġserver Ġ= Ġvert x . create Net Server ( options ) ĊĠĠĠĠĠ Ġserver . exception Handler Ġ{ Ġe Ġ-> Ġlogger . error ( e . message , Ġe ) Ġ} ĊĠĠĠĠĠ Ġserver . connect Handler ( this :: handle Connection ) ĊĠĠĠĠĠ Ġserver . listen (). await () ĊĠĠĠĠĠ Ġtcp Server Ġ= Ġserver ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġhandle Connection ( socket : ĠNet Socket ) Ġ{ ĊĠĠĠ Ġsocket . exception Handler Ġ{ Ġe Ġ-> Ġlogger . error ( e . message , Ġe ) Ġ} ĊĠĠĠ Ġval Ġconn Ġ= ĠStr atum Connection ( ĊĠĠĠĠĠ Ġprotocols , Ġsocket :: close ĊĠĠĠ Ġ) Ġ{ Ġbytes Ġ-> Ġsocket . write ( Buffer . buffer ( bytes )) Ġ} ĊĠĠĠ Ġsocket . handler ( conn :: handle Buffer ) ĊĠĠĠ Ġsocket . close Handler Ġ{ ĊĠĠĠĠĠ Ġlogger . trace (" Client Ġinitiated Ġsocket Ġclose ") ĊĠĠĠĠĠ Ġconn . close () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġsuspend Ġfun Ġstop () Ġ{ ĊĠĠĠ Ġif Ġ( started . compare AndSet ( true , Ġfalse )) Ġ{ ĊĠĠĠĠĠ Ġtcp Server ?. close ()?. await () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġport (): ĠInt Ġ{ ĊĠĠĠ Ġreturn Ġtcp Server ?. actual Port () Ġ?: Ġport ĊĠ Ġ} Ċ } Ċ