| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- // package kernel_serv_http -- встроенный HTTP-сервер
- package kernel_serv_http
- import (
- "embed"
- "log"
- "net/http"
- "os"
- "sync"
- "time"
- "github.com/gofiber/fiber/v2"
- "github.com/gofiber/fiber/v2/middleware/compress"
- "github.com/gofiber/fiber/v2/middleware/filesystem"
- "github.com/gofiber/fiber/v2/middleware/monitor"
- "wartank/kernel/internal/safe_bool"
- . "wartank/kernel/kernel_types"
- . "wartank/pkg/helpers"
- )
- const (
- streamName = "kernel_server_http" // Контрольная строка для ожидателя потока
- )
- // kernelServHttp -- встроенный HTTP-сервер
- type kernelServHttp struct {
- ctx ИЯдроКонтекст
- strPort string // Порт ,на котором слушает HTTP-сервер
- fiberApp *fiber.App
- isWork ИБезопБул
- block sync.Mutex
- }
- //go:embed static/*
- var embedDirStatic embed.FS
- var (
- kernServHttp *kernelServHttp
- block sync.Mutex
- )
- // GetKernelServHttp -- возвращает встроенный HTTP-сервер
- func GetKernelServHttp(ctx ИЯдроКонтекст) ИЯдроСерверВеб {
- log.Println("NewKernelServHttp()")
- block.Lock()
- defer block.Unlock()
- if kernServHttp != nil {
- return kernServHttp
- }
- strPort := os.Getenv("SERVER_HTTP_PORT")
- Паника(strPort != "", "NewKernelServHttp(): env SERVER_HTTP_PORT not set")
- confFiber := fiber.Config{
- ServerHeader: "KernelServerWeb",
- UnescapePath: true,
- ReadTimeout: time.Second * 15,
- WriteTimeout: time.Second * 15,
- AppName: "KernelServerWeb",
- Network: "tcp4",
- EnablePrintRoutes: true,
- }
- sf := &kernelServHttp{
- ctx: ctx,
- strPort: strPort,
- fiberApp: fiber.New(confFiber),
- isWork: safe_bool.НовБезопБул_(),
- }
- sf.fiberApp.Use(compress.New(compress.Config{
- Level: compress.LevelBestCompression, // 2
- }))
- sf.fiberApp.Use("/static", filesystem.New(filesystem.Config{
- Root: http.FS(embedDirStatic),
- PathPrefix: "static",
- Browse: true,
- MaxAge: 3600 * 24,
- }))
- sf.fiberApp.Get("/monitor", monitor.New(monitor.Config{Title: "KernelServerWeb"}))
- err := sf.ctx.Оп().Add(streamName)
- Паника(err == nil, "NewKernelServHttp(): in add stream %v, err=\n\t%v", streamName, err)
- ctx.Уст("fiberApp", sf.fiberApp)
- kernServHttp = sf
- ctx.Уст("kernServHttp", kernServHttp)
- return kernServHttp
- }
- // Fiber -- возвращает объект веб-приложения fiber
- func (sf *kernelServHttp) Fiber() *fiber.App {
- return sf.fiberApp
- }
- // Run -- запускает сервер в работу (блокирующий вызов)
- func (sf *kernelServHttp) Run() {
- go sf.close()
- sf.isWork.Уст()
- err := sf.fiberApp.Listen(":" + sf.strPort)
- if err != nil {
- log.Printf("kernelServHttp.Run(): in listen, err=\n\t%v\n", err)
- sf.ctx.Отменить()
- }
- }
- // Ожидает окончания работы
- func (sf *kernelServHttp) close() {
- <-sf.ctx.Конт().Done()
- sf.block.Lock()
- defer sf.block.Unlock()
- if !sf.isWork.Получ() {
- return
- }
- sf.isWork.Сброс()
- err := sf.fiberApp.Server().Shutdown()
- Провер(err == nil, "kernelServHttp.close(): in close server, err=\n\t%v", err)
- sf.ctx.Оп().Done(streamName)
- log.Println("kernelServHttp.close(): end")
- }
|