-
Notifications
You must be signed in to change notification settings - Fork 156
/
session.go
119 lines (101 loc) · 2.16 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
package session
import (
"errors"
"sync"
"time"
"github.com/gorilla/websocket"
"github.com/pborman/uuid"
)
type Session struct {
sync.Mutex
mConnection *websocket.Conn
nLastActive int64
sSessionId string
clientChordID []byte
clientPubKey []byte
clientAddrStr *string
}
const sessionTimeOut int64 = 120
func (s *Session) GetSessionId() string {
return s.sSessionId
}
func newSession(wsConn *websocket.Conn) (session *Session, err error) {
sSessionId := uuid.NewUUID().String()
session = &Session{
mConnection: wsConn,
nLastActive: time.Now().Unix(),
sSessionId: sSessionId,
}
return session, nil
}
func (s *Session) close() {
s.Lock()
defer s.Unlock()
if s.mConnection != nil {
s.mConnection.Close()
s.mConnection = nil
}
s.sSessionId = ""
}
func (s *Session) UpdateActiveTime() {
s.Lock()
defer s.Unlock()
s.nLastActive = time.Now().Unix()
}
func (s *Session) Send(msgType int, data []byte) error {
s.Lock()
defer s.Unlock()
if s.mConnection == nil {
return errors.New("Websocket is null")
}
return s.mConnection.WriteMessage(msgType, data)
}
func (s *Session) SendText(data []byte) error {
return s.Send(websocket.TextMessage, data)
}
func (s *Session) SendBinary(data []byte) error {
return s.Send(websocket.BinaryMessage, data)
}
func (s *Session) SessionTimeoverCheck() bool {
if s.IsClient() {
return false
}
nCurTime := time.Now().Unix()
if nCurTime-s.nLastActive > sessionTimeOut { //sec
return true
}
return false
}
func (s *Session) SetSessionId(sessionId string) {
s.Lock()
defer s.Unlock()
s.sSessionId = sessionId
}
func (s *Session) SetClient(chordID, pubKey []byte, addrStr *string) {
s.Lock()
defer s.Unlock()
s.clientChordID = chordID
s.clientPubKey = pubKey
s.clientAddrStr = addrStr
}
func (s *Session) IsClient() bool {
return s.clientChordID != nil && s.clientPubKey != nil && s.clientAddrStr != nil
}
func (s *Session) GetID() []byte {
if !s.IsClient() {
return nil
}
return s.clientChordID
}
func (s *Session) GetPubKey() []byte {
if !s.IsClient() {
return nil
}
return s.clientPubKey
}
func (s *Session) GetAddrStr() *string {
if !s.IsClient() {
return nil
}
return s.clientAddrStr
}