(conn interface{}, appid uint32)
| 25 | } |
| 26 | |
| 27 | func (ss *SessionStore) Create(conn interface{}, appid uint32) *Session { |
| 28 | var s Session |
| 29 | |
| 30 | switch conn.(type) { |
| 31 | case *websocket.Conn: |
| 32 | s.proto = WEBSOCK |
| 33 | s.ws, _ = conn.(*websocket.Conn) |
| 34 | case http.ResponseWriter: |
| 35 | s.proto = LPOLL |
| 36 | s.wrt, _ = conn.(http.ResponseWriter) |
| 37 | default: |
| 38 | s.proto = NONE |
| 39 | } |
| 40 | |
| 41 | if s.proto != NONE { |
| 42 | s.subs = make(map[string]*Subscription) |
| 43 | s.send = make(chan []byte, 64) // buffered |
| 44 | s.stop = make(chan bool) |
| 45 | s.detach = make(chan string, 64) // buffered |
| 46 | } |
| 47 | |
| 48 | s.appid = appid |
| 49 | s.lastTouched = time.Now() |
| 50 | s.sid = getRandomString() |
| 51 | s.uid = types.ZeroUid |
| 52 | |
| 53 | if s.proto != WEBSOCK { |
| 54 | // Websocket connections are not managed by SessionStore |
| 55 | ss.rw.Lock() |
| 56 | |
| 57 | elem := ss.lru.PushFront(&sessionStoreElement{s.sid, &s}) |
| 58 | ss.sessions[s.sid] = elem |
| 59 | |
| 60 | // Remove expired sessions |
| 61 | expire := s.lastTouched.Add(-ss.lifeTime) |
| 62 | for elem = ss.lru.Back(); elem != nil; elem = ss.lru.Back() { |
| 63 | if elem.Value.(*sessionStoreElement).val.lastTouched.Before(expire) { |
| 64 | ss.lru.Remove(elem) |
| 65 | delete(ss.sessions, elem.Value.(*sessionStoreElement).key) |
| 66 | } else { |
| 67 | break // don't need to traverse further |
| 68 | } |
| 69 | } |
| 70 | ss.rw.Unlock() |
| 71 | } |
| 72 | |
| 73 | return &s |
| 74 | } |
| 75 | |
| 76 | func (ss *SessionStore) Get(sid string) *Session { |
| 77 | ss.rw.Lock() |
no test coverage detected