package fetcher import ( "context" "log/slog" "time" "git.avsdev.uk/Go/job-search/internal/config" "git.avsdev.uk/Go/job-search/internal/util" ) // sleepDuration is how long the sleeper's simulated work takes. const sleepDuration = 60 * time.Second // runSleeper runs the sleeper test source until ctx is cancelled: every // configured interval it simulates work by sleeping for sleepDuration. func runSleeper( ctx context.Context, logger *slog.Logger, conf *config.JSCSourceSleeper, since time.Time, ) error { blockShutdown := conf.BlockShutdown worker := util.Worker{ Logger: tagged(logger), Name: "Sleeper", Interval: conf.Interval, Task: func(taskCtx context.Context, since time.Time) error { if blockShutdown { return sleep(taskCtx, true, sleepDuration) } return sleep(ctx, false, sleepDuration) }, } return worker.Run(ctx, since) } // sleep simulates work taking duration, returning early with ctx.Err() if ctx // is cancelled. With blockShutdown, the work itself ignores ctx (as a // non-cooperative call would) and only the wait for it stops. func sleep( ctx context.Context, blockShutdown bool, duration time.Duration, ) error { return util.AwaitTaskE(ctx, func() error { if blockShutdown { time.Sleep(duration) return nil } timer := time.NewTimer(duration) defer timer.Stop() select { case <-timer.C: return nil case <-ctx.Done(): return ctx.Err() } }) }