github.com/demisto/mattermost-server@v4.9.0-rc3+incompatible/model/websocket_message.go (about) 1 // Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved. 2 // See License.txt for license information. 3 4 package model 5 6 import ( 7 "encoding/json" 8 "fmt" 9 "io" 10 ) 11 12 const ( 13 WEBSOCKET_EVENT_TYPING = "typing" 14 WEBSOCKET_EVENT_POSTED = "posted" 15 WEBSOCKET_EVENT_POST_EDITED = "post_edited" 16 WEBSOCKET_EVENT_POST_DELETED = "post_deleted" 17 WEBSOCKET_EVENT_CHANNEL_DELETED = "channel_deleted" 18 WEBSOCKET_EVENT_CHANNEL_CREATED = "channel_created" 19 WEBSOCKET_EVENT_CHANNEL_UPDATED = "channel_updated" 20 WEBSOCKET_EVENT_CHANNEL_MEMBER_UPDATED = "channel_member_updated" 21 WEBSOCKET_EVENT_DIRECT_ADDED = "direct_added" 22 WEBSOCKET_EVENT_GROUP_ADDED = "group_added" 23 WEBSOCKET_EVENT_NEW_USER = "new_user" 24 WEBSOCKET_EVENT_ADDED_TO_TEAM = "added_to_team" 25 WEBSOCKET_EVENT_LEAVE_TEAM = "leave_team" 26 WEBSOCKET_EVENT_UPDATE_TEAM = "update_team" 27 WEBSOCKET_EVENT_DELETE_TEAM = "delete_team" 28 WEBSOCKET_EVENT_USER_ADDED = "user_added" 29 WEBSOCKET_EVENT_USER_UPDATED = "user_updated" 30 WEBSOCKET_EVENT_USER_ROLE_UPDATED = "user_role_updated" 31 WEBSOCKET_EVENT_MEMBERROLE_UPDATED = "memberrole_updated" 32 WEBSOCKET_EVENT_USER_REMOVED = "user_removed" 33 WEBSOCKET_EVENT_PREFERENCE_CHANGED = "preference_changed" 34 WEBSOCKET_EVENT_PREFERENCES_CHANGED = "preferences_changed" 35 WEBSOCKET_EVENT_PREFERENCES_DELETED = "preferences_deleted" 36 WEBSOCKET_EVENT_EPHEMERAL_MESSAGE = "ephemeral_message" 37 WEBSOCKET_EVENT_STATUS_CHANGE = "status_change" 38 WEBSOCKET_EVENT_HELLO = "hello" 39 WEBSOCKET_EVENT_WEBRTC = "webrtc" 40 WEBSOCKET_AUTHENTICATION_CHALLENGE = "authentication_challenge" 41 WEBSOCKET_EVENT_REACTION_ADDED = "reaction_added" 42 WEBSOCKET_EVENT_REACTION_REMOVED = "reaction_removed" 43 WEBSOCKET_EVENT_RESPONSE = "response" 44 WEBSOCKET_EVENT_EMOJI_ADDED = "emoji_added" 45 WEBSOCKET_EVENT_CHANNEL_VIEWED = "channel_viewed" 46 WEBSOCKET_EVENT_PLUGIN_ACTIVATED = "plugin_activated" // EXPERIMENTAL - SUBJECT TO CHANGE 47 WEBSOCKET_EVENT_PLUGIN_DEACTIVATED = "plugin_deactivated" // EXPERIMENTAL - SUBJECT TO CHANGE 48 WEBSOCKET_EVENT_ROLE_UPDATED = "role_updated" 49 WEBSOCKET_EVENT_LICENSE_CHANGED = "license_changed" 50 WEBSOCKET_EVENT_CONFIG_CHANGED = "config_changed" 51 ) 52 53 type WebSocketMessage interface { 54 ToJson() string 55 IsValid() bool 56 EventType() string 57 } 58 59 type WebsocketBroadcast struct { 60 OmitUsers map[string]bool `json:"omit_users"` // broadcast is omitted for users listed here 61 UserId string `json:"user_id"` // broadcast only occurs for this user 62 ChannelId string `json:"channel_id"` // broadcast only occurs for users in this channel 63 TeamId string `json:"team_id"` // broadcast only occurs for users in this team 64 } 65 66 type precomputedWebSocketEventJSON struct { 67 Event json.RawMessage 68 Data json.RawMessage 69 Broadcast json.RawMessage 70 } 71 72 type WebSocketEvent struct { 73 Event string `json:"event"` 74 Data map[string]interface{} `json:"data"` 75 Broadcast *WebsocketBroadcast `json:"broadcast"` 76 Sequence int64 `json:"seq"` 77 78 precomputedJSON *precomputedWebSocketEventJSON 79 } 80 81 // PrecomputeJSON precomputes and stores the serialized JSON for all fields other than Sequence. 82 // This makes ToJson much more efficient when sending the same event to multiple connections. 83 func (m *WebSocketEvent) PrecomputeJSON() { 84 event, _ := json.Marshal(m.Event) 85 data, _ := json.Marshal(m.Data) 86 broadcast, _ := json.Marshal(m.Broadcast) 87 m.precomputedJSON = &precomputedWebSocketEventJSON{ 88 Event: json.RawMessage(event), 89 Data: json.RawMessage(data), 90 Broadcast: json.RawMessage(broadcast), 91 } 92 } 93 94 func (m *WebSocketEvent) Add(key string, value interface{}) { 95 m.Data[key] = value 96 } 97 98 func NewWebSocketEvent(event, teamId, channelId, userId string, omitUsers map[string]bool) *WebSocketEvent { 99 return &WebSocketEvent{Event: event, Data: make(map[string]interface{}), 100 Broadcast: &WebsocketBroadcast{TeamId: teamId, ChannelId: channelId, UserId: userId, OmitUsers: omitUsers}} 101 } 102 103 func (o *WebSocketEvent) IsValid() bool { 104 return o.Event != "" 105 } 106 107 func (o *WebSocketEvent) EventType() string { 108 return o.Event 109 } 110 111 func (o *WebSocketEvent) ToJson() string { 112 if o.precomputedJSON != nil { 113 return fmt.Sprintf(`{"event": %s, "data": %s, "broadcast": %s, "seq": %d}`, o.precomputedJSON.Event, o.precomputedJSON.Data, o.precomputedJSON.Broadcast, o.Sequence) 114 } 115 b, _ := json.Marshal(o) 116 return string(b) 117 } 118 119 func WebSocketEventFromJson(data io.Reader) *WebSocketEvent { 120 var o *WebSocketEvent 121 json.NewDecoder(data).Decode(&o) 122 return o 123 } 124 125 type WebSocketResponse struct { 126 Status string `json:"status"` 127 SeqReply int64 `json:"seq_reply,omitempty"` 128 Data map[string]interface{} `json:"data,omitempty"` 129 Error *AppError `json:"error,omitempty"` 130 } 131 132 func (m *WebSocketResponse) Add(key string, value interface{}) { 133 m.Data[key] = value 134 } 135 136 func NewWebSocketResponse(status string, seqReply int64, data map[string]interface{}) *WebSocketResponse { 137 return &WebSocketResponse{Status: status, SeqReply: seqReply, Data: data} 138 } 139 140 func NewWebSocketError(seqReply int64, err *AppError) *WebSocketResponse { 141 return &WebSocketResponse{Status: STATUS_FAIL, SeqReply: seqReply, Error: err} 142 } 143 144 func (o *WebSocketResponse) IsValid() bool { 145 return o.Status != "" 146 } 147 148 func (o *WebSocketResponse) EventType() string { 149 return WEBSOCKET_EVENT_RESPONSE 150 } 151 152 func (o *WebSocketResponse) ToJson() string { 153 b, _ := json.Marshal(o) 154 return string(b) 155 } 156 157 func WebSocketResponseFromJson(data io.Reader) *WebSocketResponse { 158 var o *WebSocketResponse 159 json.NewDecoder(data).Decode(&o) 160 return o 161 }