"prjs",
"iosk",
"CIFS",
- "IPROJECT"
+ "IPROJECT",
+ "unregister"
]
}
"sync"
"github.com/gin-gonic/gin"
+ "github.com/iotbzh/xds-agent/lib/apiv1"
"github.com/iotbzh/xds-agent/lib/xdsconfig"
common "github.com/iotbzh/xds-common/golib"
)
var confMut sync.Mutex
-// APIConfig parameters (json format) of /config command
-type APIConfig struct {
- Servers []ServerCfg `json:"servers"`
-
- // Not exposed outside in JSON
- Version string `json:"-"`
- APIVersion string `json:"-"`
- VersionGitTag string `json:"-"`
-}
-
-// ServerCfg .
-type ServerCfg struct {
- ID string `json:"id"`
- URL string `json:"url"`
- APIURL string `json:"apiUrl"`
- PartialURL string `json:"partialUrl"`
- ConnRetry int `json:"connRetry"`
- Connected bool `json:"connected"`
- Disabled bool `json:"disabled"`
-}
-
// GetConfig returns the configuration
func (s *APIService) getConfig(c *gin.Context) {
confMut.Lock()
// SetConfig sets configuration
func (s *APIService) setConfig(c *gin.Context) {
- var cfgArg APIConfig
+ var cfgArg apiv1.APIConfig
if c.BindJSON(&cfgArg) != nil {
common.APIError(c, "Invalid arguments")
return
c.JSON(http.StatusOK, s._getConfig())
}
-func (s *APIService) _getConfig() APIConfig {
- cfg := APIConfig{
+func (s *APIService) _getConfig() apiv1.APIConfig {
+ cfg := apiv1.APIConfig{
Version: s.Config.Version,
APIVersion: s.Config.APIVersion,
VersionGitTag: s.Config.VersionGitTag,
- Servers: []ServerCfg{},
+ Servers: []apiv1.ServerCfg{},
}
for _, svr := range s.xdsServers {
- cfg.Servers = append(cfg.Servers, ServerCfg{
+ cfg.Servers = append(cfg.Servers, apiv1.ServerCfg{
ID: svr.ID,
URL: svr.BaseURL,
APIURL: svr.APIURL,
"net/http"
"github.com/gin-gonic/gin"
+ "github.com/iotbzh/xds-agent/lib/apiv1"
common "github.com/iotbzh/xds-common/golib"
)
-// 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"`
-}
-
// eventsList Registering for events that will be send over a WS
func (s *APIService) eventsList(c *gin.Context) {
c.JSON(http.StatusOK, s.events.GetList())
// eventsRegister Registering for events that will be send over a WS
func (s *APIService) eventsRegister(c *gin.Context) {
- var args EventRegisterArgs
+ var args apiv1.EventRegisterArgs
if c.BindJSON(&args) != nil || args.Name == "" {
common.APIError(c, "Invalid arguments")
// eventsRegister Registering for events that will be send over a WS
func (s *APIService) eventsUnRegister(c *gin.Context) {
- var args EventUnRegisterArgs
+ var args apiv1.EventUnRegisterArgs
if c.BindJSON(&args) != nil || args.Name == "" {
common.APIError(c, "Invalid arguments")
"net/http"
"github.com/gin-gonic/gin"
+ "github.com/iotbzh/xds-agent/lib/apiv1"
common "github.com/iotbzh/xds-common/golib"
uuid "github.com/satori/go.uuid"
)
-// ExecArgs Only define used fields
-type ExecArgs struct {
- ID string `json:"id" binding:"required"`
- CmdID string `json:"cmdID"` // command unique ID
-}
-
var execCmdID = 1
// ExecCmd executes remotely a command
common.APIError(c, err.Error())
}
- args := ExecArgs{}
+ args := apiv1.ExecArgs{}
// XXX - we cannot use c.BindJSON, so directly unmarshall it
// (see https://github.com/gin-gonic/gin/issues/1078)
if err := json.Unmarshal(data, &args); err != nil {
// Forward XDSServer WS events to client WS
// TODO removed static event name list and get it from XDSServer
evtList := []string{
- "exec:input",
- "exec:output",
- "exec:inferior-input",
- "exec:inferior-output",
+ apiv1.ExecInEvent,
+ apiv1.ExecOutEvent,
+ apiv1.ExecInferiorInEvent,
+ apiv1.ExecInferiorOutEvent,
}
so := *sock
fwdFuncID := []uuid.UUID{}
// Handle Exit event separately to cleanup registered listener
var exitFuncID uuid.UUID
exitFunc := func(evData interface{}) {
- so.Emit("exec:exit", evData)
+ so.Emit(apiv1.ExecExitEvent, evData)
// cleanup listener
for i, evName := range evtList {
svr.EventOff(evName, fwdFuncID[i])
}
- svr.EventOff("exec:exit", exitFuncID)
+ svr.EventOff(apiv1.ExecExitEvent, exitFuncID)
}
- exitFuncID, err = svr.EventOn("exec:exit", exitFunc)
+ exitFuncID, err = svr.EventOn(apiv1.ExecExitEvent, exitFunc)
if err != nil {
common.APIError(c, err.Error())
return
return
}
c.JSON(http.StatusOK, string(body))
-
}
"net/http"
"github.com/gin-gonic/gin"
+ "github.com/iotbzh/xds-agent/lib/apiv1"
common "github.com/iotbzh/xds-common/golib"
)
// addProject adds a new project to server config
func (s *APIService) addProject(c *gin.Context) {
- var cfgArg ProjectConfig
+ var cfgArg apiv1.ProjectConfig
if c.BindJSON(&cfgArg) != nil {
common.APIError(c, "Invalid arguments")
return
--- /dev/null
+package agent
+
+// sdksPassthroughInit Declare passthrough routes for sdks
+func (s *APIService) sdksPassthroughInit(svr *XdsServer) error {
+ svr.PassthroughGet("/sdks")
+ svr.PassthroughGet("/sdk/:id")
+
+ return nil
+}
"net/http"
"github.com/gin-gonic/gin"
+ "github.com/iotbzh/xds-agent/lib/apiv1"
common "github.com/iotbzh/xds-common/golib"
)
-type version struct {
- ID string `json:"id"`
- Version string `json:"version"`
- APIVersion string `json:"apiVersion"`
- VersionGitTag string `json:"gitTag"`
-}
-
-type apiVersion struct {
- Client version `json:"client"`
- Server []version `json:"servers"`
-}
-
// getInfo : return various information about server
func (s *APIService) getVersion(c *gin.Context) {
- response := apiVersion{
- Client: version{
+ response := apiv1.XDSVersion{
+ Client: apiv1.VersionData{
ID: "",
Version: s.Config.Version,
APIVersion: s.Config.APIVersion,
},
}
- svrVer := []version{}
+ svrVer := []apiv1.VersionData{}
for _, svr := range s.xdsServers {
- res := version{}
+ res := apiv1.VersionData{}
if err := svr.GetVersion(&res); err != nil {
common.APIError(c, "Cannot retrieve version of XDS server ID %s : %v", svr.ID, err.Error())
return
// Passthrough routes (handle by XDS Server)
grp := s.apiRouter.Group(svr.PartialURL)
svr.SetAPIRouterGroup(grp)
- svr.PassthroughGet("/sdks")
- svr.PassthroughGet("/sdk/:id")
+
+ // Declare passthrough routes
+ s.sdksPassthroughInit(svr)
}
// Established connection
import (
"fmt"
"time"
-)
-
-// Events constants
-const (
- // EventTypePrefix Used as event prefix
- EventTypePrefix = "event:" // following by event type
- // Supported Events type
- EVTAll = "all"
- EVTServerConfig = "server-config" // data type ServerCfg
- EVTProjectAdd = "project-add" // data type ProjectConfig
- EVTProjectDelete = "project-delete" // data type ProjectConfig
- EVTProjectChange = "project-state-change" // data type ProjectConfig
+ "github.com/iotbzh/xds-agent/lib/apiv1"
)
var _EVTAllList = []string{
- EVTServerConfig,
- EVTProjectAdd,
- EVTProjectDelete,
- EVTProjectChange,
-}
-
-// EventMsg Message send
-type EventMsg struct {
- Time string `json:"time"`
- Type string `json:"type"`
- Data interface{} `json:"data"`
+ apiv1.EVTServerConfig,
+ apiv1.EVTProjectAdd,
+ apiv1.EVTProjectDelete,
+ apiv1.EVTProjectChange,
}
+// EventDef Definition on one event
type EventDef struct {
sids map[string]int
}
+// Events Hold registered events per context
type Events struct {
*Context
eventsMap map[string]*EventDef
// Register Used by a client/session to register to a specific (or all) event(s)
func (e *Events) Register(evName, sessionID string) error {
evs := _EVTAllList
- if evName != EVTAll {
+ if evName != apiv1.EVTAll {
if _, ok := e.eventsMap[evName]; !ok {
return fmt.Errorf("Unsupported event type name")
}
// UnRegister Used by a client/session to unregister event(s)
func (e *Events) UnRegister(evName, sessionID string) error {
evs := _EVTAllList
- if evName != EVTAll {
+ if evName != apiv1.EVTAll {
if _, ok := e.eventsMap[evName]; !ok {
return fmt.Errorf("Unsupported event type name")
}
}
continue
}
- msg := EventMsg{
+ msg := apiv1.EventMsg{
Time: time.Now().String(),
Type: evName,
Data: data,
}
- if err := (*so).Emit(EventTypePrefix+evName, msg); err != nil {
- e.Log.Errorf("WS Emit %v error : %v", EventTypePrefix+evName, err)
+ if err := (*so).Emit(apiv1.EventTypePrefix+evName, msg); err != nil {
+ e.Log.Errorf("WS Emit %v error : %v", apiv1.EventTypePrefix+evName, err)
if firstErr == nil {
firstErr = err
}
package agent
-// ProjectType definition
-type ProjectType string
-
-const (
- TypePathMap = "PathMap"
- TypeCloudSync = "CloudSync"
- TypeCifsSmb = "CIFS"
-)
-
-// Project Status definition
-const (
- StatusErrorConfig = "ErrorConfig"
- StatusDisable = "Disable"
- StatusEnable = "Enable"
- StatusPause = "Pause"
- StatusSyncing = "Syncing"
-)
+import "github.com/iotbzh/xds-agent/lib/apiv1"
// IPROJECT Project interface
type IPROJECT interface {
- Add(cfg ProjectConfig) (*ProjectConfig, error) // Add a new project
- Delete() error // Delete a project
- GetProject() *ProjectConfig // Get project public configuration
- UpdateProject(prj ProjectConfig) (*ProjectConfig, error) // Update project configuration
- GetServer() *XdsServer // Get XdsServer that holds this project
- Sync() error // Force project files synchronization
- IsInSync() (bool, error) // Check if project files are in-sync
-}
-
-// ProjectConfig is the config for one project
-type ProjectConfig struct {
- ID string `json:"id"`
- ServerID string `json:"serverId"`
- Label string `json:"label"`
- ClientPath string `json:"clientPath"`
- ServerPath string `json:"serverPath"`
- Type ProjectType `json:"type"`
- Status string `json:"status"`
- IsInSync bool `json:"isInSync"`
- DefaultSdk string `json:"defaultSdk"`
+ Add(cfg apiv1.ProjectConfig) (*apiv1.ProjectConfig, error) // Add a new project
+ Delete() error // Delete a project
+ GetProject() *apiv1.ProjectConfig // Get project public configuration
+ UpdateProject(prj apiv1.ProjectConfig) (*apiv1.ProjectConfig, error) // Update project configuration
+ GetServer() *XdsServer // Get XdsServer that holds this project
+ Sync() error // Force project files synchronization
+ IsInSync() (bool, error) // Check if project files are in-sync
}
"os"
"strings"
+ "github.com/iotbzh/xds-agent/lib/apiv1"
common "github.com/iotbzh/xds-common/golib"
)
}
// Add a new project
-func (p *PathMap) Add(cfg ProjectConfig) (*ProjectConfig, error) {
+func (p *PathMap) Add(cfg apiv1.ProjectConfig) (*apiv1.ProjectConfig, error) {
var err error
var file *os.File
errMsg := "ClientPath sanity check error (%d): %v"
}
// GetProject Get public part of project config
-func (p *PathMap) GetProject() *ProjectConfig {
+func (p *PathMap) GetProject() *apiv1.ProjectConfig {
prj := p.server.FolderToProject(*p.folder)
prj.ServerID = p.server.ID
return &prj
}
// UpdateProject Set project config
-func (p *PathMap) UpdateProject(prj ProjectConfig) (*ProjectConfig, error) {
+func (p *PathMap) UpdateProject(prj apiv1.ProjectConfig) (*apiv1.ProjectConfig, error) {
p.folder = p.server.ProjectToFolder(prj)
np := p.GetProject()
- if err := p.events.Emit(EVTProjectChange, np); err != nil {
+ if err := p.events.Emit(apiv1.EVTProjectChange, np); err != nil {
return np, err
}
return np, nil
package agent
import (
+ "github.com/iotbzh/xds-agent/lib/apiv1"
st "github.com/iotbzh/xds-agent/lib/syncthing"
)
}
// Add a new project
-func (p *STProject) Add(cfg ProjectConfig) (*ProjectConfig, error) {
+func (p *STProject) Add(cfg apiv1.ProjectConfig) (*apiv1.ProjectConfig, error) {
var err error
// Add project/folder into XDS Server
locPrj, err := p.SThg.FolderConfigGet(id)
if err != nil {
- svrPrj.Status = StatusErrorConfig
+ svrPrj.Status = apiv1.StatusErrorConfig
return nil, err
}
if svrPrj.ID != locPrj.ID {
}
// GetProject Get public part of project config
-func (p *STProject) GetProject() *ProjectConfig {
+func (p *STProject) GetProject() *apiv1.ProjectConfig {
prj := p.server.FolderToProject(*p.folder)
prj.ServerID = p.server.ID
return &prj
}
// UpdateProject Update project config
-func (p *STProject) UpdateProject(prj ProjectConfig) (*ProjectConfig, error) {
+func (p *STProject) UpdateProject(prj apiv1.ProjectConfig) (*apiv1.ProjectConfig, error) {
// Update folder
p.folder = p.server.ProjectToFolder(prj)
svrPrj := p.GetProject()
p.folder.DataCloudSync.STSvrIsInSync = evt.Folder.IsInSync
p.folder.DataCloudSync.STSvrStatus = evt.Folder.Status
- if err := p.events.Emit(EVTProjectChange, p.server.FolderToProject(*p.folder)); err != nil {
+ if err := p.events.Emit(apiv1.EVTProjectChange, p.server.FolderToProject(*p.folder)); err != nil {
p.Log.Warningf("Cannot notify project change: %v", err)
}
}
to := ev.Data["to"]
switch to {
case "scanning", "syncing":
- sts = StatusSyncing
+ sts = apiv1.StatusSyncing
case "idle":
- sts = StatusEnable
+ sts = apiv1.StatusEnable
}
inSync = (to == "idle")
case st.EventFolderPaused:
- if sts == StatusEnable {
- sts = StatusPause
+ if sts == apiv1.StatusEnable {
+ sts = apiv1.StatusPause
}
inSync = false
}
p.folder.DataCloudSync.STLocIsInSync = inSync
p.folder.DataCloudSync.STLocStatus = sts
- if err := p.events.Emit(EVTProjectChange, p.server.FolderToProject(*p.folder)); err != nil {
+ if err := p.events.Emit(apiv1.EVTProjectChange, p.server.FolderToProject(*p.folder)); err != nil {
p.Log.Warningf("Cannot notify project change: %v", err)
}
}
"log"
"time"
+ "github.com/iotbzh/xds-agent/lib/apiv1"
"github.com/iotbzh/xds-agent/lib/syncthing"
"github.com/syncthing/syncthing/lib/sync"
)
}
// GetProjectArr returns the config of all folders as an array
-func (p *Projects) GetProjectArr() []ProjectConfig {
+func (p *Projects) GetProjectArr() []apiv1.ProjectConfig {
pjMutex.Lock()
defer pjMutex.Unlock()
}
// GetProjectArrUnsafe Same as GetProjectArr without mutex protection
-func (p *Projects) GetProjectArrUnsafe() []ProjectConfig {
- conf := []ProjectConfig{}
+func (p *Projects) GetProjectArrUnsafe() []apiv1.ProjectConfig {
+ conf := []apiv1.ProjectConfig{}
for _, v := range p.projects {
prj := (*v).GetProject()
conf = append(conf, *prj)
}
// Add adds a new folder
-func (p *Projects) Add(newF ProjectConfig) (*ProjectConfig, error) {
+func (p *Projects) Add(newF apiv1.ProjectConfig) (*apiv1.ProjectConfig, error) {
prj, err := p.createUpdate(newF, true, false)
if err != nil {
return prj, err
}
// Notify client with event
- if err := p.events.Emit(EVTProjectAdd, *prj); err != nil {
+ if err := p.events.Emit(apiv1.EVTProjectAdd, *prj); err != nil {
p.Log.Warningf("Cannot notify project deletion: %v", err)
}
}
// CreateUpdate creates or update a folder
-func (p *Projects) createUpdate(newF ProjectConfig, create bool, initial bool) (*ProjectConfig, error) {
+func (p *Projects) createUpdate(newF apiv1.ProjectConfig, create bool, initial bool) (*apiv1.ProjectConfig, error) {
var err error
pjMutex.Lock()
var fld IPROJECT
switch newF.Type {
// SYNCTHING
- case TypeCloudSync:
+ case apiv1.TypeCloudSync:
if p.SThg != nil {
fld = NewProjectST(p.Context, svr)
} else {
}
// PATH MAP
- case TypePathMap:
+ case apiv1.TypePathMap:
fld = NewProjectPathMap(p.Context, svr)
default:
return nil, fmt.Errorf("Unsupported folder type")
}
- var newPrj *ProjectConfig
+ var newPrj *apiv1.ProjectConfig
if create {
// Add project on server
if newPrj, err = fld.Add(newF); err != nil {
- newF.Status = StatusErrorConfig
+ newF.Status = apiv1.StatusErrorConfig
log.Printf("ERROR Adding project: %v\n", err)
return newPrj, err
}
} else {
// Just update project config
if newPrj, err = fld.UpdateProject(newF); err != nil {
- newF.Status = StatusErrorConfig
+ newF.Status = apiv1.StatusErrorConfig
log.Printf("ERROR Updating project: %v\n", err)
return newPrj, err
}
}
// Delete deletes a specific folder
-func (p *Projects) Delete(id string) (ProjectConfig, error) {
+func (p *Projects) Delete(id string) (apiv1.ProjectConfig, error) {
var err error
pjMutex.Lock()
defer pjMutex.Unlock()
- fld := ProjectConfig{}
+ fld := apiv1.ProjectConfig{}
fc, exist := p.projects[id]
if !exist {
return fld, fmt.Errorf("unknown id")
delete(p.projects, id)
// Notify client with event
- if err := p.events.Emit(EVTProjectDelete, *prj); err != nil {
+ if err := p.events.Emit(apiv1.EVTProjectDelete, *prj); err != nil {
p.Log.Warningf("Cannot notify project deletion: %v", err)
}
return nil
}
-// nesSession Allocate a new client session
+// newSession Allocate a new client session
func (s *Sessions) newSession(prefix string) *ClientSession {
uuid := prefix + uuid.NewV4().String()
id := base64.URLEncoding.EncodeToString([]byte(uuid))
}
s.sIOServer.On("connection", func(so socketio.Socket) {
- s.Log.Debugf("WS Connected (SID=%v)", so.Id())
+ s.Log.Debugf("WS Connected (WSID=%s, SID=%s)", so.Id(), sess.ID)
s.sessions.UpdateIOSocket(sess.ID, &so)
so.On("disconnection", func() {
- s.Log.Debugf("WS disconnected (SID=%v)", so.Id())
+ s.Log.Debugf("WS disconnected (WSID=%s, SID=%s)", so.Id(), sess.ID)
s.sessions.UpdateIOSocket(sess.ID, nil)
})
})
"time"
"github.com/gin-gonic/gin"
+ "github.com/iotbzh/xds-agent/lib/apiv1"
"github.com/iotbzh/xds-agent/lib/xdsconfig"
common "github.com/iotbzh/xds-common/golib"
uuid "github.com/satori/go.uuid"
}
// ProjectToFolder Convert Project structure to Folder structure
-func (xs *XdsServer) ProjectToFolder(pPrj ProjectConfig) *XdsFolderConfig {
+func (xs *XdsServer) ProjectToFolder(pPrj apiv1.ProjectConfig) *XdsFolderConfig {
stID := ""
if pPrj.Type == XdsTypeCloudSync {
stID, _ = xs.SThg.IDGet()
}
// FolderToProject Convert Folder structure to Project structure
-func (xs *XdsServer) FolderToProject(fPrj XdsFolderConfig) ProjectConfig {
+func (xs *XdsServer) FolderToProject(fPrj XdsFolderConfig) apiv1.ProjectConfig {
inSync := fPrj.IsInSync
sts := fPrj.Status
sts = fPrj.DataCloudSync.STSvrStatus
switch fPrj.DataCloudSync.STLocStatus {
- case StatusErrorConfig, StatusDisable, StatusPause:
+ case apiv1.StatusErrorConfig, apiv1.StatusDisable, apiv1.StatusPause:
sts = fPrj.DataCloudSync.STLocStatus
break
- case StatusSyncing:
- if sts != StatusErrorConfig && sts != StatusDisable && sts != StatusPause {
- sts = StatusSyncing
+ case apiv1.StatusSyncing:
+ if sts != apiv1.StatusErrorConfig && sts != apiv1.StatusDisable && sts != apiv1.StatusPause {
+ sts = apiv1.StatusSyncing
}
break
- case StatusEnable:
+ case apiv1.StatusEnable:
// keep STSvrStatus
break
}
}
- pPrj := ProjectConfig{
+ pPrj := apiv1.ProjectConfig{
ID: fPrj.ID,
ServerID: xs.ID,
Label: fPrj.Label,
ClientPath: fPrj.ClientPath,
ServerPath: fPrj.DataPathMap.ServerPath,
- Type: ProjectType(fPrj.Type),
+ Type: apiv1.ProjectType(fPrj.Type),
Status: sts,
IsInSync: inSync,
DefaultSdk: fPrj.DefaultSdk,
// Send event to notify changes
func (xs *XdsServer) _NotifyState() {
- evSts := ServerCfg{
+ evSts := apiv1.ServerCfg{
ID: xs.ID,
URL: xs.BaseURL,
APIURL: xs.APIURL,
ConnRetry: xs.ConnRetry,
Connected: xs.Connected,
}
- if err := xs.events.Emit(EVTServerConfig, evSts); err != nil {
+ if err := xs.events.Emit(apiv1.EVTServerConfig, evSts); err != nil {
xs.Log.Warningf("Cannot notify XdsServer state change: %v", err)
}
}
--- /dev/null
+package apiv1
+
+// APIConfig parameters (json format) of /config command
+type APIConfig struct {
+ Servers []ServerCfg `json:"servers"`
+
+ // Not exposed outside in JSON
+ Version string `json:"-"`
+ APIVersion string `json:"-"`
+ VersionGitTag string `json:"-"`
+}
+
+// ServerCfg .
+type ServerCfg struct {
+ ID string `json:"id"`
+ URL string `json:"url"`
+ APIURL string `json:"apiUrl"`
+ PartialURL string `json:"partialUrl"`
+ ConnRetry int `json:"connRetry"`
+ Connected bool `json:"connected"`
+ Disabled bool `json:"disabled"`
+}
--- /dev/null
+package apiv1
+
+// 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 definitions
+const (
+ // EventTypePrefix Used as event prefix
+ EventTypePrefix = "event:" // following by event type
+
+ // Supported Events type
+ EVTAll = "all"
+ EVTServerConfig = "server-config" // data type apiv1.ServerCfg
+ EVTProjectAdd = "project-add" // data type apiv1.ProjectConfig
+ EVTProjectDelete = "project-delete" // data type apiv1.ProjectConfig
+ EVTProjectChange = "project-state-change" // data type apiv1.ProjectConfig
+)
+
+// EventMsg Message send
+type EventMsg struct {
+ Time string `json:"time"`
+ Type string `json:"type"`
+ Data interface{} `json:"data"`
+}
--- /dev/null
+package apiv1
+
+type (
+ // ExecArgs JSON parameters of /exec command
+ ExecArgs struct {
+ ID string `json:"id" binding:"required"`
+ SdkID string `json:"sdkID"` // sdk ID to use for setting env
+ CmdID string `json:"cmdID"` // command unique ID
+ Cmd string `json:"cmd" binding:"required"`
+ Args []string `json:"args"`
+ Env []string `json:"env"`
+ RPath string `json:"rpath"` // relative path into project
+ TTY bool `json:"tty"` // Use a tty, specific to gdb --tty option
+ TTYGdbserverFix bool `json:"ttyGdbserverFix"` // Set to true to activate gdbserver workaround about inferior output
+ ExitImmediate bool `json:"exitImmediate"` // when true, exit event sent immediately when command exited (IOW, don't wait file synchronization)
+ CmdTimeout int `json:"timeout"` // command completion timeout in Second
+ }
+
+ // ExecInMsg Message used to received input characters (stdin)
+ ExecInMsg struct {
+ CmdID string `json:"cmdID"`
+ Timestamp string `json:"timestamp"`
+ Stdin string `json:"stdin"`
+ }
+
+ // ExecOutMsg Message used to send output characters (stdout+stderr)
+ ExecOutMsg struct {
+ CmdID string `json:"cmdID"`
+ Timestamp string `json:"timestamp"`
+ Stdout string `json:"stdout"`
+ Stderr string `json:"stderr"`
+ }
+
+ // ExecExitMsg Message sent when executed command exited
+ ExecExitMsg struct {
+ CmdID string `json:"cmdID"`
+ Timestamp string `json:"timestamp"`
+ Code int `json:"code"`
+ Error error `json:"error"`
+ }
+
+ // ExecSignalArgs JSON parameters of /exec/signal command
+ ExecSignalArgs struct {
+ CmdID string `json:"cmdID" binding:"required"` // command id
+ Signal string `json:"signal" binding:"required"` // signal number
+ }
+)
+
+const (
+ // ExecInEvent Event send in WS when characters are sent (stdin)
+ ExecInEvent = "exec:input"
+
+ // ExecOutEvent Event send in WS when characters are received (stdout or stderr)
+ ExecOutEvent = "exec:output"
+
+ // ExecExitEvent Event send in WS when program exited
+ ExecExitEvent = "exec:exit"
+
+ // ExecInferiorInEvent Event send in WS when characters are sent to an inferior (used by gdb inferior/tty)
+ ExecInferiorInEvent = "exec:inferior-input"
+
+ // ExecInferiorOutEvent Event send in WS when characters are received by an inferior
+ ExecInferiorOutEvent = "exec:inferior-output"
+)
--- /dev/null
+package apiv1
+
+// ProjectType definition
+type ProjectType string
+
+const (
+ TypePathMap = "PathMap"
+ TypeCloudSync = "CloudSync"
+ TypeCifsSmb = "CIFS"
+)
+
+// Project Status definition
+const (
+ StatusErrorConfig = "ErrorConfig"
+ StatusDisable = "Disable"
+ StatusEnable = "Enable"
+ StatusPause = "Pause"
+ StatusSyncing = "Syncing"
+)
+
+// ProjectConfig is the config for one project
+type ProjectConfig struct {
+ ID string `json:"id"`
+ ServerID string `json:"serverId"`
+ Label string `json:"label"`
+ ClientPath string `json:"clientPath"`
+ ServerPath string `json:"serverPath"`
+ Type ProjectType `json:"type"`
+ Status string `json:"status"`
+ IsInSync bool `json:"isInSync"`
+ DefaultSdk string `json:"defaultSdk"`
+}
--- /dev/null
+package apiv1
+
+// SDK Define a cross tool chain used to build application
+type SDK struct {
+ ID string `json:"id" binding:"required"`
+ Name string `json:"name"`
+ Profile string `json:"profile"`
+ Version string `json:"version"`
+ Arch string `json:"arch"`
+ Path string `json:"path"`
+}
--- /dev/null
+package apiv1
+
+// VersionData
+type VersionData struct {
+ ID string `json:"id"`
+ Version string `json:"version"`
+ APIVersion string `json:"apiVersion"`
+ VersionGitTag string `json:"gitTag"`
+}
+
+// XDSVersion
+type XDSVersion struct {
+ Client VersionData `json:"client"`
+ Server []VersionData `json:"servers"`
+}