Added Target and Terminal events through WS.
[src/xds/xds-server.git] / lib / xsapiv1 / events.go
1 /*
2  * Copyright (C) 2017-2018 "IoT.bzh"
3  * Author Sebastien Douheret <sebastien@iot.bzh>
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *   http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17
18 package xsapiv1
19
20 import (
21         "encoding/json"
22         "fmt"
23 )
24
25 // EventRegisterArgs Parameters (json format) of /events/register command
26 type EventRegisterArgs struct {
27         Name   string `json:"name"`
28         Filter string `json:"filter"`
29 }
30
31 // EventUnRegisterArgs Parameters of /events/unregister command
32 type EventUnRegisterArgs struct {
33         Name string `json:"name"`
34         ID   int    `json:"id"`
35 }
36
37 // EventMsg Message send
38 type EventMsg struct {
39         Time          string      `json:"time"`
40         FromSessionID string      `json:"sessionID"` // Session ID of client who produce this event
41         Type          string      `json:"type"`
42         Data          interface{} `json:"data"` // Data
43 }
44
45 // EventEvent Event send in WS when an internal event (eg. Syncthing event is received)
46 const (
47         // EventTypePrefix Used as event prefix
48         EventTypePrefix = "event:" // following by event type
49
50         // Supported Events type
51         EVTAll = EventTypePrefix + "all"
52
53         EVTFolderChange      = EventTypePrefix + "folder-change"       // type EventMsg with Data type xsapiv1.FolderConfig
54         EVTFolderStateChange = EventTypePrefix + "folder-state-change" // type EventMsg with Data type xsapiv1.FolderConfig
55
56         EVTSDKAdd         = EventTypePrefix + "sdk-add"          // type EventMsg with Data type xsapiv1.SDK
57         EVTSDKRemove      = EventTypePrefix + "sdk-remove"       // type EventMsg with Data type xsapiv1.SDK
58         EVTSDKManagement  = EventTypePrefix + "sdk-management"   // type EventMsg with Data type xsapiv1.SDKManagementMsg
59         EVTSDKStateChange = EventTypePrefix + "sdk-state-change" // type EventMsg with Data type xsapiv1.SDK
60
61         EVTTargetAdd         = EventTypePrefix + "target-add"          // type EventMsg with Data type xsapiv1.TargetConfig
62         EVTTargetRemove      = EventTypePrefix + "target-remove"       // type EventMsg with Data type xsapiv1.TargetConfig
63         EVTTargetStateChange = EventTypePrefix + "target-state-change" // type EventMsg with Data type xsapiv1.TargetConfig
64
65         EVTTargetTerminalAdd         = EventTypePrefix + "target-terminal-add"          // type EventMsg with Data type xsapiv1.TerminalConfig
66         EVTTargetTerminalRemove      = EventTypePrefix + "target-terminal-remove"       // type EventMsg with Data type xsapiv1.TerminalConfig
67         EVTTargetTerminalStateChange = EventTypePrefix + "target-terminal-state-change" // type EventMsg with Data type xsapiv1.TerminalConfig
68 )
69
70 // EVTAllList List of all supported events
71 var EVTAllList = []string{
72         EVTFolderChange,
73         EVTFolderStateChange,
74         EVTSDKAdd,
75         EVTSDKRemove,
76         EVTSDKManagement,
77         EVTSDKStateChange,
78         EVTTargetAdd,
79         EVTTargetRemove,
80         EVTTargetStateChange,
81         EVTTargetTerminalAdd,
82         EVTTargetTerminalRemove,
83         EVTTargetTerminalStateChange,
84 }
85
86 // DecodeFolderConfig Helper to decode Data field type FolderConfig
87 func (e *EventMsg) DecodeFolderConfig() (FolderConfig, error) {
88         var err error
89         f := FolderConfig{}
90         switch e.Type {
91         case EVTFolderChange, EVTFolderStateChange:
92                 d := []byte{}
93                 d, err = json.Marshal(e.Data)
94                 if err == nil {
95                         err = json.Unmarshal(d, &f)
96                 }
97         default:
98                 err = fmt.Errorf("Invalid type")
99         }
100         return f, err
101 }
102
103 // DecodeSDKEvent Helper to decode Data field type SDK
104 func (e *EventMsg) DecodeSDKEvent() (SDK, error) {
105         var err error
106         s := SDK{}
107         switch e.Type {
108         case EVTSDKAdd, EVTSDKRemove, EVTSDKStateChange:
109                 d := []byte{}
110                 d, err = json.Marshal(e.Data)
111                 if err == nil {
112                         err = json.Unmarshal(d, &s)
113                 }
114         default:
115                 err = fmt.Errorf("Invalid type")
116         }
117         return s, err
118 }
119
120 // DecodeTargetEvent Helper to decode Data field type TargetConfig
121 func (e *EventMsg) DecodeTargetEvent() (TargetConfig, error) {
122         var err error
123         p := TargetConfig{}
124         switch e.Type {
125         case EVTTargetAdd, EVTTargetRemove, EVTTargetStateChange:
126                 d := []byte{}
127                 d, err = json.Marshal(e.Data)
128                 if err == nil {
129                         err = json.Unmarshal(d, &p)
130                 }
131         default:
132                 err = fmt.Errorf("Invalid type")
133         }
134         return p, err
135 }
136
137 // DecodeTerminalEvent Helper to decode Data field type TerminalConfig
138 func (e *EventMsg) DecodeTerminalEvent() (TerminalConfig, error) {
139         var err error
140         p := TerminalConfig{}
141         switch e.Type {
142         case EVTTargetTerminalAdd, EVTTargetTerminalRemove, EVTTargetTerminalStateChange:
143                 d := []byte{}
144                 d, err = json.Marshal(e.Data)
145                 if err == nil {
146                         err = json.Unmarshal(d, &p)
147                 }
148         default:
149                 err = fmt.Errorf("Invalid type")
150         }
151         return p, err
152 }