/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 1 - 2 0 2 2 , ĠVal ap he e . Ċ Ġ* Ċ Ġ* Ġ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 Ġcom . val ap he e . net code . mc be . auto Ċ Ċ import Ġcom . fasterxml . jackson . module . kotlin . convert Value Ċ import Ġcom . fasterxml . jackson . module . kotlin . jackson ObjectMapper Ċ import Ġcom . fasterxml . jackson . module . kotlin . readValue Ċ import Ġio . netty . buffer . Byte Buf InputStream Ċ import Ġio . netty . channel . Channel HandlerContext Ċ import Ġio . netty . handler . codec . Message To Message Codec Ċ import Ġio . netty . handler . codec . http . websocket x . Text WebSocket Frame Ċ import Ġjava . util . UUID Ċ import Ġkotlin . reflect . K Class Ċ Ċ /** Ċ Ġ* Ġ@ author ĠKevin ĠL ud w ig Ċ Ġ*/ Ċ class ĠPacket Codec ( ĊĠĠĠ Ġprivate Ġval Ġevents : ĠMap < String , ĠK Class < out ĠEvent >> Ċ ) Ġ: ĠMessage To Message Codec < Text WebSocket Frame , ĠPacket >() Ġ{ ĊĠĠĠ Ġprivate Ġval Ġresponses Ġ= Ġmutable Map Of < UUID , ĠK Class < out ĠCommand Response >>() ĊĊĠĠĠ Ġoverride Ġfun Ġencode ( context : ĠChannel HandlerContext , Ġmessage : ĠPacket , Ġout : ĠMutable List < Any >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( message . header . message Purpose Ġ== ĠPacket . Header . Message Purpose . Command Request Ġ&& Ġmessage . body Ġis ĠCommand ) Ġresponses [ message . header . requestId !! ] Ġ= Ġmessage . body . response Type ĊĠĠĠĠĠĠĠ Ġout . add ( Text WebSocket Frame ( object Mapper . writeValue AsString ( message ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdecode ( context : ĠChannel HandlerContext , Ġ` in `: ĠText WebSocket Frame , Ġout : ĠMutable List < Any >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpacket Ġ= ĠobjectMapper . readValue < Packet >( Byte Buf InputStream (` in `. content ())) ĊĠĠĠĠĠĠĠ Ġout . add ( when Ġ( packet . header . message Purpose ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPacket . Header . Message Purpose . Command Response Ġ-> Ġresponses . remove ( packet . header . requestId )?. let Ġ{ ĠPacket ( packet . header , ĠobjectMapper . convert Value ( packet . body , Ġit . java )) Ġ} Ġ?: Ġpacket ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPacket . Header . Message Purpose . Error Ġ-> ĠobjectMapper . convert Value < Error >( packet . body !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPacket . Header . Message Purpose . Event Ġ-> Ġevents [ packet . header . eventName ]?. let Ġ{ ĠPacket ( packet . header , ĠobjectMapper . convert Value ( packet . body , Ġit . java )) Ġ} Ġ?: Ġpacket ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPacket . Header . Message Purpose . Event Subscribe , ĠPacket . Header . Message Purpose . Event Un subscribe Ġ-> ĠobjectMapper . convert Value < Event Request >( packet . body !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġpacket ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠName Ġ= Ġ" auto - codec " ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠobjectMapper Ġ= Ġj ack son ObjectMapper () ĊĠĠĠ Ġ} Ċ } Ċ