import { HttpStatusCodes } from './constants.ts' import { errors } from 'jose' import type { LoginDto, WebSocketCtx, WebSocketData } from './types/types.ts' import { createAccessToken, verifyAccessToken } from './utils/jwt.ts' import { config } from './config.ts' import { messageService } from './grpc/message.ts' export const handlers = { async getVersion() { try { const res = await messageService.getVersion() return Response.json(res) } catch (error) { return Response.json({ message: 'Error' }, { status: HttpStatusCodes.BAD_REQUEST }) } }, async login(req: Request) { try { const body: LoginDto = await req.json() const { email } = body if (!email) return Response.json({ message: 'email required' }, { status: HttpStatusCodes.BAD_REQUEST }) const userResponse = await messageService.getUserByEmail({ email: body.email }) const user = userResponse.data if (!user) return Response.json({ message: 'Invalid email or password' }, { status: HttpStatusCodes.NOT_FOUND }) const accessToken = await createAccessToken(user.id, user.email) const expires = new Date(Date.now() + config.cookieExpiry * 1000) return Response.json( { accessToken: accessToken.token, tokenType: 'Bearer', expires: expires, }, { status: HttpStatusCodes.CREATED }, ) } catch (error) { console.log({ error }) return Response.json({ message: 'Login failed' }, { status: HttpStatusCodes.BAD_REQUEST }) } }, } export async function upgrade(req: Request, server: Bun.Server) { const payload = await checkRequest(req) if (!payload) return new Response('Invalid token', { status: HttpStatusCodes.NOT_FOUND }) const success = server.upgrade(req, { data: { userId: +payload.sub, email: payload.email } }) if (success) return undefined return new Response('Upgrade failed', { status: HttpStatusCodes.BAD_REQUEST }) } async function checkRequest(req: Request) { try { const url = new URL(req.url) const token = url.searchParams.get('token') if (!token) return null return await verifyAccessToken(token) } catch (error) { if (error instanceof errors.JWTInvalid) { console.log('invalid') } if (error instanceof errors.JWTExpired) { console.log('expired') } return null } }