package Ġcom . ark iv an ov . mv ik otlin . time travel . client . internal Ċ Ċ import Ġcom . ark iv an ov . mv ik otlin . time travel . client . internal . Time Travel Client Store Factory . Connector Ċ 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 tr ave lex port . Time Travel Export Ċ import Ġcom . ark iv an ov . mv ik otlin . time travel . proto . internal . data . time travel state update . Time Travel State Update Ċ 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 . bad oo . reak t ive . dis posable . Disposable Ċ import Ġcom . bad oo . reak t ive . observable . Observable Ċ import Ġcom . bad oo . reak t ive . observable . Observable Emitter Ċ import Ġcom . bad oo . reak t ive . observable . observable Ċ import Ġcom . bad oo . reak t ive . observable . observe On Ċ import Ġcom . bad oo . reak t ive . observable . onError Return Ċ import Ġcom . bad oo . reak t ive . observable . subscribe On Ċ import Ġcom . bad oo . reak t ive . scheduler . io Scheduler Ċ import Ġcom . bad oo . reak t ive . scheduler . main Scheduler Ċ import Ġkotlinx . c interop . CP o inter Ċ import Ġkotlinx . c interop . alloc Ċ import Ġkotlinx . c interop . convert Ċ import Ġkotlinx . c interop . get Ċ import Ġkotlinx . c interop . mem Scoped Ċ import Ġkotlinx . c interop . point ed Ċ import Ġkotlinx . c interop . ptr Ċ import Ġkotlinx . c interop . reinterpret Ċ import Ġkotlinx . c interop . size Of Ċ import Ġplatform . posix . AF _ INET Ċ import Ġplatform . posix . IP PROTO _ TCP Ċ import Ġplatform . posix . PF _ INET Ċ import Ġplatform . posix . SOCK _ STREAM Ċ import Ġplatform . posix . close Ċ import Ġplatform . posix . connect Ċ import Ġplatform . posix . errno Ċ import Ġplatform . posix . geth ost by name Ċ import Ġplatform . posix . h _ errno Ċ import Ġplatform . posix . host ent Ċ import Ġplatform . posix . in _ addr Ċ import Ġplatform . posix . memset Ċ import Ġplatform . posix . sock addr _ in Ċ import Ġplatform . posix . socket Ċ Ċ @ Suppress (" EXPERIMENT AL _ API _ USAGE ") Ċ internal Ġclass ĠTime Travel Connector ( ĊĠĠĠ Ġprivate Ġval Ġhost : ĠString , ĊĠĠĠ Ġprivate Ġval Ġport : ĠInt Ċ ) Ġ: ĠConnector Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġconnect (): ĠObservable < Connector . Event > Ġ= ĊĠĠĠĠĠĠĠ Ġobservable < Connector . Event > Ġ{ Ġit . connect () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. onError Return Ġ{ ĠConnector . Event . Error ( it . message ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( io Scheduler ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( main Scheduler ) ĊĊĠĠĠ Ġprivate Ġfun ĠObservable Emitter < Connector . Event >. connect () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsocket Ġ= Ġsocket ( PF _ INET , ĠSOCK _ STREAM , ĠIP PROTO _ TCP ) ĊĠĠĠĠĠĠĠ Ġif Ġ( socket Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonError ( Exception (" Error Ġopen Ġsocket : Ġ$ errno ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġaddr : ĠC Pointer < host ent >? Ġ= Ġge th ost by name ( host ) ĊĠĠĠĠĠĠĠ Ġif Ġ( addr Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonError ( Exception (" Error Ġgetting Ġhost Ġby Ġname : Ġ$ h _ errno ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmem Scoped Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsin Ġ= Ġalloc < sock addr _ in >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmemset ( sin . ptr , Ġ 0 , Ġsockaddr _ in . size . convert ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsin . sin _ len Ġ= Ġsize Of < sock addr _ in >(). convert () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsin . sin _ family Ġ= ĠAF _ INET . convert () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsin . sin _ port Ġ= Ġget Sin Port () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaddr List Ġ= Ġrequire NotNull ( addr . point ed . h _ addr _ list ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst Addr Ġ= Ġrequire NotNull ( addr List [ 0 ]). reinterpret < in _ addr >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsin . sin _ addr . s _ addr Ġ= Ġfirst Addr . point ed . s _ addr ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( connect ( socket , Ġsin . ptr . reinterpret (), Ġsockaddr _ in . size . convert ()) Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError ( Exception (" Error Ġconnect Ġsocket : Ġ$ errno ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Disposed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose ( socket ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġreader Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠReader Thread < Proto Object >( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsocket Ġ= Ġsocket , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Read Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Next ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTime Travel State Update Ġ-> ĠConnector . Event . State Update ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTime Travel Export Ġ-> Ġreturn @ Reader Thread Ġ// ĠNot Ġsupported ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠUnsupportedOperationException (" Unsupported Ġproto Ġobject Ġtype : Ġ$ it ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError Ġ= Ġ:: onError ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġwriter Ġ= ĠWriter Thread ( socket Ġ= Ġsocket , ĠonError Ġ= Ġ:: onError ) ĊĊĠĠĠĠĠĠĠ Ġon Next ( Connector . Event . Connected ( writer :: submit )) ĊĊĠĠĠĠĠĠĠ Ġreader . start () ĊĊĠĠĠĠĠĠĠ Ġset Disposable ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDis posable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreader . interrupt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . interrupt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose ( socket ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" Magic Number ") ĊĠĠĠ Ġprivate Ġfun Ġget Sin Port (): ĠU Short Ġ= Ġ(( port Ġshr Ġ 8 ) Ġor Ġ(( port Ġand Ġ 0 xff ) Ġshl Ġ 8 )). to U Short () Ċ } Ċ