all repos — homestead @ 445c43ef8b981bfacc8b465b3997da413370043f

Code for my website

use redis notifications to update website

Alan Pearce
commit

445c43ef8b981bfacc8b465b3997da413370043f

parent

fd0f99dffb49f29531d1974a638c0ce883bf5db7

1 file changed, 36 insertions(+), 22 deletions(-)

changed files
M internal/events/file.gointernal/events/file.go
@@ -2,6 +2,7 @@ package events
import ( "io/fs" + "maps" "os" "path" "path/filepath"
@@ -18,6 +19,7 @@ var (
ignores = []string{ "*.templ", "*.go", + "*-journal", } checkSettleInterval = 200 * time.Millisecond )
@@ -33,17 +35,19 @@ if err != nil {
return nil, errors.WithMessage(err, "could not create file watcher") } + fw := &FileWatcher{ + Watcher: fsn, + log: logger, + } + for _, dir := range dirs { - err = fsn.Add(dir) + err = fw.AddRecursive(dir) if err != nil { return nil, errors.WithMessagef(err, "could not add directory %s to file watcher", dir) } } - return &FileWatcher{ - Watcher: fsn, - log: logger, - }, nil + return fw, nil } func (fw *FileWatcher) matches(name string) func(string) bool {
@@ -85,53 +89,63 @@
return errors.WithMessage(err, "error walking directory tree") } -func (fw *FileWatcher) Wait(events chan<- Event, errs chan<- error) error { +func (fw *FileWatcher) GetLatestRunID() (uint64, error) { + return 0, nil +} + +func (fw *FileWatcher) Subscribe() (<-chan Event, error) { var timer *time.Timer + events := make(chan Event, 1) go func() { - var fileEvents []fsnotify.Event + fileEvents := make(map[string]fsnotify.Op) for { select { case baseEvent := <-fw.Watcher.Events: if !fw.ignored(baseEvent.Name) { - fw.log.Debug( - "watcher event", - "name", - baseEvent.Name, - "op", - baseEvent.Op.String(), - ) if baseEvent.Has(fsnotify.Create) || baseEvent.Has(fsnotify.Rename) { f, err := os.Stat(baseEvent.Name) if err != nil { - errs <- errors.WithMessagef(err, "error handling event %s", baseEvent.Op.String()) + fw.log.Warn( + "error handling event", + "op", + baseEvent.Op, + "name", + baseEvent.Name, + ) } else if f.IsDir() { err = fw.Add(baseEvent.Name) if err != nil { - errs <- errors.WithMessage(err, "error adding new folder to watcher") + fw.log.Warn("error adding new folder to watcher", "error", err) } } } if baseEvent.Has(fsnotify.Rename) || baseEvent.Has(fsnotify.Write) || baseEvent.Has(fsnotify.Create) || baseEvent.Has(fsnotify.Chmod) { - fileEvents = append(fileEvents, baseEvent) + fileEvents[baseEvent.Name] |= baseEvent.Op if timer == nil { timer = time.AfterFunc(checkSettleInterval, func() { + fw.log.Debug( + "file update event", + "changed", + slices.Collect(maps.Keys(fileEvents)), + ) events <- Event{ - FileEvents: fileEvents, - Revision: "", + FSEvent: FSEvent{ + Events: fileEvents, + }, } - fileEvents = []fsnotify.Event{} + clear(fileEvents) }) } timer.Reset(checkSettleInterval) } } case err := <-fw.Watcher.Errors: - errs <- errors.WithMessage(err, "error in watcher") + fw.log.Warn("error in watcher", "error", err) } } }() - return nil + return events, nil }