All files and memory storage tests pass

This commit is contained in:
DarkGopher 2025-06-23 13:37:25 +02:00
parent 045163310e
commit 23b020ec9b
4 changed files with 72 additions and 46 deletions

View file

@ -10,7 +10,7 @@ import (
"git.mtux.eu/darkgopher/session/util"
)
var pder = &ProviderMemory{list: list.New()}
var pder = &ProviderMemory{li: list.New()}
func init() {
pder.sessions = make(map[string]*list.Element, 0)
@ -21,7 +21,7 @@ func init() {
type ProviderMemory struct {
lock sync.Mutex
sessions map[string]*list.Element //save to RAM
list *list.List //for GC
li *list.List //for GC
}
func (pder *ProviderMemory) updateAtime(sid string) {
@ -29,7 +29,7 @@ func (pder *ProviderMemory) updateAtime(sid string) {
defer pder.lock.Unlock()
if ssel, ok := pder.sessions[sid]; ok {
ssel.Value.(*SessionMemory).atime = time.Now()
pder.list.MoveToFront(ssel)
pder.li.MoveToFront(ssel)
}
}
@ -44,25 +44,17 @@ func (pder *ProviderMemory) Init(sid string) (ses session.Session, err error) {
defer pder.lock.Unlock()
data := make(map[any]any, 0)
sess := &SessionMemory{sid, time.Now(), data}
sessel := pder.list.PushBack(sess)
sessel := pder.li.PushBack(sess)
pder.sessions[sid] = sessel
return sess, nil
}
// Exists return true if session with sid exists
func (pder *ProviderMemory) Exists(sid string) (ex bool) {
if _, ex := pder.sessions[sid]; ex {
return ex
}
return
}
// Load return existing unexpired session or create new
func (pder *ProviderMemory) Load(sid string) (ses session.Session, err error) {
pder.lock.Lock()
defer pder.lock.Unlock()
if ssel, ok := pder.sessions[sid]; ok {
return ssel.Value.(*SessionMemory), nil
if pder.Exists(sid) {
return pder.sessions[sid].Value.(*SessionMemory), nil
}
return pder.Init(sid)
}
@ -72,7 +64,7 @@ func (pder *ProviderMemory) Destroy(sid string) (err error) {
pder.lock.Lock()
defer pder.lock.Unlock()
if ssel, ok := pder.sessions[sid]; ok {
pder.list.Remove(ssel)
pder.li.Remove(ssel)
delete(pder.sessions, sid)
return nil
}
@ -91,17 +83,25 @@ func (pder *ProviderMemory) ChangeID(oldsid, newsid string) (err error) {
return
}
// Exists return true if session with sid exists
func (pder *ProviderMemory) Exists(sid string) (ex bool) {
if _, ex := pder.sessions[sid]; ex {
return ex
}
return
}
// GC iterate all sessions and delete expired
func (pder *ProviderMemory) GC(maxlifetime int64) {
pder.lock.Lock()
defer pder.lock.Unlock()
for {
ssel := pder.list.Back()
ssel := pder.li.Back()
if ssel == nil {
break
}
if ssel.Value.(*SessionMemory).atime.UnixMilli()+(maxlifetime*session.MilisPerSec()) < time.Now().UnixMilli() {
pder.list.Remove(ssel)
pder.li.Remove(ssel)
delete(pder.sessions, ssel.Value.(*SessionMemory).sid)
} else {
break