aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2026-01-21 15:00:02 -0800
committerAdam Soltys <[email protected]>2026-01-21 15:00:02 -0800
commit5248bf5ffca4c8b3303de4c73d11c9f7f0cfde13 (patch)
tree33ad949937238d4b8d286829bf6418aed235fcf5
parent76bbaa296e2fa5a0bf51e15dd8b51011b0ee4a1e (diff)
downloadcoinos-ui-5248bf5ffca4c8b3303de4c73d11c9f7f0cfde13.tar.gz
coinos-ui-5248bf5ffca4c8b3303de4c73d11c9f7f0cfde13.zip
redirect on invalid token
-rw-r--r--src/lib/utils.ts14
-rw-r--r--src/routes/(app)/+layout.server.ts19
-rw-r--r--src/routes/(app)/admin/+layout.server.ts10
-rw-r--r--src/routes/(static)/+layout.server.ts9
-rw-r--r--src/routes/+layout.server.ts21
5 files changed, 63 insertions, 10 deletions
diff --git a/src/lib/utils.ts b/src/lib/utils.ts
index a3d9cd49..f220ed45 100644
--- a/src/lib/utils.ts
+++ b/src/lib/utils.ts
@@ -199,6 +199,20 @@ export const auth = (cookies) => ({
authorization: `Bearer ${cookies.get("token")}`,
});
+export const isInvalidTokenError = (e: unknown) => {
+ const message = (e as Error)?.message || "";
+ if (!message) return false;
+ const normalized = message.toLowerCase();
+ return (
+ normalized.includes("jwt") ||
+ normalized.includes("invalid token") ||
+ normalized.includes("token expired") ||
+ normalized.includes("expired token") ||
+ normalized.includes("unauthorized") ||
+ normalized.includes("not authorized")
+ );
+};
+
export const btc = (fiat: number, rate: number): number =>
Math.round((fiat * sats) / rate);
diff --git a/src/routes/(app)/+layout.server.ts b/src/routes/(app)/+layout.server.ts
index e28d8b56..8b694241 100644
--- a/src/routes/(app)/+layout.server.ts
+++ b/src/routes/(app)/+layout.server.ts
@@ -1,4 +1,4 @@
-import { auth, get, sleep } from "$lib/utils";
+import { auth, get, isInvalidTokenError, sleep } from "$lib/utils";
import { error, redirect } from "@sveltejs/kit";
export async function load({ cookies, request, url, params }) {
@@ -12,8 +12,21 @@ export async function load({ cookies, request, url, params }) {
user = await get("/me", auth(cookies));
} catch (e) {
const { message } = e as Error;
- if (message.startsWith("Rate")) await sleep(3000);
- user = await get("/me", auth(cookies));
+ if (message.startsWith("Rate")) {
+ await sleep(3000);
+ try {
+ user = await get("/me", auth(cookies));
+ } catch (retryError) {
+ if (isInvalidTokenError(retryError) && pathname !== "/logout") {
+ redirect(307, "/logout");
+ }
+ throw retryError;
+ }
+ } else if (isInvalidTokenError(e) && pathname !== "/logout") {
+ redirect(307, "/logout");
+ } else {
+ throw e;
+ }
}
}
diff --git a/src/routes/(app)/admin/+layout.server.ts b/src/routes/(app)/admin/+layout.server.ts
index d4aa181d..a2da1a90 100644
--- a/src/routes/(app)/admin/+layout.server.ts
+++ b/src/routes/(app)/admin/+layout.server.ts
@@ -1,10 +1,16 @@
-import { auth, get } from "$lib/utils";
+import { auth, get, isInvalidTokenError } from "$lib/utils";
import { redirect } from "@sveltejs/kit";
export async function load({ cookies }) {
const token = cookies.get("token");
if (!token) redirect(307, "/login");
- const user = await get("/me", auth(cookies));
+ let user;
+ try {
+ user = await get("/me", auth(cookies));
+ } catch (e) {
+ if (isInvalidTokenError(e)) redirect(307, "/logout");
+ throw e;
+ }
if (!user) redirect(307, "/login");
return { user };
diff --git a/src/routes/(static)/+layout.server.ts b/src/routes/(static)/+layout.server.ts
index c780b5e0..5de752fa 100644
--- a/src/routes/(static)/+layout.server.ts
+++ b/src/routes/(static)/+layout.server.ts
@@ -1,4 +1,5 @@
-import { get, auth } from "$lib/utils";
+import { auth, get, isInvalidTokenError } from "$lib/utils";
+import { redirect } from "@sveltejs/kit";
export async function load({ cookies }) {
const token = cookies.get("token");
@@ -7,7 +8,11 @@ export async function load({ cookies }) {
if (token) {
try {
user = await get("/me", auth(cookies));
- } catch (e) {}
+ } catch (e) {
+ if (isInvalidTokenError(e)) {
+ redirect(307, "/logout");
+ }
+ }
}
return { user };
diff --git a/src/routes/+layout.server.ts b/src/routes/+layout.server.ts
index 584e836c..c1f77695 100644
--- a/src/routes/+layout.server.ts
+++ b/src/routes/+layout.server.ts
@@ -3,7 +3,8 @@ import {
loadTranslations,
locales,
} from "$lib/translations/index";
-import { auth, get, sleep } from "$lib/utils";
+import { auth, get, isInvalidTokenError, sleep } from "$lib/utils";
+import { redirect } from "@sveltejs/kit";
export const load = async ({ cookies, request, url }) => {
const { host, pathname } = url;
@@ -13,8 +14,22 @@ export const load = async ({ cookies, request, url }) => {
try {
user = await get("/me", auth(cookies));
} catch (e) {
- if (e.message.startsWith("Rate")) await sleep(3000);
- user = await get("/me", auth(cookies));
+ const { message } = e as Error;
+ if (message.startsWith("Rate")) {
+ await sleep(3000);
+ try {
+ user = await get("/me", auth(cookies));
+ } catch (retryError) {
+ if (isInvalidTokenError(retryError) && pathname !== "/logout") {
+ redirect(307, "/logout");
+ }
+ throw retryError;
+ }
+ } else if (isInvalidTokenError(e) && pathname !== "/logout") {
+ redirect(307, "/logout");
+ } else {
+ throw e;
+ }
}
}