Reworked SDKs events (introduced sdk-state-change)
[src/xds/xds-agent.git] / webapp / src / app / @core-xds / services / xdsagent.service.ts
index 94d3dec..033185b 100644 (file)
@@ -1,6 +1,6 @@
 /**
 * @license
-* Copyright (C) 2017 "IoT.bzh"
+* Copyright (C) 2017-2018 "IoT.bzh"
 * Author Sebastien Douheret <sebastien@iot.bzh>
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,7 +25,7 @@ import { BehaviorSubject } from 'rxjs/BehaviorSubject';
 import * as io from 'socket.io-client';
 
 import { AlertService } from './alert.service';
-import { ISdk } from './sdk.service';
+import { ISdk, ISdkManagementMsg } from './sdk.service';
 import { ProjectType, ProjectTypeEnum } from './project.service';
 
 // Import RxJs required methods
@@ -34,7 +34,7 @@ import 'rxjs/add/operator/catch';
 import 'rxjs/add/observable/throw';
 import 'rxjs/add/operator/mergeMap';
 import 'rxjs/add/observable/of';
-import 'rxjs/add/operator/retryWhen';
+import { ErrorObservable } from 'rxjs/observable/ErrorObservable';
 
 
 export interface IXDSConfigProject {
@@ -133,6 +133,11 @@ export class XDSAgentService {
   protected projectDel$ = new Subject<IXDSProjectConfig>();
   protected projectChange$ = new Subject<IXDSProjectConfig>();
 
+  protected sdkAdd$ = new Subject<ISdk>();
+  protected sdkRemove$ = new Subject<ISdk>();
+  protected sdkChange$ = new Subject<ISdk>();
+  protected sdkManagement$ = new Subject<ISdkManagementMsg>();
+
   private baseUrl: string;
   private wsUrl: string;
   private httpSessionID: string;
@@ -246,10 +251,12 @@ export class XDSAgentService {
       }
     });
 
+    /*** Project events ****/
+
     this.socket.on('event:project-add', (ev) => {
       if (ev && ev.data && ev.data.id) {
         this.projectAdd$.next(Object.assign({}, ev.data));
-        if (ev.sessionID !== this.httpSessionID && ev.data.label) {
+        if (ev.sessionID !== '' && ev.sessionID !== this.httpSessionID && ev.data.label) {
           this.alert.info('Project "' + ev.data.label + '" has been added by another tool.');
         }
       } else if (isDevMode) {
@@ -261,7 +268,7 @@ export class XDSAgentService {
     this.socket.on('event:project-delete', (ev) => {
       if (ev && ev.data && ev.data.id) {
         this.projectDel$.next(Object.assign({}, ev.data));
-        if (ev.sessionID !== this.httpSessionID && ev.data.label) {
+        if (ev.sessionID !== '' && ev.sessionID !== this.httpSessionID && ev.data.label) {
           this.alert.info('Project "' + ev.data.label + '" has been deleted by another tool.');
         }
       } else if (isDevMode) {
@@ -273,7 +280,60 @@ export class XDSAgentService {
       if (ev && ev.data) {
         this.projectChange$.next(Object.assign({}, ev.data));
       } else if (isDevMode) {
-        console.log('Warning: received event:project-state-change with unknown data: ev=', ev);
+        console.log('Warning: received event:project-state-change with unkn220own data: ev=', ev);
+      }
+    });
+
+    /*** SDK Events ***/
+
+    this.socket.on('event:sdk-add', (ev) => {
+      if (ev && ev.data && ev.data.id) {
+        const evt = <ISdk>ev.data;
+        this.sdkAdd$.next(Object.assign({}, evt));
+
+        if (ev.sessionID !== '' && ev.sessionID !== this.httpSessionID && evt.name) {
+          this.alert.info('SDK "' + evt.name + '" has been added by another tool.');
+        }
+      } else if (isDevMode) {
+        console.log('Warning: received event:sdk-add with unknown data: ev=', ev);
+      }
+    });
+
+    this.socket.on('event:sdk-remove', (ev) => {
+      if (ev && ev.data && ev.data.id) {
+        const evt = <ISdk>ev.data;
+        this.sdkRemove$.next(Object.assign({}, evt));
+
+        if (ev.sessionID !== '' && ev.sessionID !== this.httpSessionID && evt.name) {
+          this.alert.info('SDK "' + evt.name + '" has been removed by another tool.');
+        }
+      } else if (isDevMode) {
+        console.log('Warning: received event:sdk-remove with unknown data: ev=', ev);
+      }
+    });
+
+    this.socket.on('event:sdk-state-change', (ev) => {
+      if (ev && ev.data && ev.data.id) {
+        const evt = <ISdk>ev.data;
+        this.sdkChange$.next(Object.assign({}, evt));
+
+      } else if (isDevMode) {
+        console.log('Warning: received event:sdk-state-change with unknown data: ev=', ev);
+      }
+    });
+
+
+    this.socket.on('event:sdk-management', (ev) => {
+      if (ev && ev.data && ev.data.sdk) {
+        const evt = <ISdkManagementMsg>ev.data;
+        this.sdkManagement$.next(Object.assign({}, evt));
+
+        if (ev.sessionID !== '' && ev.sessionID !== this.httpSessionID && evt.sdk.name) {
+          this.alert.info('SDK "' + evt.sdk.name + '" has been installed by another tool.');
+        }
+      } else if (isDevMode) {
+        /* tslint:disable:no-console */
+        console.log('Warning: received event:sdk-install with unknown data: ev=', ev);
       }
     });
 
@@ -294,6 +354,22 @@ export class XDSAgentService {
     return this.projectChange$.asObservable();
   }
 
+  onSdkAdd(): Observable<ISdk> {
+    return this.sdkAdd$.asObservable();
+  }
+
+  onSdkRemove(): Observable<ISdk> {
+    return this.sdkRemove$.asObservable();
+  }
+
+  onSdkChange(): Observable<ISdk> {
+    return this.sdkChange$.asObservable();
+  }
+
+  onSdkManagement(): Observable<ISdkManagementMsg> {
+    return this.sdkManagement$.asObservable();
+  }
+
   /**
   ** Misc / Version
   ***/
@@ -355,10 +431,22 @@ export class XDSAgentService {
     if (!svr || !svr.connected) {
       return Observable.of([]);
     }
-
     return this._get(svr.partialUrl + '/sdks');
   }
 
+  installSdk(serverID: string, id: string, filename?: string, force?: boolean): Observable<ISdk> {
+    return this._post(this._getServerUrl(serverID) + '/sdks', { id: id, filename: filename, force: force });
+  }
+
+  abortInstall(serverID: string, id: string): Observable<ISdk> {
+    return this._post(this._getServerUrl(serverID) + '/sdks/abortinstall', { id: id });
+  }
+
+  removeSdk(serverID: string, id: string): Observable<ISdk> {
+    return this._delete(this._getServerUrl(serverID) + '/sdks/' + id);
+  }
+
+
   /***
   ** Projects
   ***/
@@ -420,6 +508,17 @@ export class XDSAgentService {
     return svr[0];
   }
 
+  private _getServerUrl(serverID: string): string | ErrorObservable {
+    const svr = this._getServer(serverID);
+    if (!svr || !svr.connected) {
+      if (isDevMode) {
+        console.log('ERROR: XDS Server unknown: serverID=' + serverID);
+      }
+      return Observable.throw('Cannot identify XDS Server');
+    }
+    return svr.partialUrl;
+  }
+
   private _attachAuthHeaders(options?: any) {
     options = options || {};
     const headers = options.headers || new HttpHeaders();