/
session.go
116 lines (91 loc) · 1.75 KB
/
session.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package ttrss
import (
"context"
"crypto/rand"
"fmt"
"strings"
"time"
"github.com/urandom/readeef/content"
)
type session struct {
login content.Login
lastVisit time.Time
}
type sessMap map[string]session
type sessionManager struct {
ops chan func(sessMap)
}
func newSession(ctx context.Context) sessionManager {
sm := sessionManager{
ops: make(chan func(sessMap)),
}
go sm.loop(ctx)
return sm
}
func (sm sessionManager) add(id string, sess session) {
sm.ops <- func(m sessMap) {
m[id] = sess
}
}
func (sm sessionManager) remove(id string) {
sm.ops <- func(m sessMap) {
delete(m, id)
}
}
func (sm sessionManager) get(id string) session {
sess := make(chan session)
sm.ops <- func(m sessMap) {
if s, ok := m[id]; ok {
sess <- s
} else {
sess <- session{}
}
}
return <-sess
}
func (sm sessionManager) set(id string, sess session) {
sm.ops <- func(m sessMap) {
m[id] = sess
}
}
func (sm sessionManager) update(sess session) string {
idRes := make(chan string)
sm.ops <- func(m sessMap) {
for id, s := range m {
if sess.login == s.login {
idRes <- id
return
}
}
id := uuid()
m[id] = sess
idRes <- id
}
return <-idRes
}
func (sm sessionManager) loop(ctx context.Context) {
sessMap := make(sessMap)
ticker := time.NewTicker(time.Hour)
defer ticker.Stop()
for {
select {
case <-ctx.Done():
return
case op := <-sm.ops:
op(sessMap)
case <-ticker.C:
fiveDaysAgo := time.Now().AddDate(0, 0, -5)
for id, sess := range sessMap {
if sess.lastVisit.Before(fiveDaysAgo) {
delete(sessMap, id)
}
}
}
}
}
func uuid() string {
var u [16]byte
rand.Read(u[:])
return strings.Replace(fmt.Sprintf("%x-%x-%x-%x-%x",
u[:4], u[4:6], u[6:8], u[8:10], u[10:]), "-", "", -1)
}