-
Notifications
You must be signed in to change notification settings - Fork 0
/
session.go
142 lines (127 loc) · 2.83 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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
package controller
import (
"errors"
"github.com/infinit-lab/gravity/config"
"github.com/infinit-lab/gravity/event"
"github.com/infinit-lab/gravity/model"
uuid "github.com/satori/go.uuid"
"strings"
"sync"
"time"
)
const DefaultAge int = 600
type Session struct {
Token string `json:"token"`
UserId string `json:"userId"`
Username string `json:"username"`
Ip string `json:"ip"`
Context interface{} `json:"context,omitempty"`
timer *time.Timer
closeChan chan int
}
var sessionMap map[string]*Session
var sessionMutex sync.Mutex
const (
TopicSession string = "session"
)
func CreateSession(userId string, username string, ip string, context interface{}) (*Session, error) {
session := new(Session)
session.Token = strings.ReplaceAll(uuid.NewV4().String(), "-", "")
session.UserId = userId
session.Username = username
session.Ip = ip
session.Context = context
age := config.GetInt("session.age")
if age == 0 {
age = DefaultAge
}
session.timer = time.NewTimer(time.Duration(age) * time.Second)
session.closeChan = make(chan int)
go func() {
select {
case <-session.timer.C:
DeleteSession(session.Token)
break
case <-session.closeChan:
break
}
}()
sessionMutex.Lock()
sessionMap[session.Token] = session
sessionMutex.Unlock()
e := new(event.Event)
e.Topic = TopicSession
e.Status = model.StatusCreated
e.Data = session
e.Context = nil
_ = event.Publish(e)
return session, nil
}
func DeleteSession(token string) {
sessionMutex.Lock()
session, ok := sessionMap[token]
if ok {
delete(sessionMap, token)
}
sessionMutex.Unlock()
if !ok {
return
}
session.timer.Stop()
close(session.closeChan)
e := new(event.Event)
e.Topic = TopicSession
e.Status = model.StatusDeleted
e.Data = session
e.Context = nil
_ = event.Publish(e)
}
func DeleteSessionByUserId(userId string) {
var tokenList []string
sessionMutex.Lock()
for key, value := range sessionMap {
if value.UserId == userId {
tokenList = append(tokenList, key)
}
}
sessionMutex.Unlock()
for _, token := range tokenList {
DeleteSession(token)
}
}
func DeleteAllSession() {
var tokenList []string
sessionMutex.Lock()
for key, _ := range sessionMap {
tokenList = append(tokenList, key)
}
sessionMutex.Unlock()
for _, token := range tokenList {
DeleteSession(token)
}
}
func UpdateSession(token string) {
sessionMutex.Lock()
session, ok := sessionMap[token]
sessionMutex.Unlock()
if !ok {
return
}
age := config.GetInt("session.age")
if age == 0 {
age = DefaultAge
}
session.timer.Reset(time.Duration(age) * time.Second)
}
func GetSession(token string) (*Session, error) {
sessionMutex.Lock()
session, ok := sessionMap[token]
sessionMutex.Unlock()
if !ok {
return nil, errors.New("Invalid token. ")
}
return session, nil
}
func init() {
sessionMap = make(map[string]*Session)
}