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 {
42 eventsMap map[string]*EventDef
45 // NewEvents creates an instance of Events
46 func NewEvents(ctx *Context) *Events {
47 evMap := make(map[string]*EventDef)
48 for _, ev := range EVTAllList {
49 evMap[ev] = &EventDef{
50 sids: make(map[string]int),
59 // GetList returns the list of all supported events
60 func (e *Events) GetList() []string {
64 // Register Used by a client/session to register to a specific (or all) event(s)
65 func (e *Events) Register(evName, sessionID string) error {
68 if _, ok := e.eventsMap[evName]; !ok {
69 return fmt.Errorf("Unsupported event type name")
71 evs = []string{evName}
73 for _, ev := range evs {
74 e.eventsMap[ev].sids[sessionID]++
79 // UnRegister Used by a client/session to unregister event(s)
80 func (e *Events) UnRegister(evName, sessionID string) error {
83 if _, ok := e.eventsMap[evName]; !ok {
84 return fmt.Errorf("Unsupported event type name")
86 evs = []string{evName}
88 for _, ev := range evs {
89 if _, exist := e.eventsMap[ev].sids[sessionID]; exist {
90 delete(e.eventsMap[ev].sids, sessionID)
97 // Emit Used to manually emit an event
98 func (e *Events) Emit(evName string, data interface{}) error {
101 if _, ok := e.eventsMap[evName]; !ok {
102 return fmt.Errorf("Unsupported event type")
105 e.Log.Debugf("Emit Event %s: %v", evName, data)
108 evm := e.eventsMap[evName]
109 for sid := range evm.sids {
110 so := e.webServer.sessions.IOSocketGet(sid)
113 firstErr = fmt.Errorf("IOSocketGet return nil")
118 Time: time.Now().String(),
122 if err := (*so).Emit(EventTypePrefix+evName, msg); err != nil {
123 e.Log.Errorf("WS Emit %v error : %v", EventTypePrefix+evName, err)