Files
socket-service/src/handles.ts
2026-03-09 12:29:51 +03:00

75 lines
2.3 KiB
TypeScript

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<WebSocketCtx>) {
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
}
}