You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tooling.apache.org by sb...@apache.org on 2026/04/23 18:37:33 UTC

(tooling-trusted-releases) branch sbp updated: Clear JWTs when the page display status changes

This is an automated email from the ASF dual-hosted git repository.

sbp pushed a commit to branch sbp
in repository https://gitbox.apache.org/repos/asf/tooling-trusted-releases.git


The following commit(s) were added to refs/heads/sbp by this push:
     new 33411c46 Clear JWTs when the page display status changes
33411c46 is described below

commit 33411c4613b976ea78de6e1451a7051eb5b7ef29
Author: Sean B. Palmer <se...@miscoranda.com>
AuthorDate: Thu Apr 23 19:35:49 2026 +0100

    Clear JWTs when the page display status changes
---
 atr/static/js/ts/create-a-jwt.js     | 47 +++++++++++++++++++++------
 atr/static/js/ts/create-a-jwt.js.map |  2 +-
 atr/static/ts/create-a-jwt.ts        | 63 +++++++++++++++++++++++++++---------
 3 files changed, 86 insertions(+), 26 deletions(-)

diff --git a/atr/static/js/ts/create-a-jwt.js b/atr/static/js/ts/create-a-jwt.js
index 8f9b6bfb..8451213d 100644
--- a/atr/static/js/ts/create-a-jwt.js
+++ b/atr/static/js/ts/create-a-jwt.js
@@ -22,10 +22,40 @@ document.addEventListener("DOMContentLoaded", () => {
     const outputContainer = document.getElementById("jwt-container");
     const output = document.getElementById("jwt-output");
     const timeField = document.getElementById("time-remaining");
-    let timeoutObj, intervalObj;
+    let timeoutObj = null;
+    let intervalObj = null;
     if (!form || !output || !outputContainer || !timeField) {
         return;
     }
+    const jwtOutput = output;
+    const jwtOutputContainer = outputContainer;
+    const jwtTimeField = timeField;
+    function clearJwtDisplay() {
+        if (timeoutObj !== null) {
+            clearTimeout(timeoutObj);
+            timeoutObj = null;
+        }
+        if (intervalObj !== null) {
+            clearInterval(intervalObj);
+            intervalObj = null;
+        }
+        jwtOutput.textContent = "";
+        jwtTimeField.textContent = "";
+        jwtOutputContainer.classList.add("d-none");
+    }
+    document.addEventListener("visibilitychange", () => {
+        if (document.visibilityState === "hidden") {
+            clearJwtDisplay();
+        }
+    });
+    window.addEventListener("pagehide", () => {
+        clearJwtDisplay();
+    });
+    window.addEventListener("pageshow", (event) => {
+        if (event.persisted) {
+            clearJwtDisplay();
+        }
+    });
     form.addEventListener("submit", async (e) => {
         e.preventDefault();
         const resp = await fetch(form.action, {
@@ -35,19 +65,16 @@ document.addEventListener("DOMContentLoaded", () => {
         if (resp.ok) {
             const token = await resp.text();
             let time = 60;
-            clearTimeout(timeoutObj);
-            clearInterval(intervalObj);
-            timeField.textContent = time + "s";
-            outputContainer.classList.remove("d-none");
-            output.textContent = token;
+            clearJwtDisplay();
+            jwtOutputContainer.classList.remove("d-none");
+            jwtOutput.textContent = token;
+            jwtTimeField.textContent = time + "s";
             timeoutObj = setTimeout(() => {
-                output.textContent = "";
-                outputContainer.classList.add("d-none");
-                clearInterval(intervalObj);
+                clearJwtDisplay();
             }, 60000);
             intervalObj = setInterval(() => {
                 time = time - 1;
-                timeField.textContent = time + "s";
+                jwtTimeField.textContent = time + "s";
             }, 1000);
         }
         else {
diff --git a/atr/static/js/ts/create-a-jwt.js.map b/atr/static/js/ts/create-a-jwt.js.map
index 72e5e216..8bfb7f28 100644
--- a/atr/static/js/ts/create-a-jwt.js.map
+++ b/atr/static/js/ts/create-a-jwt.js.map
@@ -1 +1 @@
-{"version":3,"file":"create-a-jwt.js","sourceRoot":"","sources":["../../ts/create-a-jwt.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;EAiBE;AAEF,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,GAAS,EAAE;IACvD,MAAM,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAA2B,CAAC;IACjF,MAAM,eAAe,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAA;IAChE,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;IAC5D,IAAI,UAAkB,EAAE,WAAmB,CAAC;IAE5C,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,I [...]
\ No newline at end of file
+{"version":3,"file":"create-a-jwt.js","sourceRoot":"","sources":["../../ts/create-a-jwt.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;EAiBE;AAEF,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,GAAS,EAAE;IACvD,MAAM,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAA2B,CAAC;IACjF,MAAM,eAAe,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;IACjE,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;IAC5D,IAAI,UAAU,GAAkB,IAAI,CAAC;IACrC,IAAI,WAAW,GAAkB,IAAI,CAAC;IAEtC, [...]
\ No newline at end of file
diff --git a/atr/static/ts/create-a-jwt.ts b/atr/static/ts/create-a-jwt.ts
index e6c5bddd..f653342b 100644
--- a/atr/static/ts/create-a-jwt.ts
+++ b/atr/static/ts/create-a-jwt.ts
@@ -19,15 +19,50 @@
 
 document.addEventListener("DOMContentLoaded", (): void => {
   const form = document.getElementById("issue-jwt-form") as HTMLFormElement | null;
-  const outputContainer = document.getElementById("jwt-container")
+  const outputContainer = document.getElementById("jwt-container");
   const output = document.getElementById("jwt-output");
   const timeField = document.getElementById("time-remaining");
-  let timeoutObj: number, intervalObj: number;
+  let timeoutObj: number | null = null;
+  let intervalObj: number | null = null;
 
   if (!form || !output || !outputContainer || !timeField) {
     return;
   }
 
+  const jwtOutput = output;
+  const jwtOutputContainer = outputContainer;
+  const jwtTimeField = timeField;
+
+  function clearJwtDisplay(): void {
+    if (timeoutObj !== null) {
+      clearTimeout(timeoutObj);
+      timeoutObj = null;
+    }
+    if (intervalObj !== null) {
+      clearInterval(intervalObj);
+      intervalObj = null;
+    }
+    jwtOutput.textContent = "";
+    jwtTimeField.textContent = "";
+    jwtOutputContainer.classList.add("d-none");
+  }
+
+  document.addEventListener("visibilitychange", (): void => {
+    if (document.visibilityState === "hidden") {
+      clearJwtDisplay();
+    }
+  });
+
+  window.addEventListener("pagehide", (): void => {
+    clearJwtDisplay();
+  });
+
+  window.addEventListener("pageshow", (event: PageTransitionEvent): void => {
+    if (event.persisted) {
+      clearJwtDisplay();
+    }
+  });
+
   form.addEventListener("submit", async (e: Event): Promise<void> => {
     e.preventDefault();
 
@@ -38,21 +73,19 @@ document.addEventListener("DOMContentLoaded", (): void => {
 
     if (resp.ok) {
       const token = await resp.text();
-      let time = 60
-      clearTimeout(timeoutObj)
-      clearInterval(intervalObj)
-      timeField.textContent = time + "s"
-      outputContainer.classList.remove("d-none");
-      output.textContent = token;
+      let time = 60;
+
+      clearJwtDisplay();
+      jwtOutputContainer.classList.remove("d-none");
+      jwtOutput.textContent = token;
+      jwtTimeField.textContent = time + "s";
       timeoutObj = setTimeout(() => {
-          output.textContent = ""
-          outputContainer.classList.add("d-none");
-          clearInterval(intervalObj)
-      }, 60000)
+        clearJwtDisplay();
+      }, 60000);
       intervalObj = setInterval(() => {
-          time = time - 1
-          timeField.textContent = time + "s"
-      }, 1000)
+        time = time - 1;
+        jwtTimeField.textContent = time + "s";
+      }, 1000);
     } else {
       alert("Failed to fetch JWT");
     }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@tooling.apache.org
For additional commands, e-mail: commits-help@tooling.apache.org