75 lines
1.2 KiB
Go
75 lines
1.2 KiB
Go
|
|
package app
|
||
|
|
|
||
|
|
import (
|
||
|
|
"context"
|
||
|
|
"log"
|
||
|
|
"nunu-layout-admin/pkg/server"
|
||
|
|
"os"
|
||
|
|
"os/signal"
|
||
|
|
"syscall"
|
||
|
|
)
|
||
|
|
|
||
|
|
type App struct {
|
||
|
|
name string
|
||
|
|
servers []server.Server
|
||
|
|
}
|
||
|
|
|
||
|
|
type Option func(a *App)
|
||
|
|
|
||
|
|
func NewApp(opts ...Option) *App {
|
||
|
|
a := &App{}
|
||
|
|
for _, opt := range opts {
|
||
|
|
opt(a)
|
||
|
|
}
|
||
|
|
return a
|
||
|
|
}
|
||
|
|
|
||
|
|
func WithServer(servers ...server.Server) Option {
|
||
|
|
return func(a *App) {
|
||
|
|
a.servers = servers
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func WithName(name string) Option {
|
||
|
|
return func(a *App) {
|
||
|
|
a.name = name
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func (a *App) Run(ctx context.Context) error {
|
||
|
|
var cancel context.CancelFunc
|
||
|
|
ctx, cancel = context.WithCancel(ctx)
|
||
|
|
defer cancel()
|
||
|
|
|
||
|
|
signals := make(chan os.Signal, 1)
|
||
|
|
signal.Notify(signals, syscall.SIGINT, syscall.SIGTERM)
|
||
|
|
|
||
|
|
for _, srv := range a.servers {
|
||
|
|
go func(srv server.Server) {
|
||
|
|
err := srv.Start(ctx)
|
||
|
|
if err != nil {
|
||
|
|
log.Printf("Server start err: %v", err)
|
||
|
|
}
|
||
|
|
}(srv)
|
||
|
|
}
|
||
|
|
|
||
|
|
select {
|
||
|
|
case <-signals:
|
||
|
|
// Received termination signal
|
||
|
|
log.Println("Received termination signal")
|
||
|
|
case <-ctx.Done():
|
||
|
|
// Context canceled
|
||
|
|
log.Println("Context canceled")
|
||
|
|
}
|
||
|
|
|
||
|
|
// Gracefully stop the servers
|
||
|
|
for _, srv := range a.servers {
|
||
|
|
err := srv.Stop(ctx)
|
||
|
|
if err != nil {
|
||
|
|
log.Printf("Server stop err: %v", err)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return nil
|
||
|
|
}
|