From 6ec582a834003808c590e7f55d3908b0cf4cb35a Mon Sep 17 00:00:00 2001 From: maddalax Date: Mon, 11 Nov 2024 09:17:57 -0600 Subject: [PATCH 1/9] allow partials throughout the project, not just partials folder (#72) * allow partials throughout the project, not jsut partials file * route directly to partial * generate correctly even if there is no partials * run cli tests * tidy * only run tests on master if push * add codecov --- .github/workflows/run-cli-tests.yml | 33 +++++++++ .github/workflows/run-framework-tests.yml | 2 +- cli/htmgo/codecov.yml | 5 ++ cli/htmgo/go.mod | 6 ++ cli/htmgo/tasks/astgen/entry.go | 74 +++++++------------ .../tasks/astgen/project-sample/.gitignore | 6 ++ .../tasks/astgen/project-sample/assets.go | 13 ++++ .../astgen/project-sample/assets_prod.go | 16 ++++ cli/htmgo/tasks/astgen/project-sample/go.mod | 13 ++++ cli/htmgo/tasks/astgen/project-sample/go.sum | 18 +++++ .../tasks/astgen/project-sample/htmgo.yml | 21 ++++++ .../project-sample/internal/embedded/os.go | 17 +++++ cli/htmgo/tasks/astgen/project-sample/main.go | 36 +++++++++ .../astgen/project-sample/pages/index.go | 30 ++++++++ .../tasks/astgen/project-sample/pages/root.go | 40 ++++++++++ .../astgen/project-sample/partials/index.go | 11 +++ cli/htmgo/tasks/astgen/registration_test.go | 66 +++++++++++++++++ cli/htmgo/watcher.go | 4 +- 18 files changed, 360 insertions(+), 51 deletions(-) create mode 100644 .github/workflows/run-cli-tests.yml create mode 100644 cli/htmgo/codecov.yml create mode 100644 cli/htmgo/tasks/astgen/project-sample/.gitignore create mode 100644 cli/htmgo/tasks/astgen/project-sample/assets.go create mode 100644 cli/htmgo/tasks/astgen/project-sample/assets_prod.go create mode 100644 cli/htmgo/tasks/astgen/project-sample/go.mod create mode 100644 cli/htmgo/tasks/astgen/project-sample/go.sum create mode 100644 cli/htmgo/tasks/astgen/project-sample/htmgo.yml create mode 100644 cli/htmgo/tasks/astgen/project-sample/internal/embedded/os.go create mode 100644 cli/htmgo/tasks/astgen/project-sample/main.go create mode 100644 cli/htmgo/tasks/astgen/project-sample/pages/index.go create mode 100644 cli/htmgo/tasks/astgen/project-sample/pages/root.go create mode 100644 cli/htmgo/tasks/astgen/project-sample/partials/index.go create mode 100644 cli/htmgo/tasks/astgen/registration_test.go diff --git a/.github/workflows/run-cli-tests.yml b/.github/workflows/run-cli-tests.yml new file mode 100644 index 0000000..547dec7 --- /dev/null +++ b/.github/workflows/run-cli-tests.yml @@ -0,0 +1,33 @@ +name: CLI Tests + +on: + push: + branches: + - master + pull_request: + branches: + - '**' # Runs on any pull request to any branch + +jobs: + test: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Set up Go + uses: actions/setup-go@v4 + with: + go-version: '1.23' # Specify the Go version you need + + - name: Install dependencies + run: cd ./cli/htmgo && go mod download + + - name: Run Go tests + run: cd ./cli/htmgo && go test ./... -coverprofile=coverage.txt + + - name: Upload results to Codecov + uses: codecov/codecov-action@v4 + with: + token: ${{ secrets.CODECOV_TOKEN }} diff --git a/.github/workflows/run-framework-tests.yml b/.github/workflows/run-framework-tests.yml index 87cce04..a342dee 100644 --- a/.github/workflows/run-framework-tests.yml +++ b/.github/workflows/run-framework-tests.yml @@ -3,7 +3,7 @@ name: Framework Tests on: push: branches: - - '**' # Runs on any branch push + - master pull_request: branches: - '**' # Runs on any pull request to any branch diff --git a/cli/htmgo/codecov.yml b/cli/htmgo/codecov.yml new file mode 100644 index 0000000..73f5f03 --- /dev/null +++ b/cli/htmgo/codecov.yml @@ -0,0 +1,5 @@ +coverage: + paths: + - "tasks/astgen/**" + ignore: + - "**" diff --git a/cli/htmgo/go.mod b/cli/htmgo/go.mod index 07945a3..7d67f4e 100644 --- a/cli/htmgo/go.mod +++ b/cli/htmgo/go.mod @@ -7,11 +7,17 @@ require ( github.com/google/uuid v1.6.0 github.com/maddalax/htmgo/framework v1.0.3-0.20241109183230-b234ead96499 github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241109183230-b234ead96499 + github.com/stretchr/testify v1.9.0 golang.org/x/mod v0.21.0 golang.org/x/sys v0.26.0 golang.org/x/tools v0.25.0 ) +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect +) + require ( github.com/bmatcuk/doublestar/v4 v4.7.1 github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/cli/htmgo/tasks/astgen/entry.go b/cli/htmgo/tasks/astgen/entry.go index d53dc85..fc86b59 100644 --- a/cli/htmgo/tasks/astgen/entry.go +++ b/cli/htmgo/tasks/astgen/entry.go @@ -233,59 +233,34 @@ func findPublicFuncsReturningHPage(dir string) ([]Page, error) { } func buildGetPartialFromContext(builder *CodeBuilder, partials []Partial) { - fName := "GetPartialFromContext" - - body := ` - path := r.URL.Path - ` - - if len(partials) == 0 { - body = "" - } - moduleName := GetModuleName() - for _, f := range partials { - if f.FuncName == fName { - continue - } - caller := fmt.Sprintf("%s.%s", f.Package, f.FuncName) - path := fmt.Sprintf("/%s/%s.%s", moduleName, f.Import, f.FuncName) - body += fmt.Sprintf(` - if path == "%s" || path == "%s" { - cc := r.Context().Value(h.RequestContextKey).(*h.RequestContext) - return %s(cc) - } - `, f.FuncName, path, caller) - } - - body += "return nil" - - f := Function{ - Name: fName, - Parameters: []NameType{ - {Name: "r", Type: "*http.Request"}, - }, - Return: []ReturnType{ - {Type: "*h.Partial"}, - }, - Body: body, - } - - builder.Append(builder.BuildFunction(f)) - - registerFunction := fmt.Sprintf(` - func RegisterPartials(router *chi.Mux) { - router.Handle("/%s/partials*", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - partial := GetPartialFromContext(r) + var routerHandlerMethod = func(path string, caller string) string { + return fmt.Sprintf(` + router.Handle("%s", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + cc := r.Context().Value(h.RequestContextKey).(*h.RequestContext) + partial := %s(cc) if partial == nil { w.WriteHeader(404) return } h.PartialView(w, partial) - })) + }))`, path, caller) + } + + handlerMethods := make([]string, 0) + + for _, f := range partials { + caller := fmt.Sprintf("%s.%s", f.Package, f.FuncName) + path := fmt.Sprintf("/%s/%s.%s", moduleName, f.Import, f.FuncName) + handlerMethods = append(handlerMethods, routerHandlerMethod(path, caller)) + } + + registerFunction := fmt.Sprintf(` + func RegisterPartials(router *chi.Mux) { + %s } - `, moduleName) + `, strings.Join(handlerMethods, "\n")) builder.AppendLine(registerFunction) } @@ -294,7 +269,7 @@ func writePartialsFile() { config := dirutil.GetConfig() cwd := process.GetWorkingDir() - partialPath := filepath.Join(cwd, "partials") + partialPath := filepath.Join(cwd) partials, err := findPublicFuncsReturningHPartial(partialPath, func(partial Partial) bool { return partial.FuncName != "GetPartialFromContext" }) @@ -311,10 +286,13 @@ func writePartialsFile() { builder := NewCodeBuilder(nil) builder.AppendLine(GeneratedFileLine) builder.AppendLine(PackageName) - builder.AddImport(ModuleName) - builder.AddImport(HttpModuleName) builder.AddImport(ChiModuleName) + if len(partials) > 0 { + builder.AddImport(ModuleName) + builder.AddImport(HttpModuleName) + } + moduleName := GetModuleName() for _, partial := range partials { builder.AddImport(fmt.Sprintf(`%s/%s`, moduleName, partial.Import)) diff --git a/cli/htmgo/tasks/astgen/project-sample/.gitignore b/cli/htmgo/tasks/astgen/project-sample/.gitignore new file mode 100644 index 0000000..3d6a979 --- /dev/null +++ b/cli/htmgo/tasks/astgen/project-sample/.gitignore @@ -0,0 +1,6 @@ +/assets/dist +tmp +node_modules +.idea +__htmgo +dist \ No newline at end of file diff --git a/cli/htmgo/tasks/astgen/project-sample/assets.go b/cli/htmgo/tasks/astgen/project-sample/assets.go new file mode 100644 index 0000000..0a7e4a2 --- /dev/null +++ b/cli/htmgo/tasks/astgen/project-sample/assets.go @@ -0,0 +1,13 @@ +//go:build !prod +// +build !prod + +package main + +import ( + "astgen-project-sample/internal/embedded" + "io/fs" +) + +func GetStaticAssets() fs.FS { + return embedded.NewOsFs() +} diff --git a/cli/htmgo/tasks/astgen/project-sample/assets_prod.go b/cli/htmgo/tasks/astgen/project-sample/assets_prod.go new file mode 100644 index 0000000..f0598e1 --- /dev/null +++ b/cli/htmgo/tasks/astgen/project-sample/assets_prod.go @@ -0,0 +1,16 @@ +//go:build prod +// +build prod + +package main + +import ( + "embed" + "io/fs" +) + +//go:embed assets/dist/* +var staticAssets embed.FS + +func GetStaticAssets() fs.FS { + return staticAssets +} diff --git a/cli/htmgo/tasks/astgen/project-sample/go.mod b/cli/htmgo/tasks/astgen/project-sample/go.mod new file mode 100644 index 0000000..981c812 --- /dev/null +++ b/cli/htmgo/tasks/astgen/project-sample/go.mod @@ -0,0 +1,13 @@ +module astgen-project-sample + +go 1.23.0 + +require ( + github.com/go-chi/chi/v5 v5.1.0 + github.com/maddalax/htmgo/framework v1.0.3-0.20241109183230-b234ead96499 +) + +require ( + github.com/google/uuid v1.6.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/cli/htmgo/tasks/astgen/project-sample/go.sum b/cli/htmgo/tasks/astgen/project-sample/go.sum new file mode 100644 index 0000000..bbed914 --- /dev/null +++ b/cli/htmgo/tasks/astgen/project-sample/go.sum @@ -0,0 +1,18 @@ +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/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= +github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/maddalax/htmgo/framework v1.0.3-0.20241109183230-b234ead96499 h1:hQF++Rt9lJHUFk8PG097MTbpl2NnEcbot0iy8ZVPSOI= +github.com/maddalax/htmgo/framework v1.0.3-0.20241109183230-b234ead96499/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +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.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/cli/htmgo/tasks/astgen/project-sample/htmgo.yml b/cli/htmgo/tasks/astgen/project-sample/htmgo.yml new file mode 100644 index 0000000..3074bbe --- /dev/null +++ b/cli/htmgo/tasks/astgen/project-sample/htmgo.yml @@ -0,0 +1,21 @@ +# htmgo configuration + +# if tailwindcss is enabled, htmgo will automatically compile your tailwind and output it to assets/dist +tailwind: true + +# which directories to ignore when watching for changes, supports glob patterns through https://github.com/bmatcuk/doublestar +watch_ignore: [".git", "node_modules", "dist/*"] + +# files to watch for changes, supports glob patterns through https://github.com/bmatcuk/doublestar +watch_files: ["**/*.go", "**/*.css", "**/*.md"] + +# files or directories to ignore when automatically registering routes for pages +# supports glob patterns through https://github.com/bmatcuk/doublestar +automatic_page_routing_ignore: ["root.go"] + +# files or directories to ignore when automatically registering routes for partials +# supports glob patterns through https://github.com/bmatcuk/doublestar +automatic_partial_routing_ignore: [] + +# url path of where the public assets are located +public_asset_path: "/public" diff --git a/cli/htmgo/tasks/astgen/project-sample/internal/embedded/os.go b/cli/htmgo/tasks/astgen/project-sample/internal/embedded/os.go new file mode 100644 index 0000000..ddfd55f --- /dev/null +++ b/cli/htmgo/tasks/astgen/project-sample/internal/embedded/os.go @@ -0,0 +1,17 @@ +package embedded + +import ( + "io/fs" + "os" +) + +type OsFs struct { +} + +func (receiver OsFs) Open(name string) (fs.File, error) { + return os.Open(name) +} + +func NewOsFs() OsFs { + return OsFs{} +} diff --git a/cli/htmgo/tasks/astgen/project-sample/main.go b/cli/htmgo/tasks/astgen/project-sample/main.go new file mode 100644 index 0000000..1d57a6b --- /dev/null +++ b/cli/htmgo/tasks/astgen/project-sample/main.go @@ -0,0 +1,36 @@ +package main + +import ( + "astgen-project-sample/__htmgo" + "fmt" + "github.com/maddalax/htmgo/framework/config" + "github.com/maddalax/htmgo/framework/h" + "github.com/maddalax/htmgo/framework/service" + "io/fs" + "net/http" +) + +func main() { + locator := service.NewLocator() + cfg := config.Get() + + h.Start(h.AppOpts{ + ServiceLocator: locator, + LiveReload: true, + Register: func(app *h.App) { + sub, err := fs.Sub(GetStaticAssets(), "assets/dist") + + if err != nil { + panic(err) + } + + http.FileServerFS(sub) + + // change this in htmgo.yml (public_asset_path) + app.Router.Handle(fmt.Sprintf("%s/*", cfg.PublicAssetPath), + http.StripPrefix(cfg.PublicAssetPath, http.FileServerFS(sub))) + + __htmgo.Register(app.Router) + }, + }) +} diff --git a/cli/htmgo/tasks/astgen/project-sample/pages/index.go b/cli/htmgo/tasks/astgen/project-sample/pages/index.go new file mode 100644 index 0000000..2eb3d58 --- /dev/null +++ b/cli/htmgo/tasks/astgen/project-sample/pages/index.go @@ -0,0 +1,30 @@ +package pages + +import ( + "github.com/maddalax/htmgo/framework/h" +) + +func IndexPage(ctx *h.RequestContext) *h.Page { + return RootPage( + h.Div( + h.Class("flex flex-col gap-4 items-center pt-24 min-h-screen bg-neutral-100"), + h.H3( + h.Id("intro-text"), + h.Text("hello htmgo"), + h.Class("text-5xl"), + ), + h.Div( + h.Class("mt-3"), + ), + h.Div(), + ), + ) +} + +func TestPartial(ctx *h.RequestContext) *h.Partial { + return h.NewPartial( + h.Div( + h.Text("Hello World"), + ), + ) +} diff --git a/cli/htmgo/tasks/astgen/project-sample/pages/root.go b/cli/htmgo/tasks/astgen/project-sample/pages/root.go new file mode 100644 index 0000000..65cb7a9 --- /dev/null +++ b/cli/htmgo/tasks/astgen/project-sample/pages/root.go @@ -0,0 +1,40 @@ +package pages + +import ( + "github.com/maddalax/htmgo/framework/h" +) + +func RootPage(children ...h.Ren) *h.Page { + title := "htmgo template" + description := "an example of the htmgo template" + author := "htmgo" + url := "https://htmgo.dev" + + return h.NewPage( + h.Html( + h.HxExtensions( + h.BaseExtensions(), + ), + h.Head( + h.Title( + h.Text(title), + ), + h.Meta("viewport", "width=device-width, initial-scale=1"), + h.Meta("title", title), + h.Meta("charset", "utf-8"), + h.Meta("author", author), + h.Meta("description", description), + h.Meta("og:title", title), + h.Meta("og:url", url), + h.Link("canonical", url), + h.Meta("og:description", description), + ), + h.Body( + h.Div( + h.Class("flex flex-col gap-2 bg-white h-full"), + h.Fragment(children...), + ), + ), + ), + ) +} diff --git a/cli/htmgo/tasks/astgen/project-sample/partials/index.go b/cli/htmgo/tasks/astgen/project-sample/partials/index.go new file mode 100644 index 0000000..43f1aeb --- /dev/null +++ b/cli/htmgo/tasks/astgen/project-sample/partials/index.go @@ -0,0 +1,11 @@ +package partials + +import "github.com/maddalax/htmgo/framework/h" + +func CountersPartial(ctx *h.RequestContext) *h.Partial { + return h.NewPartial( + h.Div( + h.Text("my counter"), + ), + ) +} diff --git a/cli/htmgo/tasks/astgen/registration_test.go b/cli/htmgo/tasks/astgen/registration_test.go new file mode 100644 index 0000000..2e0b088 --- /dev/null +++ b/cli/htmgo/tasks/astgen/registration_test.go @@ -0,0 +1,66 @@ +package astgen + +import ( + "fmt" + "github.com/maddalax/htmgo/cli/htmgo/internal/dirutil" + "github.com/maddalax/htmgo/cli/htmgo/tasks/process" + "github.com/stretchr/testify/assert" + "net/http" + "os" + "path/filepath" + "sync" + "testing" + "time" +) + +func TestAstGen(t *testing.T) { + t.Parallel() + + workingDir, err := filepath.Abs("./project-sample") + + assert.NoError(t, err) + process.SetWorkingDir(workingDir) + assert.NoError(t, os.Chdir(workingDir)) + + err = dirutil.DeleteDir(filepath.Join(process.GetWorkingDir(), "__htmgo")) + assert.NoError(t, err) + err = process.Run(process.NewRawCommand("", "go build .")) + assert.Error(t, err) + err = GenAst() + assert.NoError(t, err) + + go func() { + // project was buildable after astgen, confirmed working + err = process.Run(process.NewRawCommand("server", "go run .")) + assert.NoError(t, err) + }() + + time.Sleep(time.Second * 1) + + urls := []string{ + "/astgen-project-sample/partials.CountersPartial", + "/", + "/astgen-project-sample/pages.TestPartial", + } + + defer func() { + serverProcess := process.GetProcessByName("server") + assert.NotNil(t, serverProcess) + process.KillProcess(*serverProcess) + }() + + wg := sync.WaitGroup{} + + for _, url := range urls { + wg.Add(1) + go func() { + defer wg.Done() + // ensure we can get a 200 response on the partials + resp, e := http.Get(fmt.Sprintf("http://localhost:3000%s", url)) + assert.NoError(t, e) + assert.Equal(t, http.StatusOK, resp.StatusCode, fmt.Sprintf("%s was not a 200 response", url)) + }() + } + + wg.Wait() +} diff --git a/cli/htmgo/watcher.go b/cli/htmgo/watcher.go index 4838d14..6ec55c4 100644 --- a/cli/htmgo/watcher.go +++ b/cli/htmgo/watcher.go @@ -89,7 +89,7 @@ func startWatcher(cb func(version string, file []*fsnotify.Event)) { if !ok { return } - slog.Error("error:", err.Error()) + slog.Error("error:", slog.String("error", err.Error())) } } }() @@ -118,7 +118,7 @@ func startWatcher(cb func(version string, file []*fsnotify.Event)) { if info.IsDir() { err = watcher.Add(path) if err != nil { - slog.Error("Error adding directory to watcher:", err) + slog.Error("Error adding directory to watcher:", slog.String("error", err.Error())) } else { slog.Debug("Watching directory:", slog.String("path", path)) } From dc8a62313cdf5d825bca787a1ea4d4251148e275 Mon Sep 17 00:00:00 2001 From: maddalax Date: Mon, 11 Nov 2024 09:55:09 -0600 Subject: [PATCH 2/9] only generate routes for partials or pages that have *h.RequestContext as a param --- cli/htmgo/tasks/astgen/entry.go | 30 +++++++++++++++++-- .../astgen/project-sample/partials/index.go | 7 +++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/cli/htmgo/tasks/astgen/entry.go b/cli/htmgo/tasks/astgen/entry.go index fc86b59..359f39e 100644 --- a/cli/htmgo/tasks/astgen/entry.go +++ b/cli/htmgo/tasks/astgen/entry.go @@ -100,6 +100,32 @@ func sliceCommonPrefix(dir1, dir2 string) string { return normalizePath(slicedDir2) } +func hasOnlyReqContextParam(funcType *ast.FuncType) bool { + if len(funcType.Params.List) != 1 { + return false + } + if funcType.Params.List[0].Names == nil { + return false + } + if len(funcType.Params.List[0].Names) != 1 { + return false + } + t := funcType.Params.List[0].Type + name, ok := t.(*ast.StarExpr) + if !ok { + return false + } + selectorExpr, ok := name.X.(*ast.SelectorExpr) + if !ok { + return false + } + ident, ok := selectorExpr.X.(*ast.Ident) + if !ok { + return false + } + return ident.Name == "h" && selectorExpr.Sel.Name == "RequestContext" +} + func findPublicFuncsReturningHPartial(dir string, predicate func(partial Partial) bool) ([]Partial, error) { var partials []Partial cwd := process.GetWorkingDir() @@ -136,7 +162,7 @@ func findPublicFuncsReturningHPartial(dir string, predicate func(partial Partial if selectorExpr, ok := starExpr.X.(*ast.SelectorExpr); ok { // Check if the package name is 'h' and type is 'Partial'. if ident, ok := selectorExpr.X.(*ast.Ident); ok && ident.Name == "h" { - if selectorExpr.Sel.Name == "Partial" { + if selectorExpr.Sel.Name == "Partial" && hasOnlyReqContextParam(funcDecl.Type) { p := Partial{ Package: node.Name.Name, Path: normalizePath(sliceCommonPrefix(cwd, path)), @@ -203,7 +229,7 @@ func findPublicFuncsReturningHPage(dir string) ([]Page, error) { if selectorExpr, ok := starExpr.X.(*ast.SelectorExpr); ok { // Check if the package name is 'h' and type is 'Partial'. if ident, ok := selectorExpr.X.(*ast.Ident); ok && ident.Name == "h" { - if selectorExpr.Sel.Name == "Page" { + if selectorExpr.Sel.Name == "Page" && hasOnlyReqContextParam(funcDecl.Type) { pages = append(pages, Page{ Package: node.Name.Name, Import: normalizePath(filepath.Dir(path)), diff --git a/cli/htmgo/tasks/astgen/project-sample/partials/index.go b/cli/htmgo/tasks/astgen/project-sample/partials/index.go index 43f1aeb..fbec3d2 100644 --- a/cli/htmgo/tasks/astgen/project-sample/partials/index.go +++ b/cli/htmgo/tasks/astgen/project-sample/partials/index.go @@ -9,3 +9,10 @@ func CountersPartial(ctx *h.RequestContext) *h.Partial { ), ) } + +func SwapFormError(ctx *h.RequestContext, error string) *h.Partial { + return h.SwapPartial( + ctx, + h.Div(), + ) +} From a2d3a367d15778888c927f02edd0e3cfdc62e52e Mon Sep 17 00:00:00 2001 From: maddalax Date: Mon, 11 Nov 2024 10:01:11 -0600 Subject: [PATCH 3/9] move codecov --- cli/htmgo/codecov.yml => codecov.yml | 1 + 1 file changed, 1 insertion(+) rename cli/htmgo/codecov.yml => codecov.yml (75%) diff --git a/cli/htmgo/codecov.yml b/codecov.yml similarity index 75% rename from cli/htmgo/codecov.yml rename to codecov.yml index 73f5f03..42c1096 100644 --- a/cli/htmgo/codecov.yml +++ b/codecov.yml @@ -1,5 +1,6 @@ coverage: paths: - "tasks/astgen/**" + - "framework/**" ignore: - "**" From d2d8e449ae8a7e9c7a28ce1876958ef0b7ecf457 Mon Sep 17 00:00:00 2001 From: maddalax Date: Mon, 11 Nov 2024 10:10:40 -0600 Subject: [PATCH 4/9] does this work --- codecov.yml | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/codecov.yml b/codecov.yml index 42c1096..49e98dd 100644 --- a/codecov.yml +++ b/codecov.yml @@ -1,6 +1,3 @@ -coverage: - paths: - - "tasks/astgen/**" - - "framework/**" - ignore: - - "**" +ignore: + - "cli/htmgo/tasks/**" + - "!cli/htmgo/tasks/astgen/**" From 97a5687f2e3f16f80bc28dddcbbb4ef5f8709392 Mon Sep 17 00:00:00 2001 From: maddalax Date: Mon, 11 Nov 2024 10:12:29 -0600 Subject: [PATCH 5/9] astgen only --- .github/workflows/run-cli-tests.yml | 2 +- codecov.yml | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) delete mode 100644 codecov.yml diff --git a/.github/workflows/run-cli-tests.yml b/.github/workflows/run-cli-tests.yml index 547dec7..31d8bc5 100644 --- a/.github/workflows/run-cli-tests.yml +++ b/.github/workflows/run-cli-tests.yml @@ -25,7 +25,7 @@ jobs: run: cd ./cli/htmgo && go mod download - name: Run Go tests - run: cd ./cli/htmgo && go test ./... -coverprofile=coverage.txt + run: cd ./cli/htmgo/tasks/astgen && go test ./... -coverprofile=coverage.txt - name: Upload results to Codecov uses: codecov/codecov-action@v4 diff --git a/codecov.yml b/codecov.yml deleted file mode 100644 index 49e98dd..0000000 --- a/codecov.yml +++ /dev/null @@ -1,3 +0,0 @@ -ignore: - - "cli/htmgo/tasks/**" - - "!cli/htmgo/tasks/astgen/**" From 257def3b5351ea6140cc25bb9846b64f2731d5f8 Mon Sep 17 00:00:00 2001 From: maddalax Date: Tue, 12 Nov 2024 08:55:35 -0600 Subject: [PATCH 6/9] up cli version --- cli/htmgo/runner.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/htmgo/runner.go b/cli/htmgo/runner.go index 3f799a8..2b8a7e0 100644 --- a/cli/htmgo/runner.go +++ b/cli/htmgo/runner.go @@ -18,7 +18,7 @@ import ( "strings" ) -const version = "1.0.4" +const version = "1.0.5" func main() { needsSignals := true From 423fd3f42985c9ff3b3734043738ab507c2821e6 Mon Sep 17 00:00:00 2001 From: maddalax Date: Tue, 12 Nov 2024 13:04:20 -0600 Subject: [PATCH 7/9] move socket manager --- extensions/websocket/init.go | 4 ++-- extensions/websocket/internal/wsutil/handler.go | 5 +++-- extensions/websocket/ws/access.go | 5 ++--- extensions/websocket/ws/dispatch.go | 3 +-- extensions/websocket/ws/every.go | 3 +-- extensions/websocket/ws/handler.go | 7 +++---- extensions/websocket/ws/listener.go | 7 +++---- extensions/websocket/{internal/wsutil => ws}/manager.go | 2 +- .../websocket/{internal/wsutil => ws}/manager_test.go | 2 +- extensions/websocket/ws/metrics.go | 3 +-- extensions/websocket/ws/register.go | 7 +++---- 11 files changed, 21 insertions(+), 27 deletions(-) rename extensions/websocket/{internal/wsutil => ws}/manager.go (99%) rename extensions/websocket/{internal/wsutil => ws}/manager_test.go (99%) diff --git a/extensions/websocket/init.go b/extensions/websocket/init.go index 9261063..980691e 100644 --- a/extensions/websocket/init.go +++ b/extensions/websocket/init.go @@ -21,8 +21,8 @@ func EnableExtension(app *h.App, opts opts.ExtensionOpts) { panic("websocket: SessionId func is required") } - service.Set[wsutil.SocketManager](app.Opts.ServiceLocator, service.Singleton, func() *wsutil.SocketManager { - manager := wsutil.NewSocketManager(&opts) + service.Set[ws.SocketManager](app.Opts.ServiceLocator, service.Singleton, func() *ws.SocketManager { + manager := ws.NewSocketManager(&opts) manager.StartMetrics() return manager }) diff --git a/extensions/websocket/internal/wsutil/handler.go b/extensions/websocket/internal/wsutil/handler.go index 1096dd5..0b320b9 100644 --- a/extensions/websocket/internal/wsutil/handler.go +++ b/extensions/websocket/internal/wsutil/handler.go @@ -6,6 +6,7 @@ import ( "github.com/gobwas/ws" "github.com/gobwas/ws/wsutil" ws2 "github.com/maddalax/htmgo/extensions/websocket/opts" + ws3 "github.com/maddalax/htmgo/extensions/websocket/ws" "github.com/maddalax/htmgo/framework/h" "github.com/maddalax/htmgo/framework/service" "log/slog" @@ -25,7 +26,7 @@ func WsHttpHandler(opts *ws2.ExtensionOpts) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { cc := r.Context().Value(h.RequestContextKey).(*h.RequestContext) locator := cc.ServiceLocator() - manager := service.Get[SocketManager](locator) + manager := service.Get[ws3.SocketManager](locator) sessionId := opts.SessionId(cc) @@ -46,7 +47,7 @@ func WsHttpHandler(opts *ws2.ExtensionOpts) http.HandlerFunc { we don't want to block the writer */ done := make(chan bool, 1000) - writer := make(WriterChan, 1000) + writer := make(ws3.WriterChan, 1000) wg := sync.WaitGroup{} diff --git a/extensions/websocket/ws/access.go b/extensions/websocket/ws/access.go index efa63c5..012d859 100644 --- a/extensions/websocket/ws/access.go +++ b/extensions/websocket/ws/access.go @@ -1,10 +1,9 @@ package ws import ( - "github.com/maddalax/htmgo/extensions/websocket/internal/wsutil" "github.com/maddalax/htmgo/framework/h" ) -func ManagerFromCtx(ctx *h.RequestContext) *wsutil.SocketManager { - return wsutil.SocketManagerFromCtx(ctx) +func ManagerFromCtx(ctx *h.RequestContext) *SocketManager { + return SocketManagerFromCtx(ctx) } diff --git a/extensions/websocket/ws/dispatch.go b/extensions/websocket/ws/dispatch.go index 248b649..53ed0f3 100644 --- a/extensions/websocket/ws/dispatch.go +++ b/extensions/websocket/ws/dispatch.go @@ -1,7 +1,6 @@ package ws import ( - "github.com/maddalax/htmgo/extensions/websocket/internal/wsutil" "github.com/maddalax/htmgo/extensions/websocket/session" "github.com/maddalax/htmgo/framework/h" "github.com/maddalax/htmgo/framework/service" @@ -33,7 +32,7 @@ func PushElement(data HandlerData, el *h.Element) bool { // PushElementCtx sends an element to the current session and swaps it into the page func PushElementCtx(ctx *h.RequestContext, el *h.Element) bool { locator := ctx.ServiceLocator() - socketManager := service.Get[wsutil.SocketManager](locator) + socketManager := service.Get[SocketManager](locator) socketId := session.GetSessionId(ctx) socket := socketManager.Get(string(socketId)) if socket == nil { diff --git a/extensions/websocket/ws/every.go b/extensions/websocket/ws/every.go index 679d3d5..d549c53 100644 --- a/extensions/websocket/ws/every.go +++ b/extensions/websocket/ws/every.go @@ -1,7 +1,6 @@ package ws import ( - "github.com/maddalax/htmgo/extensions/websocket/internal/wsutil" "github.com/maddalax/htmgo/extensions/websocket/session" "github.com/maddalax/htmgo/framework/h" "github.com/maddalax/htmgo/framework/service" @@ -12,7 +11,7 @@ import ( func Every(ctx *h.RequestContext, interval time.Duration, cb func() bool) { socketId := session.GetSessionId(ctx) locator := ctx.ServiceLocator() - manager := service.Get[wsutil.SocketManager](locator) + manager := service.Get[SocketManager](locator) manager.RunIntervalWithSocket(string(socketId), interval, cb) } diff --git a/extensions/websocket/ws/handler.go b/extensions/websocket/ws/handler.go index 2d0bbb7..07c3080 100644 --- a/extensions/websocket/ws/handler.go +++ b/extensions/websocket/ws/handler.go @@ -2,16 +2,15 @@ package ws import ( "fmt" - "github.com/maddalax/htmgo/extensions/websocket/internal/wsutil" "github.com/maddalax/htmgo/extensions/websocket/session" "sync" ) type MessageHandler struct { - manager *wsutil.SocketManager + manager *SocketManager } -func NewMessageHandler(manager *wsutil.SocketManager) *MessageHandler { +func NewMessageHandler(manager *SocketManager) *MessageHandler { return &MessageHandler{manager: manager} } @@ -77,7 +76,7 @@ func (h *MessageHandler) OnDomElementRemoved(handlerId string) { handlers.Delete(handlerId) } -func (h *MessageHandler) OnSocketDisconnected(event wsutil.SocketEvent) { +func (h *MessageHandler) OnSocketDisconnected(event SocketEvent) { sessionId := session.Id(event.SessionId) hashes, ok := sessionIdToHashes.Load(sessionId) if ok { diff --git a/extensions/websocket/ws/listener.go b/extensions/websocket/ws/listener.go index 5556331..9b4965b 100644 --- a/extensions/websocket/ws/listener.go +++ b/extensions/websocket/ws/listener.go @@ -1,13 +1,12 @@ package ws import ( - "github.com/maddalax/htmgo/extensions/websocket/internal/wsutil" "github.com/maddalax/htmgo/extensions/websocket/session" "github.com/maddalax/htmgo/framework/service" ) func StartListener(locator *service.Locator) { - manager := service.Get[wsutil.SocketManager](locator) + manager := service.Get[SocketManager](locator) manager.Listen(socketMessageListener) handler := NewMessageHandler(manager) go func() { @@ -23,9 +22,9 @@ func handle(handler *MessageHandler) { handler.OnServerSideEvent(event) case event := <-socketMessageListener: switch event.Type { - case wsutil.DisconnectedEvent: + case DisconnectedEvent: handler.OnSocketDisconnected(event) - case wsutil.MessageEvent: + case MessageEvent: handlerId, ok := event.Payload["id"].(string) eventName, ok2 := event.Payload["event"].(string) diff --git a/extensions/websocket/internal/wsutil/manager.go b/extensions/websocket/ws/manager.go similarity index 99% rename from extensions/websocket/internal/wsutil/manager.go rename to extensions/websocket/ws/manager.go index d274fe1..6fd6db6 100644 --- a/extensions/websocket/internal/wsutil/manager.go +++ b/extensions/websocket/ws/manager.go @@ -1,4 +1,4 @@ -package wsutil +package ws import ( "fmt" diff --git a/extensions/websocket/internal/wsutil/manager_test.go b/extensions/websocket/ws/manager_test.go similarity index 99% rename from extensions/websocket/internal/wsutil/manager_test.go rename to extensions/websocket/ws/manager_test.go index 0ba95d4..3c05a6f 100644 --- a/extensions/websocket/internal/wsutil/manager_test.go +++ b/extensions/websocket/ws/manager_test.go @@ -1,4 +1,4 @@ -package wsutil +package ws import ( ws2 "github.com/maddalax/htmgo/extensions/websocket/opts" diff --git a/extensions/websocket/ws/metrics.go b/extensions/websocket/ws/metrics.go index 258493b..29bbe79 100644 --- a/extensions/websocket/ws/metrics.go +++ b/extensions/websocket/ws/metrics.go @@ -1,12 +1,11 @@ package ws import ( - "github.com/maddalax/htmgo/extensions/websocket/internal/wsutil" "github.com/maddalax/htmgo/framework/h" ) type Metrics struct { - Manager wsutil.ManagerMetrics + Manager ManagerMetrics Handler HandlerMetrics } diff --git a/extensions/websocket/ws/register.go b/extensions/websocket/ws/register.go index b7350fd..d24d0d1 100644 --- a/extensions/websocket/ws/register.go +++ b/extensions/websocket/ws/register.go @@ -1,7 +1,6 @@ package ws import ( - "github.com/maddalax/htmgo/extensions/websocket/internal/wsutil" "github.com/maddalax/htmgo/extensions/websocket/session" "github.com/maddalax/htmgo/framework/h" "github.com/puzpuzpuz/xsync/v3" @@ -11,8 +10,8 @@ import ( type HandlerData struct { SessionId session.Id - Socket *wsutil.SocketConnection - Manager *wsutil.SocketManager + Socket *SocketConnection + Manager *SocketManager } type Handler func(data HandlerData) @@ -29,7 +28,7 @@ var sessionIdToHashes = xsync.NewMapOf[session.Id, map[KeyHash]bool]() var hashesToSessionId = xsync.NewMapOf[KeyHash, session.Id]() var serverEventNamesToHash = xsync.NewMapOf[string, map[KeyHash]bool]() -var socketMessageListener = make(chan wsutil.SocketEvent, 100) +var socketMessageListener = make(chan SocketEvent, 100) var serverSideMessageListener = make(chan ServerSideEvent, 100) var lock = sync.Mutex{} var callingHandler = atomic.Bool{} From b06d1b14bd0c5a877d9f1a98fe0f2a6f18802991 Mon Sep 17 00:00:00 2001 From: maddalax Date: Tue, 12 Nov 2024 18:15:59 -0600 Subject: [PATCH 8/9] log http requests --- htmgo-site/internal/urlhelper/ip.go | 27 +++++++++++++++++++++++++++ htmgo-site/main.go | 11 ++++++++--- 2 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 htmgo-site/internal/urlhelper/ip.go diff --git a/htmgo-site/internal/urlhelper/ip.go b/htmgo-site/internal/urlhelper/ip.go new file mode 100644 index 0000000..2d33209 --- /dev/null +++ b/htmgo-site/internal/urlhelper/ip.go @@ -0,0 +1,27 @@ +package urlhelper + +import ( + "net/http" + "strings" +) + +func GetClientIp(r *http.Request) string { + // Try to get the real client IP from the 'CF-Connecting-IP' header + if ip := r.Header.Get("CF-Connecting-IP"); ip != "" { + return ip + } + + // If not available, fall back to 'X-Forwarded-For' + if ip := r.Header.Get("X-Forwarded-For"); ip != "" { + return ip + } + + // Otherwise, use the default remote address (this will be Cloudflare's IP) + remote := r.RemoteAddr + + if strings.HasPrefix(remote, "[::1]") { + return "localhost" + } + + return remote +} diff --git a/htmgo-site/main.go b/htmgo-site/main.go index 5c6a484..35914f3 100644 --- a/htmgo-site/main.go +++ b/htmgo-site/main.go @@ -1,14 +1,15 @@ package main import ( - "fmt" "github.com/maddalax/htmgo/framework/h" "github.com/maddalax/htmgo/framework/service" "htmgo-site/__htmgo" "htmgo-site/internal/cache" "htmgo-site/internal/markdown" "htmgo-site/internal/sitemap" + "htmgo-site/internal/urlhelper" "io/fs" + "log" "net/http" ) @@ -20,13 +21,17 @@ func main() { service.Set(locator, service.Singleton, markdown.NewRenderer) service.Set(locator, service.Singleton, cache.NewSimpleCache) - fmt.Printf("starting up server2\n") - h.Start(h.AppOpts{ ServiceLocator: locator, LiveReload: true, Register: func(app *h.App) { + app.Use(func(ctx *h.RequestContext) { + r := ctx.Request + // Log the details of the incoming request + log.Printf("Method: %s, URL: %s, RemoteAddr: %s", r.Method, r.URL.String(), urlhelper.GetClientIp(r)) + }) + app.UseWithContext(func(w http.ResponseWriter, r *http.Request, context map[string]any) { context["embeddedMarkdown"] = markdownAssets }) From 971f05c0051085f0bd70f80e872da54f5d04826f Mon Sep 17 00:00:00 2001 From: maddalax Date: Tue, 12 Nov 2024 18:16:20 -0600 Subject: [PATCH 9/9] Revert "move socket manager" This reverts commit 423fd3f42985c9ff3b3734043738ab507c2821e6. --- extensions/websocket/init.go | 4 ++-- extensions/websocket/internal/wsutil/handler.go | 5 ++--- extensions/websocket/{ws => internal/wsutil}/manager.go | 2 +- .../websocket/{ws => internal/wsutil}/manager_test.go | 2 +- extensions/websocket/ws/access.go | 5 +++-- extensions/websocket/ws/dispatch.go | 3 ++- extensions/websocket/ws/every.go | 3 ++- extensions/websocket/ws/handler.go | 7 ++++--- extensions/websocket/ws/listener.go | 7 ++++--- extensions/websocket/ws/metrics.go | 3 ++- extensions/websocket/ws/register.go | 7 ++++--- 11 files changed, 27 insertions(+), 21 deletions(-) rename extensions/websocket/{ws => internal/wsutil}/manager.go (99%) rename extensions/websocket/{ws => internal/wsutil}/manager_test.go (99%) diff --git a/extensions/websocket/init.go b/extensions/websocket/init.go index 980691e..9261063 100644 --- a/extensions/websocket/init.go +++ b/extensions/websocket/init.go @@ -21,8 +21,8 @@ func EnableExtension(app *h.App, opts opts.ExtensionOpts) { panic("websocket: SessionId func is required") } - service.Set[ws.SocketManager](app.Opts.ServiceLocator, service.Singleton, func() *ws.SocketManager { - manager := ws.NewSocketManager(&opts) + service.Set[wsutil.SocketManager](app.Opts.ServiceLocator, service.Singleton, func() *wsutil.SocketManager { + manager := wsutil.NewSocketManager(&opts) manager.StartMetrics() return manager }) diff --git a/extensions/websocket/internal/wsutil/handler.go b/extensions/websocket/internal/wsutil/handler.go index 0b320b9..1096dd5 100644 --- a/extensions/websocket/internal/wsutil/handler.go +++ b/extensions/websocket/internal/wsutil/handler.go @@ -6,7 +6,6 @@ import ( "github.com/gobwas/ws" "github.com/gobwas/ws/wsutil" ws2 "github.com/maddalax/htmgo/extensions/websocket/opts" - ws3 "github.com/maddalax/htmgo/extensions/websocket/ws" "github.com/maddalax/htmgo/framework/h" "github.com/maddalax/htmgo/framework/service" "log/slog" @@ -26,7 +25,7 @@ func WsHttpHandler(opts *ws2.ExtensionOpts) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { cc := r.Context().Value(h.RequestContextKey).(*h.RequestContext) locator := cc.ServiceLocator() - manager := service.Get[ws3.SocketManager](locator) + manager := service.Get[SocketManager](locator) sessionId := opts.SessionId(cc) @@ -47,7 +46,7 @@ func WsHttpHandler(opts *ws2.ExtensionOpts) http.HandlerFunc { we don't want to block the writer */ done := make(chan bool, 1000) - writer := make(ws3.WriterChan, 1000) + writer := make(WriterChan, 1000) wg := sync.WaitGroup{} diff --git a/extensions/websocket/ws/manager.go b/extensions/websocket/internal/wsutil/manager.go similarity index 99% rename from extensions/websocket/ws/manager.go rename to extensions/websocket/internal/wsutil/manager.go index 6fd6db6..d274fe1 100644 --- a/extensions/websocket/ws/manager.go +++ b/extensions/websocket/internal/wsutil/manager.go @@ -1,4 +1,4 @@ -package ws +package wsutil import ( "fmt" diff --git a/extensions/websocket/ws/manager_test.go b/extensions/websocket/internal/wsutil/manager_test.go similarity index 99% rename from extensions/websocket/ws/manager_test.go rename to extensions/websocket/internal/wsutil/manager_test.go index 3c05a6f..0ba95d4 100644 --- a/extensions/websocket/ws/manager_test.go +++ b/extensions/websocket/internal/wsutil/manager_test.go @@ -1,4 +1,4 @@ -package ws +package wsutil import ( ws2 "github.com/maddalax/htmgo/extensions/websocket/opts" diff --git a/extensions/websocket/ws/access.go b/extensions/websocket/ws/access.go index 012d859..efa63c5 100644 --- a/extensions/websocket/ws/access.go +++ b/extensions/websocket/ws/access.go @@ -1,9 +1,10 @@ package ws import ( + "github.com/maddalax/htmgo/extensions/websocket/internal/wsutil" "github.com/maddalax/htmgo/framework/h" ) -func ManagerFromCtx(ctx *h.RequestContext) *SocketManager { - return SocketManagerFromCtx(ctx) +func ManagerFromCtx(ctx *h.RequestContext) *wsutil.SocketManager { + return wsutil.SocketManagerFromCtx(ctx) } diff --git a/extensions/websocket/ws/dispatch.go b/extensions/websocket/ws/dispatch.go index 53ed0f3..248b649 100644 --- a/extensions/websocket/ws/dispatch.go +++ b/extensions/websocket/ws/dispatch.go @@ -1,6 +1,7 @@ package ws import ( + "github.com/maddalax/htmgo/extensions/websocket/internal/wsutil" "github.com/maddalax/htmgo/extensions/websocket/session" "github.com/maddalax/htmgo/framework/h" "github.com/maddalax/htmgo/framework/service" @@ -32,7 +33,7 @@ func PushElement(data HandlerData, el *h.Element) bool { // PushElementCtx sends an element to the current session and swaps it into the page func PushElementCtx(ctx *h.RequestContext, el *h.Element) bool { locator := ctx.ServiceLocator() - socketManager := service.Get[SocketManager](locator) + socketManager := service.Get[wsutil.SocketManager](locator) socketId := session.GetSessionId(ctx) socket := socketManager.Get(string(socketId)) if socket == nil { diff --git a/extensions/websocket/ws/every.go b/extensions/websocket/ws/every.go index d549c53..679d3d5 100644 --- a/extensions/websocket/ws/every.go +++ b/extensions/websocket/ws/every.go @@ -1,6 +1,7 @@ package ws import ( + "github.com/maddalax/htmgo/extensions/websocket/internal/wsutil" "github.com/maddalax/htmgo/extensions/websocket/session" "github.com/maddalax/htmgo/framework/h" "github.com/maddalax/htmgo/framework/service" @@ -11,7 +12,7 @@ import ( func Every(ctx *h.RequestContext, interval time.Duration, cb func() bool) { socketId := session.GetSessionId(ctx) locator := ctx.ServiceLocator() - manager := service.Get[SocketManager](locator) + manager := service.Get[wsutil.SocketManager](locator) manager.RunIntervalWithSocket(string(socketId), interval, cb) } diff --git a/extensions/websocket/ws/handler.go b/extensions/websocket/ws/handler.go index 07c3080..2d0bbb7 100644 --- a/extensions/websocket/ws/handler.go +++ b/extensions/websocket/ws/handler.go @@ -2,15 +2,16 @@ package ws import ( "fmt" + "github.com/maddalax/htmgo/extensions/websocket/internal/wsutil" "github.com/maddalax/htmgo/extensions/websocket/session" "sync" ) type MessageHandler struct { - manager *SocketManager + manager *wsutil.SocketManager } -func NewMessageHandler(manager *SocketManager) *MessageHandler { +func NewMessageHandler(manager *wsutil.SocketManager) *MessageHandler { return &MessageHandler{manager: manager} } @@ -76,7 +77,7 @@ func (h *MessageHandler) OnDomElementRemoved(handlerId string) { handlers.Delete(handlerId) } -func (h *MessageHandler) OnSocketDisconnected(event SocketEvent) { +func (h *MessageHandler) OnSocketDisconnected(event wsutil.SocketEvent) { sessionId := session.Id(event.SessionId) hashes, ok := sessionIdToHashes.Load(sessionId) if ok { diff --git a/extensions/websocket/ws/listener.go b/extensions/websocket/ws/listener.go index 9b4965b..5556331 100644 --- a/extensions/websocket/ws/listener.go +++ b/extensions/websocket/ws/listener.go @@ -1,12 +1,13 @@ package ws import ( + "github.com/maddalax/htmgo/extensions/websocket/internal/wsutil" "github.com/maddalax/htmgo/extensions/websocket/session" "github.com/maddalax/htmgo/framework/service" ) func StartListener(locator *service.Locator) { - manager := service.Get[SocketManager](locator) + manager := service.Get[wsutil.SocketManager](locator) manager.Listen(socketMessageListener) handler := NewMessageHandler(manager) go func() { @@ -22,9 +23,9 @@ func handle(handler *MessageHandler) { handler.OnServerSideEvent(event) case event := <-socketMessageListener: switch event.Type { - case DisconnectedEvent: + case wsutil.DisconnectedEvent: handler.OnSocketDisconnected(event) - case MessageEvent: + case wsutil.MessageEvent: handlerId, ok := event.Payload["id"].(string) eventName, ok2 := event.Payload["event"].(string) diff --git a/extensions/websocket/ws/metrics.go b/extensions/websocket/ws/metrics.go index 29bbe79..258493b 100644 --- a/extensions/websocket/ws/metrics.go +++ b/extensions/websocket/ws/metrics.go @@ -1,11 +1,12 @@ package ws import ( + "github.com/maddalax/htmgo/extensions/websocket/internal/wsutil" "github.com/maddalax/htmgo/framework/h" ) type Metrics struct { - Manager ManagerMetrics + Manager wsutil.ManagerMetrics Handler HandlerMetrics } diff --git a/extensions/websocket/ws/register.go b/extensions/websocket/ws/register.go index d24d0d1..b7350fd 100644 --- a/extensions/websocket/ws/register.go +++ b/extensions/websocket/ws/register.go @@ -1,6 +1,7 @@ package ws import ( + "github.com/maddalax/htmgo/extensions/websocket/internal/wsutil" "github.com/maddalax/htmgo/extensions/websocket/session" "github.com/maddalax/htmgo/framework/h" "github.com/puzpuzpuz/xsync/v3" @@ -10,8 +11,8 @@ import ( type HandlerData struct { SessionId session.Id - Socket *SocketConnection - Manager *SocketManager + Socket *wsutil.SocketConnection + Manager *wsutil.SocketManager } type Handler func(data HandlerData) @@ -28,7 +29,7 @@ var sessionIdToHashes = xsync.NewMapOf[session.Id, map[KeyHash]bool]() var hashesToSessionId = xsync.NewMapOf[KeyHash, session.Id]() var serverEventNamesToHash = xsync.NewMapOf[string, map[KeyHash]bool]() -var socketMessageListener = make(chan SocketEvent, 100) +var socketMessageListener = make(chan wsutil.SocketEvent, 100) var serverSideMessageListener = make(chan ServerSideEvent, 100) var lock = sync.Mutex{} var callingHandler = atomic.Bool{}