cookie and pwa stuff
This commit is contained in:
@@ -46,7 +46,7 @@ class Logger {
|
||||
constructor(context?: string, options: LoggerOptions = {}) {
|
||||
this.context = context;
|
||||
this.options = {
|
||||
enabled: import.meta.env.NODE_ENV !== "production",
|
||||
enabled: true,
|
||||
showTimestamp: true,
|
||||
collapsed: true,
|
||||
colors: true,
|
||||
@@ -75,27 +75,44 @@ class Logger {
|
||||
|
||||
const groupLabel = `${timestamp}${style.label}${context} │ ${label}`;
|
||||
|
||||
const group = this.options.collapsed
|
||||
? console.groupCollapsed
|
||||
: console.group;
|
||||
// In server environment (no window), use simple console.log instead of groups
|
||||
const isServer = typeof window === "undefined";
|
||||
|
||||
if (this.options.colors && typeof window !== "undefined") {
|
||||
group(`%c${groupLabel}`, `color: ${style.color}; font-weight: bold;`);
|
||||
} else {
|
||||
group(groupLabel);
|
||||
}
|
||||
|
||||
if (data !== undefined) {
|
||||
console.log(data);
|
||||
}
|
||||
|
||||
if (rest.length > 0) {
|
||||
for (const item of rest) {
|
||||
console.log(item);
|
||||
if (isServer) {
|
||||
// Server-side: Simple formatted output (no console.group in Node.js)
|
||||
console.log(groupLabel);
|
||||
if (data !== undefined) {
|
||||
console.log(JSON.stringify(data, null, 2));
|
||||
}
|
||||
}
|
||||
if (rest.length > 0) {
|
||||
for (const item of rest) {
|
||||
console.log(JSON.stringify(item, null, 2));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Browser: Use console.group with colors
|
||||
const group = this.options.collapsed
|
||||
? console.groupCollapsed
|
||||
: console.group;
|
||||
|
||||
console.groupEnd();
|
||||
if (this.options.colors) {
|
||||
group(`%c${groupLabel}`, `color: ${style.color}; font-weight: bold;`);
|
||||
} else {
|
||||
group(groupLabel);
|
||||
}
|
||||
|
||||
if (data !== undefined) {
|
||||
console.log(data);
|
||||
}
|
||||
|
||||
if (rest.length > 0) {
|
||||
for (const item of rest) {
|
||||
console.log(item);
|
||||
}
|
||||
}
|
||||
|
||||
console.groupEnd();
|
||||
}
|
||||
}
|
||||
|
||||
info(label: string, data?: any, ...rest: any[]): void {
|
||||
|
||||
@@ -5,6 +5,40 @@ import SuperTokens from "supertokens-node";
|
||||
|
||||
export async function getSessionForStart(request: Request, options?: { sessionRequired?: boolean }) {
|
||||
ensureSuperTokensBackend();
|
||||
|
||||
const cookieHeader = request.headers.get('cookie');
|
||||
if (cookieHeader) {
|
||||
const tokens = cookieHeader.match(/sAccessToken=([^;]+)/g);
|
||||
if (tokens && tokens.length > 1) {
|
||||
logger.warn(`Detected ${tokens.length} duplicate sAccessToken cookies, cleaning up`);
|
||||
|
||||
const parsedTokens = tokens.map(tokenStr => {
|
||||
const token = tokenStr.replace('sAccessToken=', '');
|
||||
try {
|
||||
const payload = JSON.parse(Buffer.from(token.split('.')[1], 'base64').toString());
|
||||
return { token, exp: payload.exp, iat: payload.iat };
|
||||
} catch (e) {
|
||||
logger.error('Failed to parse token', e);
|
||||
return { token, exp: 0, iat: 0 };
|
||||
}
|
||||
});
|
||||
|
||||
parsedTokens.sort((a, b) => b.exp - a.exp);
|
||||
const freshestToken = parsedTokens[0];
|
||||
|
||||
logger.info(`Using freshest token: exp=${freshestToken.exp}, iat=${freshestToken.iat}`);
|
||||
|
||||
const cleanedCookie = cookieHeader
|
||||
.split(';')
|
||||
.filter(c => !c.trim().startsWith('sAccessToken='))
|
||||
.join(';') + `; sAccessToken=${freshestToken.token}`;
|
||||
|
||||
const cleanedHeaders = new Headers(request.headers);
|
||||
cleanedHeaders.set('cookie', cleanedCookie);
|
||||
request = new Request(request, { headers: cleanedHeaders });
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
const session = await getSessionForSSR(request);
|
||||
|
||||
|
||||
@@ -25,6 +25,7 @@ export const backendConfig = (): TypeInput => {
|
||||
cookieSameSite: "lax",
|
||||
cookieSecure: process.env.NODE_ENV === "production",
|
||||
cookieDomain: process.env.COOKIE_DOMAIN || undefined,
|
||||
olderCookieDomain: undefined,
|
||||
antiCsrf: process.env.NODE_ENV === "production" ? "VIA_TOKEN" : "NONE",
|
||||
|
||||
// Debug only
|
||||
|
||||
Reference in New Issue
Block a user