blob: 877417324209e9173e530eae441bd83a53760f3e [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 Scandolo31daa802017-09-01 12:19:56 -070026 skip_notification?: boolean;
Matteo Scandoloe9cdf9a2017-11-21 10:41:28 -080027 deleted?: boolean;
Matteo Scandolo035c5932016-12-14 09:55:15 -080028 msg: {
29 changed_fields: string[],
30 object?: any,
31 pk?: number
32 };
33}
34
35export interface IWSEventService {
36 list(): Observable<IWSEvent>;
37}
38
39export class WebSocketEvent {
Matteo Scandolo828d1e82017-01-17 14:49:38 -080040
Matteo Scandolo98b5f5d2017-03-17 17:09:05 -070041 static $inject = [
42 'AppConfig',
43 '$log'
44 ];
Matteo Scandolo828d1e82017-01-17 14:49:38 -080045
Matteo Scandoloe015fa92017-05-10 09:52:36 -070046
Matteo Scandolo035c5932016-12-14 09:55:15 -080047 private _events: Subject<IWSEvent> = new Subject<IWSEvent>();
Matteo Scandoloe015fa92017-05-10 09:52:36 -070048 private socket;
49 constructor(
50 private AppConfig: IXosAppConfig,
51 private $log: ng.ILogService
52 ) {
53 // NOTE list of field that are not useful to the UI
54 const ignoredFields: string[] = ['created', 'updated', 'backend_register'];
Matteo Scandolo98b5f5d2017-03-17 17:09:05 -070055
Matteo Scandoloe015fa92017-05-10 09:52:36 -070056 this.socket = io(this.AppConfig.websocketClient);
Matteo Scandoloe9cdf9a2017-11-21 10:41:28 -080057
58 this.socket.on('remove', (data: IWSEvent): void => {
59 this.$log.info(`[WebSocket] Received Remove Event for: ${data.model} [${data.msg.pk}]`, data);
60 this._events.next(data);
61
62 // TODO update observers of parent classes
63 });
64
65 this.socket.on('update', (data: IWSEvent): void => {
Matteo Scandolo98b5f5d2017-03-17 17:09:05 -070066
Matteo Scandoloe015fa92017-05-10 09:52:36 -070067 if (data.msg.changed_fields.length === 0 || _.intersection(data.msg.changed_fields, ignoredFields).length === data.msg.changed_fields.length) {
68 // NOTE means that the only updated fields does not change anything in the UI, so don't send events around
Matteo Scandoloe015fa92017-05-10 09:52:36 -070069 return;
70 }
71
Matteo Scandolo31daa802017-09-01 12:19:56 -070072 this.$log.info(`[WebSocket] Received Event for: ${data.model} [${data.msg.pk}]`, data);
Matteo Scandoloc3804aa2017-08-09 16:00:43 -070073
Matteo Scandoloe015fa92017-05-10 09:52:36 -070074 this._events.next(data);
75
76 // NOTE update observers of parent classes
77 if (data.msg.object.class_names && angular.isString(data.msg.object.class_names)) {
78 const models = data.msg.object.class_names.split(',');
Matteo Scandolo31daa802017-09-01 12:19:56 -070079 let event: IWSEvent = angular.copy(data);
Matteo Scandoloe015fa92017-05-10 09:52:36 -070080 _.forEach(models, (m: string) => {
Matteo Scandolobcac2dc2017-08-21 14:13:45 -070081 // send event only if the parent class is not the same as the model class
Matteo Scandolo31daa802017-09-01 12:19:56 -070082 if (event.model !== m && m !== 'object') {
83 event.model = m;
84 event.skip_notification = true;
85 this._events.next(event);
Matteo Scandolobcac2dc2017-08-21 14:13:45 -070086 }
Matteo Scandoloe015fa92017-05-10 09:52:36 -070087 });
88 }
89
90 });
Matteo Scandolo035c5932016-12-14 09:55:15 -080091 }
92 list() {
93 return this._events.asObservable();
94 }
95}