Skip to content
Snippets Groups Projects
viamapi-iframe.js 83.4 KiB
Newer Older
  • Learn to ignore specific revisions
  • Damyan Mitev's avatar
    Damyan Mitev committed
        validateVMime: async (vMime, vCardAttribs = null) => {
    
    Damyan Mitev's avatar
    Damyan Mitev committed
          const authenticationPublicKey = localStorage.getItem(
            "authenticatedIdentity"
          );
    
          if (
            !authenticationPublicKey ||
            !window.loadedIdentities[authenticationPublicKey] ||
            !extendPinCodeTtl(authenticationPublicKey)
          ) {
            return encodeResponse("400", "", "Identity not authenticated");
          }
    
    
          const validateVMimeResponse = await executeRestfulFunction(
    
    Damyan Mitev's avatar
    Damyan Mitev committed
            "private",
            window.viamApi,
    
            window.viamApi.signValidateVMime,
    
    Damyan Mitev's avatar
    Damyan Mitev committed
            null,
    
    Damyan Mitev's avatar
    Damyan Mitev committed
            vMime,
    
    Damyan Mitev's avatar
    Damyan Mitev committed
          );
    
          if (validateVMimeResponse.code !== "200") {
            return encodeResponse("400", "", validateVMimeResponse.status);
    
    Damyan Mitev's avatar
    Damyan Mitev committed
          const validationResult = validateVMimeResponse.data;
    
          const { signatures } = validationResult;
    
          if (signatures) {
            for (const signature of signatures) {
    
              const certificateChain = signature.certificateChainPEM.map(
    
                  const certificate = parseCertificate(certificatePEM);
                  const certificateData = new CertificateData(certificate);
                  return certificateData;
                }
              );
    
              signature.certificateChain = certificateChain;
    
          return encodeResponse(
            "200",
            validationResult,
            "Validation result retrieved"
          );
    
    Damyan Mitev's avatar
    Damyan Mitev committed
        },
    
        generateQrCode,
    
        documentCreateDocument: async (passportUUID, path, contentType, title) => {
    
    Alexey Lunin's avatar
    Alexey Lunin committed
          const authenticationPublicKey = localStorage.getItem(
            "authenticatedIdentity"
          );
    
          if (
            !authenticationPublicKey ||
            !window.loadedIdentities[authenticationPublicKey] ||
            !extendPinCodeTtl(authenticationPublicKey)
          ) {
            return encodeResponse("400", "", "Identity not authenticated");
          }
    
    
          path = encodeURI(path);
          contentType = encodeURI(contentType);
          title = encodeURI(title);
    
    
          const config = {
            headers: {
              path,
              passportuuid: passportUUID,
    
    Alexey Lunin's avatar
    Alexey Lunin committed
          const response = await executeRestfulFunction(
            "private",
            window.viamApi,
            window.viamApi.documentCreateDocument,
            config
          );
    
          if (response.code !== "200") {
            return encodeResponse("400", "", response.status);
          }
    
    
          return encodeResponse("200", response.data, "Document created");
        },
    
        getVcardWithQrCode: async (passportUUID, QRCodeContent = null) => {
    
          //TODO: IMPLEMENT QR CODE backend method needed
          const authenticationPublicKey = localStorage.getItem(
            "authenticatedIdentity"
          );
    
          if (
            !authenticationPublicKey ||
            !window.loadedIdentities[authenticationPublicKey] ||
            !extendPinCodeTtl(authenticationPublicKey)
          ) {
            return encodeResponse("400", "", "Identity not authenticated");
          }
    
          let vCardImageData;
          let vCardImageClaimValue;
    
          const vCardImageClaimName = "vCardImage";
          const defaultTagName = "notag";
    
          const vCardClaimResponse = await executeRestfulFunction(
            "private",
            window.viamApi,
            window.viamApi.entityGetClaim,
            null,
            vCardImageClaimName,
            defaultTagName,
            passportUUID
          );
    
          if (vCardClaimResponse.code === "200") {
            vCardImageClaimValue = vCardClaimResponse.data;
          }
    
          if (
            vCardImageClaimValue &&
            "state" in vCardImageClaimValue &&
            vCardImageClaimValue.state === "disabled"
          ) {
            //No image data if the user have disabled vCard for this profile.
            vCardImageData = null;
    
            // vCardImageData = new ImageData({
            //   contentType: "image/png",
            //   contentBase64:
            //     "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=" //1x1px transparent pixel
            // });
          } else {
            const vCardImageResponse = await executeRestfulFunction(
              "private",
              window.viamApi,
              window.viamApi.passportGetVCardImage,
              null,
              passportUUID
            );
    
            if (vCardImageResponse.code !== "200") {
              return encodeResponse("400", "", vCardImageResponse.status);
            }
            vCardImageData = new ImageData(vCardImageResponse.data.Image);
            if (vCardImageData.contentType !== "image/png") {
              return encodeResponse(
                "400",
                "",
                "Content type of vCard mmust be 'image/png'"
              );
            }
          }
    
          return encodeResponse("200", vCardImageData, "vCard got");
    
    Alexey Lunin's avatar
    Alexey Lunin committed
        documentPutDocument: async (
          passportUUID,
          resourceid,
          contentType,
    
    Alexey Lunin's avatar
    Alexey Lunin committed
          file,
          upload
    
    Alexey Lunin's avatar
    Alexey Lunin committed
        ) => {
          const authenticationPublicKey = localStorage.getItem(
            "authenticatedIdentity"
          );
    
          if (
            !authenticationPublicKey ||
            !window.loadedIdentities[authenticationPublicKey] ||
            !extendPinCodeTtl(authenticationPublicKey)
          ) {
            return encodeResponse("400", "", "Identity not authenticated");
          }
    
    
          resourceid = encodeURI(resourceid);
          contentType = encodeURI(contentType);
    
    
    Alexey Lunin's avatar
    Alexey Lunin committed
              "Content-Type": "multipart/form-data",
    
              contentType,
    
    
          const response = await executeRestfulFunction(
    
    Alexey Lunin's avatar
    Alexey Lunin committed
            "private",
            window.viamApi,
            window.viamApi.documentPutDocument,
            config,
            file
          );
    
          if (response.code !== "200") {
            return encodeResponse("400", "", response.status);
          }
    
    
          return encodeResponse("200", response.data, "Document stored");
        },
    
        hasSession() {
    
          return new Penpal.Promise(result => {
    
    Alexey Lunin's avatar
    Alexey Lunin committed
            const authenticationPublicKey = localStorage.getItem(
              "authenticatedIdentity"
            );
    
            if (authenticationPublicKey === null) {
    
    Alexey Lunin's avatar
    Alexey Lunin committed
              result({
                data: "",
                code: "400",
    
                status: "Identity not authenticated"
    
            if (window.loadedIdentities[authenticationPublicKey] === null) {
    
    Alexey Lunin's avatar
    Alexey Lunin committed
              result({
                data: "",
                code: "400",
    
                status: "Identity not authenticated"
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
            const success = extendPinCodeTtl(authenticationPublicKey);
    
    Alexey Lunin's avatar
    Alexey Lunin committed
            if (success === false) {
              result({
                data: "",
                code: "400",
    
                status: "Identity not authenticated"
    
    Alexey Lunin's avatar
    Alexey Lunin committed
              });
    
    Alexey Lunin's avatar
    Alexey Lunin committed
            executeRestfulFunction(
              "private",
              viamApi,
              viamApi.identityHasSession,
              null
    
              result(executeResult);
            });
          });
        },
        marketingSignUpIdentificator(identificator, reference) {
    
          return new Penpal.Promise(result => {
    
    Markin Igor's avatar
    Markin Igor committed
            viamApi.setIdentity("marketingapppublickey");
    
    Alexey Lunin's avatar
    Alexey Lunin committed
            executeRestfulFunction(
              "public",
              viamApi,
              viamApi.marketingSignUpIdentificator,
              null,
              identificator,
              reference
    
    Markin Igor's avatar
    Markin Igor committed
              viamApi.setIdentity("");
    
    Markin Igor's avatar
    Markin Igor committed
              viamApi.setSessionData("", "");
    
              result(executeResult);
            });
          });
        },
        marketingGetIdentificatorProfile(identificator, pincode) {
    
          return new Penpal.Promise(result => {
    
    Markin Igor's avatar
    Markin Igor committed
            viamApi.setIdentity("marketingapppublickey");
    
    Alexey Lunin's avatar
    Alexey Lunin committed
            executeRestfulFunction(
              "public",
              viamApi,
              viamApi.marketingGetIdentificatorProfile,
              null,
              identificator,
              pincode
    
    Markin Igor's avatar
    Markin Igor committed
              viamApi.setIdentity("");
    
    Markin Igor's avatar
    Markin Igor committed
              viamApi.setSessionData("", "");
    
              result(executeResult);
            });
          });
        },
    
        marketingExecuteEventForIdentificator(identificator, pincode, event) {
    
          return new Penpal.Promise(result => {
    
    Markin Igor's avatar
    Markin Igor committed
            viamApi.setIdentity("marketingapppublickey");
    
    Alexey Lunin's avatar
    Alexey Lunin committed
            executeRestfulFunction(
              "public",
              viamApi,
              viamApi.marketingExecuteEventForIdentificator,
              null,
              identificator,
              pincode,
              event
    
    Markin Igor's avatar
    Markin Igor committed
              viamApi.setIdentity("");
    
    Markin Igor's avatar
    Markin Igor committed
              viamApi.setSessionData("", "");
    
              result(executeResult);
            });
          });
        },
        getCurrentlyAuthenticatedIdentity() {
    
    Alexey Lunin's avatar
    Alexey Lunin committed
          const {
            publicKey,
    
    Alexey Lunin's avatar
    Alexey Lunin committed
          } = window.currentlyAuthenticatedIdentity.authentication;
    
        extractMessageID(mime) {
    
          return new Penpal.Promise(result => {
    
            result(extractMessageID(mime));
          });
        },
    
        stringToUtf8ByteArray(str) {
    
          return new Penpal.Promise(result => {
    
            result(stringToUtf8ByteArray(str));
          });
    
          return new Penpal.Promise(result => {
    
            result(utf8ByteArrayToString(ba));
          });
    
          return new Penpal.Promise(result => {
    
            result(stringToUtf8Base64(str));
          });
    
        },
        utf8Base64ToString(strBase64) {
    
          return new Penpal.Promise(result => {
    
            result(utf8Base64ToString(strBase64));
          });
    
        },
        base64ToByteArray(strBase64) {
    
          return new Penpal.Promise(result => {
    
            result(base64ToByteArray(strBase64));
          });
    
          return new Penpal.Promise(result => {
    
            result(byteArrayToBase64(ba));
          });
    
        hexStringToUtf8ByteArray(str) {
          return new Penpal.Promise(result => {
            result(hexStringToUtf8ByteArray(str));
          });
        },
    
    Alexey Lunin's avatar
    Alexey Lunin committed
    
        // Collabora APIs
    
        collaboraDiscovery() {
    
          return collaboraApi.discovery().then(apps => apps);
    
    Alexey Lunin's avatar
    Alexey Lunin committed
        // WOPI
    
    Gospodin Bodurov's avatar
    Gospodin Bodurov committed
        getPassportsNewProtocol: async (resourceID, contentType) => {
    
    Alexey Lunin's avatar
    Alexey Lunin committed
          const authenticationPublicKey = localStorage.getItem(
            "authenticatedIdentity"
          );
    
    Alexey Lunin's avatar
    Alexey Lunin committed
          if (
            !authenticationPublicKey ||
            !window.loadedIdentities[authenticationPublicKey] ||
            !extendPinCodeTtl(authenticationPublicKey)
          ) {
            return encodeResponse("400", "", "Identity not authenticated");
          }
    
    Alexey Lunin's avatar
    Alexey Lunin committed
          const response = await wopiAPI.getPassportsNewProtocol(
            resourceID,
            contentType
          );
    
    Alexey Lunin's avatar
    Alexey Lunin committed
          return response.data;
    
        getPassports: async fileId => {
    
    Alexey Lunin's avatar
    Alexey Lunin committed
          const authenticationPublicKey = localStorage.getItem(
            "authenticatedIdentity"
          );
    
    Alexey Lunin's avatar
    Alexey Lunin committed
          if (
            !authenticationPublicKey ||
            !window.loadedIdentities[authenticationPublicKey] ||
            !extendPinCodeTtl(authenticationPublicKey)
          ) {
            return encodeResponse("400", "", "Identity not authenticated");
          }
    
          const response = await wopiAPI.getPassports(fileId);
    
    Alexey Lunin's avatar
    Alexey Lunin committed
          return response.data;
    
        wopiCreateDocument: async (passportUUID, path, title) => {
    
    Alexey Lunin's avatar
    Alexey Lunin committed
          const authenticationPublicKey = localStorage.getItem(
            "authenticatedIdentity"
          );
    
          if (
            !authenticationPublicKey ||
            !window.loadedIdentities[authenticationPublicKey] ||
            !extendPinCodeTtl(authenticationPublicKey)
          ) {
            return encodeResponse("400", "", "Identity not authenticated");
          }
    
          const config = {
            headers: {
              path,
              passportuuid: passportUUID,
    
          const createDocumentResult = await executeRestfulFunction(
    
    Alexey Lunin's avatar
    Alexey Lunin committed
            "private",
            window.viamApi,
            window.viamApi.documentCreateDocument,
            config
          );
    
          if (createDocumentResult.code !== "200") {
            return createDocumentResult;
    
    
          const resourceID = createDocumentResult.data;
    
    
          const accessTokenResponse = await wopiAPI.getAccessToken(
            passportUUID,
            resourceID
          );
    
    
          if (accessTokenResponse.data.code !== "200") {
            return accessTokenResponse.data;
          }
    
          const accessToken = accessTokenResponse.data.data;
    
    
          const result = {
            resourceID,
    
          return encodeResponse("200", result, "ok");
    
        wopiGetAccessToken: async (passportUUID, resourceID, contentType) => {
          const authenticationPublicKey = localStorage.getItem(
            "authenticatedIdentity"
          );
    
          if (
            !authenticationPublicKey ||
            !window.loadedIdentities[authenticationPublicKey] ||
            !extendPinCodeTtl(authenticationPublicKey)
          ) {
            return encodeResponse("400", "", "Identity not authenticated");
          }
    
    
          const response = await wopiAPI.getAccessToken(
            passportUUID,
            resourceID,
            contentType
          );
    
          return response.data;
        },
    
    
        wopiPutFile: async (resourceID, accessToken, file) => {
    
    Alexey Lunin's avatar
    Alexey Lunin committed
          const authenticationPublicKey = localStorage.getItem(
            "authenticatedIdentity"
          );
    
    Alexey Lunin's avatar
    Alexey Lunin committed
          if (
            !authenticationPublicKey ||
            !window.loadedIdentities[authenticationPublicKey] ||
            !extendPinCodeTtl(authenticationPublicKey)
          ) {
            return encodeResponse("400", "", "Identity not authenticated");
          }
    
    
          const response = await wopiAPI.putDocument(resourceID, accessToken, file);
    
    Alexey Lunin's avatar
    Alexey Lunin committed
          return response.data;
    
    Markin Igor's avatar
    Markin Igor committed
    });
    
    connection.promise.then(parent => {
    
      iframeParent = parent;
    
    
      if (!navigator.cookieEnabled) {
        console.warn("Cookie disabled. Can't start library.");
        return;
      }
    
      window.addEventListener("storage", event => {
    
        if (event.key === "authenticatedIdentity" && event.newValue === null) {
    
    Alexey Lunin's avatar
    Alexey Lunin committed
          const publicKey =
            window.currentlyAuthenticatedIdentity.authentication.publicKey;
    
          window.currentlyLoadedIdentity = null;
          window.currentlyAuthenticatedIdentity = null;
    
    Markin Igor's avatar
    Markin Igor committed
          const event = createEvent("LogoutFromAnotherTab", "Logout", [publicKey]);
          parent.onEvent(event);
    
    Markin Igor's avatar
    Markin Igor committed
      const identities = localStorage.getItem("identities");
    
    Markin Igor's avatar
    Markin Igor committed
      console.log("Library loaded at: " + new Date().toISOString());
    
    
      if (identities === "" || identities === null) {
    
    Markin Igor's avatar
    Markin Igor committed
        localStorage.setItem("identities", JSON.stringify({}));
    
    Markin Igor's avatar
    Markin Igor committed
      if (
        localStorage.getItem("uuid") === null ||
        localStorage.getItem("token") === null ||
        localStorage.getItem("authenticatedIdentity") === null
      ) {
    
        const event = createEvent("", "NotAuthenticated");
        parent.onEvent(event);
    
    Markin Igor's avatar
    Markin Igor committed
        localStorage.removeItem("uuid");
        localStorage.removeItem("token");
    
    Markin Igor's avatar
    Markin Igor committed
        localStorage.removeItem("authenticatedIdentity");
    
    Alexey Lunin's avatar
    Alexey Lunin committed
        const authenticationPublicKey = localStorage.getItem(
          "authenticatedIdentity"
        );
    
        const pinCode = getPincode(authenticationPublicKey);
    
    Markin Igor's avatar
    Markin Igor committed
        if (pinCode === "" || pinCode === null) {
    
          loadIdentityInternal(authenticationPublicKey, "00000000").then(result => {
            if (result.code !== "200") {
              const event = createEvent(
                "CanNotGetPincodeForAuthenticatedIdentity",
                "IdentityNotLoaded",
                [authenticationPublicKey]
              );
              parent.onEvent(event);
    
          loadIdentityInternal(authenticationPublicKey, pinCode).then(result => {
    
    Markin Igor's avatar
    Markin Igor committed
            if (result.code !== "200") {
              const event = createEvent(
                "CanNotLoadIdentity",
                "ErrorDuringLoadingIdentity",
    
                [authenticationPublicKey]
    
    Markin Igor's avatar
    Markin Igor committed
              );
              parent.onEvent(event);
    
      let anynomousDeviceKeyEventsProcessing = false;
      let maxDeviceKeyAnonymousEventTime = 0;
    
      let eventsDeviceEventsProcessing = false;
      let maxDeviceKeyEventTime = 0;
    
      let eventsEntityEventsProcessing = false;
      let maxEntityEventTime = 0;
    
      let identityLoadedEvent = false;
      let identityAuthenticatedEvent = false;
    
    Alexey Lunin's avatar
    Alexey Lunin committed
      let previousLocalStorageUUID;
      let previousLocalStorageToken;
      let previousLocalStorageIdentity;
    
    
    Sasha Ilieva's avatar
    Sasha Ilieva committed
      setInterval(async function () {
    
    Sasha Ilieva's avatar
    Sasha Ilieva committed
        console.log(
          "before if window.currentlyAuthenticated",
          window.currentlyAuthenticatedIdentity
        );
    
    Markin Igor's avatar
    Markin Igor committed
        if (window.currentlyAuthenticatedIdentity) {
    
    Sasha Ilieva's avatar
    Sasha Ilieva committed
          console.log("has window.currentlyauthenitcated");
    
    Markin Igor's avatar
    Markin Igor committed
          const { authentication } = window.currentlyAuthenticatedIdentity;
          const pinCode = getPincode(authentication.publicKey);
          if (pinCode) {
    
    Alexey Lunin's avatar
    Alexey Lunin committed
            const identity = await getIdentityFromLocalStorage(
              authentication.publicKey,
              pinCode,
              false
            );
    
    Markin Igor's avatar
    Markin Igor committed
            window.currentlyLoadedIdentity = identity;
    
            if (!identityAuthenticatedEvent && identity) {
    
    Alexey Lunin's avatar
    Alexey Lunin committed
              const event = createEvent("IdentityAuthenticated", "Authenticated", [
    
                identity.authentication.publicKey
    
    Alexey Lunin's avatar
    Alexey Lunin committed
              ]);
    
    Markin Igor's avatar
    Markin Igor committed
              parent.onEvent(event);
              identityAuthenticatedEvent = true;
            }
    
    Alexey Lunin's avatar
    Alexey Lunin committed
            const authenticationPublicKey = localStorage.getItem(
              "authenticatedIdentity"
            );
    
    Markin Igor's avatar
    Markin Igor committed
            if (authenticationPublicKey) {
    
    Alexey Lunin's avatar
    Alexey Lunin committed
              const result = await loadIdentityInternal(
                authenticationPublicKey,
                "00000000"
              );
    
    Markin Igor's avatar
    Markin Igor committed
              if (result.code !== "200") {
    
    Alexey Lunin's avatar
    Alexey Lunin committed
                const event = createEvent(
                  "CanNotGetPincodeForAuthenticatedIdentity",
                  "IdentityNotLoaded",
                  [authenticationPublicKey]
                );
    
    Markin Igor's avatar
    Markin Igor committed
                parent.onEvent(event);
                clearPinCodeTtl(authenticationPublicKey);
                window.currentlyAuthenticatedIdentity = null;
              }
    
    Markin Igor's avatar
    Markin Igor committed
            identityAuthenticatedEvent = false;
    
    Markin Igor's avatar
    Markin Igor committed
            window.currentlyLoadedIdentity = null;
    
    Markin Igor's avatar
    Markin Igor committed
        if (window.currentlyLoadedIdentity) {
    
    Alexey Lunin's avatar
    Alexey Lunin committed
          const pinCode = getPincode(
            window.currentlyLoadedIdentity.authentication.publicKey
          );
    
    Markin Igor's avatar
    Markin Igor committed
          if (!pinCode) {
            if (!identityLoadedEvent) {
    
    Alexey Lunin's avatar
    Alexey Lunin committed
              const result = await loadIdentityInternal(
                window.currentlyLoadedIdentity.authentication.publicKey,
                "00000000"
              );
    
              if (window.currentlyLoadedIdentity && result.code !== "200") {
    
    Alexey Lunin's avatar
    Alexey Lunin committed
                const event = createEvent(
                  "CanNotLoadPincodeForLoadedIdentity",
                  "IdentityNotLoaded",
                  [window.currentlyLoadedIdentity.authentication.publicKey]
                );
    
    Markin Igor's avatar
    Markin Igor committed
                parent.onEvent(event);
                identityLoadedEvent = true;
              }
    
    Markin Igor's avatar
    Markin Igor committed
            identityLoadedEvent = false;
    
    Markin Igor's avatar
    Markin Igor committed
        if (window.currentlyAuthenticatedIdentity) {
          const now = new Date().getTime();
          if (now - window.lastTimeGetProfile > 30000) {
            getProfileData(window.currentlyAuthenticatedIdentity);
    
    Markin Igor's avatar
    Markin Igor committed
            window.lastTimeGetProfile = now;
    
    Alexey Lunin's avatar
    Alexey Lunin committed
    
        const currentLocalStorageUUID = localStorage.getItem("uuid");
        const currentLocalStorageToken = localStorage.getItem("token");
    
    Alexey Lunin's avatar
    Alexey Lunin committed
        const currentLocalStorageIdentity = localStorage.getItem(
          "authenticatedIdentity"
        );
    
    Alexey Lunin's avatar
    Alexey Lunin committed
        if (
    
    Alexey Lunin's avatar
    Alexey Lunin committed
          (!currentLocalStorageUUID && previousLocalStorageUUID) ||
          (!currentLocalStorageToken && previousLocalStorageToken) ||
          (!currentLocalStorageIdentity && previousLocalStorageIdentity)
    
    Alexey Lunin's avatar
    Alexey Lunin committed
        ) {
          previousLocalStorageUUID = null;
          previousLocalStorageToken = null;
          previousLocalStorageIdentity = null;
    
          destroyAuthentication();
    
          const event = createEvent("", "LogoutExternal");
          parent.onEvent(event);
        } else {
          previousLocalStorageUUID = currentLocalStorageUUID;
          previousLocalStorageToken = currentLocalStorageToken;
          previousLocalStorageIdentity = currentLocalStorageIdentity;
        }
    
    Markin Igor's avatar
    Markin Igor committed
      }, 50);
    
      const getNewEventsWithoutSession = async () => {
        anynomousDeviceKeyEventsProcessing = true;
        try {
    
    Alexey Lunin's avatar
    Alexey Lunin committed
          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) {
    
    Alexey Lunin's avatar
    Alexey Lunin committed
                case "DeviceConfirmed": {
    
                  await setIdentityInLocalStorage(window.currentlyLoadedIdentity);
                  parent.onEvent(event);
                  break;
    
    Alexey Lunin's avatar
    Alexey Lunin committed
                case "QRCodeUpdated": {
    
                  const actionID = event["actionID"];
                  const QrCode = event["payloads"][1];
    
                  const eventCopy = JSON.parse(JSON.stringify(event));
    
                  const dataUrl = await generateQrCode(actionID + "," + QrCode);
                  eventCopy["payloads"].push(dataUrl);
                  parent.onEvent(eventCopy);
    
    Alexey Lunin's avatar
    Alexey Lunin committed
                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;
                }
    
    
    Alexey Lunin's avatar
    Alexey Lunin committed
                default: {
    
              changedMaxDeviceKeyAnonymousEventTime = true;
    
    Alexey Lunin's avatar
    Alexey Lunin committed
              maxDeviceKeyAnonymousEventTime = Math.max(
                maxDeviceKeyAnonymousEventTime,
                event.stamp
              );
    
    Alexey Lunin's avatar
    Alexey Lunin committed
            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 {
    
    Alexey Lunin's avatar
    Alexey Lunin committed
          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));
    
    
                const dataUrl = await generateQrCode(actionID + "," + QrCode);
                eventCopy["payloads"].push(dataUrl);
                parent.onEvent(eventCopy);
    
              } else {
                parent.onEvent(event);
    
              maxDeviceKeyEventTime = Math.max(maxDeviceKeyEventTime, event.stamp);
            }
    
    Alexey Lunin's avatar
    Alexey Lunin committed
            if (changedMaxDeviceKeyEventTime) {
              await executeRestfulFunction(
                "private",
                viamApi,
                viamApi.eventUpdateLastViewed,
                null,
                "devicekey",
                maxDeviceKeyEventTime.toString()
              );
    
        } catch (e) {
          console.warn(e);
    
        eventsDeviceEventsProcessing = false;
      };
    
      const getNewEntityEvents = async () => {
        eventsEntityEventsProcessing = true;
        try {
    
    Alexey Lunin's avatar
    Alexey Lunin committed
          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];
    
                const eventCopy = JSON.parse(JSON.stringify(event));
    
                const dataUrl = await generateQrCode(actionID + "," + QrCode);
                eventCopy["payloads"].push(dataUrl);
                parent.onEvent(eventCopy);
    
    
              parent.onEvent(event);
              changedMaxEntityEventTime = true;
              maxEntityEventTime = Math.max(maxEntityEventTime, event.stamp);
            }
    
    Alexey Lunin's avatar
    Alexey Lunin committed
            if (changedMaxEntityEventTime) {
              await executeRestfulFunction(
                "private",
                viamApi,
                viamApi.eventUpdateLastViewed,
                null,
                "entity",
                maxEntityEventTime.toString()
              );
    
        } catch (e) {
          console.warn(e);
        }
        eventsEntityEventsProcessing = false;
    
    Alexey Lunin's avatar
    Alexey Lunin committed
      };
    
    
      setInterval(() => {
    
    Alexey Lunin's avatar
    Alexey Lunin committed
        if (
          window.currentlyLoadedIdentity &&
          !anynomousDeviceKeyEventsProcessing &&
          !window.currentlyAuthenticatedIdentity
        ) {
    
          getNewEventsWithoutSession();
        }
    
        if (window.currentlyAuthenticatedIdentity) {
          // These functions has to be executed at the same time.
          !eventsDeviceEventsProcessing && getNewDeviceEvents();
          !eventsEntityEventsProcessing && getNewEntityEvents();