bpms_site/.svn/pristine/e6/e6adc71371d853a5bddadae3ba2ec0987d823243.svn-base
2025-11-02 16:38:49 +03:30

118 lines
4.8 KiB
Plaintext

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