diff --git a/javascript/src/iframe/viamapi-iframe.js b/javascript/src/iframe/viamapi-iframe.js index ebcf31d1cb2ad0d554b5737a10c252c9926fe9e8..63ad5c252a818d236ca6ebad17f1bb226fa85fd6 100644 --- a/javascript/src/iframe/viamapi-iframe.js +++ b/javascript/src/iframe/viamapi-iframe.js @@ -710,39 +710,25 @@ const connection = Penpal.connectToParent({ }); }, logout: async () => { - try { - const authenticationPublicKey = localStorage.getItem("authenticatedIdentity"); - if (!authenticationPublicKey || !window.loadedIdentities[authenticationPublicKey]) { - return { - data: "", - code: "400", - status: "Identity not loaded" - }; - } - - // Clone headers to be able destroy authentication first. - // We need it because clients should be able reload page right after logout invocation and not wait until request completed - const headers = {...window.viamApi.getConfig().headers}; - - destroyAuthentication(); - - const identityLogoutResponse = await executeRestfulFunction( - "private", - window.viamApi, - window.viamApi.identityLogout, - { - headers - } - ); - - return identityLogoutResponse; - } catch (e) { + const authenticationPublicKey = localStorage.getItem("authenticatedIdentity"); + if (!authenticationPublicKey || !window.loadedIdentities[authenticationPublicKey]) { return { data: "", code: "400", - status: e.message + status: "Identity not loaded" }; } + + const identityLogoutResponse = await executeRestfulFunction( + "private", + window.viamApi, + window.viamApi.identityLogout, + null + ); + + destroyAuthentication(); + + return identityLogoutResponse; }, identityRestoreAccess(restoreAccessIdentity, identificator) { return new Penpal.Promise(result => { @@ -1286,23 +1272,80 @@ connection.promise.then(parent => { } }, 50); - const getNewEventsWithoutSession = async () => { - anynomousDeviceKeyEventsProcessing = true; - try { - const executeResult = await executeRestfulFunction("public", viamAnonymousApi, viamAnonymousApi.eventGetNewEventsWithoutSession, null, "devicekey"); - if(executeResult.code === "200") { - const eventsLen = executeResult.data.length; - let changedMaxDeviceKeyAnonymousEventTime = false; - for (let i = 0; i < eventsLen; i++) { - const event = executeResult.data[i]; - switch (event.type) { - case "DeviceConfirmed" : { - await setIdentityInLocalStorage(window.currentlyLoadedIdentity); - parent.onEvent(event); - break; + setInterval(async () => { + if (window.currentlyLoadedIdentity && !anynomousDeviceKeyEventsProcessing && !window.currentlyAuthenticatedIdentity) { + anynomousDeviceKeyEventsProcessing = true; + try { + const executeResult = await executeRestfulFunction("public", viamAnonymousApi, viamAnonymousApi.eventGetNewEventsWithoutSession, null, "devicekey"); + if(executeResult.code === "200") { + const eventsLen = executeResult.data.length; + let changedMaxDeviceKeyAnonymousEventTime = false; + for (let i = 0; i < eventsLen; i++) { + const event = executeResult.data[i]; + switch (event.type) { + case "DeviceConfirmed" : { + await setIdentityInLocalStorage(window.currentlyLoadedIdentity); + parent.onEvent(event); + break; + } + + case "QRCodeUpdated" : { + const actionID = event["actionID"]; + const QrCode = event["payloads"][1]; + + const eventCopy = JSON.parse(JSON.stringify(event)); + + QRCode.toDataURL(actionID + "," + QrCode, function (err, url) { + eventCopy["payloads"].push(url); + parent.onEvent(eventCopy); + }); + break; + } + + case "KeyDeleted" : { + const authenticationPublicKey = localStorage.getItem("authenticatedIdentity"); + clearPinCodeTtl(authenticationPublicKey); + localStorage.removeItem("uuid"); + localStorage.removeItem("token"); + localStorage.removeItem("authenticatedIdentity"); + delete window.loadedIdentities[authenticationPublicKey]; + window.currentlyLoadedIdentity = null; + window.currentlyAuthenticatedIdentity = null; + window.lastTimeGetProfile = 0; + + destroyIdentityFromLocalStorage(authenticationPublicKey); + break; + } + + default : { + parent.onEvent(event); + } } + changedMaxDeviceKeyAnonymousEventTime = true; + maxDeviceKeyAnonymousEventTime = Math.max(maxDeviceKeyAnonymousEventTime, event.stamp); + } + + if(changedMaxDeviceKeyAnonymousEventTime) { + await executeRestfulFunction("public", viamAnonymousApi, viamAnonymousApi.eventUpdateLastViewedWithoutSession, + null, "devicekey", maxDeviceKeyAnonymousEventTime.toString()); + } + } + } catch (e) { + console.warn(e); + } + anynomousDeviceKeyEventsProcessing = false; + } - case "QRCodeUpdated" : { + if (window.currentlyAuthenticatedIdentity != null && eventsDeviceEventsProcessing === false) { + eventsDeviceEventsProcessing = true; + try { + const executeResult = await executeRestfulFunction("private", viamApi, viamApi.eventGetNewEvents, null, "devicekey"); + if (executeResult.code === "200") { + const eventsLen = executeResult.data.length; + const changedMaxDeviceKeyEventTime = false; + for (let i = 0; i < eventsLen; i++) { + const event = executeResult.data[i]; + if (event.type === "QRCodeUpdated") { const actionID = event["actionID"]; const QrCode = event["payloads"][1]; @@ -1312,126 +1355,59 @@ connection.promise.then(parent => { eventCopy["payloads"].push(url); parent.onEvent(eventCopy); }); - break; - } - - case "KeyDeleted" : { - const authenticationPublicKey = localStorage.getItem("authenticatedIdentity"); - clearPinCodeTtl(authenticationPublicKey); - localStorage.removeItem("uuid"); - localStorage.removeItem("token"); - localStorage.removeItem("authenticatedIdentity"); - delete window.loadedIdentities[authenticationPublicKey]; - window.currentlyLoadedIdentity = null; - window.currentlyAuthenticatedIdentity = null; - window.lastTimeGetProfile = 0; - - destroyIdentityFromLocalStorage(authenticationPublicKey); - break; - } - - default : { + } else { parent.onEvent(event); } + maxDeviceKeyEventTime = Math.max(maxDeviceKeyEventTime, event.stamp); } - changedMaxDeviceKeyAnonymousEventTime = true; - maxDeviceKeyAnonymousEventTime = Math.max(maxDeviceKeyAnonymousEventTime, event.stamp); - } - - if(changedMaxDeviceKeyAnonymousEventTime) { - await executeRestfulFunction("public", viamAnonymousApi, viamAnonymousApi.eventUpdateLastViewedWithoutSession, - null, "devicekey", maxDeviceKeyAnonymousEventTime.toString()); - } - } - } catch (e) { - console.warn(e); - } - anynomousDeviceKeyEventsProcessing = false; - }; - - const getNewDeviceEvents = async () => { - eventsDeviceEventsProcessing = true; - try { - const executeResult = await executeRestfulFunction("private", viamApi, viamApi.eventGetNewEvents, null, "devicekey"); - if (executeResult.code === "200") { - const eventsLen = executeResult.data.length; - const changedMaxDeviceKeyEventTime = false; - for (let i = 0; i < eventsLen; i++) { - const event = executeResult.data[i]; - if (event.type === "QRCodeUpdated") { - const actionID = event["actionID"]; - const QrCode = event["payloads"][1]; - - const eventCopy = JSON.parse(JSON.stringify(event)); - - QRCode.toDataURL(actionID + "," + QrCode, function (err, url) { - eventCopy["payloads"].push(url); - parent.onEvent(eventCopy); - }); - } else { - parent.onEvent(event); + if(changedMaxDeviceKeyEventTime) { + await executeRestfulFunction("private", viamApi, viamApi.eventUpdateLastViewed, null, "devicekey", + maxDeviceKeyEventTime.toString()); } - maxDeviceKeyEventTime = Math.max(maxDeviceKeyEventTime, event.stamp); - } - if(changedMaxDeviceKeyEventTime) { - await executeRestfulFunction("private", viamApi, viamApi.eventUpdateLastViewed, null, "devicekey", - maxDeviceKeyEventTime.toString()); } + } catch (e) { + console.warn(e); } - } catch (e) { - console.warn(e); + eventsDeviceEventsProcessing = false; } - eventsDeviceEventsProcessing = false; - }; - const getNewEntityEvents = async () => { - eventsEntityEventsProcessing = true; - try { - const executeResult = await executeRestfulFunction("private", viamApi, viamApi.eventGetNewEvents, null, "entity"); + if (window.currentlyAuthenticatedIdentity != null && eventsEntityEventsProcessing === false) { + eventsEntityEventsProcessing = true; + try { + const executeResult = await executeRestfulFunction("private", viamApi, viamApi.eventGetNewEvents, null, "entity"); + + if (executeResult.code === "200") { + const eventsLen = executeResult.data.length; + let changedMaxEntityEventTime = false; + for (let i = 0; i < eventsLen; i++) { + const event = executeResult.data[i]; + if (event.type === "QRCodeUpdated") { + const actionID = event["actionID"]; + const QrCode = event["payloads"][1]; - if (executeResult.code === "200") { - const eventsLen = executeResult.data.length; - let changedMaxEntityEventTime = false; - for (let i = 0; i < eventsLen; i++) { - const event = executeResult.data[i]; - if (event.type === "QRCodeUpdated") { - const actionID = event["actionID"]; - const QrCode = event["payloads"][1]; + const eventCopy = JSON.parse(JSON.stringify(event)); - const eventCopy = JSON.parse(JSON.stringify(event)); + QRCode.toDataURL(actionID + "," + QrCode, function (err, url) { + eventCopy["payloads"].push(url); + parent.onEvent(eventCopy); + }); - QRCode.toDataURL(actionID + "," + QrCode, function (err, url) { - eventCopy["payloads"].push(url); - parent.onEvent(eventCopy); - }); + continue; + } - continue; + parent.onEvent(event); + changedMaxEntityEventTime = true; + maxEntityEventTime = Math.max(maxEntityEventTime, event.stamp); + } + if(changedMaxEntityEventTime) { + await executeRestfulFunction("private", viamApi, viamApi.eventUpdateLastViewed, null, "entity", + maxEntityEventTime.toString()); } - - parent.onEvent(event); - changedMaxEntityEventTime = true; - maxEntityEventTime = Math.max(maxEntityEventTime, event.stamp); - } - if(changedMaxEntityEventTime) { - await executeRestfulFunction("private", viamApi, viamApi.eventUpdateLastViewed, null, "entity", - maxEntityEventTime.toString()); } + } catch (e) { + console.warn(e); } - } catch (e) { - console.warn(e); - } - eventsEntityEventsProcessing = false; - } - - setInterval(() => { - if (window.currentlyLoadedIdentity && !anynomousDeviceKeyEventsProcessing && !window.currentlyAuthenticatedIdentity) { - getNewEventsWithoutSession(); - } - - if (window.currentlyAuthenticatedIdentity) { - // These functions has to be executed at the same time. - !eventsDeviceEventsProcessing && getNewDeviceEvents(); - !eventsEntityEventsProcessing && getNewEntityEvents(); + eventsEntityEventsProcessing = false; } }, 1000); });