package main import ( "sync/atomic" "time" p9 "github.com/Harvey-OS/ninep/protocol" "git.samanthony.xyz/buth/back/auth" ) type Session struct { auth.SessId auth.Uname qid p9.QID timer *time.Timer dead *atomic.Bool } func NewSession(id auth.SessId, uname auth.Uname) *Session { dead := new(atomic.Bool) timer := time.AfterFunc(auth.SessTimeout, func() { dead.Store(true) }) return &Session{ id, uname, p9.QID{Path: NextQidPath()}, timer, dead, } } // Close expires the session immediately. func (s *Session) Close() { s.timer.Stop() s.dead.Store(true) } // IsActive returns true if the session has not yet expired. func (s *Session) IsActive() bool { return !s.dead.Load() } // Extend resets the session's timer or returns false if it has // already expired. func (s *Session) Extend() bool { if s.timer.Stop() { s.timer.Reset(auth.SessTimeout) return true } // already expired return false } func (s *Session) Qid() (p9.QID, error) { return s.qid, nil } func (s *Session) Open(mode p9.Mode) error { if mode != p9.OREAD { return ErrPerm } return nil }