github.com/llimllib/devd@v0.0.0-20230426145215-4d29fc25f909/watch.go (about) 1 package devd 2 3 import ( 4 "os" 5 "time" 6 7 "github.com/llimllib/devd/livereload" 8 "github.com/cortesi/moddwatch" 9 "github.com/cortesi/termlog" 10 ) 11 12 const batchTime = time.Millisecond * 200 13 14 // Watch watches an endpoint for changes, if it supports them. 15 func (r Route) Watch( 16 ch chan []string, 17 excludePatterns []string, 18 log termlog.Logger, 19 ) (*moddwatch.Watcher, error) { 20 wd, err := os.Getwd() 21 if err != nil { 22 return nil, err 23 } 24 var watcher *moddwatch.Watcher 25 switch r.Endpoint.(type) { 26 case *filesystemEndpoint: 27 ep := *r.Endpoint.(*filesystemEndpoint) 28 modchan := make(chan *moddwatch.Mod, 1) 29 watcher, err = moddwatch.Watch( 30 wd, 31 []string{ep.Root + "/...", "**"}, 32 excludePatterns, 33 batchTime, 34 modchan, 35 ) 36 if err != nil { 37 return nil, err 38 } 39 go func() { 40 for mod := range modchan { 41 if !mod.Empty() { 42 ch <- mod.All() 43 } 44 } 45 }() 46 } 47 return watcher, nil 48 } 49 50 // WatchPaths watches a set of paths, and broadcasts changes through reloader. 51 func WatchPaths(paths, excludePatterns []string, reloader livereload.Reloader, log termlog.Logger) error { 52 wd, err := os.Getwd() 53 if err != nil { 54 return err 55 } 56 ch := make(chan []string, 1) 57 for _, path := range paths { 58 modchan := make(chan *moddwatch.Mod, 1) 59 _, err := moddwatch.Watch( 60 wd, 61 []string{path}, 62 excludePatterns, 63 batchTime, 64 modchan, 65 ) 66 if err != nil { 67 return err 68 } 69 go func() { 70 for mod := range modchan { 71 if !mod.Empty() { 72 ch <- mod.All() 73 } 74 } 75 }() 76 } 77 go reloader.Watch(ch) 78 return nil 79 } 80 81 // WatchRoutes watches the route collection, and broadcasts changes through reloader. 82 func WatchRoutes(routes RouteCollection, reloader livereload.Reloader, excludePatterns []string, log termlog.Logger) error { 83 c := make(chan []string, 1) 84 for i := range routes { 85 _, err := routes[i].Watch(c, excludePatterns, log) 86 if err != nil { 87 return err 88 } 89 } 90 go reloader.Watch(c) 91 return nil 92 }