UNPKG

somod-chat-service

Version:

Serverless Chat Service from SOMOD

69 lines (68 loc) 2.96 kB
import { verify } from "jsonwebtoken"; import { sessionRequirement } from "./types"; import { threadCache } from "./threadCache"; const sessionJwtSecret = process.env.SESSION_SECRET ?? ""; const sessionForce = process.env.SESSION_FORCE ?? ""; export const Error = { required: "missing required field: sessionToken", invalid: "invalid field: sessionToken" }; export const handleSessionToken = async (userId, threadId, type, action, sessionToken) => { const result = { sessionId: "" }; if (sessionJwtSecret) { if (!sessionToken) { const isSessionRequiredForThisTypeAction = sessionRequirement[type]?.[action]; if (isSessionRequiredForThisTypeAction !== undefined) { const oneDay = Date.now() + 1000 * 60 * 60 * 24; // 1 day if (isSessionRequiredForThisTypeAction === "always") { result.error = Error.required; result.sessionRequiredTill = oneDay; } else if (isSessionRequiredForThisTypeAction === "thread") { if (sessionForce == "true") { result.error = Error.required; result.sessionRequiredTill = oneDay; } else { const thread = await threadCache.get(threadId, -1); // ttl = -1 will force the cache to fetch from db const sessionRequired = Object.fromEntries(thread?.sessionRequired?.map((userId, index) => [ userId, thread?.sessionRequiredTill?.[index] ?? oneDay ]) ?? []); if (sessionRequired[userId] !== undefined && Date.now() < sessionRequired[userId]) { result.error = Error.required; result.sessionRequiredTill = sessionRequired[userId]; } } } } } else { try { const session = verify(sessionToken, sessionJwtSecret + "", { algorithms: ["HS512"], ignoreExpiration: true }); const now = Date.now(); if (session.participants.includes(userId) && session.startTime <= now && now <= session.endTime) { result.sessionId = session.id; } else { result.error = Error.invalid; } } catch (err) { // eslint-disable-next-line no-console console.error("session token verification failed. userId=" + userId + ", error=" + err); result.error = Error.invalid; } } } return result; };