Skip to content

Commit

Permalink
chore: cleanup, improve logging, do some renaming
Browse files Browse the repository at this point in the history
Signed-off-by: gfanton <8671905+gfanton@users.noreply.github.com>
  • Loading branch information
gfanton committed Feb 7, 2025
1 parent f4a5140 commit b0dd70e
Show file tree
Hide file tree
Showing 22 changed files with 315 additions and 324 deletions.
4 changes: 3 additions & 1 deletion contribs/gnodev/cmd/gnodev/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,7 @@ func (ds *App) Setup(ctx context.Context, dirs ...string) (err error) {
case "":
if len(ds.paths) > 0 {
ds.webHomePath = strings.TrimPrefix(ds.paths[0], ds.cfg.chainDomain)
ds.logger.Info("using default package", "path", ds.paths[0])
ds.logger.WithGroup(WebLogName).Info("using default package", "path", ds.paths[0])
}
case "/", ":none:": // skip
default:
Expand Down Expand Up @@ -219,6 +219,8 @@ func (ds *App) Setup(ctx context.Context, dirs ...string) (err error) {
"proxy_addr", ds.proxy.ProxyAddress(),
"target_addr", ds.proxy.TargetAddress(),
)

proxyLogger.Info("lazy loading is enabled. packages will be loaded only upon a request via a query or transaction.", "loader", ds.loader.Name())
} else {
nodeCfg.TMConfig.RPC.ListenAddress = fmt.Sprintf("%s://%s", address.Network(), address.String())
}
Expand Down
2 changes: 1 addition & 1 deletion contribs/gnodev/cmd/gnodev/app_config.go
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ func (c *AppConfig) RegisterFlagsWith(fs *flag.FlagSet, defaultCfg AppConfig) {
fs.Var(
&c.resolvers,
"resolver",
"list of additional resolvers (`root`, `dir` or `remote`), will be executed in the given order",
"list of additional resolvers (`root`, `local` or `remote`), will be executed in the given order",
)

fs.StringVar(
Expand Down
4 changes: 2 additions & 2 deletions contribs/gnodev/cmd/gnodev/command_local.go
Original file line number Diff line number Diff line change
Expand Up @@ -94,15 +94,15 @@ func execLocalApp(cfg *LocalAppConfig, args []string, cio commands.IO) error {
}

exampleRoot := filepath.Join(gnoroot, "examples")
baseResolvers = append(baseResolvers, packages.NewFSResolver(exampleRoot))
baseResolvers = append(baseResolvers, packages.NewRootResolver(exampleRoot))
}

// Check if current directory is a valid gno package
path := guessPath(&cfg.AppConfig, dir)
resolver := packages.NewLocalResolver(path, dir)
if resolver.IsValid() {
// Add current directory as local resolver
baseResolvers = append(baseResolvers, resolver)
baseResolvers = append([]packages.Resolver{resolver}, baseResolvers...)
if len(cfg.paths) > 0 {
cfg.paths += ","
}
Expand Down
2 changes: 1 addition & 1 deletion contribs/gnodev/cmd/gnodev/command_staging.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ func execStagingCmd(cfg *StagingAppConfig, args []string, io commands.IO) error
}

exampleRoot := filepath.Join(gnoroot, "examples")
cfg.AppConfig.resolvers = append(cfg.AppConfig.resolvers, packages.NewFSResolver(exampleRoot))
cfg.AppConfig.resolvers = append(cfg.AppConfig.resolvers, packages.NewRootResolver(exampleRoot))
}

