detached d5464c3

refactor(session): Extend session expiry and add renewal threshold

- Increase session expiry from 24 hours to 7 days
- Add a 1-day threshold for session renewal when user status is online
- Prevent unnecessary session token regeneration if session has sufficient remaining time
commit
d5464c368263df358f66e4e5294813a1ac8d369f
author
Kit · · 2025-02-19 06:51 UTC
parent
334edb8
signature
SSH UnverifiedSHA256:H91DFuEG4jpk5edzLA4aUKkpv4zv9Q339ipRmkph6Tk The key is unknown
2 files · +13 -9
M src/lib/api/session.server.ts +1 -1
@@ -54,7 +54,7 @@ export async function createSession(token: string, userId: string): Promise<Sess
5454 log.debug("Creating session", { userId });
5555 const sessionId = await sha256(token);
5656 const createdAt = Date.now();
57- const expiresAt = createdAt + 24 * 60 * 60 * 1000; // 24 hours expiry
57+ const expiresAt = createdAt + 7 * 24 * 60 * 60 * 1000; // 7 days expiry
5858 await db.insert(sessions).values({
5959 id: sessionId,
6060 userId,
@@ -54,7 +54,7 @@ export async function createSession(token: string, userId: string): Promise<Sess
54 log.debug("Creating session", { userId });54 log.debug("Creating session", { userId });
55 const sessionId = await sha256(token);55 const sessionId = await sha256(token);
56 const createdAt = Date.now();56 const createdAt = Date.now();
57- const expiresAt = createdAt + 24 * 60 * 60 * 1000; // 24 hours expiry57+ const expiresAt = createdAt + 7 * 24 * 60 * 60 * 1000; // 7 days expiry
58 await db.insert(sessions).values({58 await db.insert(sessions).values({
59 id: sessionId,59 id: sessionId,
60 userId,60 userId,
M src/routes/api/status/+server.ts +12 -8
@@ -47,19 +47,23 @@ export const POST: RequestHandler = async ({ request, cookies, locals }) => {
4747 .get();
4848 log.debug('Database updated successfully', { userId: maskedUserId, status });
4949
50- // Renew session if status is online
50+ // Renew session if status is online and session expires in less than 1 day
5151 if (status === 'online') {
5252 const token = cookies.get('session');
5353 if (token) {
5454 const result = await validateSessionToken(token);
5555 if (result.session) {
56- const newToken = generateSessionToken();
57- const newSession = await createSession(newToken, userId);
58- setSessionTokenCookie({ cookies }, newToken, newSession.expiresAt);
59- log.info('Session renewed', {
60- userId: maskedUserId,
61- expiresAt: new Date(newSession.expiresAt).toISOString()
62- });
56+ const remaining = result.session.expiresAt - now;
57+ const threshold = 24 * 60 * 60 * 1000; // 1 day in milliseconds
58+ if (remaining < threshold) {
59+ const newToken = generateSessionToken();
60+ const newSession = await createSession(newToken, userId);
61+ setSessionTokenCookie({ cookies }, newToken, newSession.expiresAt);
62+ log.info('Session renewed', {
63+ userId: maskedUserId,
64+ expiresAt: new Date(newSession.expiresAt).toISOString()
65+ });
66+ }
6367 }
6468 }
6569 }
@@ -47,19 +47,23 @@ export const POST: RequestHandler = async ({ request, cookies, locals }) => {
47 .get();47 .get();
48 log.debug('Database updated successfully', { userId: maskedUserId, status });48 log.debug('Database updated successfully', { userId: maskedUserId, status });
49 49
50- // Renew session if status is online50+ // Renew session if status is online and session expires in less than 1 day
51 if (status === 'online') {51 if (status === 'online') {
52 const token = cookies.get('session');52 const token = cookies.get('session');
53 if (token) {53 if (token) {
54 const result = await validateSessionToken(token);54 const result = await validateSessionToken(token);
55 if (result.session) {55 if (result.session) {
56- const newToken = generateSessionToken();56+ const remaining = result.session.expiresAt - now;
57- const newSession = await createSession(newToken, userId);57+ const threshold = 24 * 60 * 60 * 1000; // 1 day in milliseconds
58- setSessionTokenCookie({ cookies }, newToken, newSession.expiresAt);58+ if (remaining < threshold) {
59- log.info('Session renewed', { 59+ const newToken = generateSessionToken();
60- userId: maskedUserId, 60+ const newSession = await createSession(newToken, userId);
61- expiresAt: new Date(newSession.expiresAt).toISOString() 61+ setSessionTokenCookie({ cookies }, newToken, newSession.expiresAt);
62- });62+ log.info('Session renewed', {
63+ userId: maskedUserId,
64+ expiresAt: new Date(newSession.expiresAt).toISOString()
65+ });
66+ }
63 }67 }
64 }68 }
65 }69 }

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 3

Tags 8

↑↓ moveenter openesc close