blob: 32f6f4a07be9ea33bc1a8769875b96d92af18955 [file] [log] [blame]
Matteo Scandolofb46ae62017-08-08 09:10:50 -07001
2/*
3 * Copyright 2017-present Open Networking Foundation
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
Matteo Scandolo035c5932016-12-14 09:55:15 -080019import * as io from 'socket.io-client';
Matteo Scandolo98b5f5d2017-03-17 17:09:05 -070020import * as _ from 'lodash';
Matteo Scandolo035c5932016-12-14 09:55:15 -080021import {Subject, Observable} from 'rxjs/Rx';
Matteo Scandolo828d1e82017-01-17 14:49:38 -080022import {IXosAppConfig} from '../../../index';
Matteo Scandolo035c5932016-12-14 09:55:15 -080023
24export interface IWSEvent {
25 model: string;
Matteo Scandoloe6f9c352017-09-01 12:19:56 -070026 skip_notification?: boolean;
Matteo Scandolo035c5932016-12-14 09:55:15 -080027 msg: {
28 changed_fields: string[],
29 object?: any,
30 pk?: number
31 };
32}
33
34export interface IWSEventService {
35 list(): Observable<IWSEvent>;
36}
37
38export class WebSocketEvent {
Matteo Scandolo828d1e82017-01-17 14:49:38 -080039
Matteo Scandolo98b5f5d2017-03-17 17:09:05 -070040 static $inject = [
41 'AppConfig',
42 '$log'
43 ];
Matteo Scandolo828d1e82017-01-17 14:49:38 -080044
Matteo Scandoloe015fa92017-05-10 09:52:36 -070045
Matteo Scandolo035c5932016-12-14 09:55:15 -080046 private _events: Subject<IWSEvent> = new Subject<IWSEvent>();
Matteo Scandoloe015fa92017-05-10 09:52:36 -070047 private socket;
48 constructor(
49 private AppConfig: IXosAppConfig,
50 private $log: ng.ILogService
51 ) {
52 // NOTE list of field that are not useful to the UI
53 const ignoredFields: string[] = ['created', 'updated', 'backend_register'];
Matteo Scandolo98b5f5d2017-03-17 17:09:05 -070054
Matteo Scandoloe015fa92017-05-10 09:52:36 -070055 this.socket = io(this.AppConfig.websocketClient);
56 this.socket.on('event', (data: IWSEvent): void => {
Matteo Scandolo98b5f5d2017-03-17 17:09:05 -070057
Matteo Scandoloe015fa92017-05-10 09:52:36 -070058 if (data.msg.changed_fields.length === 0 || _.intersection(data.msg.changed_fields, ignoredFields).length === data.msg.changed_fields.length) {
59 // NOTE means that the only updated fields does not change anything in the UI, so don't send events around
60 this.$log.debug(`[WebSocket] Ignoring Event for: ${data.model} [${data.msg.pk}]`);
61 return;
62 }
63
Matteo Scandoloe6f9c352017-09-01 12:19:56 -070064 this.$log.info(`[WebSocket] Received Event for: ${data.model} [${data.msg.pk}]`, data);
Matteo Scandoloc3804aa2017-08-09 16:00:43 -070065
Matteo Scandoloe015fa92017-05-10 09:52:36 -070066 this._events.next(data);
67
68 // NOTE update observers of parent classes
69 if (data.msg.object.class_names && angular.isString(data.msg.object.class_names)) {
70 const models = data.msg.object.class_names.split(',');
Matteo Scandoloe6f9c352017-09-01 12:19:56 -070071 let event: IWSEvent = angular.copy(data);
Matteo Scandoloe015fa92017-05-10 09:52:36 -070072 _.forEach(models, (m: string) => {
Matteo Scandolobcac2dc2017-08-21 14:13:45 -070073 // send event only if the parent class is not the same as the model class
Matteo Scandoloe6f9c352017-09-01 12:19:56 -070074 if (event.model !== m && m !== 'object') {
75 event.model = m;
76 event.skip_notification = true;
77 this._events.next(event);
Matteo Scandolobcac2dc2017-08-21 14:13:45 -070078 }
Matteo Scandoloe015fa92017-05-10 09:52:36 -070079 });
80 }
81
82 });
Matteo Scandolo035c5932016-12-14 09:55:15 -080083 }
84 list() {
85 return this._events.asObservable();
86 }
87}