somod-chat-service
Version:
Serverless Chat Service from SOMOD
69 lines (68 loc) • 2.96 kB
JavaScript
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;
};