Unregistered events when client WS session is closed.
[src/xds/xds-agent.git] / lib / agent / project-st.go
index c0d2550..e2cd3cb 100644 (file)
@@ -1,6 +1,7 @@
 package agent
 
 import (
+       "github.com/iotbzh/xds-agent/lib/apiv1"
        st "github.com/iotbzh/xds-agent/lib/syncthing"
 )
 
@@ -25,7 +26,7 @@ func NewProjectST(ctx *Context, svr *XdsServer) *STProject {
 }
 
 // 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
@@ -48,7 +49,7 @@ func (p *STProject) Add(cfg ProjectConfig) (*ProjectConfig, error) {
 
        locPrj, err := p.SThg.FolderConfigGet(id)
        if err != nil {
-               svrPrj.Status = StatusErrorConfig
+               svrPrj.Status = apiv1.StatusErrorConfig
                return nil, err
        }
        if svrPrj.ID != locPrj.ID {
@@ -70,21 +71,21 @@ func (p *STProject) Delete() error {
 }
 
 // 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()
 
        // Register events to update folder status
        // Register to XDS Server events
-       p.server.EventOn("event:FolderStateChanged", p._cbServerFolderChanged)
+       p.server.EventOn("event:FolderStateChanged", "", p._cbServerFolderChanged)
        if err := p.server.EventRegister("FolderStateChanged", svrPrj.ID); err != nil {
                p.Log.Warningf("XDS Server EventRegister failed: %v", err)
                return svrPrj, err
@@ -127,12 +128,12 @@ func (p *STProject) IsInSync() (bool, error) {
 
 // callback use to update (XDS Server) folder IsInSync status
 
-func (p *STProject) _cbServerFolderChanged(data interface{}) {
+func (p *STProject) _cbServerFolderChanged(pData interface{}, data interface{}) error {
        evt := data.(XdsEventFolderChange)
 
        // Only process event that concerns this project/folder ID
        if p.folder.ID != evt.Folder.ID {
-               return
+               return nil
        }
 
        if evt.Folder.IsInSync != p.folder.DataCloudSync.STSvrIsInSync ||
@@ -141,10 +142,11 @@ func (p *STProject) _cbServerFolderChanged(data interface{}) {
                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 {
-                       p.Log.Warningf("Cannot notify project change: %v", err)
+               if err := p.events.Emit(apiv1.EVTProjectChange, p.server.FolderToProject(*p.folder)); err != nil {
+                       p.Log.Warningf("Cannot notify project change (from server): %v", err)
                }
        }
+       return nil
 }
 
 // callback use to update IsInSync status
@@ -161,15 +163,15 @@ func (p *STProject) _cbLocalSTEvents(ev st.Event, data *st.EventsCBData) {
                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
        }
@@ -179,8 +181,8 @@ func (p *STProject) _cbLocalSTEvents(ev st.Event, data *st.EventsCBData) {
                p.folder.DataCloudSync.STLocIsInSync = inSync
                p.folder.DataCloudSync.STLocStatus = sts
 
-               if err := p.events.Emit(EVTProjectChange, p.server.FolderToProject(*p.folder)); err != nil {
-                       p.Log.Warningf("Cannot notify project change: %v", err)
+               if err := p.events.Emit(apiv1.EVTProjectChange, p.server.FolderToProject(*p.folder)); err != nil {
+                       p.Log.Warningf("Cannot notify project change (local): %v", err)
                }
        }
 }