github.com/lei006/gmqtt-broker@v0.0.1/broker/lib/sessions/sessions.go (about) 1 package sessions 2 3 import ( 4 "crypto/rand" 5 "encoding/base64" 6 "errors" 7 "fmt" 8 "io" 9 ) 10 11 var ( 12 ErrSessionsProviderNotFound = errors.New("Session: Session provider not found") 13 ErrKeyNotAvailable = errors.New("Session: not item found for key.") 14 15 providers = make(map[string]SessionsProvider) 16 ) 17 18 type SessionsProvider interface { 19 New(id string) (*Session, error) 20 Get(id string) (*Session, error) 21 Del(id string) 22 Save(id string) error 23 Count() int 24 Close() error 25 } 26 27 // Register makes a session provider available by the provided name. 28 // If a Register is called twice with the same name or if the driver is nil, 29 // it panics. 30 func Register(name string, provider SessionsProvider) { 31 if provider == nil { 32 panic("session: Register provide is nil") 33 } 34 35 if _, dup := providers[name]; dup { 36 panic("session: Register called twice for provider " + name) 37 } 38 39 providers[name] = provider 40 } 41 42 func Unregister(name string) { 43 delete(providers, name) 44 } 45 46 type Manager struct { 47 p SessionsProvider 48 } 49 50 func NewManager(providerName string) (*Manager, error) { 51 p, ok := providers[providerName] 52 if !ok { 53 return nil, fmt.Errorf("session: unknown provider %q", providerName) 54 } 55 56 return &Manager{p: p}, nil 57 } 58 59 func (this *Manager) New(id string) (*Session, error) { 60 if id == "" { 61 id = this.sessionId() 62 } 63 return this.p.New(id) 64 } 65 66 func (this *Manager) Get(id string) (*Session, error) { 67 return this.p.Get(id) 68 } 69 70 func (this *Manager) Del(id string) { 71 this.p.Del(id) 72 } 73 74 func (this *Manager) Save(id string) error { 75 return this.p.Save(id) 76 } 77 78 func (this *Manager) Count() int { 79 return this.p.Count() 80 } 81 82 func (this *Manager) Close() error { 83 return this.p.Close() 84 } 85 86 func (manager *Manager) sessionId() string { 87 b := make([]byte, 15) 88 if _, err := io.ReadFull(rand.Reader, b); err != nil { 89 return "" 90 } 91 return base64.URLEncoding.EncodeToString(b) 92 }