···
import * as crypto from "node:crypto";
import { SESSIONS_SECRET } from "@/lib/utils/crypto";
5
+
import type { Result } from "@/lib/utils/result";
export const sessionInfoSchema = z.object({
···
export type SessionInfo = z.infer<typeof sessionInfoSchema>;
13
-
export type Session = Map<string, WebSocket>;
15
-
export const sessions: Session = new Map<string, WebSocket>();
export const generateSessionId = () => {
return crypto.randomUUID();
···
return { id: sessionId, token, fingerprint };
31
-
export const verifySessionToken = ({
28
+
export const verifyHandshakeToken = ({
···
50
-
export const assignSessionTo = ({
47
+
export const issuedHandshakes = new Set<SessionInfo>();
49
+
export const issueNewHandshakeToken = () => {
50
+
const sessionId = generateSessionId();
51
+
const sessionInfo = generateSessionInfo(sessionId);
52
+
issuedHandshakes.add(sessionInfo);
55
+
export const activeSessions = new Map<string, WebSocket>();
57
+
export const createNewSession = ({
sessionInfo: SessionInfo;
63
+
}): Result<undefined, undefined> => {
64
+
const isValidSession = verifyHandshakeToken(sessionInfo);
65
+
if (!isValidSession) return { ok: false };
58
-
const sessionId = sessionInfo.id;
59
-
sessions.set(sessionId, socket);
60
-
return { ok: true };
61
-
} catch (err: unknown) {
62
-
return { ok: false, err };
68
+
issuedHandshakes.delete(sessionInfo);
70
+
return { ok: false };
72
+
activeSessions.set(sessionInfo.id, socket);
73
+
return { ok: true };
66
-
export const dropSession = (sessionId: string) => {
76
+
export const deleteSession = (
77
+
sessionInfo: SessionInfo,
78
+
): Result<undefined, undefined> => {
79
+
if (!activeSessions.has(sessionInfo.id)) return { ok: false };
68
-
if (!sessions.has(sessionId))
72
-
`Could not find a session socket for id ${sessionId} `,
75
-
const session = sessions.get(sessionId);
80
-
"`sessionId` key exists, but could not get the session socket for some reason?",
84
-
sessions.delete(sessionId);
85
-
return { ok: true };
86
-
} catch (err: unknown) {
87
-
return { ok: false, err };
81
+
activeSessions.delete(sessionInfo.id);
83
+
return { ok: false };
85
+
return { ok: true };