Skip to content

Commit cabc10f

Browse files
committed
add caching
1 parent 890fbe2 commit cabc10f

File tree

1 file changed

+66
-63
lines changed

1 file changed

+66
-63
lines changed

src/hooks.server.ts

Lines changed: 66 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -3,80 +3,83 @@ import { auth } from '$lib/server/auth';
33
import { prisma } from '$lib/server/prisma';
44
import { error, type Handle } from '@sveltejs/kit';
55

6+
const API_CACHE_CONTROL = 'private, no-store, max-age=0, must-revalidate';
7+
68
export const handle: Handle = async ({ event, resolve }) => {
7-
const sessionId = event.cookies.get("session_token");
8-
if (!sessionId) {
9-
event.locals.user = null;
10-
event.locals.session = null;
11-
return resolve(event);
12-
}
9+
const sessionId = event.cookies.get('session_token');
1310

14-
const {session, user, role} = await auth.validateSession(sessionId);
15-
if (session == null || user == null) {
16-
event.cookies.set("session_token", "", {
17-
path: '/',
18-
httpOnly: true,
19-
secure: true,
20-
sameSite: 'lax',
21-
expires: new Date(0)
22-
});
23-
event.locals.user = null;
24-
event.locals.session = null;
25-
event.locals.role = null;
26-
return resolve(event);
27-
}
11+
event.locals.user = null;
12+
event.locals.session = null;
13+
event.locals.role = null;
2814

29-
if(session != null && user != null){
30-
try{
31-
const now = new Date();
32-
// Throttle session writes to avoid update conflicts on concurrent requests.
33-
const minSessionAgeMs = 30_000;
34-
const sessionCutoff = new Date(now.getTime() - minSessionAgeMs);
35-
await prisma.session.updateMany({
36-
where:{
37-
id: session.id,
38-
OR: [
39-
{ last_use: { lt: sessionCutoff } },
40-
{ last_use: null }
41-
]
42-
},
43-
data: {
44-
last_use: now,
45-
ip: event.getClientAddress()
46-
}
47-
});
48-
// Avoid hammering the user row on every request and reduce update conflicts.
49-
const minPingAgeMs = 60_000;
50-
const cutoff = new Date(now.getTime() - minPingAgeMs);
51-
await prisma.user.updateMany({
52-
where: {
53-
username: user.username,
54-
lastPing: { lt: cutoff }
55-
},
56-
data: {
57-
lastPing: now,
58-
}
15+
if (sessionId) {
16+
const { session, user, role } = await auth.validateSession(sessionId);
17+
18+
if (!session || !user) {
19+
event.cookies.set('session_token', '', {
20+
path: '/',
21+
httpOnly: true,
22+
secure: true,
23+
sameSite: 'lax',
24+
expires: new Date(0)
5925
});
60-
}catch(error_message){
61-
if (error_message instanceof Error) {
62-
console.log(error_message)
63-
if(error_message.name != "PrismaClientUnknownRequestError"){
26+
} else {
27+
try {
28+
const now = new Date();
29+
// Throttle session writes to avoid update conflicts on concurrent requests.
30+
const minSessionAgeMs = 30_000;
31+
const sessionCutoff = new Date(now.getTime() - minSessionAgeMs);
32+
await prisma.session.updateMany({
33+
where: {
34+
id: session.id,
35+
OR: [
36+
{ last_use: { lt: sessionCutoff } },
37+
{ last_use: null }
38+
]
39+
},
40+
data: {
41+
last_use: now,
42+
ip: event.getClientAddress()
43+
}
44+
});
45+
// Avoid hammering the user row on every request and reduce update conflicts.
46+
const minPingAgeMs = 60_000;
47+
const cutoff = new Date(now.getTime() - minPingAgeMs);
48+
await prisma.user.updateMany({
49+
where: {
50+
username: user.username,
51+
lastPing: { lt: cutoff }
52+
},
53+
data: {
54+
lastPing: now
55+
}
56+
});
57+
} catch (error_message) {
58+
if (error_message instanceof Error) {
59+
console.log(error_message);
60+
if (error_message.name != 'PrismaClientUnknownRequestError') {
61+
error(500, {
62+
message: 'ERROR'
63+
});
64+
}
65+
} else {
6466
error(500, {
6567
message: 'ERROR'
6668
});
6769
}
68-
} else {
69-
error(500, {
70-
message: 'ERROR'
71-
});
7270
}
71+
72+
event.locals.user = user;
73+
event.locals.session = session;
74+
event.locals.role = role;
7375
}
7476
}
7577

78+
const response = await resolve(event);
7679

80+
if (event.url.pathname.startsWith('/api')) {
81+
response.headers.set('cache-control', API_CACHE_CONTROL);
82+
}
7783

78-
event.locals.user = user;
79-
event.locals.session = session;
80-
event.locals.role = role;
81-
return resolve(event);
82-
}
84+
return response;
85+
};

0 commit comments

Comments
 (0)