(function(){ "use strict"; angular.module('shared') .run( [ '$timeout', 'SessionTimeoutModal', 'SessionApi', 'windowService', '$rootScope', '$compile', function($timeout, SessionTimeoutModal, SessionApi, windowService, $rootScope, $compile){ var REQUEST_TIME_DRIFT_SECONDS = 60; if(!windowService.isIframe()){ openModalOnExpiry(); } function openModalOnExpiry(){ return SessionApi.getDetails() .then(function(sessionDetails){ if(!sessionDetails.hasTimeout){ return; } var secondsUntilModal = calculateSecondsUntilModal(sessionDetails.expiresInSeconds || 0); if(secondsUntilModal <= 0){ return SessionTimeoutModal .show() .then(handleModalResults) } return $timeout(openModalOnExpiry, secondsUntilModal * 1000); }); } function calculateSecondsUntilModal(expiresInSeconds){ return expiresInSeconds - REQUEST_TIME_DRIFT_SECONDS - SessionTimeoutModal.getModalTimeoutSeconds(); } function handleModalResults(status){ switch(status){ case 'accept': return SessionApi.keepAlive() .then(function(){ return openModalOnExpiry() }); case 'reject': showLoadingAnimation(); return SessionApi.logout(); case 'timeout': showLoadingAnimation(); return SessionApi.timeout(); default: throw new Error('unknown session timeout status'); } } function showLoadingAnimation(){ var lnkFn = $compile( '
' ); var loading = lnkFn($rootScope.$new()); angular.element('body').append(loading); } }]); })();