import { createMiddleware } from "@tanstack/react-start" import { getCookie, setCookie } from "@tanstack/react-start/server" import { normalizeWooSessionToken, WOO_SESSION_COOKIE, WOO_SESSION_MAX_AGE, } from "@wp-reactor/commerce" import { ssrForwardedHeaders } from "@wp-reactor/headless-core" import { GraphQLClient } from "graphql-request" import { runtimeEnv } from "../env" import { authMiddleware } from "./authMiddleware" /** * Coque (Option B) : construit le client GraphQL panier — Bearer si connecté, * sinon token woo-session invité (et réécrit le token roté dans le cookie). Le * contexte est consommé par `createCartHandlers` (@wp-reactor/commerce). */ export const cartMiddleware = createMiddleware() .middleware([authMiddleware]) .server(async ({ next, context }) => { const headers: Record = ssrForwardedHeaders(runtimeEnv) const isGuest = !context.authToken const wooSessionToken = isGuest ? getCookie(WOO_SESSION_COOKIE) : null if (context.authToken) { headers.Authorization = `Bearer ${context.authToken}` } else if (wooSessionToken) { headers["woocommerce-session"] = `Session ${wooSessionToken}` } const graphqlClient = new GraphQLClient(runtimeEnv.endpoint, { credentials: "omit", headers, responseMiddleware: (response) => { if (!isGuest) return if (response instanceof Error) return const rotated = response.headers?.get?.("woocommerce-session") if (!rotated) return const normalized = normalizeWooSessionToken(rotated) if (!normalized) return setCookie(WOO_SESSION_COOKIE, normalized, { httpOnly: true, secure: process.env.NODE_ENV === "production", sameSite: "lax", path: "/", maxAge: WOO_SESSION_MAX_AGE, }) }, }) return next({ context: { graphqlClient, isAuthenticated: context.isAuthenticated, hasWooSession: !!wooSessionToken, }, }) })