decentralised message store

refactor!: remember channels per session

serenity 05440ebb 6f74d9a3

Changed files
+23 -6
src
lib
+8 -2
src/lib/handlers/handshake.ts
···
});
}
-
const { interServiceJwt } = handshakeData;
+
const { interServiceJwt, channelAtUris: channelAtUriStrings } =
+
handshakeData;
+
const allowedChannels = channelAtUriStrings.map((channel) => {
+
const res = stringToAtUri(channel);
+
if (!res.ok) return;
+
return res.data;
+
});
const verifyJwtResult = await verifyServiceJwt(interServiceJwt);
if (!verifyJwtResult.ok) {
···
// yipee, it's a valid request :3
-
const sessionInfo = issueNewHandshakeToken();
+
const sessionInfo = issueNewHandshakeToken(allowedChannels);
return newSuccessResponse({ sessionInfo });
};
+15 -4
src/lib/sessions.ts
···
import { SESSIONS_SECRET } from "@/lib/utils/crypto";
import { z } from "zod";
import type { Result } from "@/lib/utils/result";
+
import type { AtUri } from "@/lib/types/atproto";
+
import { atUriSchema } from "@/lib/types/atproto";
export const sessionInfoSchema = z.object({
id: z.string(),
token: z.string(),
fingerprint: z.string(),
+
allowedChannels: z.array(atUriSchema),
});
export type SessionInfo = z.infer<typeof sessionInfoSchema>;
···
return crypto.randomUUID();
};
-
export const generateSessionInfo = (sessionId: string): SessionInfo => {
+
export const generateSessionInfo = (
+
sessionId: string,
+
allowedChannels: Array<AtUri>,
+
): SessionInfo => {
const token = crypto.randomBytes(32).toString("base64url");
const hmac = crypto.createHmac("sha256", SESSIONS_SECRET);
hmac.update(`${token}:${sessionId}`);
const fingerprint = hmac.digest("hex");
-
return { id: sessionId, token, fingerprint };
+
return { id: sessionId, token, fingerprint, allowedChannels };
};
export const verifyHandshakeToken = ({
···
export const issuedHandshakes = new Map<string, SessionInfo>();
-
export const issueNewHandshakeToken = () => {
+
export const issueNewHandshakeToken = (
+
allowedChannels: Array<AtUri | undefined>,
+
) => {
+
const filteredChannels = allowedChannels.filter(
+
(channels) => channels !== undefined,
+
);
const sessionId = generateSessionId();
-
const sessionInfo = generateSessionInfo(sessionId);
+
const sessionInfo = generateSessionInfo(sessionId, filteredChannels);
issuedHandshakes.set(sessionInfo.id, sessionInfo);
return sessionInfo;
};