From ff62386f6b3de8ca24d28027f0339c36a142be5c Mon Sep 17 00:00:00 2001 From: wwqgtxx Date: Mon, 27 Oct 2025 17:29:57 +0800 Subject: [PATCH] chore: reduce internal dependencies of the ntp package --- hub/executor/executor.go | 2 +- ntp/{ => ntp}/service.go | 32 ++++++++------------------------ ntp/{ => ntp}/time_stub.go | 0 ntp/{ => ntp}/time_unix.go | 0 ntp/{ => ntp}/time_windows.go | 0 ntp/time.go | 28 ++++++++++++++++++++++++++++ 6 files changed, 37 insertions(+), 25 deletions(-) rename ntp/{ => ntp}/service.go (80%) rename ntp/{ => ntp}/time_stub.go (100%) rename ntp/{ => ntp}/time_unix.go (100%) rename ntp/{ => ntp}/time_windows.go (100%) create mode 100644 ntp/time.go diff --git a/hub/executor/executor.go b/hub/executor/executor.go index 041e6fc3..44f7f144 100644 --- a/hub/executor/executor.go +++ b/hub/executor/executor.go @@ -39,7 +39,7 @@ import ( "github.com/metacubex/mihomo/listener/inner" "github.com/metacubex/mihomo/listener/tproxy" "github.com/metacubex/mihomo/log" - "github.com/metacubex/mihomo/ntp" + "github.com/metacubex/mihomo/ntp/ntp" "github.com/metacubex/mihomo/tunnel" ) diff --git a/ntp/service.go b/ntp/ntp/service.go similarity index 80% rename from ntp/service.go rename to ntp/ntp/service.go index 8473df6a..8f27d0aa 100644 --- a/ntp/service.go +++ b/ntp/ntp/service.go @@ -3,18 +3,18 @@ package ntp import ( "context" "sync" - "sync/atomic" "time" "github.com/metacubex/mihomo/component/dialer" "github.com/metacubex/mihomo/component/proxydialer" "github.com/metacubex/mihomo/log" + mihomoNtp "github.com/metacubex/mihomo/ntp" M "github.com/metacubex/sing/common/metadata" "github.com/metacubex/sing/common/ntp" ) -var globalSrv atomic.Pointer[Service] +var globalSrv *Service var globalMu sync.Mutex type Service struct { @@ -23,21 +23,20 @@ type Service struct { ticker *time.Ticker ctx context.Context cancel context.CancelFunc - offset atomic.Int64 // [time.Duration] syncSystemTime bool } func ReCreateNTPService(server string, interval time.Duration, dialerProxy string, syncSystemTime bool) { globalMu.Lock() defer globalMu.Unlock() - if service := globalSrv.Swap(nil); service != nil { - service.Stop() + if globalSrv != nil { + globalSrv.Stop() } if server == "" || interval <= 0 { return } ctx, cancel := context.WithCancel(context.Background()) - service := &Service{ + globalSrv = &Service{ server: M.ParseSocksaddr(server), dialer: proxydialer.NewByNameSingDialer(dialerProxy, dialer.NewDialer()), ticker: time.NewTicker(interval * time.Minute), @@ -45,8 +44,7 @@ func ReCreateNTPService(server string, interval time.Duration, dialerProxy strin cancel: cancel, syncSystemTime: syncSystemTime, } - service.Start() - globalSrv.Store(service) + globalSrv.Start() } func (srv *Service) Start() { @@ -59,10 +57,6 @@ func (srv *Service) Stop() { srv.cancel() } -func (srv *Service) Offset() time.Duration { - return time.Duration(srv.offset.Load()) -} - func (srv *Service) update() error { var response *ntp.Response var err error @@ -80,7 +74,7 @@ func (srv *Service) update() error { } else if offset < time.Duration(0) { log.Infoln("System clock is behind NTP time by %s", -offset) } - srv.offset.Store(int64(offset)) + mihomoNtp.SetOffset(offset) if srv.syncSystemTime { timeNow := response.Time syncErr := setSystemTime(timeNow) @@ -97,7 +91,7 @@ func (srv *Service) update() error { } func (srv *Service) loopUpdate() { - defer srv.offset.Store(0) + defer mihomoNtp.SetOffset(0) defer srv.ticker.Stop() for { err := srv.update() @@ -111,13 +105,3 @@ func (srv *Service) loopUpdate() { } } } - -func Now() time.Time { - now := time.Now() - if service := globalSrv.Load(); service != nil { - if offset := service.Offset(); offset.Abs() > 0 { - now = now.Add(offset) - } - } - return now -} diff --git a/ntp/time_stub.go b/ntp/ntp/time_stub.go similarity index 100% rename from ntp/time_stub.go rename to ntp/ntp/time_stub.go diff --git a/ntp/time_unix.go b/ntp/ntp/time_unix.go similarity index 100% rename from ntp/time_unix.go rename to ntp/ntp/time_unix.go diff --git a/ntp/time_windows.go b/ntp/ntp/time_windows.go similarity index 100% rename from ntp/time_windows.go rename to ntp/ntp/time_windows.go diff --git a/ntp/time.go b/ntp/time.go new file mode 100644 index 00000000..e69be025 --- /dev/null +++ b/ntp/time.go @@ -0,0 +1,28 @@ +// Package ntp provide time.Now +// +// DON'T import other package in mihomo to keep minimal internal dependencies +package ntp + +import ( + "time" + + "sync/atomic" +) + +var _offset atomic.Int64 // [time.Duration] + +func SetOffset(offset time.Duration) { + _offset.Store(int64(offset)) +} + +func GetOffset() time.Duration { + return time.Duration(_offset.Load()) +} + +func Now() time.Time { + now := time.Now() + if offset := GetOffset(); offset != 0 { + now = now.Add(offset) + } + return now +}