summaryrefslogtreecommitdiff
path: root/src/lib/server
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/server')
-rw-r--r--src/lib/server/cookie.ts47
-rw-r--r--src/lib/server/cookiebridge.ts33
-rw-r--r--src/lib/server/header.ts12
-rw-r--r--src/lib/server/setcookie.ts25
4 files changed, 117 insertions, 0 deletions
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<string, string | string[]>;
+ cookies?: ResponseCookie[];
+ };
+ const headerObj = ctx.headers || {};
+ headerObj["set-cookie"] = mergeSetCookies(
+ headerObj["set-cookie"] || [],
+ (ctx.cookies || []) as ResponseCookie[],
+ );
+ const headers = new Headers(headerObj as Record<string, string>);
+ 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;