package scrobble import ( "time" ) // backoffSchedule maps the failure count (1-indexed: 1 = first failure // just happened) to the delay before the next attempt. Per spec §M4a: // 1m → 5m → 30m → 2h → 6h, then give up. var backoffSchedule = []time.Duration{ 1 * time.Minute, 5 * time.Minute, 30 * time.Minute, 2 * time.Hour, 6 * time.Hour, } const maxAttempts = 5 // backoffDelay returns the delay before the next attempt given the value // of the `attempts` column AFTER the failure has been recorded (1-indexed: // attempts=1 means the first failure just happened, the next retry should // wait 1 minute). Returns (_, false) when attempts > maxAttempts (the // caller should mark the row failed). func backoffDelay(attempts int) (time.Duration, bool) { if attempts < 1 || attempts > maxAttempts { return 0, false } return backoffSchedule[attempts-1], true }