import { defineGraphqlServerOptions } from "nuxt-graphql-middleware/server-options"; import { jwtDecode } from "jwt-decode"; import type { LoginRootMutation, SwitchToRootMutation } from "#graphql-operations"; interface DecodedToken { exp: number; } async function refreshAuthToken(refreshToken: string): Promise { const refreshResponse = await useGraphqlMutation("refreshJwtAuthToken", { refreshToken }); return refreshResponse.data?.refreshJwtAuthToken?.authToken || null; } export default defineGraphqlServerOptions({ async serverFetchOptions(event) { const headers = { Cookie: getRequestHeader(event, "cookie") || "", }; const session = await getUserSession(event); if (!session?.secure?.authToken) return { headers }; const decoded = jwtDecode(session.secure.authToken); const isExpired = decoded.exp * 1000 < Date.now(); if (isExpired) { const newToken = await refreshAuthToken(session.secure.refreshToken); if (newToken) { session.secure.authToken = newToken; await setUserSession(event, session); } } return { headers: { ...headers, Authorization: `Bearer ${session.secure.authToken}` } }; }, async onServerResponse(event, response, _operation, operationName) { switch (operationName) { case "login": await handleLogin(event, response._data!.data as LoginRootMutation); break; case "switchTo": await handleSwitchTo(event, response._data!.data as SwitchToRootMutation); break; } return response._data!; }, });