From d56594d3289002566f4653d607f0837befd65109 Mon Sep 17 00:00:00 2001 From: polwex Date: Thu, 15 May 2025 10:13:00 +0700 Subject: wtf man --- src/lib/server/cookie.ts | 47 ++++++++++++++++++++++++++++++++++++++++++ src/lib/server/cookiebridge.ts | 33 +++++++++++++++++++++++++++++ src/lib/server/header.ts | 12 +++++++++++ src/lib/server/setcookie.ts | 25 ++++++++++++++++++++++ 4 files changed, 117 insertions(+) create mode 100644 src/lib/server/cookie.ts create mode 100644 src/lib/server/cookiebridge.ts create mode 100644 src/lib/server/header.ts create mode 100644 src/lib/server/setcookie.ts (limited to 'src/lib/server') diff --git a/src/lib/server/cookie.ts b/src/lib/server/cookie.ts new file mode 100644 index 0000000..fadac9d --- /dev/null +++ b/src/lib/server/cookie.ts @@ -0,0 +1,47 @@ +import { + getCookie, + getSignedCookie, + setCookie, + setSignedCookie, + deleteCookie, +} from "hono/cookie"; +import cookie from "cookie"; +// console.log("db module path:", "@/lib/db"); +// console.log( +// "globalThis.__WAKU_MIDDLEWARE_CONTEXT_STORAGE__:", +// globalThis.__WAKU_MIDDLEWARE_CONTEXT_STORAGE__, +// ); +import db from "../db"; + +import type { Middleware } from "waku/config"; + +// XXX we would probably like to extend config. + +const cookieMiddleware: Middleware = () => { + console.log("cookieMiddleware executed"); + return async (ctx, next) => { + if (ctx.req.url.pathname === "/login") return await next(); + const cookies = cookie.parse(ctx.req.headers.cookie || ""); + console.log({ cookies }); + const coki = cookies.sorlang; + if (!coki) { + ctx.res.status = 301; + ctx.res.headers = { + Location: "/login", + }; + } + if (coki) { + const userRow = db.fetchCookie(coki); + if (userRow) ctx.data.user = { id: userRow.id, name: userRow.name }; + else { + ctx.res.status = 301; + ctx.res.headers = { + Location: "/login", + }; + } + } + await next(); + }; +}; + +export default cookieMiddleware; diff --git a/src/lib/server/cookiebridge.ts b/src/lib/server/cookiebridge.ts new file mode 100644 index 0000000..ca4bd44 --- /dev/null +++ b/src/lib/server/cookiebridge.ts @@ -0,0 +1,33 @@ +import { getContextData } from "waku/middleware/context"; +import { + RequestCookies, + ResponseCookies, + type ResponseCookie, +} from "@edge-runtime/cookies"; +import { mergeSetCookies } from "./setcookie"; + +const cookies = () => { + const ctx = getContextData() as { + headers: Record; + cookies?: ResponseCookie[]; + }; + const headerObj = ctx.headers || {}; + headerObj["set-cookie"] = mergeSetCookies( + headerObj["set-cookie"] || [], + (ctx.cookies || []) as ResponseCookie[], + ); + const headers = new Headers(headerObj as Record); + const reqCookies = new RequestCookies(headers); + const resCookies = new ResponseCookies(headers); + + const getCookie: ResponseCookies["get"] = (...args) => + resCookies.get(...args) || reqCookies.get(...args); + const setCookie: ResponseCookies["set"] = (...args) => { + const updated = resCookies.set(...args); + ctx.cookies = updated.getAll(); + return updated; + }; + return { getCookie, setCookie }; +}; + +export { cookies }; diff --git a/src/lib/server/header.ts b/src/lib/server/header.ts new file mode 100644 index 0000000..33f8792 --- /dev/null +++ b/src/lib/server/header.ts @@ -0,0 +1,12 @@ +// https://github.com/t6adev/waku-auth-middleware-demo/blob/a476ecb3d5caf0c7731a34314450400d4dcc2dac/src/middleware/validateRouting.ts + +import type { Middleware } from "waku/config"; + +const headersMiddleware: Middleware = () => { + return async (ctx, next) => { + ctx.data.headers = ctx.req.headers; + await next(); + }; +}; + +export default headersMiddleware; diff --git a/src/lib/server/setcookie.ts b/src/lib/server/setcookie.ts new file mode 100644 index 0000000..f64b380 --- /dev/null +++ b/src/lib/server/setcookie.ts @@ -0,0 +1,25 @@ +import type { Middleware } from "waku/config"; +import { type ResponseCookie, stringifyCookie } from "@edge-runtime/cookies"; + +export const mergeSetCookies = ( + resSetCookies: string | string[], + cookiesInContext: ResponseCookie[], +) => { + if (typeof resSetCookies === "string") { + resSetCookies = [resSetCookies]; + } + return [...resSetCookies, ...cookiesInContext.map(stringifyCookie)]; +}; + +const setCookieMiddleware: Middleware = () => { + return async (ctx, next) => { + await next(); + ctx.res.headers ||= {}; + ctx.res.headers["set-cookie"] = mergeSetCookies( + ctx.res.headers["set-cookie"] || [], + (ctx.data.cookies || []) as ResponseCookie[], + ); + }; +}; + +export default setCookieMiddleware; -- cgit v1.2.3