package Ġcom . ark iv an ov . mv ik otlin . time travel . server Ċ Ċ import Ġcom . ark iv an ov . mv ik otlin . core . annotations . MainThread Ċ import Ġcom . ark iv an ov . mv ik otlin . rx . Disposable Ċ import Ġcom . ark iv an ov . mv ik otlin . rx . observer Ċ import Ġcom . ark iv an ov . mv ik otlin . time travel . controller . Time Travel Controller Ċ import Ġcom . ark iv an ov . mv ik otlin . time travel . controller . time Travel Controller Ċ import Ġcom . ark iv an ov . mv ik otlin . time travel . proto . internal . DEFAULT _ PORT Ċ import Ġcom . ark iv an ov . mv ik otlin . time travel . proto . internal . data . Proto Object Ċ import Ġcom . ark iv an ov . mv ik otlin . time travel . proto . internal . data . time travel com and . Time Travel Command Ċ import Ġcom . ark iv an ov . mv ik otlin . time travel . proto . internal . data . time tr ave le vent value . Time Travel Event Value Ċ import Ġcom . ark iv an ov . mv ik otlin . time travel . proto . internal . data . value . Value Parser Ċ import Ġcom . ark iv an ov . mv ik otlin . time travel . proto . internal . io . Reader Thread Ċ import Ġcom . ark iv an ov . mv ik otlin . time travel . proto . internal . io . Writer Thread Ċ import Ġcom . ark iv an ov . mv ik otlin . utils . internal . Atomic Ref Ċ import Ġcom . ark iv an ov . mv ik otlin . utils . internal . Is olated Ref Ċ import Ġcom . ark iv an ov . mv ik otlin . utils . internal . assert On MainThread Ċ import Ġcom . ark iv an ov . mv ik otlin . utils . internal . atomic Ċ import Ġcom . ark iv an ov . mv ik otlin . utils . internal . get AndUpdate Ċ import Ġplatform . darwin . dispatch _ async Ċ import Ġplatform . darwin . dispatch _ get _ main _ queue Ċ import Ġplatform . posix . close Ċ import Ġkotlin . native . concurrent . freeze Ċ Ċ class ĠTime Travel Server ( ĊĠĠĠ Ġcontroller : ĠTime Travel Controller Ġ= Ġtime Travel Controller , ĊĠĠĠ Ġprivate Ġval Ġport : ĠInt Ġ= ĠDEFAULT _ PORT , ĊĠĠĠ ĠonError : Ġ( Throwable ) Ġ-> ĠUnit Ġ= Ġ{} Ċ ) Ġ{ ĊĊĠĠĠ Ġconstructor () Ġ: Ġthis ( controller Ġ= Ġtime Travel Controller ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġassert On MainThread () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġholder Ref : ĠAtomic Ref < Is olated Ref < Holder > ?> Ġ= Ġatomic ( Is olated Ref ( Holder ( controller Ġ= Ġcontroller , ĠonError Ġ= ĠonError ))) ĊĊĠĠĠ Ġ@ MainThread ĊĠĠĠ Ġfun Ġstart () Ġ{ ĊĠĠĠĠĠĠĠ Ġassert On MainThread () ĊĊĠĠĠĠĠĠĠ Ġval Ġholder Ġ= Ġget Holder () Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġconnection Thread Ġ= Ġconnection Thread () ĊĠĠĠĠĠĠĠ Ġholder . connection Thread Ġ= Ġconnection Thread ĊĠĠĠĠĠĠĠ Ġconnection Thread . start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconnection Thread (): ĠConnection Thread Ġ= ĊĠĠĠĠĠĠĠ ĠConnection Thread ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġport Ġ= Ġport , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Client Connected Ġ= Ġ:: on Client Connected , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonError Ġ= Ġ:: onError ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġ@ MainThread ĊĠĠĠ Ġfun Ġstop () Ġ{ ĊĠĠĠĠĠĠĠ Ġassert On MainThread () ĊĊĠĠĠĠĠĠĠ Ġval Ġholder Ġ= Ġremove Holder () Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġholder . connection Thread ?. interrupt () ĊĠĠĠĠĠĠĠ Ġclose Clients ( holder . clients . values ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Client Connected ( socket : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrun On MainThread IfNot Disposed Ġ{ Ġholder Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreader Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠReader Thread < Time Travel Command >( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsocket Ġ= Ġsocket , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Read Ġ= Ġ{ Ġon Command Received ( command Ġ= Ġit , Ġsocket Ġ= Ġsocket ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Disconnected Ġ= Ġ{ Ġon Client Disconnected ( socket ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwriter Ġ= ĠWriter Thread ( socket Ġ= Ġsocket , Ġon Disconnected Ġ= Ġ{ Ġon Client Disconnected ( socket ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Diff Ġ= ĠState Diff () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdis posable Ġ= Ġholder . controller . states ( observer Ġ{ Ġwriter . submit ( state Diff ( it )) Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . clients Ġ+= Ġsocket Ġto ĠClient ( socket , Ġreader , Ġwriter , Ġdis posable ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreader . start () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Client Disconnected ( socket : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrun On MainThread IfNot Disposed Ġ{ Ġholder Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . clients . remove ( socket )?. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose Clients ( listOf ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclose Clients ( clients : ĠIterable < Client >) Ġ{ ĊĠĠĠĠĠĠĠ Ġclients . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . reader . interrupt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . writer . interrupt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . dis posable . dispose () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclients . forEach Ġ{ Ġclose ( it . socket ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Command Received ( command : ĠTime Travel Command , Ġsocket : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrun On MainThread IfNot Disposed Ġ{ Ġholder Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( command ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTime Travel Command . Start Recording Ġ-> Ġholder . controller . start Recording () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTime Travel Command . Stop Recording Ġ-> Ġholder . controller . stop Recording () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTime Travel Command . MoveTo Start Ġ-> Ġholder . controller . moveTo Start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTime Travel Command . Step Backward Ġ-> Ġholder . controller . step Backward () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTime Travel Command . Step Forward Ġ-> Ġholder . controller . step Forward () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTime Travel Command . Move ToEnd Ġ-> Ġholder . controller . moveTo End () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTime Travel Command . Cancel Ġ-> Ġholder . controller . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTime Travel Command . Debug Event Ġ-> Ġholder . controller . debug Event ( eventId Ġ= Ġcommand . eventId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTime Travel Command . Analyze Event Ġ-> Ġanalyze Event ( eventId Ġ= Ġcommand . eventId , Ġholder Ġ= Ġholder , Ġsocket Ġ= Ġsocket ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTime Travel Command . Export Events Ġ-> ĠUnit Ġ// ĠNot Ġsupported ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTime Travel Command . Import Events Ġ-> ĠUnit Ġ// ĠNot Ġsupported ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. let Ġ{} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠonError ( error : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrun On MainThread IfNot Disposed Ġ{ Ġholder Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . onError . invoke ( error ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrun On MainThread IfNot Disposed ( block : Ġ( Holder ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcallback : Ġ() Ġ-> ĠUnit Ġ= Ġ{ Ġget Holder ()?. also ( block ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġdispatch _ async ( dispatch _ get _ main _ queue (), Ġcallback . freeze ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Holder (): ĠH older ? Ġ= ĊĠĠĠĠĠĠĠ Ġholder Ref . value ?. value ĊĊĠĠĠ Ġprivate Ġfun Ġremove Holder (): ĠH older ? Ġ= ĊĠĠĠĠĠĠĠ Ġholder Ref . get AndUpdate Ġ{ Ġnull Ġ} ?. value ĊĊĠĠĠ Ġprivate Ġfun Ġanalyze Event ( eventId : ĠLong , Ġholder : ĠH older , Ġsocket : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġevent Ġ= Ġholder . controller . state . events . first OrNull Ġ{ Ġit . id Ġ== Ġevent Id Ġ} Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġparsed Value Ġ= ĠValue Parser (). parse Value ( event . value ) ĊĠĠĠĠĠĠĠ Ġholder . send Data ( client Socket Ġ= Ġsocket , Ġproto Object Ġ= ĠTime Travel Event Value ( eventId Ġ= Ġevent Id , Ġvalue Ġ= Ġparsed Value )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠH older . send Data ( client Socket : ĠInt , Ġproto Object : ĠProto Object ) Ġ{ ĊĠĠĠĠĠĠĠ Ġclients [ client Socket ]?. writer ?. submit ( proto Object ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠH older ( ĊĠĠĠĠĠĠĠ Ġval Ġcontroller : ĠTime Travel Controller , ĊĠĠĠĠĠĠĠ Ġval ĠonError : Ġ( Throwable ) Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġconnection Thread : ĠConnection Thread ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġclients : ĠMutable Map < Int , ĠClient > Ġ= ĠHashMap () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠClient ( ĊĠĠĠĠĠĠĠ Ġval Ġsocket : ĠInt , ĊĠĠĠĠĠĠĠ Ġval Ġreader : ĠReader Thread <* >, ĊĠĠĠĠĠĠĠ Ġval Ġwriter : ĠWriter Thread , ĊĠĠĠĠĠĠĠ Ġval Ġdis posable : ĠDis posable ĊĠĠĠ Ġ) Ċ } Ċ