import { ResponseCookies } from "../cookies"; import { ReflectAdapter } from "./reflect"; /** * @internal */ export class ReadonlyRequestCookiesError extends Error { constructor(){ super("Cookies can only be modified in a Server Action or Route Handler. Read more: https://nextjs.org/docs/app/api-reference/functions/cookies#cookiessetname-value-options"); } static callable() { throw new ReadonlyRequestCookiesError(); } } export class RequestCookiesAdapter { static seal(cookies) { return new Proxy(cookies, { get (target, prop, receiver) { switch(prop){ case "clear": case "delete": case "set": return ReadonlyRequestCookiesError.callable; default: return ReflectAdapter.get(target, prop, receiver); } } }); } } const SYMBOL_MODIFY_COOKIE_VALUES = Symbol.for("next.mutated.cookies"); export function getModifiedCookieValues(cookies) { const modified = cookies[SYMBOL_MODIFY_COOKIE_VALUES]; if (!modified || !Array.isArray(modified) || modified.length === 0) { return []; } return modified; } export function appendMutableCookies(headers, mutableCookies) { const modifiedCookieValues = getModifiedCookieValues(mutableCookies); if (modifiedCookieValues.length === 0) { return false; } // Return a new response that extends the response with // the modified cookies as fallbacks. `res` cookies // will still take precedence. const resCookies = new ResponseCookies(headers); const returnedCookies = resCookies.getAll(); // Set the modified cookies as fallbacks. for (const cookie of modifiedCookieValues){ resCookies.set(cookie); } // Set the original cookies as the final values. for (const cookie of returnedCookies){ resCookies.set(cookie); } return true; } export class MutableRequestCookiesAdapter { static wrap(cookies, onUpdateCookies) { const responseCookes = new ResponseCookies(new Headers()); for (const cookie of cookies.getAll()){ responseCookes.set(cookie); } let modifiedValues = []; const modifiedCookies = new Set(); const updateResponseCookies = ()=>{ var _fetch___nextGetStaticStore; // TODO-APP: change method of getting staticGenerationAsyncStore const staticGenerationAsyncStore = fetch.__nextGetStaticStore == null ? void 0 : (_fetch___nextGetStaticStore = fetch.__nextGetStaticStore.call(fetch)) == null ? void 0 : _fetch___nextGetStaticStore.getStore(); if (staticGenerationAsyncStore) { staticGenerationAsyncStore.pathWasRevalidated = true; } const allCookies = responseCookes.getAll(); modifiedValues = allCookies.filter((c)=>modifiedCookies.has(c.name)); if (onUpdateCookies) { const serializedCookies = []; for (const cookie of modifiedValues){ const tempCookies = new ResponseCookies(new Headers()); tempCookies.set(cookie); serializedCookies.push(tempCookies.toString()); } onUpdateCookies(serializedCookies); } }; return new Proxy(responseCookes, { get (target, prop, receiver) { switch(prop){ // A special symbol to get the modified cookie values case SYMBOL_MODIFY_COOKIE_VALUES: return modifiedValues; // TODO: Throw error if trying to set a cookie after the response // headers have been set. case "delete": return function(...args) { modifiedCookies.add(typeof args[0] === "string" ? args[0] : args[0].name); try { target.delete(...args); } finally{ updateResponseCookies(); } }; case "set": return function(...args) { modifiedCookies.add(typeof args[0] === "string" ? args[0] : args[0].name); try { return target.set(...args); } finally{ updateResponseCookies(); } }; default: return ReflectAdapter.get(target, prop, receiver); } } }); } } //# sourceMappingURL=request-cookies.js.map