package Ġcc . crypt op unk s . crypt on . net Ċ Ċ import Ġcc . crypt op unk s . crypt on . Connector Ċ import Ġcc . crypt op unk s . crypt on . encode Context Ċ import Ġcc . crypt op unk s . crypt on . json . format Json Ċ import Ġcc . crypt op unk s . crypt on . json . parse Json Ċ import Ġio . ktor . network . sockets .* Ċ import Ġio . ktor . utils . io .* Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . filter Ċ import Ġkotlinx . coroutines . flow . flow Ċ import Ġkotlinx . coroutines . flow . map Ċ import Ġkotlinx . coroutines . flow . scan Ċ import Ġjava . io . IOException Ċ import Ġkotlin . reflect . K Class ĊĊ Ċ fun ĠSocket . connector (): ĠConnector Ġ{ ĊĠĠĠ Ġval Ġread Channel Ġ= Ġopen Read Channel () ĊĠĠĠ Ġval Ġwrite Channel Ġ= Ġopen Write Channel () ĊĠĠĠ Ġreturn ĠConnector ( ĊĠĠĠĠĠĠĠ Ġinput Ġ= Ġread Channel . flow Parsed Messages (), ĊĠĠĠĠĠĠĠ Ġoutput Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Channel . send ( it ) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġclose Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Channel . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġread Channel . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdispose () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) Ċ } Ċ Ċ private Ġfun ĠByte Read Channel . flow Parsed Messages (): ĠFlow < Any > Ġ= Ġflow Messages () Ċ Ċ private Ġfun ĠByte Read Channel . flow Messages (): ĠFlow < Any > Ġ= Ġflow Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlen Ġ= Ġread Int () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarr Ġ= ĠByteArray ( len ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġread Fully ( arr , Ġ 0 , Ġlen ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġarr . toString ( Charsets . UTF _ 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġprintln (" Close Ġmessage Ġflow Ġ(${ e . message }) ") ĊĠĠĠ Ġ} Ċ }. scan ( emptyList < String >()) Ġ{ Ġaccumulator , Ġvalue Ġ-> ĊĠĠĠ Ġwhen Ġ( accumulator . size ) Ġ{ ĊĠĠĠĠĠĠĠĠ 2 Ġ-> ĠlistOf ( value ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġaccumulator Ġ+ Ġvalue ĊĠĠĠ Ġ} Ċ }. filter Ġ{ Ġit . size Ġ== Ġ 2 Ġ}. map Ġ{ Ġ( type , Ġmessage ) Ġ-> ĊĠĠĠ Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ" s " Ġ-> Ġmessage ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġmessage . parse Message ( type ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠString . parse Message ( type : ĠString ): ĠAny Ġ= Ġtry Ġ{ ĊĠĠĠ Ġparse Json ( Class . forName ( PREFIX Ġ+ Ġtype ). kotlin Ġas ĠK Class < Any >) Ċ } Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠ Ġprintln ( this ) ĊĠĠĠ Ġe . printStackTrace () ĊĠĠĠ Ġthis Ċ } Ċ Ċ private Ġsuspend Ġfun ĠByte Write Channel . send ( any : ĠAny ) Ġ= Ġtry Ġ{ ĊĠĠĠ Ġany . encode Context (). forEach Ġ{ Ġchunk Ġ-> ĊĠĠĠĠĠĠĠ Ġwhen Ġ( chunk ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠString Ġ-> Ġsend (" s ", Ġchunk ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġsend ( chunk . type (), Ġchunk . format Json ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġflush () Ċ } Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠ Ġprintln (" failed Ġsend Ġ$ any ") ĊĠĠĠ Ġprintln ( e . localized Message ) Ċ } Ċ Ċ private Ġsuspend Ġfun ĠByte Write Channel . send ( type : ĠString , Ġmessage : ĠString ) Ġ{ ĊĠĠĠ Ġsend ( type . encode To ByteArray ()) ĊĠĠĠ Ġsend ( message . encode To ByteArray ()) Ċ } Ċ Ċ private Ġsuspend Ġfun ĠByte Write Channel . send ( packet : ĠByteArray ) Ġ{ ĊĠĠĠ Ġwrite ( packet . size ) Ġ{ Ġbuffer Ġ-> ĊĠĠĠĠĠĠĠ Ġbuffer . put Int ( packet . size ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġwrite Packet Ġ{ ĊĠĠĠĠĠĠĠ Ġwrite Fully ( packet ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġconst Ġval ĠPREFIX Ġ= Ġ" cc . crypt op unk s . crypt on ." Ċ Ċ private Ġfun ĠAny . type () Ġ= Ġjava Class . name . remove Prefix ( PREFIX ) Ċ