From f3d3c53453b0274efd29fa8e7844d08aa2e2063a Mon Sep 17 00:00:00 2001 From: Pliable Pixels Date: Mon, 1 Oct 2018 12:38:29 -0400 Subject: typo --- www/js/EventServer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'www/js/EventServer.js') diff --git a/www/js/EventServer.js b/www/js/EventServer.js index fae8b307..e142dc8d 100644 --- a/www/js/EventServer.js +++ b/www/js/EventServer.js @@ -150,7 +150,7 @@ angular.module('zmApp.controllers') if (timeElapsedSinceResume == -1) { // so we display error - timeElapsedSinceResume = moment().subtract('1', hour); + timeElapsedSinceResume = moment().subtract('1', 'hour'); } var duration = moment.duration(moment().diff(timeElapsedSinceResume)).asSeconds().toFixed(1); -- cgit v1.2.3 From 881a3b160a1320f2318712c1063e40775236099f Mon Sep 17 00:00:00 2001 From: Pliable Pixels Date: Mon, 8 Oct 2018 11:26:07 -0400 Subject: rework to use native browser websockets. angular-websocket doesn't seem to work with WK --- www/js/EventServer.js | 373 +++++++++++++++++++++++++++----------------------- 1 file changed, 203 insertions(+), 170 deletions(-) (limited to 'www/js/EventServer.js') diff --git a/www/js/EventServer.js b/www/js/EventServer.js index e142dc8d..f252cca4 100644 --- a/www/js/EventServer.js +++ b/www/js/EventServer.js @@ -16,65 +16,174 @@ angular.module('zmApp.controllers') var localNotificationId = 0; var pushInited = false; var isTimerOn = false; + //-------------------------------------------------------------------------- // called when the websocket is opened //-------------------------------------------------------------------------- - function openHandshake() { - NVRDataModel.log("Inside openHandshake"); - var loginData = NVRDataModel.getLogin(); - if (loginData.isUseEventServer == false || loginData.eventServer == "") { - NVRDataModel.log("openHandShake: no event server"); - return; - } - - if (typeof ws == 'undefined') { - NVRDataModel.debug("websocket is undefined, need to create ws before I can sent auth"); - ws = $websocket(loginData.eventServer, { - reconnectIfNotNormalClose: false + function handleOpen(event) { + + NVRDataModel.debug ("WebSocket open called with:"+JSON.stringify(event.data)); + var loginData = NVRDataModel.getLogin(); + NVRDataModel.log("openHandshake: Websocket open, sending Auth"); + sendMessage("auth", + { + user: loginData.username, + password: loginData.password }); - // ws.onOpen(openHandshake); - // return; - } - NVRDataModel.log("openHandshake: Websocket open, sending Auth"); - ws.send({ - event: 'auth', - data: { - user: loginData.username, - password: loginData.password + + if ($rootScope.apnsToken != '') { + var plat = $ionicPlatform.is('ios') ? 'ios' : 'android'; + var ld = NVRDataModel.getLogin(); + var pushstate = "enabled"; + if (ld.disablePush == true) + pushstate = "disabled"; + + NVRDataModel.debug("openHandShake: state of push is " + pushstate); + // let's do this only if disabled. If enabled, I suppose registration + // will be called? + //if (ld.disablePush) + //console.log ("HANDSHAKE MESSAGE WITH "+$rootScope.monstring); + + sendMessage ("push", { + type: 'token', + platform: plat, + token: $rootScope.apnsToken, + monlist: $rootScope.monstring, + intlist: $rootScope.intstring, + state: pushstate + + }); } + + } - }); + function handleClose(event) { - if ($rootScope.apnsToken != '') { - var plat = $ionicPlatform.is('ios') ? 'ios' : 'android'; - var ld = NVRDataModel.getLogin(); - var pushstate = "enabled"; - if (ld.disablePush == true) - pushstate = "disabled"; + + console.log ("*********** WEBSOCKET CLOSE CALLED WITH "+JSON.stringify(event.data)); - NVRDataModel.debug("openHandShake: state of push is " + pushstate); - // let's do this only if disabled. If enabled, I suppose registration - // will be called? - //if (ld.disablePush) - if (1) { - //console.log ("HANDSHAKE MESSAGE WITH "+$rootScope.monstring); - ws.send({ - event: 'push', - data: { - type: 'token', - platform: plat, - token: $rootScope.apnsToken, - monlist: $rootScope.monstring, - intlist: $rootScope.intstring, - state: pushstate - } - }); - } + + if (!isTimerOn) { + NVRDataModel.log("Will try to reconnect in 10 sec.."); + $timeout(init, 10000); + isTimerOn = true; } + } + + function handleError(event) { + + console.log ("*********** WEBSOCKET CLOSE CALLED WITH "+JSON.stringify(event.data)); + //return; + if (!isTimerOn) { + NVRDataModel.log("Will try to reconnect in 10 sec.."); + $timeout(init, 10000); + isTimerOn = true; + } + } + + function handleMessage(smsg) { + //NVRDataModel.debug ("Websocket received message:"+smsg); + str = JSON.parse(smsg); + NVRDataModel.debug("Real-time event: " + JSON.stringify(str)); + + + + // Error messages + if (str.status != 'Success') { + NVRDataModel.log("Event Error: " + JSON.stringify(str)); + + if (str.reason == 'APNSDISABLED') { + console.log ("FORCE CLOSING"); + ws.close(); + NVRDataModel.displayBanner('error', ['Event Server: APNS disabled'], 2000, 6000); + $rootScope.apnsToken = ""; + } + + } + + if (str.status == 'Success' && (str.event == 'auth')) { + if (str.version == undefined) + str.version = "0.1"; + if (NVRDataModel.versionCompare(str.version, zm.minEventServerVersion) == -1) { + $rootScope.zmPopup = $ionicPopup.alert({ + title: $translate.instant('kEventServerVersionTitle'), + template: $translate.instant('kEventServerVersionBody1') + " " + str.version + ". " + $translate.instant('kEventServerVersionBody2') + " " + + zm.minEventServerVersion, + okText: $translate.instant('kButtonOk'), + cancelText: $translate.instant('kButtonCancel'), + }); + } + + } + + if (str.status == 'Success' && str.event == 'alarm') // new events + { + + var localNotText; + // ZMN specific hack for Event Server + if (str.supplementary != 'true') { + new Audio('sounds/blop.mp3').play(); + localNotText = ""; + $rootScope.isAlarm = 1; + + // Show upto a max of 99 when it comes to display + // so aesthetics are maintained + if ($rootScope.alarmCount == "99") { + $rootScope.alarmCount = "99+"; + } + if ($rootScope.alarmCount != "99+") { + $rootScope.alarmCount = (parseInt($rootScope.alarmCount) + 1).toString(); + } + + } else { + NVRDataModel.debug("received supplementary event information over websockets"); + } + var eventsToDisplay = []; + var listOfMonitors = []; + for (var iter = 0; iter < str.events.length; iter++) { + // lets stack the display so they don't overwrite + //eventsToDisplay.push(str.events[iter].Name + ": latest new alarm (" + str.events[iter].EventId + ")"); + var txt = str.events[iter].EventId; + if (str.events[iter].Cause) { + txt = str.events[iter].Cause; + } + eventsToDisplay.push(str.events[iter].Name + ": " + txt); + localNotText = localNotText + str.events[iter].Name + ": " + txt + ","; + listOfMonitors.push(str.events[iter].MonitorId); + + } + localNotText = localNotText.substring(0, localNotText.length - 1); + + // if we are in background, do a local notification, else do an in app display + if (!NVRDataModel.isBackground()) { + + //emit alarm details - this is when received over websockets + $rootScope.$broadcast('alarm', { + message: listOfMonitors + }); + + if (str.supplementary != 'true') { + + NVRDataModel.debug("App is in foreground, displaying banner"); + if (eventsToDisplay.length > 0) { + + if (eventsToDisplay.length == 1) { + //console.log("Single Display: " + eventsToDisplay[0]); + NVRDataModel.displayBanner('alarm', [eventsToDisplay[0]], 5000, 5000); + } else { + NVRDataModel.displayBanner('alarm', eventsToDisplay, + 5000, 5000 * eventsToDisplay.length); + } + + } + } + } + } + } @@ -83,130 +192,69 @@ angular.module('zmApp.controllers') //-------------------------------------------------------------------------- function init() { - - $rootScope.isAlarm = 0; $rootScope.alarmCount = "0"; - isTimerOn = false; - var d = $q.defer(); - var loginData = NVRDataModel.getLogin(); - //console.log ("INIT GOT " + JSON.stringify(loginData)); - if (loginData.isUseEventServer == false || !loginData.eventServer) { NVRDataModel.log("No Event Server present. Not initializing"); d.reject("false"); return d.promise; } - //if (!$rootScope.apnsToken) - if (!pushInited) pushInit(); - - // console.log ("WS TYPEOF="+ typeof ws); - // console.log ("WS="+JSON.stringify(ws)); - /*if (typeof ws !== 'undefined') - { - NVRDataModel.debug("websocket already initialized --Forcing close"); - ws.close(true); - ws=undefined; - - }*/ - NVRDataModel.log("Initializing Websocket with URL " + loginData.eventServer); - /* ws = $websocket.$new( - { - url: loginData.eventServer, - reconnect: true, - reconnectInterval: 60000, - lazy: true - });*/ - - ws = $websocket(loginData.eventServer, { - reconnectIfNotNormalClose: false - }); - ws.onOpen(openHandshake); + - initCalled = true; - // Transmit auth information to server - // ws.$on('$open', openHandshake); + + ws = new WebSocket(loginData.eventServer); - if (ws) { - ws.onErrorCallbacks = []; - NVRDataModel.debug("Removing error handlers for websocket"); - } - NVRDataModel.debug("Setting up websocket error handler"); - //ws.$on('$error', function(e) - ws.onError(function (e) { + ws.onopen = function (event) { + handleOpen(event); + if (!pushInited) { NVRDataModel.debug ("Initializing FCM push"); pushInit();} + d.resolve("true"); + return; + }; - NVRDataModel.debug("Websocket Errorhandler called"); + ws.onclose = function (event) { + handleClose(event); + d.reject ("error"); + return; + + }; - var timeElapsedSinceResume = NVRDataModel.getTimeSinceResumed(); + ws.onerror = function (event) { + handleError(event); + d.reject ("error"); + return; + - if (timeElapsedSinceResume == -1) { - // so we display error - timeElapsedSinceResume = moment().subtract('1', 'hour'); - } - - var duration = moment.duration(moment().diff(timeElapsedSinceResume)).asSeconds().toFixed(1); - - NVRDataModel.debug(">> time since resumed is " + duration + " seconds"); - if (duration > zm.waitTimeTillResume) { + + }; - $timeout(function () { - var eserr = $translate.instant('kEventServerConnErr'); - NVRDataModel.displayBanner('error', [eserr]); - }, 1000); // leave time for transitions - - } else { - NVRDataModel.debug("ES error happened " + timeElapsedSinceResume + " secs after resume, maybe fake, lets wait..."); - } + ws.onmessage = function (event) { + + var smsg = event.data; + handleMessage (smsg); - /*if (typeof ws !== 'undefined'){ - NVRDataModel.debug ("-->Forcing socket close"); - ws.close(true); + + }; - }*/ - ws = undefined; - NVRDataModel.log("Will try to reconnect in 10 sec.."); - if (!isTimerOn) { - $timeout(init, 10000); - isTimerOn = true; - } - - - //console.log ("VALUE TIME " + lastEventServerCheck); - //console.log ("NOW TIME " + Date.now()); - }); - - ws.onClose(function () - // ws.$on('$close', function() - { - NVRDataModel.log("Websocket closed"); - ws = undefined; - - var ld = NVRDataModel.getLogin(); + - /* if (ld.isUseEventServer && !isTimerOn) { - // this means remote error, because zmN still - // wants it on - $timeout ( init, 10000 ); - isTimerOn = true; - }*/ - }); + - // Handles responses back from ZM ES + /* ws.onMessage(function (str) // ws.$on('$message', function(str) @@ -309,7 +357,11 @@ angular.module('zmApp.controllers') } //end of success handler }); - d.resolve("true"); + + + */ + + return (d.promise); } @@ -323,9 +375,11 @@ angular.module('zmApp.controllers') NVRDataModel.log("Clearing error/close cbk, disconnecting and deleting Event Server socket..."); // ws.$close(); - ws.onErrorCallbacks = []; - ws.onCloseCallbacks = []; - ws.close(true); // force close + + + ws.onmessage = null; + + ws.close(); // ws.$un('open'); // ws.$un('close'); // ws.$un('message'); @@ -354,38 +408,17 @@ angular.module('zmApp.controllers') } // console.log (">>>>>>>>>>>>>>>>>EVENT SERVER SENDING: type="+type+" DATA="+JSON.stringify(obj)); - ws.send({ + + var msg = { 'event': type, 'data': obj - }); + }; - /*if (ws.$status() == ws.$CLOSED) - { - NVRDataModel.log("Websocket was closed, trying to re-open"); - ws.$un('$open'); - //ws.$on ('$open', openHandshake); - ws.$open(); - - ws.$on('$open', openHandshake, function() - { - - //console.log(" sending " + type + " " + - // JSON.stringify(obj)); - //console.log("sending " + type + " " + JSON.stringify(obj)); - ws.$emit(type, obj); - - ws.$un('$open'); - ws.$on('$open', openHandshake); - - }); - - } - else* - { - ws.send(type, obj); - // console.log("sending " + type + " " + JSON.stringify(obj)); - }*/ + var jmsg = JSON.stringify(msg); + NVRDataModel.debug ("~~~~ sendMessage: Sending->"+jmsg); + ws.send(jmsg); + } //-------------------------------------------------------------------------- -- cgit v1.2.3 From f6be92a7c14d600fa1345a55de76bda706b84380 Mon Sep 17 00:00:00 2001 From: Pliable Pixels Date: Sun, 14 Oct 2018 14:39:37 -0400 Subject: migrate websockets to native --- www/js/EventServer.js | 499 +++++++++++++++++++++++--------------------------- 1 file changed, 230 insertions(+), 269 deletions(-) (limited to 'www/js/EventServer.js') diff --git a/www/js/EventServer.js b/www/js/EventServer.js index f252cca4..a460795c 100644 --- a/www/js/EventServer.js +++ b/www/js/EventServer.js @@ -16,173 +16,174 @@ angular.module('zmApp.controllers') var localNotificationId = 0; var pushInited = false; var isTimerOn = false; - + var nativeWebSocketId = -1; + //-------------------------------------------------------------------------- // called when the websocket is opened //-------------------------------------------------------------------------- - function handleOpen(event) { - - NVRDataModel.debug ("WebSocket open called with:"+JSON.stringify(event.data)); - var loginData = NVRDataModel.getLogin(); - NVRDataModel.log("openHandshake: Websocket open, sending Auth"); - sendMessage("auth", - { - user: loginData.username, - password: loginData.password - }); + function handleOpen(data) { + NVRDataModel.debug("WebSocket open called with:" + JSON.stringify(data)); + var loginData = NVRDataModel.getLogin(); + NVRDataModel.log("openHandshake: Websocket open, sending Auth"); + sendMessage("auth", { + user: loginData.username, + password: loginData.password + }); - if ($rootScope.apnsToken != '') { - var plat = $ionicPlatform.is('ios') ? 'ios' : 'android'; - var ld = NVRDataModel.getLogin(); - var pushstate = "enabled"; - if (ld.disablePush == true) - pushstate = "disabled"; - - NVRDataModel.debug("openHandShake: state of push is " + pushstate); - // let's do this only if disabled. If enabled, I suppose registration - // will be called? - //if (ld.disablePush) - //console.log ("HANDSHAKE MESSAGE WITH "+$rootScope.monstring); - sendMessage ("push", { - type: 'token', - platform: plat, - token: $rootScope.apnsToken, - monlist: $rootScope.monstring, - intlist: $rootScope.intstring, - state: pushstate + if ($rootScope.apnsToken != '') { + var plat = $ionicPlatform.is('ios') ? 'ios' : 'android'; + var ld = NVRDataModel.getLogin(); + var pushstate = "enabled"; + if (ld.disablePush == true) + pushstate = "disabled"; + + NVRDataModel.debug("openHandShake: state of push is " + pushstate); + // let's do this only if disabled. If enabled, I suppose registration + // will be called? + //if (ld.disablePush) + //console.log ("HANDSHAKE MESSAGE WITH "+$rootScope.monstring); + + sendMessage("push", { + type: 'token', + platform: plat, + token: $rootScope.apnsToken, + monlist: $rootScope.monstring, + intlist: $rootScope.intstring, + state: pushstate + + }); + } - }); - } - } function handleClose(event) { - - console.log ("*********** WEBSOCKET CLOSE CALLED WITH "+JSON.stringify(event.data)); + console.log("*********** WEBSOCKET CLOSE CALLED"); + + if (!NVRDataModel.getLogin().isUseEventServer) return; - if (!isTimerOn) { - NVRDataModel.log("Will try to reconnect in 10 sec.."); - $timeout(init, 10000); - isTimerOn = true; + NVRDataModel.log("Will try to reconnect in 10 sec.."); + $timeout(init, 10000); + isTimerOn = true; } } function handleError(event) { - console.log ("*********** WEBSOCKET CLOSE CALLED WITH "+JSON.stringify(event.data)); - //return; - if (!isTimerOn) { - NVRDataModel.log("Will try to reconnect in 10 sec.."); - $timeout(init, 10000); - isTimerOn = true; - } + console.log("*********** WEBSOCKET ERROR CALLED"); + if (!NVRDataModel.getLogin().isUseEventServer) return; + + if (!isTimerOn) { + NVRDataModel.log("Will try to reconnect in 10 sec.."); + $timeout(init, 10000); + isTimerOn = true; + } } function handleMessage(smsg) { //NVRDataModel.debug ("Websocket received message:"+smsg); - str = JSON.parse(smsg); - NVRDataModel.debug("Real-time event: " + JSON.stringify(str)); - - - - // Error messages - if (str.status != 'Success') { - NVRDataModel.log("Event Error: " + JSON.stringify(str)); - - if (str.reason == 'APNSDISABLED') { - console.log ("FORCE CLOSING"); - ws.close(); - NVRDataModel.displayBanner('error', ['Event Server: APNS disabled'], 2000, 6000); - $rootScope.apnsToken = ""; - } + str = JSON.parse(smsg); + NVRDataModel.debug("Real-time event: " + JSON.stringify(str)); - } - if (str.status == 'Success' && (str.event == 'auth')) { - if (str.version == undefined) - str.version = "0.1"; - if (NVRDataModel.versionCompare(str.version, zm.minEventServerVersion) == -1) { - $rootScope.zmPopup = $ionicPopup.alert({ - title: $translate.instant('kEventServerVersionTitle'), - template: $translate.instant('kEventServerVersionBody1') + " " + str.version + ". " + $translate.instant('kEventServerVersionBody2') + " " + - zm.minEventServerVersion, - okText: $translate.instant('kButtonOk'), - cancelText: $translate.instant('kButtonCancel'), - }); - } - } + // Error messages + if (str.status != 'Success') { + NVRDataModel.log("Event Error: " + JSON.stringify(str)); - if (str.status == 'Success' && str.event == 'alarm') // new events - { + if (str.reason == 'APNSDISABLED') { + console.log("FORCE CLOSING"); + ws.close(); + NVRDataModel.displayBanner('error', ['Event Server: APNS disabled'], 2000, 6000); + $rootScope.apnsToken = ""; + } - var localNotText; - // ZMN specific hack for Event Server - if (str.supplementary != 'true') { - new Audio('sounds/blop.mp3').play(); - localNotText = ""; - $rootScope.isAlarm = 1; - - // Show upto a max of 99 when it comes to display - // so aesthetics are maintained - if ($rootScope.alarmCount == "99") { - $rootScope.alarmCount = "99+"; - } - if ($rootScope.alarmCount != "99+") { - $rootScope.alarmCount = (parseInt($rootScope.alarmCount) + 1).toString(); - } + } - } else { - NVRDataModel.debug("received supplementary event information over websockets"); - } - var eventsToDisplay = []; - var listOfMonitors = []; - for (var iter = 0; iter < str.events.length; iter++) { - // lets stack the display so they don't overwrite - //eventsToDisplay.push(str.events[iter].Name + ": latest new alarm (" + str.events[iter].EventId + ")"); - var txt = str.events[iter].EventId; - if (str.events[iter].Cause) { - txt = str.events[iter].Cause; - } - eventsToDisplay.push(str.events[iter].Name + ": " + txt); - localNotText = localNotText + str.events[iter].Name + ": " + txt + ","; - listOfMonitors.push(str.events[iter].MonitorId); + if (str.status == 'Success' && (str.event == 'auth')) { + if (str.version == undefined) + str.version = "0.1"; + if (NVRDataModel.versionCompare(str.version, zm.minEventServerVersion) == -1) { + $rootScope.zmPopup = $ionicPopup.alert({ + title: $translate.instant('kEventServerVersionTitle'), + template: $translate.instant('kEventServerVersionBody1') + " " + str.version + ". " + $translate.instant('kEventServerVersionBody2') + " " + + zm.minEventServerVersion, + okText: $translate.instant('kButtonOk'), + cancelText: $translate.instant('kButtonCancel'), + }); + } - } - localNotText = localNotText.substring(0, localNotText.length - 1); + } - // if we are in background, do a local notification, else do an in app display - if (!NVRDataModel.isBackground()) { + if (str.status == 'Success' && str.event == 'alarm') // new events + { - //emit alarm details - this is when received over websockets - $rootScope.$broadcast('alarm', { - message: listOfMonitors - }); + var localNotText; + // ZMN specific hack for Event Server + if (str.supplementary != 'true') { + new Audio('sounds/blop.mp3').play(); + localNotText = ""; + $rootScope.isAlarm = 1; + + // Show upto a max of 99 when it comes to display + // so aesthetics are maintained + if ($rootScope.alarmCount == "99") { + $rootScope.alarmCount = "99+"; + } + if ($rootScope.alarmCount != "99+") { + $rootScope.alarmCount = (parseInt($rootScope.alarmCount) + 1).toString(); + } - if (str.supplementary != 'true') { + } else { + NVRDataModel.debug("received supplementary event information over websockets"); + } + var eventsToDisplay = []; + var listOfMonitors = []; + for (var iter = 0; iter < str.events.length; iter++) { + // lets stack the display so they don't overwrite + //eventsToDisplay.push(str.events[iter].Name + ": latest new alarm (" + str.events[iter].EventId + ")"); + var txt = str.events[iter].EventId; + if (str.events[iter].Cause) { + txt = str.events[iter].Cause; + } + eventsToDisplay.push(str.events[iter].Name + ": " + txt); + localNotText = localNotText + str.events[iter].Name + ": " + txt + ","; + listOfMonitors.push(str.events[iter].MonitorId); + + } + localNotText = localNotText.substring(0, localNotText.length - 1); - NVRDataModel.debug("App is in foreground, displaying banner"); - if (eventsToDisplay.length > 0) { + // if we are in background, do a local notification, else do an in app display + if (!NVRDataModel.isBackground()) { - if (eventsToDisplay.length == 1) { - //console.log("Single Display: " + eventsToDisplay[0]); - NVRDataModel.displayBanner('alarm', [eventsToDisplay[0]], 5000, 5000); - } else { - NVRDataModel.displayBanner('alarm', eventsToDisplay, - 5000, 5000 * eventsToDisplay.length); - } + //emit alarm details - this is when received over websockets + $rootScope.$broadcast('alarm', { + message: listOfMonitors + }); - } + if (str.supplementary != 'true') { + + NVRDataModel.debug("App is in foreground, displaying banner"); + if (eventsToDisplay.length > 0) { + + if (eventsToDisplay.length == 1) { + //console.log("Single Display: " + eventsToDisplay[0]); + NVRDataModel.displayBanner('alarm', [eventsToDisplay[0]], 5000, 5000); + } else { + NVRDataModel.displayBanner('alarm', eventsToDisplay, + 5000, 5000 * eventsToDisplay.length); } + } } + } + } } @@ -207,183 +208,134 @@ angular.module('zmApp.controllers') NVRDataModel.log("Initializing Websocket with URL " + loginData.eventServer); - - - - ws = new WebSocket(loginData.eventServer); - - ws.onopen = function (event) { - handleOpen(event); - if (!pushInited) { NVRDataModel.debug ("Initializing FCM push"); pushInit();} - d.resolve("true"); - return; - }; + if ($rootScope.platforOS == 'desktop') { + NVRDataModel.debug("Using browser websockets..."); + return setupDesktopSocket(); + } else { + NVRDataModel.debug("Using native websockets..."); + return setupMobileSocket(); - ws.onclose = function (event) { - handleClose(event); - d.reject ("error"); - return; - - }; - - ws.onerror = function (event) { - handleError(event); - d.reject ("error"); - return; - + } - - }; + } - ws.onmessage = function (event) { - + function setupMobileSocket() { - var smsg = event.data; - handleMessage (smsg); + var loginData = NVRDataModel.getLogin(); + var d = $q.defer(); - + var wsOptions = { + url: loginData.eventServer, + acceptAllCerts: !loginData.enableStrictSSL }; + CordovaWebsocketPlugin.wsConnect(wsOptions, + function (recvEvent) { + console.log("Received callback from WebSocket: " + recvEvent.callbackMethod); + if (recvEvent.callbackMethod == 'onMessage') { + handleMessage(recvEvent.message); + } else if (recvEvent.callbackMethod == 'onClose') { + handleClose(); + } else if (recvEvent.callbackMethod == 'onFail') { + handleError(); + } - - - - - - - /* - - ws.onMessage(function (str) - // ws.$on('$message', function(str) - - { - str = JSON.parse(str.data); - //console.log ("FULL MESSAGE="+JSON.stringify(str.data)); - NVRDataModel.debug("Real-time event: " + JSON.stringify(str)); - - // Error messages - if (str.status != 'Success') { - NVRDataModel.log("Event Error: " + JSON.stringify(str)); - - if (str.reason == 'APNSDISABLED') { - ws.close(); - NVRDataModel.displayBanner('error', ['Event Server: APNS disabled'], 2000, 6000); - $rootScope.apnsToken = ""; - } - + }, + function (success) { + console.log("Connected to WebSocket with id: " + success.webSocketId); + nativeWebSocketId = success.webSocketId; + handleOpen(success); + if (!pushInited) { + NVRDataModel.debug("Initializing FCM push"); + pushInit(); } + d.resolve(true); + return d.promise; + }, + function (error) { + console.log("Failed to connect to WebSocket: " + + "code: " + error.code + + ", reason: " + error.reason + + ", exception: " + error.exception); + d.resolve(false); + return d.promise; + } + ); + return d.promise; + } - if (str.status == 'Success' && (str.event == 'auth')) { - if (str.version == undefined) - str.version = "0.1"; - if (NVRDataModel.versionCompare(str.version, zm.minEventServerVersion) == -1) { - $rootScope.zmPopup = $ionicPopup.alert({ - title: $translate.instant('kEventServerVersionTitle'), - template: $translate.instant('kEventServerVersionBody1') + " " + str.version + ". " + $translate.instant('kEventServerVersionBody2') + " " + - zm.minEventServerVersion, - okText: $translate.instant('kButtonOk'), - cancelText: $translate.instant('kButtonCancel'), - }); - } + function setupDesktopSocket() { - } + var d = $q.defer(); + ws = new WebSocket(loginData.eventServer); - if (str.status == 'Success' && str.event == 'alarm') // new events - { + ws.onopen = function (event) { + handleOpen(event.data); + if (!pushInited) { + NVRDataModel.debug("Initializing FCM push"); + pushInit(); + } + d.resolve("true"); + return d.promise; + }; - var localNotText; - // ZMN specific hack for Event Server - if (str.supplementary != 'true') { - new Audio('sounds/blop.mp3').play(); - localNotText = ""; - $rootScope.isAlarm = 1; - - // Show upto a max of 99 when it comes to display - // so aesthetics are maintained - if ($rootScope.alarmCount == "99") { - $rootScope.alarmCount = "99+"; - } - if ($rootScope.alarmCount != "99+") { - $rootScope.alarmCount = (parseInt($rootScope.alarmCount) + 1).toString(); - } - } else { - NVRDataModel.debug("received supplementary event information over websockets"); - } - var eventsToDisplay = []; - var listOfMonitors = []; - for (var iter = 0; iter < str.events.length; iter++) { - // lets stack the display so they don't overwrite - //eventsToDisplay.push(str.events[iter].Name + ": latest new alarm (" + str.events[iter].EventId + ")"); - var txt = str.events[iter].EventId; - if (str.events[iter].Cause) { - txt = str.events[iter].Cause; - } - eventsToDisplay.push(str.events[iter].Name + ": " + txt); - localNotText = localNotText + str.events[iter].Name + ": " + txt + ","; - listOfMonitors.push(str.events[iter].MonitorId); + ws.onclose = function (event) { + handleClose(event); + d.reject("error"); + return d.promise; - } - localNotText = localNotText.substring(0, localNotText.length - 1); + }; - // if we are in background, do a local notification, else do an in app display - if (!NVRDataModel.isBackground()) { + ws.onerror = function (event) { + handleError(event); + d.reject("error"); + return d.promise; - //emit alarm details - this is when received over websockets - $rootScope.$broadcast('alarm', { - message: listOfMonitors - }); + }; - if (str.supplementary != 'true') { - NVRDataModel.debug("App is in foreground, displaying banner"); - if (eventsToDisplay.length > 0) { + ws.onmessage = function (event) { - if (eventsToDisplay.length == 1) { - //console.log("Single Display: " + eventsToDisplay[0]); - NVRDataModel.displayBanner('alarm', [eventsToDisplay[0]], 5000, 5000); - } else { - NVRDataModel.displayBanner('alarm', eventsToDisplay, - 5000, 5000 * eventsToDisplay.length); - } + var smsg = event.data; + handleMessage(smsg); - } - } - } - } //end of success handler + }; - }); + return d.promise; + } - */ - - return (d.promise); - } function disconnect() { - if (typeof ws === 'undefined') { - NVRDataModel.log("Event server socket is empty, nothing to disconnect"); - return; - } NVRDataModel.log("Clearing error/close cbk, disconnecting and deleting Event Server socket..."); - // ws.$close(); - - ws.onmessage = null; + if ($rootScope.platforOS == 'desktop'){ + if (typeof ws === 'undefined') { + NVRDataModel.log("Event server socket is empty, nothing to disconnect"); + return; + } + + + ws.onmessage = null; + ws.close(); + ws = undefined; + } + else { + if (nativeWebSocketId != -1) //native; + CordovaWebsocketPlugin.wsClose(nativeWebSocketId, 1000, "Connection closed"); + nativeWebSocketId = -1; - ws.close(); - // ws.$un('open'); - // ws.$un('close'); - // ws.$un('message'); - ws = undefined; + } + } @@ -402,7 +354,7 @@ angular.module('zmApp.controllers') return; } - if (typeof ws === 'undefined') { + if (typeof ws === 'undefined' && nativeWebSocketId == -1) { NVRDataModel.debug("Event server not initalized, not sending message"); return; } @@ -415,10 +367,19 @@ angular.module('zmApp.controllers') }; var jmsg = JSON.stringify(msg); - NVRDataModel.debug ("~~~~ sendMessage: Sending->"+jmsg); + NVRDataModel.debug("~~~~ sendMessage: Sending->" + jmsg); + + if ($rootScope.platformOS == 'desktop') { ws.send(jmsg); + } + else { + if (nativeWebSocketId != -1) + CordovaWebsocketPlugin.wsSend(nativeWebSocketId, jmsg); + else + NVRDataModel.debug ("ERROR:native websocket not initialized, can't send "+jmsg); + } + - } //-------------------------------------------------------------------------- -- cgit v1.2.3