decentralised message store

feat: websocket connection route

serenity d1054fe6 a2a949c8

Changed files
+62
src
lib
handlers
routes
connect
+53
src/lib/handlers/connect.ts
···
+
import {
+
createNewSession,
+
issuedHandshakes,
+
isValidSession,
+
} from "@/lib/sessions";
+
import type { PreHandler, WsRouteHandler } from "@/lib/types/routes";
+
+
export const connectPreHandler: PreHandler = (req, reply, done) => {
+
const { query } = req;
+
if (!query) return;
+
if (!(typeof query === "object" && "token" in query)) {
+
reply.code(400).send("provide token in query params");
+
return;
+
}
+
+
const sessionToken = query.token as string;
+
+
const sessionInfo = issuedHandshakes.get(sessionToken);
+
if (!sessionInfo) {
+
reply.code(404).send("session token could not resolve to existing session. retry?");
+
return;
+
}
+
+
if (!isValidSession(sessionInfo)) {
+
reply.code(403).send("session token resolved to session, but did not pass verification. this should not happen.");
+
return;
+
}
+
+
+
done();
+
};
+
+
export const connectWsHandler: WsRouteHandler = (socket, req) => {
+
const { query } = req;
+
if (!query) return;
+
if (!(typeof query === "object" && "token" in query)) {
+
socket.close();
+
return;
+
}
+
const sessionToken = query.token as string;
+
+
const sessionInfo = issuedHandshakes.get(sessionToken);
+
if (!sessionInfo) {
+
socket.close();
+
return;
+
}
+
+
const sessionCreateResult = createNewSession({ sessionInfo, socket });
+
if (!sessionCreateResult.ok) {
+
socket.close();
+
return;
+
}
+
};
+7
src/routes/connect/route.ts
···
+
import { connectPreHandler, connectWsHandler } from "@/lib/handlers/connect";
+
import type { WsRoute } from "@/lib/types/routes";
+
+
export const connectRoute: WsRoute = {
+
wsHandler: connectWsHandler,
+
preHandler: connectPreHandler,
+
};
+2
src/routes/index.ts
···
import type { Route, WsRoute } from "@/lib/types/routes";
+
import { connectRoute } from "@/routes/connect/route";
import { didWebDocRoute } from "@/routes/dot-well-known/did-dot-json/route";
import { handshakeRoute } from "@/routes/handshake/route";
import { indexRoute } from "@/routes/route";
···
"/": indexRoute,
"/.well-known/did.json": didWebDocRoute,
"/handshake": handshakeRoute,
+
"/connect": connectRoute,
};