112 lines
2.3 KiB
Go
112 lines
2.3 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"log"
|
||
|
"time"
|
||
|
|
||
|
"github.com/labstack/echo"
|
||
|
"github.com/labstack/echo/middleware"
|
||
|
"github.com/nats-io/nats.go"
|
||
|
"github.com/rosti-cz/server_lobby/server"
|
||
|
)
|
||
|
|
||
|
const discoveryChannel = "lobby.discovery"
|
||
|
const cleanEvery = 15 // clean discoveredServers every X seconds
|
||
|
const keepAlive = 15 // sends discovery struct every
|
||
|
|
||
|
var discoveryStorage server.Discoveries = server.Discoveries{}
|
||
|
|
||
|
var config Config
|
||
|
|
||
|
func init() {
|
||
|
discoveryStorage.LogChannel = make(chan string)
|
||
|
}
|
||
|
|
||
|
// cleanDiscoveryPool clears the local server map and keeps only the alive servers
|
||
|
func cleanDiscoveryPool() {
|
||
|
for {
|
||
|
discoveryStorage.Clean()
|
||
|
time.Sleep(cleanEvery * time.Second)
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
// sendDisoveryPacket sends discovery packet regularly so the network know we exist
|
||
|
func sendDisoveryPacket(nc *nats.Conn) {
|
||
|
for {
|
||
|
discovery, err := getIdentification()
|
||
|
if err != nil {
|
||
|
log.Printf("sending discovery identification error: %v\n", err)
|
||
|
}
|
||
|
|
||
|
data, err := discovery.Bytes()
|
||
|
if err != nil {
|
||
|
log.Printf("sending discovery formating message error: %v\n", err)
|
||
|
}
|
||
|
err = nc.Publish(discoveryChannel, data)
|
||
|
if err != nil {
|
||
|
log.Printf("sending discovery error: %v\n", err)
|
||
|
}
|
||
|
time.Sleep(keepAlive * time.Second)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Print logs acquired from disovery storage
|
||
|
func printDiscoveryLogs() {
|
||
|
for {
|
||
|
logMessage := <-discoveryStorage.LogChannel
|
||
|
log.Println(logMessage)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func main() {
|
||
|
var err error
|
||
|
|
||
|
// Closing the logging channel
|
||
|
defer close(discoveryStorage.LogChannel)
|
||
|
|
||
|
// Load config from environment variables
|
||
|
config = *GetConfig()
|
||
|
|
||
|
// ------------------------
|
||
|
// Server discovering stuff
|
||
|
// ------------------------
|
||
|
|
||
|
// Connect to the NATS service
|
||
|
nc, err := nats.Connect(config.NATSURL)
|
||
|
if err != nil {
|
||
|
log.Fatalln(err)
|
||
|
}
|
||
|
defer nc.Drain()
|
||
|
|
||
|
go printDiscoveryLogs()
|
||
|
|
||
|
// Subscribe
|
||
|
log.Println("> discovery channel")
|
||
|
_, err = nc.Subscribe(discoveryChannel, discoveryHandler)
|
||
|
if err != nil {
|
||
|
log.Fatalln(err)
|
||
|
}
|
||
|
|
||
|
go cleanDiscoveryPool()
|
||
|
go sendDisoveryPacket(nc)
|
||
|
|
||
|
// --------
|
||
|
// REST API
|
||
|
// --------
|
||
|
e := echo.New()
|
||
|
|
||
|
// Middleware
|
||
|
e.Use(middleware.Logger())
|
||
|
e.Use(middleware.Recover())
|
||
|
|
||
|
// Routes
|
||
|
e.GET("/", func(c echo.Context) error {
|
||
|
discoveries := discoveryStorage.GetAll()
|
||
|
return c.JSONPretty(200, discoveries, " ")
|
||
|
})
|
||
|
|
||
|
// Start server
|
||
|
e.Logger.Fatal(e.Start(":1313"))
|
||
|
}
|