package main import ( "context" "errors" "log" "net/http" "os" "os/signal" "syscall" "time" "git.118im.com/im_team/im_workbench/internal/app" "git.118im.com/im_team/im_workbench/internal/config" ) func main() { cfg, err := config.Load() if err != nil { log.Fatalf("load config: %v", err) } server, err := app.New(cfg) if err != nil { log.Fatalf("init app: %v", err) } defer server.Close() httpServer := &http.Server{ Addr: cfg.Listen, Handler: server.Handler(), ReadHeaderTimeout: 5 * time.Second, } errCh := make(chan error, 1) go func() { log.Printf("im_workbench listening on %s", cfg.Listen) if err := httpServer.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) { errCh <- err } }() stopCh := make(chan os.Signal, 1) signal.Notify(stopCh, syscall.SIGINT, syscall.SIGTERM) select { case err := <-errCh: log.Fatalf("serve: %v", err) case <-stopCh: log.Printf("shutdown requested") } ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() if err := httpServer.Shutdown(ctx); err != nil { log.Printf("shutdown error: %v", err) } }