/* Ċ Ġ* ĠMIT ĠLicense Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 2 . ĠM ak sym ĠO li iny k . Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ċ Ġ* Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ Ġ* ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ @ file : Suppress (" FunctionName ", Ġ" K Doc Un resolved Reference ") Ċ Ċ package Ġio . github . x lo pec . tea . time . travel . component Ċ Ċ import Ġio . github . x lo pec . tea . core . Component Ċ import Ġio . github . x lo pec . tea . core . Env Ċ import Ġio . github . x lo pec . tea . core . Initial Ċ import Ġio . github . x lo pec . tea . core . Initializer Ċ import Ġio . github . x lo pec . tea . core . Regular Ċ import Ġio . github . x lo pec . tea . core . Resolver Ċ import Ġio . github . x lo pec . tea . core . Share Options Ċ import Ġio . github . x lo pec . tea . core . Share State While Sub scribed Ċ import Ġio . github . x lo pec . tea . core . Sink Ċ import Ġio . github . x lo pec . tea . core . Snapshot Ċ import Ġio . github . x lo pec . tea . core . Updater Ċ import Ġio . github . x lo pec . tea . core . attach Message Collector Ċ import Ġio . github . x lo pec . tea . core . compute Snapshots Ċ import Ġio . github . x lo pec . tea . core . initial Ċ import Ġio . github . x lo pec . tea . core . resolve As Flow Ċ import Ġio . github . x lo pec . tea . core . share In Ċ import Ġio . github . x lo pec . tea . data . Random UUID Ċ import Ġio . github . x lo pec . tea . time . travel . component . internal . merge With Ċ import Ġio . github . x lo pec . tea . time . travel . protocol . Component Id Ċ import Ġio . github . x lo pec . tea . time . travel . protocol . Json Serializer Ċ import Ġio . github . x lo pec . tea . time . travel . protocol . Notify Component Attached Ċ import Ġio . github . x lo pec . tea . time . travel . protocol . Notify Component Snapshot Ċ import Ġio . github . x lo pec . tea . time . travel . protocol . Notify Server Ċ import Ġio . github . x lo pec . tea . time . travel . session . Debug Session Ċ import Ġio . github . x lo pec . tea . time . travel . session . HttpClient Ċ import Ġio . github . x lo pec . tea . time . travel . session . Local host Ċ import Ġio . github . x lo pec . tea . time . travel . session . SessionFactory Ċ import Ġio . github . x lo pec . tea . time . travel . session . session Ċ import Ġio . ktor . http . Url Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . channels . Channel Ċ import Ġkotlinx . coroutines . channels . Channel . Factory . REN DE Z VO US Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . channel Flow Ċ import Ġkotlinx . coroutines . flow . map Ċ import Ġkotlinx . coroutines . flow . on Each Ċ import Ġkotlinx . coroutines . flow . receive As Flow Ċ Ċ /** Ċ Ġ* ĠCreates Ġnew Ġdebug gable Ġ[ component ][ Component ] Ċ Ġ* Ċ Ġ* Ġ@ param Ġid Ġcomponent Ġidentifier Ċ Ġ* Ġ@ param Ġinitializer Ġinitializer Ġthat Ġprovides Ġinitial Ġvalues Ċ Ġ* Ġ@ param Ġresolver Ġresolver Ġthat Ġresolves Ġmessages Ġto Ġcommands Ġand Ġperforms Ġside Ġeffects Ċ Ġ* Ġ@ param Ġupdater Ġupdater Ġthat Ġcomputes Ġnew Ġstates Ġand Ġcommands Ġto Ġbe Ġexecuted Ċ Ġ* Ġ@ param Ġjson Serializer Ġjson Ġconverter Ċ Ġ* Ġ@ param Ġscope Ġscope Ġin Ġwhich Ġthe Ġsharing Ġcoroutine Ġis Ġstarted Ċ Ġ* Ġ@ param Ġurl Ġurl Ġused Ġto Ġconnect Ġto Ġdebug Ġserver Ċ Ġ* Ġ@ param Ġshare Options Ġsharing Ġoptions , Ġsee Ġ[ share In ][ kotlin x . coroutines . flow . share In ] Ġfor Ġmore Ġinfo Ċ Ġ* Ġ@ param Ġsession Factory Ġfunction Ġthat Ġfor Ġa Ġgiven Ġserver Ġsettings Ġcreates Ġa Ġnew Ġconnection Ċ Ġ* Ġto Ġa Ġdebug Ġserver Ċ Ġ* Ġ@ param ĠM Ġincoming Ġmessages Ċ Ġ* Ġ@ param ĠS Ġstate Ġof Ġthe Ġapplication Ċ Ġ* Ġ@ param ĠC Ġcommands Ġto Ġbe Ġexecuted Ċ Ġ*/ Ċ public Ġinline Ġfun Ġ< re ified ĠM Ġ: ĠAny , Ġre ified ĠC , Ġre ified ĠS Ġ: ĠAny , ĠJ > ĠComponent ( ĊĠĠĠ Ġid : ĠComponent Id , ĊĠĠĠ Ġno inline Ġinitializer : ĠInitial izer < S , ĠC >, ĊĠĠĠ Ġno inline Ġresolver : ĠResolver < C , ĠM >, ĊĠĠĠ Ġno inline Ġupdater : ĠUp dater < M , ĠS , ĠC >, ĊĠĠĠ Ġscope : ĠCor outine Scope , ĊĠĠĠ Ġ// Ġtodo : Ġgroup Ġto Ġreduce Ġnumber Ġof Ġarguments ĊĠĠĠ Ġurl : ĠUrl Ġ= ĠLocal host , ĊĠĠĠ Ġjson Serializer : ĠJsonSerializer < J >, ĊĠĠĠ Ġ// Ġsee Ġhttps :// yout rack . jetbrains . com / issue / KT - 4 7 1 9 5 ĊĠĠĠ Ġ// Ġsee Ġhttps :// github . com / Kotlin / kotlin x . coroutines / issues / 3 0 0 5 # issuecomment - 1 0 1 4 5 7 7 5 7 3 ĊĠĠĠ Ġno inline Ġsession Factory : ĠSession Factory < M , ĠS , ĠJ > Ġ= Ġ{ Ġsettings , Ġblock Ġ-> ĠHttpClient . session ( settings , Ġblock ) Ġ}, ĊĠĠĠ Ġshare Options : ĠShare Options Ġ= ĠShare State While Sub scribed , Ċ ): ĠComponent < M , ĠS , ĠC > Ġ= ĊĠĠĠ ĠComponent ( ĊĠĠĠĠĠĠĠ ĠDebug Env ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEnv ( initializer , Ġresolver , Ġupdater , Ġscope , Ġshare Options ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSettings ( id , Ġjson Serializer , Ġurl , Ġsession Factory ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) Ċ Ċ /** Ċ Ġ* ĠCreates Ġnew Ġcomponent Ġusing Ġpre configured Ġdebug Ġenvironment Ċ Ġ* Ċ Ġ* Ġ@ param Ġdebug Env Ġenvironment Ġto Ġbe Ġused Ċ Ġ* Ġ@ param ĠM Ġincoming Ġmessages Ċ Ġ* Ġ@ param ĠS Ġstate Ġof Ġthe Ġapplication Ċ Ġ* Ġ@ param ĠC Ġcommands Ġto Ġbe Ġexecuted Ċ Ġ*/ Ċ public Ġfun Ġ< M , ĠS , ĠC , ĠJ > ĠComponent ( ĊĠĠĠ Ġdebug Env : ĠDebug Env < M , ĠS , ĠC , ĠJ >, Ċ ): ĠComponent < M , ĠS , ĠC > Ġ{ ĊĊĠĠĠ Ġval Ġinput Ġ= ĠChannel < M >( REN DE Z VO US ) ĊĠĠĠ Ġval Ġupstream Ġ= Ġdebug Env . compute Snapshots ( input ) ĊĠĠĠĠĠĠĠ Ġ. share In ( debug Env . env . scope , Ġdebug Env . env . share Options ) ĊĊĠĠĠ Ġreturn Ġ{ Ġmessages Ġ-> Ġupstream . attach Message Collector ( messages , Ġinput :: send ) Ġ} Ċ } Ċ Ċ private Ġfun Ġ< M , ĠS , ĠC , ĠJ > ĠDebug Env < M , ĠS , ĠC , ĠJ >. compute Snapshots ( ĊĠĠĠ Ġinput : ĠChannel < M >, Ċ ): ĠFlow < Snapshot < M , ĠS , ĠC >> Ġ= ĊĠĠĠ Ġdebug Session Ġ{ Ġsink Ġ-> ĊĠĠĠĠĠĠĠ Ġenv . compute Snapshots ( merge Initial Snapshots ( states ), Ġinput :: send , Ġmerge Messages ( input . receive As Flow (), Ġmessages )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Each Ġ{ Ġsnapshot Ġ-> Ġnotify Server ( this @ compute Snapshots , Ġsnapshot ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect ( sink :: invoke ) ĊĠĠĠ Ġ} Ċ Ċ private Ġfun Ġ< M , ĠS , ĠC , ĠJ > ĠDebug Env < M , ĠS , ĠC , ĠJ >. merge Initial Snapshots ( ĊĠĠĠ Ġdebug States : ĠFlow < S >, Ċ ) Ġ= Ġenv . initial (). merge With ( debug States . to Initial Snapshots ()) Ċ Ċ private Ġfun Ġ< M , ĠS , ĠC , ĠJ > ĠDebug Env < M , ĠS , ĠC , ĠJ >. merge Messages ( ĊĠĠĠ Ġoriginal Input : ĠFlow < M >, ĊĠĠĠ Ġdebug Input : ĠFlow < M >, Ċ ): Ġ( Initial < S , ĠC >) Ġ-> ĠFlow < M > Ġ= Ġ{ Ġinitial Ġ-> ĊĠĠĠ Ġenv . resolve As Flow ( initial . commands ) ĊĠĠĠĠĠĠĠ Ġ. merge With ( original Input ) ĊĠĠĠĠĠĠĠ Ġ. merge With ( debug Input ) Ċ } Ċ Ċ private Ġfun Ġ< M , ĠS , ĠC , ĠJ > ĠDebug Env < M , ĠS , ĠC , ĠJ >. debug Session ( ĊĠĠĠ Ġblock : Ġsuspend ĠDebug Session < M , ĠS , ĠJ >. ( input : ĠS ink < Snapshot < M , ĠS , ĠC >>) Ġ-> ĠUnit , Ċ ): ĠFlow < Snapshot < M , ĠS , ĠC >> Ġ= ĊĠĠĠ Ġchannel Flow Ġ{ Ġsettings . session Factory ( settings ) Ġ{ Ġblock ( channel :: send ) Ġ} Ġ} Ċ Ċ private Ġfun Ġ< S > ĠFlow < S >. to Initial Snapshots (): ĠFlow < Initial < S , ĠNothing >> Ġ= ĊĠĠĠ Ġ// ĠTODO Ġwhat Ġif Ġwe Ġwant Ġto Ġstart Ġfrom ĠRegular Ġsnapshot ? ĊĠĠĠ Ġmap Ġ{ Ġs Ġ-> ĠInitial ( s , Ġset Of ()) Ġ} Ċ Ċ /** Ċ Ġ* ĠNot ifies Ġserver Ġabout Ġstate Ġchanges Ċ Ġ*/ Ċ // ĠTODO Ġcontext ( Debug Session < M , ĠS , ĠJ >, ĠDebug Env < M , ĠS , ĠC , ĠJ >) Ċ private Ġsuspend Ġfun Ġ< M , ĠS , ĠC , ĠJ > ĠDebug Session < M , ĠS , ĠJ >. notify Server ( ĊĠĠĠ Ġenv : ĠDebug Env < M , ĠS , ĠC , ĠJ >, ĊĠĠĠ Ġsnapshot : ĠSnapshot < M , ĠS , ĠC >, Ċ ) Ġ= Ġwith ( env . settings ) Ġ{ ĊĠĠĠ Ġinvoke ( Notify Server ( Random UUID (), Ġid , Ġserializer . to Server Message ( snapshot ))) Ċ } Ċ Ċ private Ġfun Ġ< M , ĠS , ĠC , ĠJ > ĠJsonSerializer < J >. to Server Message ( ĊĠĠĠ Ġsnapshot : ĠSnapshot < M , ĠS , ĠC >, Ċ ) Ġ= Ġwhen Ġ( snapshot ) Ġ{ ĊĠĠĠ Ġis ĠInitial Ġ-> ĠNotify Component Attached ( toJson Tree ( snapshot . currentState ), Ġto Commands Set ( snapshot . commands )) ĊĠĠĠ Ġis ĠRegular Ġ-> ĠNotify Component Snapshot ( ĊĠĠĠĠĠĠĠ ĠtoJson Tree ( snapshot . message ), ĊĠĠĠĠĠĠĠ ĠtoJson Tree ( snapshot . previous State ), ĊĠĠĠĠĠĠĠ ĠtoJson Tree ( snapshot . currentState ), ĊĠĠĠĠĠĠĠ Ġto Commands Set ( snapshot . commands ), ĊĠĠĠ Ġ) Ċ } Ċ Ċ private Ġfun Ġ< C , ĠJ > ĠJsonSerializer < J >. to Commands Set ( ĊĠĠĠ Ġs : ĠSet < C > Ċ ): ĠSet < J > Ġ= Ġs . map To ( HashSet ( s . size ), Ġ:: toJson Tree ) Ċ