github.com/mysteriumnetwork/node@v0.0.0-20240516044423-365054f76801/session/time_tracker.go (about) 1 /* 2 * Copyright (C) 2019 The "MysteriumNetwork/node" Authors. 3 * 4 * This program is free software: you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License as published by 6 * the Free Software Foundation, either version 3 of the License, or 7 * (at your option) any later version. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program. If not, see <http://www.gnu.org/licenses/>. 16 */ 17 18 package session 19 20 import ( 21 "time" 22 23 "github.com/mysteriumnetwork/node/session/mbtime" 24 ) 25 26 // TimeTracker tracks elapsed time from the beginning of the session 27 // it's passive (no internal go routines) and simply encapsulates time operation: now - startOfSession expressed as duration 28 type TimeTracker struct { 29 started bool 30 startTime mbtime.Time 31 getTime func() mbtime.Time 32 } 33 34 // NewTracker initializes TimeTracker with specified monotonically increasing clock function (usually time.Now is enough - but we do DI for test sake) 35 func NewTracker(getTime func() mbtime.Time) TimeTracker { 36 return TimeTracker{ 37 getTime: getTime, 38 } 39 } 40 41 // StartTracking starts tracking the time 42 func (tt *TimeTracker) StartTracking() { 43 tt.started = true 44 tt.startTime = tt.getTime() 45 } 46 47 // Elapsed gets the total duration of time that has passed since we've started 48 func (tt TimeTracker) Elapsed() time.Duration { 49 if !tt.started { 50 return 0 * time.Second 51 } 52 t := tt.getTime() 53 return t.Sub(tt.startTime) 54 }