session.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. package mux
  2. import (
  3. "sync"
  4. "v2ray.com/core/common/buf"
  5. "v2ray.com/core/common/protocol"
  6. "v2ray.com/core/transport/ray"
  7. )
  8. type SessionManager struct {
  9. sync.RWMutex
  10. sessions map[uint16]*Session
  11. count uint16
  12. closed bool
  13. }
  14. func NewSessionManager() *SessionManager {
  15. return &SessionManager{
  16. count: 0,
  17. sessions: make(map[uint16]*Session, 16),
  18. }
  19. }
  20. func (m *SessionManager) Size() int {
  21. m.RLock()
  22. defer m.RUnlock()
  23. return len(m.sessions)
  24. }
  25. func (m *SessionManager) Count() int {
  26. m.RLock()
  27. defer m.RUnlock()
  28. return int(m.count)
  29. }
  30. func (m *SessionManager) Allocate() *Session {
  31. m.Lock()
  32. defer m.Unlock()
  33. if m.closed {
  34. return nil
  35. }
  36. m.count++
  37. s := &Session{
  38. ID: m.count,
  39. parent: m,
  40. }
  41. m.sessions[s.ID] = s
  42. return s
  43. }
  44. func (m *SessionManager) Add(s *Session) {
  45. m.Lock()
  46. defer m.Unlock()
  47. if m.closed {
  48. return
  49. }
  50. m.sessions[s.ID] = s
  51. }
  52. func (m *SessionManager) Remove(id uint16) {
  53. m.Lock()
  54. defer m.Unlock()
  55. if m.closed {
  56. return
  57. }
  58. delete(m.sessions, id)
  59. }
  60. func (m *SessionManager) Get(id uint16) (*Session, bool) {
  61. m.RLock()
  62. defer m.RUnlock()
  63. if m.closed {
  64. return nil, false
  65. }
  66. s, found := m.sessions[id]
  67. return s, found
  68. }
  69. func (m *SessionManager) CloseIfNoSession() bool {
  70. m.Lock()
  71. defer m.Unlock()
  72. if m.closed {
  73. return true
  74. }
  75. if len(m.sessions) != 0 {
  76. return false
  77. }
  78. m.closed = true
  79. return true
  80. }
  81. func (m *SessionManager) Close() error {
  82. m.Lock()
  83. defer m.Unlock()
  84. if m.closed {
  85. return nil
  86. }
  87. m.closed = true
  88. for _, s := range m.sessions {
  89. s.input.Close()
  90. s.output.Close()
  91. }
  92. m.sessions = nil
  93. return nil
  94. }
  95. // Session represents a client connection in a Mux connection.
  96. type Session struct {
  97. input ray.InputStream
  98. output ray.OutputStream
  99. parent *SessionManager
  100. ID uint16
  101. transferType protocol.TransferType
  102. }
  103. // Close closes all resources associated with this session.
  104. func (s *Session) Close() error {
  105. s.output.Close()
  106. s.input.Close()
  107. s.parent.Remove(s.ID)
  108. return nil
  109. }
  110. // NewReader creates a buf.Reader based on the transfer type of this Session.
  111. func (s *Session) NewReader(reader *buf.BufferedReader) buf.Reader {
  112. if s.transferType == protocol.TransferTypeStream {
  113. return NewStreamReader(reader)
  114. }
  115. return NewPacketReader(reader)
  116. }