Files
ark/server/internal/infrastructure/scheduler/gocron/service.go
Louis Singer 0d39bb6b9f Add integration tests for sweeping rounds (#339)
* add "block" scheduler type + sweep integration test

* increase timeout in integrationtests

* remove config logs

* rename scheduler package name

* rename package

* rename packages
2024-10-05 16:12:46 +02:00

49 lines
976 B
Go

package timescheduler
import (
"fmt"
"time"
"github.com/ark-network/ark/server/internal/core/ports"
"github.com/go-co-op/gocron"
)
type service struct {
scheduler *gocron.Scheduler
}
func NewScheduler() ports.SchedulerService {
svc := gocron.NewScheduler(time.UTC)
return &service{svc}
}
func (s *service) Unit() ports.TimeUnit {
return ports.UnixTime
}
func (s *service) AddNow(lifetime int64) int64 {
return time.Now().Add(time.Duration(lifetime) * time.Second).Unix()
}
func (s *service) AfterNow(expiry int64) bool {
return time.Unix(expiry, 0).After(time.Now())
}
func (s *service) Start() {
s.scheduler.StartAsync()
}
func (s *service) Stop() {
s.scheduler.Stop()
}
func (s *service) ScheduleTaskOnce(at int64, task func()) error {
delay := at - time.Now().Unix()
if delay < 0 {
return fmt.Errorf("cannot schedule task in the past")
}
_, err := s.scheduler.Every(int(delay)).Seconds().WaitForSchedule().LimitRunsTo(1).Do(task)
return err
}