package Ġcom . ly k ke . matching . engine . messages Ċ Ċ import Ġcom . google . protobuf . Message Ċ import Ġcom . google . protobuf . Message OrBuilder Ċ import Ġcom . ly k ke . matching . engine . ded up lication . Processed Message Ċ import Ġcom . ly k ke . matching . engine . socket . Client Handler Ċ import Ġcom . ly k ke . matching . engine . utils . Byte Helper . Companion . toByteArray Ċ import Ġcom . ly k ke . utils . logging . Metrics Logger Ċ import Ġcom . ly k ke . utils . logging . Th rottling Logger Ċ import Ġjava . io . IOException Ċ import Ġjava . lang . IllegalStateException Ċ Ċ class ĠMessage Wrapper ( ĊĠĠĠĠĠĠĠ Ġval Ġsource Ip : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġtype : ĠByte , ĊĠĠĠĠĠĠĠ Ġval ĠbyteArray : ĠByteArray , ĊĠĠĠĠĠĠĠ Ġval Ġclient Handler : ĠClient Handler ?, ĊĠĠĠĠĠĠĠ Ġval Ġstart Timestamp : ĠLong Ġ= ĠSystem . nano Time (), ĊĠĠĠĠĠĠĠ Ġvar Ġtimestamp : ĠLong ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġvar ĠmessageId : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġvar Ġparsed Message : ĠMessage OrBuilder ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġvar Ġid : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġvar Ġtried To Persist : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġvar Ġpersisted : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġvar Ġcontext : ĠAny ? Ġ= Ġnull ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠLOGGER Ġ= ĠTh rottling Logger . getLogger ( Message Wrapper :: class . java . name ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠMET R ICS _ LOGGER Ġ= ĠMetrics Logger . getLogger () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġmessage Pre Processor Start Timestamp : ĠLong ? Ġ Ġ= Ġnull ĊĠĠĠ Ġvar Ġmessage Pre Processor End Timestamp : ĠLong ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġwrite Response Time : ĠLong ? Ġ= Ġnull ĊĊĠĠĠ Ġvar Ġprocessed Message : ĠPro cessed Message ? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġwrite Response ( response Builder : ĠProtocol Messages . Response . Builder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! response Builder . has MessageId () Ġ&& ĠmessageId Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Builder . message Id Ġ= ĠmessageId ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! response Builder . has Uid () Ġ&& Ġid Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Builder . uid Ġ= Ġid !!. to Long () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwrite ClientResponse ( response Builder . build (), ĠMessageType . RESPONSE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwrite New Response ( response Builder : ĠProtocol Messages . New Response . Builder ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! response Builder . has MessageId () Ġ&& ĠmessageId Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Builder . message Id Ġ= ĠmessageId ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! response Builder . has Id () Ġ&& Ġid Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Builder . id Ġ= Ġid ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwrite ClientResponse ( response Builder . build (), ĠMessageType . NEW _ RESPONSE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwrite Market Order Response ( response Builder : ĠProtocol Messages . Market Order Response . Builder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! response Builder . has MessageId () Ġ&& ĠmessageId Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Builder . message Id Ġ= ĠmessageId ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! response Builder . has Id () Ġ&& Ġid Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Builder . id Ġ= Ġid ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwrite ClientResponse ( response Builder . build (), ĠMessageType . MARKER _ ORDER _ RESPONSE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwrite Multi Limit Order Response ( response Builder : ĠProtocol Messages . Multi Limit Order Response . Builder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! response Builder . has MessageId () Ġ&& ĠmessageId Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Builder . message Id Ġ= ĠmessageId ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! response Builder . has Id () Ġ&& Ġid Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Builder . id Ġ= Ġid ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwrite ClientResponse ( response Builder . build (), ĠMessageType . MULTI _ LIMIT _ ORDER _ RESPONSE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite ClientResponse ( message : ĠMessage , Ġmessage Type : ĠMessageType ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( client Handler Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( write Response Time Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠerrorMessage Ġ= Ġ" [$ source Ip ]: ĠCan Ġnot Ġwrite Ġresponse Ġ- Ġresponse Ġwas Ġalready Ġwritten Ġto Ġsocket , Ġmessage Ġid Ġ$ message Id " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . error ( errorMessage ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMET R ICS _ LOGGER . log Error ( errorMessage ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException ( errorMessage ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Ġ= ĠSystem . nano Time () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient Handler . write Output ( toByteArray ( message Type . type , Ġmessage . serialized Size , Ġmessage . toByteArray ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Response Time Ġ= ĠSystem . nano Time () Ġ- Ġstart ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠIOException ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . error (" [$ source Ip ]: ĠUnable Ġto Ġwrite Ġfor Ġmessage Ġwith Ġid Ġ$ message Id Ġresponse : Ġ${ exception . message }", Ġexception ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMET R ICS _ LOGGER . log Error ( Ġ" [$ source Ip ]: ĠUnable Ġto Ġwrite Ġresponse ", Ġexception ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