amati/server/socket.ts
2024-02-19 23:26:30 +07:00

102 lines
2.4 KiB
TypeScript

import getUserFromToken from "@/modules/auth/utils/getUserFromToken";
import { User } from "@prisma/client";
import prisma from "@/core/db";
import Bun from "bun";
const intents = {
listenMyWaitingLinkRequest: "listenMyWaitingLinkRequest",
} as const;
const waitingLinkRequestConnections: Map<
string,
Bun.ServerWebSocket<{
channel: string;
user: User;
intent: string;
}>
> = new Map();
export const server = Bun.serve<{
channel: string;
user: User;
intent: string;
}>({
async fetch(req, server) {
const url = new URL(req.url);
req.headers.getSetCookie();
const pathname = url.pathname;
const cookies = req.headers.get("Cookie");
// Extract the Authorization header
const authHeader = req.headers.get("Authorization");
const token = authHeader?.startsWith("Bearer ")
? authHeader.substring(7, authHeader.length)
: null;
const user = token ? await getUserFromToken(token) : null;
const intent = pathname.substring(1);
switch (intent) {
case `/${intents.listenMyWaitingLinkRequest}`: {
if (!user) {
return new Response("Unauthorized", { status: 401 });
}
const channel = `mwrl-${user.id}`;
const success = server.upgrade(req, {
data: { user, channel, intent },
});
if (success) return undefined;
break;
}
default: {
return new Response("");
}
}
},
websocket: {
async open(ws) {
switch (ws.data.intent) {
case intents.listenMyWaitingLinkRequest: {
ws.subscribe(ws.data.channel);
//retrieve user's link requests with status of waiting
const result = await prisma.office365LinkRequest.findMany({
where: {
createdBy: ws.data.user.id,
status: "WAITING",
},
select: {
id: true,
},
});
server.publish(ws.data.channel, JSON.stringify(result));
waitingLinkRequestConnections.set(ws.data.channel, ws);
}
}
},
message(ws, message) {
// the server re-broadcasts incoming messages to everyone
// server.publish("the-group-chat", `: ${message}`);
},
close(ws) {
// const msg = ` has left the chat`;
// server.publish("the-group-chat", msg);
// ws.unsubscribe("the-group-chat");
switch (ws.data.intent) {
case intents.listenMyWaitingLinkRequest: {
ws.unsubscribe(ws.data.channel);
waitingLinkRequestConnections.delete(ws.data.channel);
}
}
},
},
port: 3001,
});
console.log(`Listening on ${server.hostname}:${server.port}`);