package fetcher import ( "context" "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 // Test source that just sleeps for 60 seconds to simulate doing work func runSleeper( ctx context.Context, conf *config.JobSearchConfig, since time.Time, ) error { blockShutdown := conf.Sources.Sleeper.BlockShutdown w := util.Worker{ Name: "Sleeper", Interval: conf.Sources.Sleeper.Interval, Task: func(taskCtx context.Context, since time.Time) error { if blockShutdown { return sleep(taskCtx, true, sleepDuration) } else { return sleep(ctx, false, sleepDuration) } }, } return w.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() } }) }