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  }