blob: 4fdb034abb340b078971563da76cdd021c70b827 [file] [log] [blame]
Philipp Schradera9a79392023-03-25 13:28:31 -07001package background_task
Philipp Schraderc49eaf72023-02-26 16:56:52 -08002
3import (
4 "time"
5)
6
Philipp Schrader3f0e36f2023-03-25 13:49:41 -07007// A helper to run a function in the background at a specified interval.
8// Can be used for a lot of different things.
9type backgroundTask struct {
Philipp Schraderc49eaf72023-02-26 16:56:52 -080010 doneChan chan<- bool
11 checkStopped chan<- bool
Philipp Schrader3f0e36f2023-03-25 13:49:41 -070012 interval time.Duration
Philipp Schraderc49eaf72023-02-26 16:56:52 -080013}
14
Philipp Schrader3f0e36f2023-03-25 13:49:41 -070015func New(interval time.Duration) backgroundTask {
16 return backgroundTask{
17 doneChan: make(chan bool, 1),
18 checkStopped: make(chan bool, 1),
19 interval: interval,
20 }
21}
Philipp Schraderc49eaf72023-02-26 16:56:52 -080022
Philipp Schrader3f0e36f2023-03-25 13:49:41 -070023func (task *backgroundTask) Start(taskFunc func()) {
Philipp Schraderc49eaf72023-02-26 16:56:52 -080024 go func() {
Philipp Schrader3f0e36f2023-03-25 13:49:41 -070025 // Setting start time to a time prior so the function gets
26 // called instantly when Start() called
27 startTime := time.Now().Add(-task.interval - time.Minute)
Philipp Schraderc49eaf72023-02-26 16:56:52 -080028 for {
29 curTime := time.Now()
30 diff := curTime.Sub(startTime)
31
Philipp Schrader3f0e36f2023-03-25 13:49:41 -070032 if diff > task.interval {
33 taskFunc()
Philipp Schraderc49eaf72023-02-26 16:56:52 -080034 startTime = curTime
35 }
36
Philipp Schrader3f0e36f2023-03-25 13:49:41 -070037 if len(task.doneChan) != 0 {
Philipp Schraderc49eaf72023-02-26 16:56:52 -080038 break
39 }
40
41 time.Sleep(time.Second)
42 }
43
Philipp Schrader3f0e36f2023-03-25 13:49:41 -070044 task.checkStopped <- true
Philipp Schraderc49eaf72023-02-26 16:56:52 -080045 }()
46}
47
Philipp Schrader3f0e36f2023-03-25 13:49:41 -070048func (task *backgroundTask) Stop() {
49 task.doneChan <- true
Philipp Schraderc49eaf72023-02-26 16:56:52 -080050
51 for {
Philipp Schrader3f0e36f2023-03-25 13:49:41 -070052 if len(task.checkStopped) != 0 {
53 close(task.doneChan)
54 close(task.checkStopped)
Philipp Schraderc49eaf72023-02-26 16:56:52 -080055 break
56 }
57 }
58}