60 lines
1.2 KiB
JavaScript
60 lines
1.2 KiB
JavaScript
import { randomBytes } from "node:crypto";
|
|
|
|
const sessions = new Map();
|
|
|
|
export function createSession(data) {
|
|
const id = randomBytes(24).toString("hex");
|
|
sessions.set(id, {
|
|
...data,
|
|
createdAt: Date.now(),
|
|
});
|
|
return id;
|
|
}
|
|
|
|
export function getSession(id) {
|
|
if (!id) return undefined;
|
|
return sessions.get(id);
|
|
}
|
|
|
|
export function updateSession(id, data) {
|
|
if (!id || !sessions.has(id)) return undefined;
|
|
const nextSession = {
|
|
...sessions.get(id),
|
|
...data,
|
|
};
|
|
sessions.set(id, nextSession);
|
|
return nextSession;
|
|
}
|
|
|
|
export function deleteSession(id) {
|
|
if (!id) return;
|
|
sessions.delete(id);
|
|
}
|
|
|
|
export function parseCookies(cookieHeader = "") {
|
|
return Object.fromEntries(
|
|
cookieHeader
|
|
.split(";")
|
|
.map((item) => item.trim())
|
|
.filter(Boolean)
|
|
.map((item) => {
|
|
const index = item.indexOf("=");
|
|
return [item.slice(0, index), decodeURIComponent(item.slice(index + 1))];
|
|
}),
|
|
);
|
|
}
|
|
|
|
export function sessionCookie(id) {
|
|
return [
|
|
`vpc_session=${encodeURIComponent(id)}`,
|
|
"Path=/",
|
|
"HttpOnly",
|
|
"SameSite=Lax",
|
|
"Max-Age=2592000",
|
|
].join("; ");
|
|
}
|
|
|
|
export function clearSessionCookie() {
|
|
return "vpc_session=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0";
|
|
}
|