@ file : Jvm Mult if ile Class Ċ package Ġorg . k atan . y oki . protocol Ċ Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . as Flow Ċ import Ġok io . ByteString . Companion . decode Hex Ċ import Ġok io . ByteString . Companion . encode Utf 8 Ċ import Ġorg . new scl ub . net . unix . AF UNIX Socket Ċ import Ġorg . new scl ub . net . unix . AF UNIX SocketAddress Ċ import Ġjava . io .* Ċ import Ġjava . net .* Ċ import Ġjava . nio . file . Files Ċ import Ġjava . nio . file . Paths Ċ import Ġjavax . net .* Ċ Ċ /** Ċ Ġ* ĠThread Ġsafe Ġnon - persistent Ġsocket Ġconnection , Ġcloses Ġthe Ġconnection Ġafter Ġa Ġrequest . Ċ Ġ*/ Ċ public Ġactual Ġopen Ġclass ĠSingle Unix Socket Ġactual Ġconstructor ( socket Path : ĠString ) Ġ: ĠUnix Socket Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġaddress : ĠA FUN IX SocketAddress Ġ= Ġget SocketAddress ( socket Path ) ĊĠĠĠ Ġpublic Ġactual Ġval Ġsocket Path : ĠString Ġget () Ġ= Ġaddress . path ĊĊĠĠĠ Ġpublic Ġactual Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġthis Ġsocket Ġconnection Ġis Ġnot Ġpersistent ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ public Ġactual Ġclass ĠPersistent Unix Socket Ġactual Ġconstructor ( socket Path : ĠString ) Ġ: ĠUnix Socket Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġsocket : ĠA FUN IX Socket Ġ= ĠA FUN IX Socket . connect To ( get SocketAddress ( socket Path )) ĊĊĠĠĠ Ġprivate Ġval Ġwriter : ĠWriter Ġ= ĠOutputStream Writer ( socket . output Stream ) ĊĠĠĠ Ġprivate Ġval Ġreader : ĠBufferedReader Ġ= Ġsocket . inputStream . buffered Reader () ĊĊĠĠĠ Ġpublic Ġactual Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġsocket . close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" Blocking Method In Non Blocking Context ") ĊĠĠĠ Ġpublic Ġactual Ġsuspend Ġfun Ġwrite ( value : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwriter . write ( value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġactual Ġsuspend Ġfun Ġread (): ĠFlow < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġreader . line Sequence (). as Flow () ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ private Ġfun Ġget SocketAddress ( path : ĠString ): ĠA FUN IX SocketAddress Ġ{ ĊĠĠĠ Ġval Ġsocket Path Ġ= ĠPaths . get ( path ) Ġ?: Ġerror (" unable Ġto Ġconnect Ġto Ġunix Ġsocket Ġ@ Ġ$ path ") ĊĊĠĠĠ Ġif Ġ(! Files . exists ( socket Path ) Ġ|| Ġ! Files . is Writable ( socket Path )) ĊĠĠĠĠĠĠĠ Ġerror (" socket Ġpath Ġdo Ġnot Ġexists Ġor Ġis Ġnot Ġwritable : Ġ$ socket Path ") ĊĊĠĠĠ Ġreturn ĠA FUN IX SocketAddress . of ( socket Path ) Ċ } Ċ Ċ internal Ġclass ĠJ vm Unix Socket Ġ: ĠSocket () Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġsocket : ĠA FUN IX Socket ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġconnect ( endpoint : ĠSocket Address , Ġtimeout : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" endpoint : Ġ$ endpoint ") ĊĊĠĠĠĠĠĠĠ Ġval Ġaddress Ġ= Ġ( endpoint Ġas ĠInet SocketAddress ). address ĊĠĠĠĠĠĠĠ Ġprintln (" address : Ġ$ address ") ĊĊĠĠĠĠĠĠĠ Ġval Ġsocket Path Ġ= Ġdecode Hostname ( address ) ĊĠĠĠĠĠĠĠ Ġprintln (" connect Ġvia : Ġ$ socket Path ") ĊĊĠĠĠĠĠĠĠ Ġval Ġsocket File Ġ= ĠFile ( socket Path ) ĊĠĠĠĠĠĠĠ Ġprintln (" socket Ġfile : Ġ$ socket File ") ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġsocket Ġ= ĠA FUN IX Socket . newInstance () ĊĠĠĠĠĠĠĠ Ġsocket . connect ( AF UNIX SocketAddress . of ( socket File ), Ġtimeout ) ĊĠĠĠĠĠĠĠ Ġsocket . so Timeout Ġ= Ġtimeout ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġbind ( bind point : ĠSocket Address ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsocket . bind ( bind point ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Connected (): ĠBoolean Ġ= Ġsocket . isConnected ĊĠĠĠ Ġ@ Throws ( IOException :: class ) Ġoverride Ġfun Ġget OutputStream (): ĠOutputStream Ġ= Ġsocket . output Stream ĊĠĠĠ Ġ@ Throws ( IOException :: class ) Ġoverride Ġfun Ġget InputStream (): ĠInputStream Ġ= Ġsocket . inputStream ĊĊĠĠĠ Ġprivate Ġobject ĠEncoder Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġencode ( text : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtext . encode Utf 8 (). hex () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġdecode ( hex : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġhex . decode Hex (). utf 8 () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġencode Hostname ( path : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠEncoder . encode ( path ) Ġ+ Ġ". socket " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġdecode Hostname ( address : ĠInet Address ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhost Name Ġ= Ġaddress . host Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠEncoder . decode ( host Name . substring ( 0 , Ġhost Name . indexOf (". socket "))) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ public Ġclass ĠUnix Socket Factory Ġ: ĠSocket Factory () Ġ{ ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! AF UNIX Socket . is Supported ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException (" AF UNIX Socket . is Supported () Ġ== Ġfalse ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġcreate Socket (): ĠSocket Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠJ vm Unix Socket () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġcreate Socket ( s : ĠString , Ġi : ĠInt ): ĠSocket Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġcreate Socket ( s : ĠString , Ġi : ĠInt , Ġinet Address : ĠInet Address , Ġi 1 : ĠInt ): ĠSocket Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġcreate Socket ( inet Address : ĠInet Address , Ġi : ĠInt ): ĠSocket Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġcreate Socket ( inet Address : ĠInet Address , Ġi : ĠInt , Ġinet Address 1 : ĠInet Address , Ġi 1 : ĠInt ): ĠSocket Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException () ĊĠĠĠ Ġ} Ċ Ċ }