You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

128 lines
2.4 KiB
Go

package session
import (
"sync"
"time"
sessionpkg "github.com/noahlann/nnet/pkg/session"
)
// SessionImpl Session实现
type SessionImpl struct {
id string
data map[string]interface{}
mu sync.RWMutex
createdAt time.Time
accessedAt time.Time
isNew bool
}
// NewSession 创建新Session
func NewSession(id string) sessionpkg.Session {
now := time.Now()
return &SessionImpl{
id: id,
data: make(map[string]interface{}),
createdAt: now,
accessedAt: now,
isNew: true,
}
}
// ID 获取Session ID
func (s *SessionImpl) ID() string {
return s.id
}
// Get 获取值
func (s *SessionImpl) Get(key string) (interface{}, error) {
s.mu.RLock()
defer s.mu.RUnlock()
s.accessedAt = time.Now()
return s.data[key], nil
}
// Set 设置值
func (s *SessionImpl) Set(key string, value interface{}) error {
s.mu.Lock()
defer s.mu.Unlock()
s.accessedAt = time.Now()
if s.data == nil {
s.data = make(map[string]interface{})
}
s.data[key] = value
return nil
}
// Delete 删除值
func (s *SessionImpl) Delete(key string) error {
s.mu.Lock()
defer s.mu.Unlock()
s.accessedAt = time.Now()
delete(s.data, key)
return nil
}
// Clear 清空所有值
func (s *SessionImpl) Clear() error {
s.mu.Lock()
defer s.mu.Unlock()
s.accessedAt = time.Now()
s.data = make(map[string]interface{})
return nil
}
// IsNew 检查是否是新的Session
func (s *SessionImpl) IsNew() bool {
s.mu.RLock()
defer s.mu.RUnlock()
return s.isNew
}
// SetNew 设置是否为新Session
func (s *SessionImpl) SetNew(isNew bool) {
s.mu.Lock()
defer s.mu.Unlock()
s.isNew = isNew
}
// Data 获取所有数据(内部使用)
func (s *SessionImpl) Data() map[string]interface{} {
s.mu.RLock()
defer s.mu.RUnlock()
result := make(map[string]interface{})
for k, v := range s.data {
result[k] = v
}
return result
}
// SetData 设置所有数据(内部使用)
func (s *SessionImpl) SetData(data map[string]interface{}) {
s.mu.Lock()
defer s.mu.Unlock()
s.data = data
s.accessedAt = time.Now()
}
// AccessedAt 获取最后访问时间
func (s *SessionImpl) AccessedAt() time.Time {
s.mu.RLock()
defer s.mu.RUnlock()
return s.accessedAt
}
// CreatedAt 获取创建时间
func (s *SessionImpl) CreatedAt() time.Time {
s.mu.RLock()
defer s.mu.RUnlock()
return s.createdAt
}
// SetCreatedAt 设置创建时间(内部使用)
func (s *SessionImpl) SetCreatedAt(t time.Time) {
s.mu.Lock()
defer s.mu.Unlock()
s.createdAt = t
}