Simon Hunt

GUI -- WebSocket object now decodes message payload as JSON on behalf of the consumer.

Change-Id: If27679b2c4d3beaed6aee96233ca4856b673ab72
...@@ -22,6 +22,36 @@ ...@@ -22,6 +22,36 @@
22 22
23 var fs; 23 var fs;
24 24
25 + function fnOpen(f) {
26 + return fs.isF(f);
27 + }
28 +
29 + function fnMessage(f) {
30 + // wrap the onMessage function; we will attempt to decode the
31 + // message event payload as JSON and pass that in...
32 + var fn = fs.isF(f);
33 + if (!fn) {
34 + return null;
35 + }
36 +
37 + return function (msgEvent) {
38 + var ev;
39 + try {
40 + ev = JSON.parse(msgEvent.data);
41 + } catch (e) {
42 + ev = {
43 + error: 'Failed to parse JSON',
44 + e: e
45 + };
46 + }
47 + fn(ev);
48 + }
49 + }
50 +
51 + function fnClose(f) {
52 + return fs.isF(f);
53 + }
54 +
25 angular.module('onosRemote') 55 angular.module('onosRemote')
26 .factory('WebSocketService', 56 .factory('WebSocketService',
27 ['$log', '$location', 'UrlFnService', 'FnService', 57 ['$log', '$location', 'UrlFnService', 'FnService',
...@@ -32,20 +62,29 @@ ...@@ -32,20 +62,29 @@
32 // creates a web socket for the given path, returning a "handle". 62 // creates a web socket for the given path, returning a "handle".
33 // opts contains the event handler callbacks. 63 // opts contains the event handler callbacks.
34 function createWebSocket(path, opts) { 64 function createWebSocket(path, opts) {
35 - var wsport = opts && opts.wsport, 65 + var o = opts || {},
66 + wsport = opts && opts.wsport,
36 fullUrl = ufs.wsUrl(path, wsport), 67 fullUrl = ufs.wsUrl(path, wsport),
37 - ws = new WebSocket(fullUrl),
38 api = { 68 api = {
39 - meta: { path: fullUrl, ws: ws }, 69 + meta: { path: fullUrl, ws: null },
40 send: send, 70 send: send,
41 close: close 71 close: close
42 - }; 72 + },
73 + ws;
74 +
75 + try {
76 + ws = new WebSocket(fullUrl);
77 + api.meta.ws = ws;
78 + } catch (e) {
79 + }
43 80
44 $log.debug('Attempting to open websocket to: ' + fullUrl); 81 $log.debug('Attempting to open websocket to: ' + fullUrl);
45 82
46 - ws.onopen = (opts && opts.onOpen) || null; 83 + if (ws) {
47 - ws.onmessage = (opts && opts.onMessage) || null; 84 + ws.onopen = fnOpen(o.onOpen);
48 - ws.onclose = (opts && opts.onClose) || null; 85 + ws.onmessage = fnMessage(o.onMessage);
86 + ws.onclose = fnClose(o.onClose);
87 + }
49 88
50 function send(msg) { 89 function send(msg) {
51 if (msg) { 90 if (msg) {
...@@ -62,6 +101,7 @@ ...@@ -62,6 +101,7 @@
62 if (ws) { 101 if (ws) {
63 ws.close(); 102 ws.close();
64 ws = null; 103 ws = null;
104 + api.meta.ws = null;
65 } 105 }
66 } 106 }
67 107
......
...@@ -34,7 +34,7 @@ ...@@ -34,7 +34,7 @@
34 var ovtopo, svg, defs, zoomLayer, map; 34 var ovtopo, svg, defs, zoomLayer, map;
35 35
36 // Internal state 36 // Internal state
37 - var zoomer; 37 + var zoomer, wsock;
38 38
39 // Note: "exported" state should be properties on 'self' variable 39 // Note: "exported" state should be properties on 'self' variable
40 40
...@@ -136,21 +136,20 @@ ...@@ -136,21 +136,20 @@
136 136
137 } 137 }
138 138
139 - function onWsMessage(msg) { 139 + function onWsMessage(ev) {
140 - var ev = JSON.parse(msg.data); 140 + $log.log('got JSON event: ', ev);
141 - $log.log('got event: ', ev);
142 141
143 } 142 }
144 143
145 - function onWsClose(msg) { 144 + function onWsClose(closeEvent) {
146 - $log.log('web socket closed...', msg); 145 + $log.log('web socket closed...', closeEvent);
147 146
148 } 147 }
149 148
150 // wsport indicates web-socket-server port other than the default. 149 // wsport indicates web-socket-server port other than the default.
151 // Used for testing with the mock-web-socket-server. 150 // Used for testing with the mock-web-socket-server.
152 function setUpWebSocket(wsport) { 151 function setUpWebSocket(wsport) {
153 - var wsHandle = wss.createWebSocket('topology', { 152 + wsock = wss.createWebSocket('topology', {
154 onOpen: onWsOpen, 153 onOpen: onWsOpen,
155 onMessage: onWsMessage, 154 onMessage: onWsMessage,
156 onClose: onWsClose, 155 onClose: onWsClose,
...@@ -161,7 +160,7 @@ ...@@ -161,7 +160,7 @@
161 // TODO: implement retry on close functionality 160 // TODO: implement retry on close functionality
162 161
163 162
164 - $log.log('created web socket', wsHandle); 163 + $log.log('created web socket', wsock);
165 // TODO: complete implementation... 164 // TODO: complete implementation...
166 165
167 } 166 }
......
...@@ -50,6 +50,7 @@ describe('factory: fw/remote/websocket.js', function () { ...@@ -50,6 +50,7 @@ describe('factory: fw/remote/websocket.js', function () {
50 }); 50 });
51 51
52 it('should use the appropriate URL', function () { 52 it('should use the appropriate URL', function () {
53 + debugger;
53 var ws = wss.createWebSocket('foo/path'); 54 var ws = wss.createWebSocket('foo/path');
54 expect(ws.meta.path).toEqual('ws://foo:80/onos/ui/ws/foo/path'); 55 expect(ws.meta.path).toEqual('ws://foo:80/onos/ui/ws/foo/path');
55 }); 56 });
...@@ -66,7 +67,8 @@ describe('factory: fw/remote/websocket.js', function () { ...@@ -66,7 +67,8 @@ describe('factory: fw/remote/websocket.js', function () {
66 }); 67 });
67 68
68 expect(ws.meta.ws.onopen).toBe(oo); 69 expect(ws.meta.ws.onopen).toBe(oo);
69 - expect(ws.meta.ws.onmessage).toBe(om); 70 + // TODO: om is wrapped - we can't test by reference
71 + //expect(ws.meta.ws.onmessage).toBe(om);
70 expect(ws.meta.ws.onclose).toBe(oc); 72 expect(ws.meta.ws.onclose).toBe(oc);
71 }); 73 });
72 74
...@@ -80,7 +82,8 @@ describe('factory: fw/remote/websocket.js', function () { ...@@ -80,7 +82,8 @@ describe('factory: fw/remote/websocket.js', function () {
80 }); 82 });
81 83
82 expect(ws.meta.ws.onopen).toBe(oo); 84 expect(ws.meta.ws.onopen).toBe(oo);
83 - expect(ws.meta.ws.onmessage).toBe(om); 85 + // TODO: om is wrapped - we can't test by reference
86 + //expect(ws.meta.ws.onmessage).toBe(om);
84 expect(ws.meta.ws.onclose).toBeNull(); 87 expect(ws.meta.ws.onclose).toBeNull();
85 }); 88 });
86 89
......