package Ġcom . ne de ll is . kotlin raft Ċ Ċ import Ġcom . t inder . StateMachine Ċ import Ġkotlinx . coroutines . channels . Send Channel Ċ Ċ sealed Ġclass ĠState Ġ{ ĊĠĠĠ Ġobject ĠFollow er Ġ: ĠState () ĊĠĠĠ Ġobject ĠC andidate Ġ: ĠState () ĊĠĠĠ Ġobject ĠLeader Ġ: ĠState () Ċ } Ċ Ċ sealed Ġclass ĠEvent Ġ{ ĊĠĠĠ Ġobject ĠFollow er Updated Ġ: ĠEvent () ĊĠĠĠ Ġobject ĠFollow er Timeout Ġ: ĠEvent () ĊĠĠĠ Ġobject ĠC andidate Timeout Ġ: ĠEvent () ĊĠĠĠ Ġobject ĠC andidate Re ceiv es M aj ority Ġ: ĠEvent () ĊĠĠĠ Ġobject ĠLeader Refresh Timer Ġ: ĠEvent () ĊĠĠĠ Ġobject ĠHigh er Term Server Ġ: ĠEvent () Ċ } Ċ Ċ sealed Ġclass ĠSide Effect Ġ{ ĊĠĠĠ Ġobject ĠBe come Follower Ġ: ĠSide Effect () ĊĠĠĠ Ġobject ĠBe come Candidate Ġ: ĠSide Effect () ĊĠĠĠ Ġobject ĠBe come Leader Ġ: ĠSide Effect () Ċ } Ċ Ċ object ĠF SM Ġ{ ĊĠĠĠ Ġoperator Ġfun Ġinvoke ( ĊĠĠĠĠĠĠĠ Ġchange State : ĠSend Channel < Side Effect > ĊĠĠĠ Ġ): ĠState Machine < State , ĠEvent , ĠSide Effect > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠState Machine . create < State , ĠEvent , ĠSide Effect > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠinitialState ( State . Follower ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate < State . Follower > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon < Event . Follower Updated > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransition To ( State . Follower , ĠSide Effect . Be come Follower ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon < Event . Follower Timeout > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransition To ( State . Candidate , ĠSide Effect . Be come Candidate ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate < State . Candidate > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon < Event . Candidate Timeout > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransition To ( State . Candidate , ĠSide Effect . Be come Candidate ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon < Event . Candidate Re ceiv es M aj ority > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransition To ( State . Leader , ĠSide Effect . Be come Leader ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon < Event . High er Term Server > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransition To ( State . Follower , ĠSide Effect . Be come Follower ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate < State . Leader > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon < Event . Leader Refresh Timer > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransition To ( State . Leader , ĠSide Effect . Be come Leader ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon < Event . High er Term Server > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransition To ( State . Follower , ĠSide Effect . Be come Follower ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAutomatically Ġvalidate Ġif Ġtransition Ġis Ġokay , Ġif Ġit Ġis Ġthen Ġcallback Ġto Ġnode ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Transition Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalid Transition Ġ= Ġit Ġas ? ĠState Machine . Transition . Valid Ġ?: Ġreturn @ on Transition ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġside Effect Ġ= Ġvalid Transition . side Effect Ġ?: Ġreturn @ on Transition ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange State . offer ( side Effect ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