diff --git a/javascript/src/iframe/viamapi-iframe.js b/javascript/src/iframe/viamapi-iframe.js index adcf52c7c27183dd35f50a4ff7edd241575a51c6..3a92c7d0922cf5c8ef0a4730f52a3bbed3ddaa01 100644 --- a/javascript/src/iframe/viamapi-iframe.js +++ b/javascript/src/iframe/viamapi-iframe.js @@ -215,32 +215,24 @@ const handleIdentityLogin = (identity, uuid, token) => { setKeyForUUID(uuid, publicKey); }; -function executeRestfulFunction(type, that, fn, ...args) { +async function executeRestfulFunction(type, that, fn, ...args) { const { currentlyAuthenticatedIdentity, viamApi, currentlyLoadedIdentity } = window; + const response = await fn.apply(that, args); - return new Penpal.Promise(executeResult => { - fn.apply(that, args).then((response) => { - const identity = currentlyAuthenticatedIdentity || currentlyLoadedIdentity; - - if (type === "private" && identity && response.data.code === "400" && response.data.status === "Bad session") { - viamApi.identityLogin("previousaddeddevice") - .then((response) => { - if (response.data.code === "200") { - const uuid = response.data.data["Uuid"]; - const token = response.data.data["Session"]; - handleIdentityLogin(identity, uuid, token); - // TODO: Previously there was fn.apply(null, args) where null is probably wrong context for fn.apply() - fn.apply(that, args).then(({data}) => executeResult(data)); - } else { - executeResult(response.data); - } - }) - .catch(console.warn); - } else { - executeResult(response.data); - } - }); - }); + const identity = currentlyAuthenticatedIdentity || currentlyLoadedIdentity; + const badSession = type === "private" && identity && response.data.code === "400" && + response.data.status === "Bad session"; + + if (!badSession) return response.data; + + const loginResponse = await viamApi.identityLogin("previousaddeddevice"); + if (loginResponse.data.code !== "200") return loginResponse.data; + + const uuid = loginResponse.data.data["Uuid"]; + const token = loginResponse.data.data["Session"]; + handleIdentityLogin(identity, uuid, token); + const { data } = await fn.apply(that, args); + return data; } window.executeRestfulFunction = executeRestfulFunction; @@ -1101,17 +1093,17 @@ connection.promise.then(parent => { } } - var anynomousDeviceKeyEventsProcessing = false; - var maxDeviceKeyAnonymousEventTime = 0; + let anynomousDeviceKeyEventsProcessing = false; + let maxDeviceKeyAnonymousEventTime = 0; - var eventsDeviceEventsProcessing = false; - var maxDeviceKeyEventTime = 0; + let eventsDeviceEventsProcessing = false; + let maxDeviceKeyEventTime = 0; - var eventsEntityEventsProcessing = false; - var maxEntityEventTime = 0; + let eventsEntityEventsProcessing = false; + let maxEntityEventTime = 0; - var identityLoadedEvent = false; - var identityAuthenticatedEvent = false; + let identityLoadedEvent = false; + let identityAuthenticatedEvent = false; setInterval(async function () { if (window.currentlyAuthenticatedIdentity) { @@ -1170,155 +1162,136 @@ connection.promise.then(parent => { } }, 50); - setInterval(function() { + setInterval(async function() { if (window.currentlyLoadedIdentity && !anynomousDeviceKeyEventsProcessing && !window.currentlyAuthenticatedIdentity) { anynomousDeviceKeyEventsProcessing = true; - executeRestfulFunction("public", viamAnonymousApi, viamAnonymousApi.eventGetNewEventsWithoutSession, "devicekey").then(async executeResult => { - if(executeResult.code === "200") { - var eventsLen = executeResult.data.length; - let changedMaxDeviceKeyAnonymousEventTime = false; - for (var i = 0; i < eventsLen; i++) { - var event = executeResult.data[i]; - switch (event.type) { - case "Authenticated" : { - const uuid = event.payloads[0]; - const token = event.payloads[1]; - handleIdentityLogin(window.currentlyLoadedIdentity, uuid, token); - const identityToStore = window.currentlyAuthenticatedIdentity; - event.payloads = [{fromQRCode: true}]; - setIdentityInLocalStorage(identityToStore).then(() => { - getProfileData(identityToStore).then(() => { - parent.onEvent(event); - }); - }); - break; - } - - case "QRCodeUpdated" : { - var actionID = event["actionID"]; - var QrCode = event["payloads"][1]; + const executeResult = await executeRestfulFunction("public", viamAnonymousApi, viamAnonymousApi.eventGetNewEventsWithoutSession, "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 "Authenticated" : { + const uuid = event.payloads[0]; + const token = event.payloads[1]; + handleIdentityLogin(window.currentlyLoadedIdentity, uuid, token); + const identityToStore = window.currentlyAuthenticatedIdentity; + event.payloads = [{fromQRCode: true}]; + await setIdentityInLocalStorage(identityToStore); + await getProfileData(identityToStore); + parent.onEvent(event); + break; + } - var eventCopy = JSON.parse(JSON.stringify(event)); + case "QRCodeUpdated" : { + const actionID = event["actionID"]; + const QrCode = event["payloads"][1]; - QRCode.toDataURL(actionID + "," + QrCode, function (err, url) { - eventCopy["payloads"].push(url); - parent.onEvent(eventCopy) - }); - break - } + const eventCopy = JSON.parse(JSON.stringify(event)); - 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; + QRCode.toDataURL(actionID + "," + QrCode, function (err, url) { + eventCopy["payloads"].push(url); + parent.onEvent(eventCopy); + }); + break; + } - destroyIdentityFromLocalStorage(authenticationPublicKey); - 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) - } + default : { + parent.onEvent(event); } - changedMaxDeviceKeyAnonymousEventTime = true; - maxDeviceKeyAnonymousEventTime = Math.max(maxDeviceKeyAnonymousEventTime, event.stamp) } + changedMaxDeviceKeyAnonymousEventTime = true; + maxDeviceKeyAnonymousEventTime = Math.max(maxDeviceKeyAnonymousEventTime, event.stamp); + } - if(changedMaxDeviceKeyAnonymousEventTime) { - executeRestfulFunction("public", viamAnonymousApi, viamAnonymousApi.eventUpdateLastViewedWithoutSession, - "devicekey", maxDeviceKeyAnonymousEventTime.toString()).then(() => { - anynomousDeviceKeyEventsProcessing = false; - }); - } else { - anynomousDeviceKeyEventsProcessing = false; - } - } else { - anynomousDeviceKeyEventsProcessing = false; + if(changedMaxDeviceKeyAnonymousEventTime) { + await executeRestfulFunction("public", viamAnonymousApi, viamAnonymousApi.eventUpdateLastViewedWithoutSession, + "devicekey", maxDeviceKeyAnonymousEventTime.toString()); } - }); + } + anynomousDeviceKeyEventsProcessing = false; } if (window.currentlyAuthenticatedIdentity != null && eventsDeviceEventsProcessing === false) { eventsDeviceEventsProcessing = true; - executeRestfulFunction("private", viamApi, viamApi.eventGetNewEvents, "devicekey").then(executeResult => { - if(executeResult.code === "200") { - var eventsLen = executeResult.data.length; - const changedMaxDeviceKeyEventTime = false; - for(var i = 0; i < eventsLen; i++) { - var event = executeResult.data[i]; - if(event.type === "QRCodeUpdated") { - var actionID = event["actionID"]; - var QrCode = event["payloads"][1]; - - var eventCopy = JSON.parse(JSON.stringify(event)); + const executeResult = await executeRestfulFunction("private", viamApi, viamApi.eventGetNewEvents, "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) - } - maxDeviceKeyEventTime = Math.max(maxDeviceKeyEventTime, event.stamp) - } - if(changedMaxDeviceKeyEventTime) { - executeRestfulFunction("private", viamApi, viamApi.eventUpdateLastViewed, "devicekey", - maxDeviceKeyEventTime.toString()).then(executeResult1 => { - eventsDeviceEventsProcessing = false - }) + QRCode.toDataURL(actionID + "," + QrCode, function (err, url) { + eventCopy["payloads"].push(url); + parent.onEvent(eventCopy); + }); } else { - eventsDeviceEventsProcessing = false + parent.onEvent(event); } - } else { - eventsDeviceEventsProcessing = false + maxDeviceKeyEventTime = Math.max(maxDeviceKeyEventTime, event.stamp); } - }); + if(changedMaxDeviceKeyEventTime) { + await executeRestfulFunction("private", viamApi, viamApi.eventUpdateLastViewed, "devicekey", + maxDeviceKeyEventTime.toString()); + } + } + eventsDeviceEventsProcessing = false; } if (window.currentlyAuthenticatedIdentity != null && eventsEntityEventsProcessing === false) { eventsEntityEventsProcessing = true; - executeRestfulFunction("private", viamApi, viamApi.eventGetNewEvents, "entity").then(executeResult => { - if(executeResult.code === "200") { - var eventsLen = executeResult.data.length; - let changedMaxEntityEventTime = false; - for(var i = 0; i < eventsLen; i++) { - event = executeResult.data[i]; - if(event.type === "QRCodeUpdated") { - var actionID = event["actionID"]; - var QrCode = event["payloads"][1]; - - var eventCopy = JSON.parse(JSON.stringify(event)); + const executeResult = await executeRestfulFunction("private", viamApi, viamApi.eventGetNewEvents, "entity"); - QRCode.toDataURL(actionID + "," + QrCode, function (err, url) { - eventCopy["payloads"].push(url); - parent.onEvent(eventCopy) - }); + 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]; - continue - } + const eventCopy = JSON.parse(JSON.stringify(event)); - parent.onEvent(event); - changedMaxEntityEventTime = true; - maxEntityEventTime = Math.max(maxEntityEventTime, event.stamp) - } - if(changedMaxEntityEventTime) { - executeRestfulFunction("private", viamApi, viamApi.eventUpdateLastViewed, "entity", - maxEntityEventTime.toString()).then(executeResult1 => { - eventsEntityEventsProcessing = false - }) - } else { - eventsEntityEventsProcessing = false + QRCode.toDataURL(actionID + "," + QrCode, function (err, url) { + eventCopy["payloads"].push(url); + parent.onEvent(eventCopy); + }); + + continue; } - } else { - eventsEntityEventsProcessing = false + + parent.onEvent(event); + changedMaxEntityEventTime = true; + maxEntityEventTime = Math.max(maxEntityEventTime, event.stamp); } - }); + if(changedMaxEntityEventTime) { + await executeRestfulFunction("private", viamApi, viamApi.eventUpdateLastViewed, "entity", + maxEntityEventTime.toString()); + } + } + eventsEntityEventsProcessing = false; } }, 1000); });