gost_software/vendor/github.com/ginuerzh/pht/session.go
2017-03-09 19:36:09 +01:00

81 lines
1.4 KiB
Go

package pht
import (
"crypto/rand"
"encoding/hex"
"sync"
)
const (
defaultRChanLen = 64
defaultWChanLen = 64
)
type session struct {
rchan chan []byte
wchan chan []byte
closed chan interface{}
}
func newSession(rlen, wlen int) *session {
if rlen <= 0 {
rlen = defaultRChanLen
}
if wlen <= 0 {
wlen = defaultWChanLen
}
return &session{
rchan: make(chan []byte, rlen),
wchan: make(chan []byte, wlen),
closed: make(chan interface{}),
}
}
type sessionManager struct {
sessions map[string]*session
mux sync.Mutex
}
func newSessionManager() *sessionManager {
return &sessionManager{
sessions: make(map[string]*session),
mux: sync.Mutex{},
}
}
func (m *sessionManager) NewSession(rlen, wlen int) (token string, s *session, err error) {
var nonce [16]byte
if _, err = rand.Read(nonce[:]); err != nil {
return
}
token = hex.EncodeToString(nonce[:])
s = newSession(rlen, wlen)
m.mux.Lock()
defer m.mux.Unlock()
m.sessions[token] = s
return
}
func (m *sessionManager) SetSession(token string, session *session) {
m.mux.Lock()
defer m.mux.Unlock()
m.sessions[token] = session
}
func (m *sessionManager) GetSession(token string) *session {
m.mux.Lock()
defer m.mux.Unlock()
return m.sessions[token]
}
func (m *sessionManager) DelSession(token string) {
m.mux.Lock()
defer m.mux.Unlock()
delete(m.sessions, token)
}