diff options
author | 2019-12-02 17:24:19 +0100 | |
---|---|---|
committer | 2019-12-02 17:24:19 +0100 | |
commit | 8b84d81f9b56c02a53d1224eb20b25ba93609aa1 (patch) | |
tree | 0de61633275d241d67628af6bb92ec14fdf5a251 /conn_pool.go | |
parent | a1a067e6de1679d0a3a1503e93bb672432990cd4 (diff) | |
download | alps-8b84d81f9b56c02a53d1224eb20b25ba93609aa1.tar.gz alps-8b84d81f9b56c02a53d1224eb20b25ba93609aa1.tar.bz2 alps-8b84d81f9b56c02a53d1224eb20b25ba93609aa1.zip |
Add initial login logic
Diffstat (limited to 'conn_pool.go')
-rw-r--r-- | conn_pool.go | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/conn_pool.go b/conn_pool.go new file mode 100644 index 0000000..147c022 --- /dev/null +++ b/conn_pool.go @@ -0,0 +1,58 @@ +package koushin + +import ( + "crypto/rand" + "encoding/base64" + "errors" + + imapclient "github.com/emersion/go-imap/client" +) + +func generateToken() (string, error) { + b := make([]byte, 32) + _, err := rand.Read(b) + if err != nil { + return "", err + } + return base64.URLEncoding.EncodeToString(b), nil +} + +var ErrSessionExpired = errors.New("session expired") + +// TODO: expiration timer +type ConnPool struct { + // TODO: add synchronization + conns map[string]*imapclient.Client +} + +func NewConnPool() *ConnPool { + return &ConnPool{ + conns: make(map[string]*imapclient.Client), + } +} + +func (pool *ConnPool) Get(token string) (*imapclient.Client, error) { + conn, ok := pool.conns[token] + if !ok { + return nil, ErrSessionExpired + } + return conn, nil +} + +func (pool *ConnPool) Put(conn *imapclient.Client) (token string, err error) { + for { + var err error + token, err = generateToken() + if err != nil { + conn.Logout() + return "", err + } + + if _, ok := pool.conns[token]; !ok { + break + } + } + + pool.conns[token] = conn + return token, nil +} |