10 // EventTypePrefix Used as event prefix
11 EventTypePrefix = "event:" // following by event type
13 // Supported Events type
15 EVTServerConfig = "server-config" // data type ServerCfg
16 EVTProjectAdd = "project-add" // data type ProjectConfig
17 EVTProjectDelete = "project-delete" // data type ProjectConfig
18 EVTProjectChange = "project-state-change" // data type ProjectConfig
21 var _EVTAllList = []string{
28 // EventMsg Message send
29 type EventMsg struct {
30 Time string `json:"time"`
31 Type string `json:"type"`
32 Data interface{} `json:"data"`
35 type EventDef struct {
41 eventsMap map[string]*EventDef
44 // NewEvents creates an instance of Events
45 func NewEvents(ctx *Context) *Events {
46 evMap := make(map[string]*EventDef)
47 for _, ev := range _EVTAllList {
48 evMap[ev] = &EventDef{
49 sids: make(map[string]int),
58 // GetList returns the list of all supported events
59 func (e *Events) GetList() []string {
63 // Register Used by a client/session to register to a specific (or all) event(s)
64 func (e *Events) Register(evName, sessionID string) error {
67 if _, ok := e.eventsMap[evName]; !ok {
68 return fmt.Errorf("Unsupported event type name")
70 evs = []string{evName}
72 for _, ev := range evs {
73 e.eventsMap[ev].sids[sessionID]++
78 // UnRegister Used by a client/session to unregister event(s)
79 func (e *Events) UnRegister(evName, sessionID string) error {
82 if _, ok := e.eventsMap[evName]; !ok {
83 return fmt.Errorf("Unsupported event type name")
85 evs = []string{evName}
87 for _, ev := range evs {
88 if _, exist := e.eventsMap[ev].sids[sessionID]; exist {
89 delete(e.eventsMap[ev].sids, sessionID)
96 // Emit Used to manually emit an event
97 func (e *Events) Emit(evName string, data interface{}) error {
100 if _, ok := e.eventsMap[evName]; !ok {
101 return fmt.Errorf("Unsupported event type")
105 e.Log.Debugf("Emit Event %s: %v", evName, data)
109 evm := e.eventsMap[evName]
110 for sid := range evm.sids {
111 so := e.webServer.sessions.IOSocketGet(sid)
114 firstErr = fmt.Errorf("IOSocketGet return nil")
119 Time: time.Now().String(),
123 if err := (*so).Emit(EventTypePrefix+evName, msg); err != nil {
124 e.Log.Errorf("WS Emit %v error : %v", EventTypePrefix+evName, err)