helpers and FX

This commit is contained in:
Zeev Diukman 2024-08-24 16:12:40 +03:00
parent 4e11d7f366
commit 91dea6d444
6 changed files with 310 additions and 153 deletions

View file

@ -1,3 +1,23 @@
module github.com/zeevdiukman/zprox module github.com/zeevdiukman/zprox
go 1.23.0 go 1.23.0
require go.uber.org/fx v1.22.2
require (
github.com/gookit/color v1.5.4 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
golang.org/x/text v0.16.0 // indirect
)
require (
github.com/fatih/color v1.17.0
github.com/gookit/goutil v0.6.16
go.uber.org/dig v1.18.0 // indirect
go.uber.org/multierr v1.10.0 // indirect
go.uber.org/zap v1.26.0 // indirect
golang.org/x/sys v0.23.0 // indirect
golang.org/x/term v0.23.0
)

41
app/go.sum Normal file
View file

@ -0,0 +1,41 @@
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4=
github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI=
github.com/gookit/color v1.5.4 h1:FZmqs7XOyGgCAxmWyPslpiok1k05wmY3SJTytgvYFs0=
github.com/gookit/color v1.5.4/go.mod h1:pZJOeOS8DM43rXbp4AZo1n9zCU2qjpcRko0b6/QJi9w=
github.com/gookit/goutil v0.6.16 h1:9fRMCF4X9abdRD5+2HhBS/GwafjBlTUBjRtA5dgkvuw=
github.com/gookit/goutil v0.6.16/go.mod h1:op2q8AoPDFSiY2+qkHxcBWQMYxOLQ1GbLXqe7vrwscI=
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no=
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM=
go.uber.org/dig v1.18.0 h1:imUL1UiY0Mg4bqbFfsRQO5G4CGRBec/ZujWTvSVp3pw=
go.uber.org/dig v1.18.0/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE=
go.uber.org/fx v1.22.2 h1:iPW+OPxv0G8w75OemJ1RAnTUrF55zOJlXlo1TbJ0Buw=
go.uber.org/fx v1.22.2/go.mod h1:o/D9n+2mLP6v1EG+qsdT1O8wKopYAsqZasju97SDFCU=
go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk=
go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo=
go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=
go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=
go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad h1:ntjMns5wyP/fN65tdBD4g8J5w8n015+iIIs9rtjXkY0=
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM=
golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.23.0 h1:F6D4vR+EHoL9/sWAWgAR1H2DcHr4PareCbAaCo1RpuU=
golang.org/x/term v0.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk=
golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

22
app/helpers/helpers.go Normal file
View file

@ -0,0 +1,22 @@
package helpers
import (
"fmt"
"strings"
"github.com/fatih/color"
"github.com/gookit/goutil/dump"
"golang.org/x/term"
)
func Lines(v ...any) {
w, _, _ := term.GetSize(0)
line := strings.Repeat(">", w-10)
color.HiYellow(line)
fmt.Println("")
for _, a := range v {
dump.Println(a)
}
fmt.Println("")
color.HiYellow(line)
}

View file

