102 lines
2.4 KiB
TypeScript
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}`);
|