forked from ebhomengo/niki
implemented echo server instance in pkg directory
This commit is contained in:
parent
c1ed70cf66
commit
4ad9199a65
|
|
@ -0,0 +1,7 @@
|
||||||
|
package httpserver
|
||||||
|
|
||||||
|
import "time"
|
||||||
|
|
||||||
|
const (
|
||||||
|
DefaultShutdownTimeout = 10 * time.Second
|
||||||
|
)
|
||||||
|
|
@ -0,0 +1,83 @@
|
||||||
|
package httpserver
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"github.com/labstack/echo/v4"
|
||||||
|
"github.com/labstack/echo/v4/middleware"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Config struct {
|
||||||
|
Host string `koanf:"host"`
|
||||||
|
Port int `koanf:"port"`
|
||||||
|
CORS CORS `koanf:"cors"`
|
||||||
|
ShutdownTimeout time.Duration `koanf:"shutdown_context_timeout"`
|
||||||
|
HideBanner bool `koanf:"hide_banner"`
|
||||||
|
HidePort bool `koanf:"hide_port"`
|
||||||
|
|
||||||
|
// Optional Otel middleware can be injected from outside.
|
||||||
|
OtelMiddleware echo.MiddlewareFunc
|
||||||
|
}
|
||||||
|
|
||||||
|
type CORS struct {
|
||||||
|
AllowOrigins []string `koanf:"allow_origins"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Server struct {
|
||||||
|
router *echo.Echo
|
||||||
|
config *Config
|
||||||
|
}
|
||||||
|
|
||||||
|
func New(cfg Config) (*Server, error) {
|
||||||
|
if cfg.Port < 1 || cfg.Port > 65535 {
|
||||||
|
return nil, fmt.Errorf("invalid port: %d", cfg.Port)
|
||||||
|
}
|
||||||
|
|
||||||
|
if cfg.ShutdownTimeout <= 0 {
|
||||||
|
cfg.ShutdownTimeout = DefaultShutdownTimeout
|
||||||
|
}
|
||||||
|
|
||||||
|
e := echo.New()
|
||||||
|
|
||||||
|
if cfg.OtelMiddleware != nil {
|
||||||
|
e.Use(cfg.OtelMiddleware)
|
||||||
|
}
|
||||||
|
|
||||||
|
e.Use(middleware.RequestID())
|
||||||
|
e.Use(middleware.Logger())
|
||||||
|
e.Use(middleware.Recover())
|
||||||
|
e.Use(
|
||||||
|
middleware.CORSWithConfig(
|
||||||
|
middleware.CORSConfig{
|
||||||
|
AllowOrigins: cfg.CORS.AllowOrigins,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
return &Server{
|
||||||
|
router: e,
|
||||||
|
config: &cfg,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Server) GetRouter() *echo.Echo {
|
||||||
|
return s.router
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Server) GetConfig() *Config {
|
||||||
|
return s.config
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Server) Start() error {
|
||||||
|
addr := fmt.Sprintf("%s:%d", s.config.Host, s.config.Port)
|
||||||
|
|
||||||
|
s.router.HideBanner = s.config.HideBanner
|
||||||
|
s.router.HidePort = s.config.HidePort
|
||||||
|
|
||||||
|
return s.router.Start(addr)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Server) Stop(ctx context.Context) error {
|
||||||
|
return s.router.Shutdown(ctx)
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue