package main import ( "fmt" "os/signal" "syscall" "FRMS/internal/pkg/config" "FRMS/internal/pkg/logging" "FRMS/internal/pkg/server" "FRMS/internal/pkg/websocket" "os" "github.com/spf13/viper" ) type coordinator interface { Start() } func NewCoordinator(config *viper.Viper, ch chan error) coordinator { return server.NewCentralCoordinator(config, ch) } func NewConfig(fname string) *viper.Viper { return config.LoadConfig(fname) } type ws interface { Start() } func NewWebSocket() ws { return websocket.New() } func main() { // lets get this bread gracefulShutdown := make(chan os.Signal, 1) signal.Notify(gracefulShutdown, syscall.SIGINT, syscall.SIGTERM) // config file conf := NewConfig("server") errCh := make(chan error) c := NewCoordinator(conf, errCh) go c.Start() logging.Debug(logging.DStart, "CCO 01 Server %s started", conf.Get("name")) // starting websocket server w := NewWebSocket() go w.Start() select { case err := <-errCh: // blocking to wait for any errors and keep alive otherwise panic(err) case <-gracefulShutdown: // Shutdown via INT // storing config fmt.Printf("\nStoring config to %s\n", conf.ConfigFileUsed()) if err := conf.WriteConfig(); err != nil { panic(err) } fmt.Println("Stored config successfully. Exiting...") os.Exit(0) } }