return runApp(&cfg.AppConfig, io, args...)
Expand Down
5 changes: 4 additions & 1 deletion contribs/gnodev/cmd/gnodev/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,10 @@ If no command is provided, gnodev will automatically start in <local> mode.
For more information and flags usage description, use 'gnodev local -h'.`,
},
nil,
func(ctx context.Context, _ []string) error { return nil },
func(ctx context.Context, _ []string) error {
localcmd.Execute(ctx, os.Args[1:])
return nil
},
)

cmd.AddSubCommands(localcmd)
Expand Down
8 changes: 4 additions & 4 deletions contribs/gnodev/cmd/gnodev/setup_loader.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,10 @@ func (va *varResolver) Set(value string) error {
return fmt.Errorf("invalid resolver remote: %q", location)
}

res = packages.NewRemoteResolver(rpc)
case "root":
res = packages.NewFSResolver(location)
case "dir":
res = packages.NewRemoteResolver(location, rpc)
case "root": // process everyting from a root directory
res = packages.NewRootResolver(location)
case "local": // process a signle directory
path, ok := guessPathGnoMod(location)
if !ok {
return fmt.Errorf("unable to read module path from gno.mod in %q", location)
Expand Down
7 changes: 4 additions & 3 deletions contribs/gnodev/cmd/gnodev/setup_node.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,10 @@ func setupDevNode(ctx context.Context, cfg *AppConfig, nodeConfig *gnodev.NodeCo
logger.Info("genesis file loaded", "path", cfg.genesisFile, "txs", len(stateTxs))
}

logger.Info("packages", "paths", paths)
if len(paths) == 0 {
logger.Debug("no path to load")
if len(paths) > 0 {
logger.Info("packages", "paths", paths)
} else {
logger.Debug("no path(s) provided")
}

return gnodev.NewDevNode(ctx, nodeConfig, paths...)
Expand Down
2 changes: 1 addition & 1 deletion contribs/gnodev/pkg/dev/node.go
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ func DefaultNodeConfig(rootdir, domain string) *NodeConfig {
}

exampleFolder := filepath.Join(gnoenv.RootDir(), "example") // XXX: we should avoid having to hardcoding this here
defaultLoader := packages.NewLoader(packages.NewFSResolver(exampleFolder))
defaultLoader := packages.NewLoader(packages.NewRootResolver(exampleFolder))

return &NodeConfig{
Logger: log.NewNoopLogger(),
Expand Down
22 changes: 16 additions & 6 deletions contribs/gnodev/pkg/emitter/server.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package emitter

import (
"encoding/json"
"log/slog"
"net/http"
"sync"
Expand Down Expand Up @@ -73,13 +74,9 @@ func (s *Server) emit(evt events.Event) {
s.muClients.Lock()
defer s.muClients.Unlock()

jsonEvt := EventJSON{evt.Type(), evt}

s.logger.Info("sending event to clients",
"clients", len(s.clients),
"type", evt.Type(),
"event", evt)
s.logEvent(evt)

jsonEvt := EventJSON{evt.Type(), evt}
for conn := range s.clients {
err := conn.WriteJSON(jsonEvt)
if err != nil {
Expand All @@ -100,3 +97,16 @@ func (s *Server) conns() []*websocket.Conn {

return conns
}

func (s *Server) logEvent(evt events.Event) {
var logEvt string
if rawEvt, err := json.Marshal(evt); err == nil {
logEvt = string(rawEvt)
}

s.logger.Info("sending event to clients",
"clients", len(s.clients),
"type", evt.Type(),
"event", logEvt)

}
100 changes: 2 additions & 98 deletions contribs/gnodev/pkg/packages/loader.go
Original file line number Diff line number Diff line change
@@ -1,108 +1,12 @@
package packages

import (
"errors"
"fmt"
"go/parser"
"go/token"
)

type Loader interface {
// Load resolves package package paths and all their dependencies in the correct order.
Load(paths ...string) ([]Package, error)

// Resolve processes a single package path and returns the corresponding Package.
Resolve(path string) (*Package, error)
}

type BaseLoader struct {
Resolver
}

func NewLoader(res ...Resolver) *BaseLoader {
return &BaseLoader{ChainResolvers(res...)}
}

func (l BaseLoader) Load(paths ...string) ([]Package, error) {
fset := token.NewFileSet()
visited, stack := map[string]bool{}, map[string]bool{}
pkgs := make([]Package, 0)
for _, root := range paths {
deps, err := load(root, fset, l.Resolver, visited, stack)
if err != nil {
return nil, err
}
pkgs = append(pkgs, deps...)
}

return pkgs, nil
}

func (l BaseLoader) Resolve(path string) (*Package, error) {
fset := token.NewFileSet()
return l.Resolver.Resolve(fset, path)
}

func load(path string, fset *token.FileSet, resolver Resolver, visited, stack map[string]bool) ([]Package, error) {
if stack[path] {
return nil, fmt.Errorf("cycle detected: %s", path)
}
if visited[path] {
return nil, nil
}

visited[path] = true

mempkg, err := resolver.Resolve(fset, path)
if err != nil {
if errors.Is(err, ErrResolverPackageSkip) {
return nil, nil
}

return nil, fmt.Errorf("unable to resolve package %q: %w", path, err)
}

var name string
imports := map[string]struct{}{}
for _, file := range mempkg.Files {
fname := file.Name
if !isGnoFile(fname) || isTestFile(fname) {
continue
}

f, err := parser.ParseFile(fset, fname, file.Body, parser.ImportsOnly)
if err != nil {
return nil, fmt.Errorf("unable to parse file %q: %w", file.Name, err)
}

if name != "" && name != f.Name.Name {
return nil, fmt.Errorf("conflict package name between %q and %q", name, f.Name.Name)
}

for _, imp := range f.Imports {
if len(imp.Path.Value) <= 2 {
continue
}

val := imp.Path.Value[1 : len(imp.Path.Value)-1]
imports[val] = struct{}{}
}

name = f.Name.Name
}

pkgs := []Package{}
for imp := range imports {
subDeps, err := load(imp, fset, resolver, visited, stack)
if err != nil {
return nil, fmt.Errorf("importing %q: %w", imp, err)
}

pkgs = append(pkgs, subDeps...)
}
pkgs = append(pkgs, *mempkg)

stack[path] = false

return pkgs, nil
// Name of the loader
Name() string
}
104 changes: 104 additions & 0 deletions contribs/gnodev/pkg/packages/loader_base.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
package packages

import (
"errors"
"fmt"
"go/parser"
"go/token"
)

type BaseLoader struct {
Resolver
}

func NewLoader(res ...Resolver) *BaseLoader {
return &BaseLoader{ChainResolvers(res...)}
}

func (l BaseLoader) Name() string {
return l.Resolver.Name()
}

func (l BaseLoader) Load(paths ...string) ([]Package, error) {
fset := token.NewFileSet()
visited, stack := map[string]bool{}, map[string]bool{}
pkgs := make([]Package, 0)
for _, root := range paths {
deps, err := load(root, fset, l.Resolver, visited, stack)
if err != nil {
return nil, err
}
pkgs = append(pkgs, deps...)
}

return pkgs, nil
}

func (l BaseLoader) Resolve(path string) (*Package, error) {
fset := token.NewFileSet()
return l.Resolver.Resolve(fset, path)
}

func load(path string, fset *token.FileSet, resolver Resolver, visited, stack map[string]bool) ([]Package, error) {
if stack[path] {
return nil, fmt.Errorf("cycle detected: %s", path)
}
if visited[path] {
return nil, nil
}

visited[path] = true

mempkg, err := resolver.Resolve(fset, path)
if err != nil {
if errors.Is(err, ErrResolverPackageSkip) {
return nil, nil
}

return nil, fmt.Errorf("unable to resolve package %q: %w", path, err)
}

var name string
imports := map[string]struct{}{}
for _, file := range mempkg.Files {
fname := file.Name
if !isGnoFile(fname) || isTestFile(fname) {
continue
}

f, err := parser.ParseFile(fset, fname, file.Body, parser.ImportsOnly)
if err != nil {
return nil, fmt.Errorf("unable to parse file %q: %w", file.Name, err)
}

if name != "" && name != f.Name.Name {
return nil, fmt.Errorf("conflict package name between %q and %q", name, f.Name.Name)
}

for _, imp := range f.Imports {
if len(imp.Path.Value) <= 2 {
continue
}

val := imp.Path.Value[1 : len(imp.Path.Value)-1]
imports[val] = struct{}{}
}

name = f.Name.Name
}

pkgs := []Package{}
for imp := range imports {
subDeps, err := load(imp, fset, resolver, visited, stack)
if err != nil {
return nil, fmt.Errorf("importing %q: %w", imp, err)
}

pkgs = append(pkgs, subDeps...)
}
pkgs = append(pkgs, *mempkg)

stack[path] = false

return pkgs, nil
}
4 changes: 4 additions & 0 deletions contribs/gnodev/pkg/packages/loader_glob.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,10 @@ func NewGlobLoader(rootpath string, res ...Resolver) *GlobLoader {
return &GlobLoader{rootpath, ChainResolvers(res...)}
}

func (l GlobLoader) Name() string {
return l.Resolver.Name()
}

func (l GlobLoader) MatchPaths(globs ...string) ([]string, error) {
if l.Root == "" {
return globs, nil
Expand Down
Loading

0 comments on commit b0dd70e

Please sign in to comment.