package server import ( "context" "log" "time" "codeberg.org/snonux/gorum/internal/config" "codeberg.org/snonux/gorum/internal/quorum" "codeberg.org/snonux/gorum/internal/vote" ) func Start(ctx context.Context, conf config.Config, quo quorum.Quorum) { go func() { for { log.Println("server: starting") if err := runServer(ctx, conf, quo); err != nil { log.Println("server:", err) } select { case <-time.After(time.Second): case <-ctx.Done(): return } } }() } func runServer(ctx context.Context, conf config.Config, quo quorum.Quorum) error { serverCtx, cancel := context.WithCancel(ctx) defer cancel() ch := make(chan vote.Vote) go func() { for { select { case vote := <-ch: quo.Vote(vote) case <-serverCtx.Done(): return } } }() return tcpServerRun(serverCtx, conf, func(message string) string { v, err := vote.NewFromJSON(message) if err != nil { return err.Error() } ch <- v return "I received your message, dear client" }) }