// 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") }