/
session_manager.go
executable file
·90 lines (76 loc) · 2.47 KB
/
session_manager.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
/*
* Copyright (c) 2018, https://github.com/airwide-code
* All rights reserved.
*
*
*
*/
package server
import (
"encoding/binary"
"github.com/airwide-code/airwide.datacenter/mtproto"
"encoding/hex"
"fmt"
"github.com/golang/glog"
"sync"
)
type sessionManager struct {
sessions sync.Map // map[int64]*sessionClientList
}
func newSessionManager() *sessionManager {
return &sessionManager{}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
func (s *sessionManager) onSessionData2(clientConnID, frontendConnID uint64, md *mtproto.ZProtoMetadata, buf []byte) error {
if len(buf) > 10240 {
glog.Infof("onSessionData: data: {session_id: %d, md: %v, buf_len: %d, buf: %s, buf_end: %s}",
// conn.RemoteAddr(),
clientConnID,
md,
len(buf),
hex.EncodeToString(buf[:256]),
hex.EncodeToString(buf[len(buf)-256:]))
} else {
glog.Infof("onSessionData: data: {session_id: %d, md: %v, buf_len: %d}", clientConnID, md, len(buf))
}
////
authKeyId := int64(binary.LittleEndian.Uint64(buf))
// TODO(@benqi): sync s.sessions
var sessList *clientSessionManager
if vv, ok := s.sessions.Load(authKeyId); !ok {
authKey := getCacheAuthKey(authKeyId)
if authKey == nil {
err := fmt.Errorf("onSessionData - not found authKeyId: {%d}", authKeyId)
glog.Error(err)
return err
}
sessList = newClientSessionManager(authKeyId, authKey, 0)
s.sessions.Store(authKeyId, sessList)
s.onNewSessionClientManager(sessList)
} else {
sessList, _ = vv.(*clientSessionManager)
}
return sessList.OnSessionDataArrived(makeClientConnID(clientConnID, frontendConnID), md, buf)
}
func (s *sessionManager) onSyncData2(authKeyId, sessionId int64, md *mtproto.ZProtoMetadata, data *messageData) error {
var sessList *clientSessionManager
if vv, ok := s.sessions.Load(authKeyId); !ok {
err := fmt.Errorf("pushToSessionData - not find sessionList by authKeyId: {%d}", authKeyId)
glog.Warning(err)
return err
} else {
sessList, _ = vv.(*clientSessionManager)
}
return sessList.OnSyncDataArrived(sessionId, md, data)
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
// session event
func (s *sessionManager) onNewSessionClientManager(sess *clientSessionManager) {
sess.Start()
}
func (s *sessionManager) onCloseSessionClientManager(authKeyId int64) {
if vv, ok := s.sessions.Load(authKeyId); ok {
vv.(*clientSessionManager).Stop()
s.sessions.Delete(authKeyId)
}
}