@@ -3,11 +3,13 @@ package tunnel
33import (
44 "sync"
55
6+ "lion/pkg/common"
67 "lion/pkg/guacd"
7- "lion/pkg/session "
8+ "lion/pkg/logger "
89)
910
1011type Tunneler interface {
12+ UUID () string
1113 WriteAndFlush (p []byte ) (int , error )
1214 ReadInstruction () (guacd.Instruction , error )
1315 Close () error
@@ -22,6 +24,16 @@ type GuaTunnelCache interface {
2224 GetBySessionId (sid string ) * Connection
2325 GetMonitorTunnelerBySessionId (sid string ) Tunneler
2426 RemoveMonitorTunneler (sid string , monitorTunnel Tunneler )
27+
28+ GetSessionEventChan (sid string ) * EventChan
29+ BroadcastSessionEvent (sid string , event * Event )
30+ RecycleSessionEventChannel (sid string , eventChan * EventChan )
31+ }
32+
33+ type SessionEvent interface {
34+ GetSessionEventChannel (sid string ) * EventChan
35+ RecycleSessionEventChannel (sid string , eventChan * EventChan )
36+ BroadcastSessionEvent (sid string , event * Event )
2537}
2638
2739var (
@@ -33,27 +45,76 @@ type GuaTunnelCacheManager struct {
3345 GuaTunnelCache
3446}
3547
36- type SessionCache struct {
37- sync.Mutex
38- Sessions map [string ]* session.TunnelSession
48+ type Room struct {
49+ sid string
50+ eventChanMaps map [string ]* EventChan
51+ lock sync.Mutex
52+ }
53+
54+ func (r * Room ) GetEventChannel (sid string ) * EventChan {
55+ r .lock .Lock ()
56+ defer r .lock .Unlock ()
57+ eventChan := NewEventChan (sid )
58+ r .eventChanMaps [eventChan .id ] = eventChan
59+ return eventChan
60+ }
61+
62+ func (r * Room ) RecycleEventChannel (eventChan * EventChan ) {
63+ r .lock .Lock ()
64+ defer r .lock .Unlock ()
65+ delete (r .eventChanMaps , eventChan .id )
66+ eventChan .Close ()
67+ }
68+
69+ func (r * Room ) BroadcastEvent (event * Event ) {
70+ r .lock .Lock ()
71+ defer r .lock .Unlock ()
72+ for _ , eventChan := range r .eventChanMaps {
73+ eventChan .SendEvent (event )
74+ }
3975}
4076
41- func ( g * SessionCache ) Add ( s * session. TunnelSession ) {
42- g . Lock ()
43- defer g . Unlock ()
44- g . Sessions [ s . ID ] = s
77+ type EventChan struct {
78+ id string
79+ sid string
80+ eventCh chan * Event
4581}
4682
47- func (g * SessionCache ) Get (sid string ) * session.TunnelSession {
48- g .Lock ()
49- defer g .Unlock ()
50- return g .Sessions [sid ]
83+ func (e * EventChan ) GetEventChannel () chan * Event {
84+ return e .eventCh
5185}
5286
53- func (g * SessionCache ) Pop ( sid string ) * session. TunnelSession {
54- g . Lock ()
55- defer g . Unlock ()
56- sess := g . Sessions [ sid ]
57- delete ( g . Sessions , sid )
58- return sess
87+ func (e * EventChan ) SendEvent ( event * Event ) {
88+ select {
89+ case e . eventCh <- event :
90+ default :
91+ logger . Errorf ( "EventChan %s for session %s is full" , e . id , e . sid )
92+ }
5993}
94+
95+ func (e * EventChan ) Close () {
96+ close (e .eventCh )
97+ }
98+
99+ func NewEventChan (sid string ) * EventChan {
100+ return & EventChan {
101+ id : common .UUID (),
102+ sid : sid ,
103+ eventCh : make (chan * Event , 5 ),
104+ }
105+ }
106+
107+ type Event struct {
108+ Type string
109+ Data []byte
110+ }
111+
112+ const (
113+ ShareJoin = "share_join"
114+ ShareExit = "share_exit"
115+ ShareUsers = "share_users"
116+
117+ ShareRemoveUser = "share_remove_user"
118+ ShareSessionPause = "share_session_pause"
119+ ShareSessionResume = "share_session_resume"
120+ )
0 commit comments