Skip to content

feat: add configurable session cookie expiry via KINDE_SESSION_MAX_AGE #85

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/lib/hooks/sessionHooks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ export async function sessionHooks({ event }: { event: EventHandler }) {
secure: process.env.NODE_ENV === "production",
sameSite: "lax",
httpOnly: true,
maxAge: 29 * 24 * 60 * 60,
maxAge: +(process.env.KINDE_SESSION_MAX_AGE ?? '') || 29 * 24 * 60 * 60,
},
);
};
Expand Down
126 changes: 100 additions & 26 deletions src/tests/hooks.spec.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { sessionHooks } from "$lib/index.js";
import { describe, it, expect, vi } from "vitest";
import { describe, it, expect, vi, afterEach } from "vitest";

describe("sessionHooks", () => {
it("should add setSessionItem and getSessionItem methods to event.request", async () => {
Expand Down Expand Up @@ -155,33 +155,107 @@ describe("sessionHooks", () => {
expect(retrievedValue2).toBeUndefined();
});

it("should set cookies with 29-day expiry", async () => {
// Arrange
const event = {
request: {},
cookies: {
set: vi.fn(),
get: vi.fn(),
},
};
describe("cookie maxAge configuration", () => {
const originalEnv = process.env.KINDE_SESSION_MAX_AGE;

await sessionHooks({ event });
afterEach(() => {
if (originalEnv !== undefined) {
process.env.KINDE_SESSION_MAX_AGE = originalEnv;
} else {
delete process.env.KINDE_SESSION_MAX_AGE;
}
});

// Act
await event.request.setSessionItem("testKey", "testValue");
it("should use default 29 days when KINDE_SESSION_MAX_AGE is not set", async () => {
delete process.env.KINDE_SESSION_MAX_AGE;

// Assert
expect(event.cookies.set).toHaveBeenCalledWith(
"kinde_testKey",
"testValue",
expect.objectContaining({
maxAge: 29 * 24 * 60 * 60,
domain: process.env.KINDE_COOKIE_DOMAIN,
path: "/",
secure: process.env.NODE_ENV === "production",
sameSite: "lax",
httpOnly: true,
}),
);
const event = {
request: {},
cookies: {
set: vi.fn(),
get: vi.fn(),
},
};

await sessionHooks({ event });
await event.request.setSessionItem("testKey", "testValue");

expect(event.cookies.set).toHaveBeenCalledWith(
"kinde_testKey",
"testValue",
expect.objectContaining({
maxAge: 29 * 24 * 60 * 60,
}),
);
});

it("should use custom maxAge when KINDE_SESSION_MAX_AGE is set", async () => {
process.env.KINDE_SESSION_MAX_AGE = "3600"; // 1 hour

const event = {
request: {},
cookies: {
set: vi.fn(),
get: vi.fn(),
},
};

await sessionHooks({ event });
await event.request.setSessionItem("testKey", "testValue");

expect(event.cookies.set).toHaveBeenCalledWith(
"kinde_testKey",
"testValue",
expect.objectContaining({
maxAge: 3600,
}),
);
});

it("should fallback to default when KINDE_SESSION_MAX_AGE is zero", async () => {
process.env.KINDE_SESSION_MAX_AGE = "0";

const event = {
request: {},
cookies: {
set: vi.fn(),
get: vi.fn(),
},
};

await sessionHooks({ event });
await event.request.setSessionItem("testKey", "testValue");

expect(event.cookies.set).toHaveBeenCalledWith(
"kinde_testKey",
"testValue",
expect.objectContaining({
maxAge: 29 * 24 * 60 * 60,
}),
);
});

it("should fallback to default when KINDE_SESSION_MAX_AGE is invalid", async () => {
process.env.KINDE_SESSION_MAX_AGE = "invalid";

const event = {
request: {},
cookies: {
set: vi.fn(),
get: vi.fn(),
},
};

await sessionHooks({ event });
await event.request.setSessionItem("testKey", "testValue");

expect(event.cookies.set).toHaveBeenCalledWith(
"kinde_testKey",
"testValue",
expect.objectContaining({
maxAge: 29 * 24 * 60 * 60,
}),
);
});
});
});
Loading