package worker import ( "context" "errors" "time" "github.com/example/remote-access-platform/backend/internal/modules/sessionbroker" ) type LeaseMonitor struct { service *Service broker *sessionbroker.Service interval time.Duration } func NewLeaseMonitor(service *Service, broker *sessionbroker.Service, interval time.Duration) *LeaseMonitor { if interval <= 0 { interval = 15 * time.Second } return &LeaseMonitor{ service: service, broker: broker, interval: interval, } } func (m *LeaseMonitor) Run(ctx context.Context) error { ticker := time.NewTicker(m.interval) defer ticker.Stop() for { select { case <-ctx.Done(): return nil case <-ticker.C: stale, err := m.service.RecoverStaleLeases(ctx) if err != nil { return err } for _, lease := range stale { err := m.broker.MarkSessionFailed(ctx, sessionbroker.MarkSessionFailedCommand{ SessionID: lease.SessionID, Reason: "worker_lease_stale_or_worker_missing", }) if err != nil && !errors.Is(err, sessionbroker.ErrSessionNotFound) && !errors.Is(err, sessionbroker.ErrSessionNotTerminable) { return err } } } } }