cic-custodial/cmd/service/main.go
Mohammed Sohail 1bc8d65016
refactor: remove action provider
* allows better control over accounting  locking
2022-10-26 09:11:15 +00:00

108 lines
2.5 KiB
Go

package main
import (
"context"
"os"
"os/signal"
"strings"
"sync"
"syscall"
"github.com/grassrootseconomics/cic-custodial/internal/api"
tasker_client "github.com/grassrootseconomics/cic-custodial/internal/tasker/client"
tasker_server "github.com/grassrootseconomics/cic-custodial/internal/tasker/server"
"github.com/grassrootseconomics/cic-go-sdk/chain"
"github.com/knadh/koanf"
"github.com/labstack/echo/v4"
"github.com/zerodha/logf"
)
var (
lo logf.Logger
ko *koanf.Koanf
chainProvider *chain.Provider
taskerClient *tasker_client.TaskerClient
httpServer *echo.Echo
taskerServer *tasker_server.TaskerServer
)
func init() {
ko = initConfig("config.toml")
lo = initLogger()
chainProvider = initChainProvider()
}
func main() {
ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM)
defer stop()
taskerClient := initTaskerClient()
keystore := initKeystore()
noncestore := initNoncestore()
httpServer = api.BootstrapHTTPServer(api.Opts{
Keystore: keystore,
TaskerClient: taskerClient,
})
taskerServer, err := tasker_server.NewTaskerServer(tasker_server.Opts{
SystemPublicKey: ko.MustString("admin.public"),
SystemPrivateKey: ko.MustString("admin.key"),
ChainProvider: chainProvider,
Keystore: keystore,
Noncestore: noncestore,
TaskerClient: taskerClient,
RedisDSN: ko.MustString("redis.dsn"),
RedisLockDB: 1,
RedisLockMinIdleConns: 3,
RedisLockPoolSize: 6,
Concurrency: 20,
Logger: lo,
})
if err != nil {
lo.Fatal("initTaskerServer", "err", err)
}
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
if err := httpServer.Start(ko.MustString("service.address")); err != nil {
if strings.Contains(err.Error(), "Server closed") {
lo.Info("shutting down server")
} else {
lo.Fatal("could not start api server", "err", err)
}
}
}()
wg.Add(1)
go func() {
defer wg.Done()
if err := taskerServer.Server.Run(taskerServer.Mux); err != nil {
lo.Fatal("could not start task server", "err", err)
}
}()
gracefulShutdown(ctx)
wg.Wait()
}
func gracefulShutdown(ctx context.Context) {
<-ctx.Done()
lo.Info("graceful shutdown triggered")
taskerServer.Server.Shutdown()
lo.Info("job processor successfully shutdown")
if err := httpServer.Shutdown(ctx); err != nil {
lo.Error("could not gracefully shutdown api server", "err", err)
}
lo.Info("api server gracefully shutdown")
}