@ -3,12 +3,11 @@ package main
import ( import (
"context" "context"
"fmt" "fmt"
"log" "net"
"net/http" "net/http"
"os"
"os/signal" "github.com/zeevdiukman/zprox/helpers"
"syscall" "go.uber.org/fx"
"time"
) )
const ( const (
@ -19,117 +18,54 @@ const (
func init() { func init() {
fmt.Println("ZPROX started") fmt.Println("ZPROX started")
} }
func StartNewServer(lc fx.Lifecycle) *http.Server {
s := &http.Server{
Addr: ":8080",
}
lc.Append(fx.Hook{
OnStart: func(ctx context.Context) error {
ln, err := net.Listen("tcp", s.Addr)
if err != nil {
return err
}
// type Matcher struct { helpers.Lines("Starting HTTP server at", s.Addr)
// r *http.Request go s.ServeTLS(ln, sslCert, sslKey)
// w http.ResponseWriter return nil
// } },
OnStop: func(ctx context.Context) error {
// func (m *Matcher) MatchHost(str string, f ...func(w http.ResponseWriter, r *http.Request)) { return s.Shutdown(ctx)
// if m.r.Host == "test.gotest.com" || m.r.Host == "localhost" { },
// m.w.Write([]byte("test")) })
// } else { return s
// m.w.Write([]byte("404 page not found"))
// m.w.WriteHeader(http.StatusNotFound)
// }
// }
type HandlerFunc func(http.ResponseWriter, *http.Request)
// func (h *HandlerFunc) Handle(f func(w http.ResponseWriter, r *http.Request)) {
// h = h.HandlerFunc()
// // &h.f()
// // if r.Host == "test.gotest.com" {
// // w.Write([]byte("test"))
// // } else {
// // w.Write([]byte("404 page not found"))
// // w.WriteHeader(http.StatusNotFound)
// // }
// }
// func test(w http.ResponseWriter, r *http.Request) {
// if r.Host == "test.gotest.com" {
// w.Write([]byte("login"))
// } else {
// w.Write([]byte("404 page not found"))
// w.WriteHeader(http.StatusNotFound)
// }
// }
// func handle(f HandlerFunc) HandlerFunc {
// HandlerFunc{}.f[0]
// return func(w http.ResponseWriter, r *http.Request) {
// f
// }
// }
// type Mux struct {
// *Handlers
// *Router
// }
// type Handlers []struct{ http.Handler }
// type Router struct{ *http.ServeMux }
// func NewMux() *Mux {
// r := new(Router)
// h := new(Handlers)
// return &Mux{Handlers:h,Router:r}
// }
// func (m *Handlers) Add() {
// h := new(Handlers)
// m = &Mux{h, r}
// &Handlers{f}
// }
type Router struct{ http.ServeMux }
func (r Router) Host(string) {
// router.HandleFunc("")
} }
func StartNewRouter(lc fx.Lifecycle) *http.ServeMux {
r := http.NewServeMux()
lc.Append(fx.Hook{
OnStart: func(ctx context.Context) error {
fmt.Println("HTTP router started.")
return nil
},
OnStop: func(ctx context.Context) error {
fmt.Println("HTTP router stoped.")
return nil
},
})
return r
}
// func GetContructors(lc fx.Lifecycle) any {
// constructors := make(...interface{}, 0)
// constructors = append(constructors, StartNewServer, StartNewRouter)
// return constructors
// }
func main() { func main() {
fx.New(
fx.Provide(StartNewServer, StartNewRouter),
fx.Invoke(func(*http.Server) {}),
).Run()
// var h HandlerFunc // var h HandlerFunc
// h:=func(a HandlerFunc)HandlerFunc{ // h:=func(a HandlerFunc)HandlerFunc{
router := http.NewServeMux()
router.H
// h := Handler.Add(func(w http.ResponseWriter, r *http.Request) {})
// http.Handler.ServeHTTP()
router.HandleFunc("test.gotest.com/", h)
// router.HandleFunc("login.gotest.com/", login)
srv := &http.Server{
Addr: ":8443",
Handler: router,
}
go func() {
if err := srv.ListenAndServeTLS(sslCert, sslKey); err != nil && err != http.ErrServerClosed {
log.Fatalf("Failed to initialize server: %v\n", err)
}
}()
log.Printf("Listening on port %v\n", srv.Addr)
// Wait for kill signal of channel
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
// This blocks until a signal is passed into the quit channel
<-quit
// The context is used to inform the server it has 5 seconds to finish
// the request it is currently handling
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
// Shutdown server
log.Println("\nShutting down server...")
if err := srv.Shutdown(ctx); err != nil {
log.Fatalf("Server forced to shutdown: %v\n", err)
}
} }

138
app/main.go.bkup1 Normal file
View file

@ -0,0 +1,138 @@
package main
import (
"context"
"fmt"
"log"
"net/http"
"os"
"os/signal"
"syscall"
"time"
"go.uber.org/fx"
)
const (
sslCert = "./certs/ssl.crt"
sslKey = "./certs/ssl.key"
)
func init() {
fmt.Println("ZPROX started")
}
// type Matcher struct {
// r *http.Request
// w http.ResponseWriter
// }
// func (m *Matcher) MatchHost(str string, f ...func(w http.ResponseWriter, r *http.Request)) {
// if m.r.Host == "test.gotest.com" || m.r.Host == "localhost" {
// m.w.Write([]byte("test"))
// } else {
// m.w.Write([]byte("404 page not found"))
// m.w.WriteHeader(http.StatusNotFound)
// }
// }
type HandlerFunc func(http.ResponseWriter, *http.Request)
// func (h *HandlerFunc) Handle(f func(w http.ResponseWriter, r *http.Request)) {
// h = h.HandlerFunc()
// // &h.f()
// // if r.Host == "test.gotest.com" {
// // w.Write([]byte("test"))
// // } else {
// // w.Write([]byte("404 page not found"))
// // w.WriteHeader(http.StatusNotFound)
// // }
// }
// func test(w http.ResponseWriter, r *http.Request) {
// if r.Host == "test.gotest.com" {
// w.Write([]byte("login"))
// } else {
// w.Write([]byte("404 page not found"))
// w.WriteHeader(http.StatusNotFound)
// }
// }
// func handle(f HandlerFunc) HandlerFunc {
// HandlerFunc{}.f[0]
// return func(w http.ResponseWriter, r *http.Request) {
// f
// }
// }
// type Mux struct {
// *Handlers
// *Router
// }
// type Handlers []struct{ http.Handler }
// type Router struct{ *http.ServeMux }
// func NewMux() *Mux {
// r := new(Router)
// h := new(Handlers)
// return &Mux{Handlers:h,Router:r}
// }
// func (m *Handlers) Add() {
// h := new(Handlers)
// m = &Mux{h, r}
// &Handlers{f}
// }
type Router struct{ http.ServeMux }
func (r Router) Host(string) {
// router.HandleFunc("")
}
func main() {
app := fx.New()
app.Run()
// var h HandlerFunc
// h:=func(a HandlerFunc)HandlerFunc{
router := http.NewServeMux()
// h := Handler.Add(func(w http.ResponseWriter, r *http.Request) {})
// http.Handler.ServeHTTP()
router.HandleFunc("test.gotest.com/", h)
// router.HandleFunc("login.gotest.com/", login)
srv := &http.Server{
Addr: ":8443",
Handler: router,
}
go func() {
if err := srv.ListenAndServeTLS(sslCert, sslKey); err != nil && err != http.ErrServerClosed {
log.Fatalf("Failed to initialize server: %v\n", err)
}
}()
log.Printf("Listening on port %v\n", srv.Addr)
// Wait for kill signal of channel
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
// This blocks until a signal is passed into the quit channel
<-quit
// The context is used to inform the server it has 5 seconds to finish
// the request it is currently handling
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
// Shutdown server
log.Println("\nShutting down server...")
if err := srv.Shutdown(ctx); err != nil {
log.Fatalf("Server forced to shutdown: %v\n", err)
}
}

View file

@ -14,47 +14,47 @@ services:
# have to use $$ (double-dollar) so docker doesn't try to substitute a variable # have to use $$ (double-dollar) so docker doesn't try to substitute a variable
command: reflex -r "\.go$$" -s -- sh -c "go run ./" command: reflex -r "\.go$$" -s -- sh -c "go run ./"
postgres: # postgres:
image: postgres:latest # image: postgres:latest
restart: always # restart: always
environment: # environment:
- POSTGRES_USER=keycloak # - POSTGRES_USER=keycloak
- POSTGRES_DB=keycloak # - POSTGRES_DB=keycloak
- POSTGRES_PASSWORD=keycloak # - POSTGRES_PASSWORD=keycloak
volumes: # volumes:
- './docker/keycloak/postgres:/var/lib/postgresql/data' # - './docker/keycloak/postgres:/var/lib/postgresql/data'
networks: # networks:
postgres: # postgres:
keycloak: # keycloak:
depends_on: # depends_on:
- postgres # - postgres
image: quay.io/keycloak/keycloak:latest # image: quay.io/keycloak/keycloak:latest
restart: unless-stopped # restart: unless-stopped
command: start # command: start
ports: # ports:
- 4000:8080 # - 4000:8080
networks: # networks:
postgres: # postgres:
environment: # environment:
- KC_PROXY_ADDRESS_FORWARDING=true # - KC_PROXY_ADDRESS_FORWARDING=true
- KC_HOSTNAME_STRICT=false # - KC_HOSTNAME_STRICT=false
- KC_HOSTNAME=keycloak.test.com # - KC_HOSTNAME=keycloak.test.com
# - KC_HOSTNAME_URL=10.0.0.2:4000 # # - KC_HOSTNAME_URL=10.0.0.2:4000
# - KC_HOSTNAME_ADMIN_URL=keycloak.diukman.com # # - KC_HOSTNAME_ADMIN_URL=keycloak.diukman.com
# - KC_PROXY=edge # # - KC_PROXY=edge
- KC_HTTP_ENABLED=true # - KC_HTTP_ENABLED=true
- KC_DB=postgres # - KC_DB=postgres
- KC_DB_USERNAME=keycloak # - KC_DB_USERNAME=keycloak
- KC_DB_PASSWORD=keycloak # - KC_DB_PASSWORD=keycloak
- KC_DB_URL_HOST=postgres # - KC_DB_URL_HOST=postgres
- KC_DB_URL_PORT=5432 # - KC_DB_URL_PORT=5432
- KC_DB_URL_DATABASE=keycloak # - KC_DB_URL_DATABASE=keycloak
- KEYCLOAK_ADMIN=admin # - KEYCLOAK_ADMIN=admin
- KEYCLOAK_ADMIN_PASSWORD=admin # - KEYCLOAK_ADMIN_PASSWORD=admin
labels: # labels:
- "quarkus.transaction-manager.enable-recovery=true" # - "quarkus.transaction-manager.enable-recovery=true"
networks: # networks:
postgres: # postgres:
# networks: # networks:
# - host # - host