/* * Copyright (C) 2017-2018 "IoT.bzh" * Author Sebastien Douheret * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package xaapiv1 import ( "encoding/json" "fmt" ) // EventRegisterArgs is the parameters (json format) of /events/register command type EventRegisterArgs struct { Name string `json:"name"` ProjectID string `json:"filterProjectID"` } // EventUnRegisterArgs is the parameters (json format) of /events/unregister command type EventUnRegisterArgs struct { Name string `json:"name"` ID int `json:"id"` } // Events Type definitions const ( // EventTypePrefix Used as event prefix EventTypePrefix = "event:" // following by event type // Supported Events type EVTAll = EventTypePrefix + "all" EVTServerConfig = EventTypePrefix + "server-config" // type EventMsg with Data type xaapiv1.ServerCfg EVTProjectAdd = EventTypePrefix + "project-add" // type EventMsg with Data type xaapiv1.ProjectConfig EVTProjectDelete = EventTypePrefix + "project-delete" // type EventMsg with Data type xaapiv1.ProjectConfig EVTProjectChange = EventTypePrefix + "project-state-change" // type EventMsg with Data type xaapiv1.ProjectConfig EVTSDKAdd = EventTypePrefix + "sdk-add" // type EventMsg with Data type xaapiv1.SDK EVTSDKRemove = EventTypePrefix + "sdk-remove" // type EventMsg with Data type xaapiv1.SDK EVTSDKManagement = EventTypePrefix + "sdk-management" // type EventMsg with Data type xaapiv1.SDKManagementMsg EVTSDKStateChange = EventTypePrefix + "sdk-state-change" // type EventMsg with Data type xaapiv1.SDK EVTTargetAdd = EventTypePrefix + "target-add" // type EventMsg with Data type xaapiv1.TargetConfig EVTTargetRemove = EventTypePrefix + "target-remove" // type EventMsg with Data type xaapiv1.TargetConfig EVTTargetStateChange = EventTypePrefix + "target-state-change" // type EventMsg with Data type xaapiv1.TargetConfig EVTTargetTerminalAdd = EventTypePrefix + "target-terminal-add" // type EventMsg with Data type xaapiv1.TerminalConfig EVTTargetTerminalRemove = EventTypePrefix + "target-terminal-remove" // type EventMsg with Data type xaapiv1.TerminalConfig EVTTargetTerminalStateChange = EventTypePrefix + "target-terminal-state-change" // type EventMsg with Data type xaapiv1.TerminalConfig ) // EVTAllList List of all supported events var EVTAllList = []string{ EVTServerConfig, EVTProjectAdd, EVTProjectDelete, EVTProjectChange, EVTSDKAdd, EVTSDKRemove, EVTSDKManagement, EVTSDKStateChange, EVTTargetAdd, EVTTargetRemove, EVTTargetStateChange, EVTTargetTerminalAdd, EVTTargetTerminalRemove, EVTTargetTerminalStateChange, } // EventMsg Event message send over Websocket, data format depend to Type (see DecodeXXX function) type EventMsg struct { Time string `json:"time"` // Timestamp FromSessionID string `json:"sessionID"` // Session ID of client who produce this event Type string `json:"type"` // Data type Data interface{} `json:"data"` // Data } // DecodeServerCfg Helper to decode Data field type ServerCfg func (e *EventMsg) DecodeServerCfg() (ServerCfg, error) { p := ServerCfg{} if e.Type != EVTServerConfig { return p, fmt.Errorf("Invalid type") } d, err := json.Marshal(e.Data) if err == nil { err = json.Unmarshal(d, &p) } return p, err } // DecodeProjectConfig Helper to decode Data field type ProjectConfig func (e *EventMsg) DecodeProjectConfig() (ProjectConfig, error) { var err error p := ProjectConfig{} switch e.Type { case EVTProjectAdd, EVTProjectChange, EVTProjectDelete: d := []byte{} d, err = json.Marshal(e.Data) if err == nil { err = json.Unmarshal(d, &p) } default: err = fmt.Errorf("Invalid type") } return p, err } // DecodeSDKMgtMsg Helper to decode Data field type SDKManagementMsg func (e *EventMsg) DecodeSDKMgtMsg() (SDKManagementMsg, error) { var err error s := SDKManagementMsg{} if e.Type != EVTSDKManagement { return s, fmt.Errorf("Invalid type") } d := []byte{} d, err = json.Marshal(e.Data) if err == nil { err = json.Unmarshal(d, &s) } return s, err } // DecodeSDKEvent Helper to decode Data field type SDK func (e *EventMsg) DecodeSDKEvent() (SDK, error) { var err error s := SDK{} switch e.Type { case EVTSDKAdd, EVTSDKRemove, EVTSDKStateChange: d := []byte{} d, err = json.Marshal(e.Data) if err == nil { err = json.Unmarshal(d, &s) } default: err = fmt.Errorf("Invalid type") } return s, err } // DecodeTargetEvent Helper to decode Data field type TargetConfig func (e *EventMsg) DecodeTargetEvent() (TargetConfig, error) { var err error p := TargetConfig{} switch e.Type { case EVTTargetAdd, EVTTargetRemove, EVTTargetStateChange: d := []byte{} d, err = json.Marshal(e.Data) if err == nil { err = json.Unmarshal(d, &p) } default: err = fmt.Errorf("Invalid type") } return p, err } // DecodeTerminalEvent Helper to decode Data field type TerminalConfig func (e *EventMsg) DecodeTerminalEvent() (TerminalConfig, error) { var err error p := TerminalConfig{} switch e.Type { case EVTTargetTerminalAdd, EVTTargetTerminalRemove, EVTTargetTerminalStateChange: d := []byte{} d, err = json.Marshal(e.Data) if err == nil { err = json.Unmarshal(d, &p) } default: err = fmt.Errorf("Invalid type") } return p, err }