diff --git a/clock.go b/clock.go new file mode 100644 index 000000000..5489cae63 --- /dev/null +++ b/clock.go @@ -0,0 +1,59 @@ +package core + +import ( + "sync" + "time" +) + +// Clock is a V2Ray feature that returns current time. +type Clock interface { + Feature + + // Now returns current time. + Now() time.Time +} + +type syncClock struct { + sync.RWMutex + Clock +} + +func (c *syncClock) Now() time.Time { + c.RLock() + defer c.RUnlock() + + if c.Clock == nil { + return time.Now() + } + + return c.Clock.Now() +} + +func (c *syncClock) Start() error { + c.RLock() + defer c.RUnlock() + + if c.Clock == nil { + return nil + } + + return c.Clock.Start() +} + +func (c *syncClock) Close() { + c.RLock() + defer c.RUnlock() + + if c.Clock == nil { + return + } + + c.Clock.Close() +} + +func (c *syncClock) Set(clock Clock) { + c.Lock() + defer c.Unlock() + + c.Clock = clock +} diff --git a/v2ray.go b/v2ray.go index 15275f8c8..b6a0de9d4 100644 --- a/v2ray.go +++ b/v2ray.go @@ -27,6 +27,7 @@ type Instance struct { router syncRouter ihm syncInboundHandlerManager ohm syncOutboundHandlerManager + clock syncClock features []Feature id uuid.UUID @@ -163,3 +164,8 @@ func (s *Instance) InboundHandlerManager() InboundHandlerManager { func (s *Instance) OutboundHandlerManager() OutboundHandlerManager { return &(s.ohm) } + +// Clock returns the Clock used by this Instance. The returned Clock is always functional. +func (s *Instance) Clock() Clock { + return &(s.clock) +}