Files
OJ2/apps/api/src/index.ts

54 lines
1.5 KiB
TypeScript

import { Hono } from "hono"
import { getRequestSessionUser } from "./auth/session"
import { config } from "./config"
import { authRoutes } from "./routes/auth"
import { judgeServerRoutes } from "./routes/judge-server"
import { problemRoutes } from "./routes/problem"
import { submissionRoutes } from "./routes/submission"
import {
bridgeSubmissionEvents,
submissionWebSocketHandler,
type SubmissionSocketData,
} from "./websocket"
const app = new Hono()
app.get("/health", (c) => c.json({ ok: true }))
app.route("/api", authRoutes)
app.route("/api", problemRoutes)
app.route("/api", submissionRoutes)
app.route("/api", judgeServerRoutes)
app.onError((error, c) => {
console.error(error)
return c.json(
{ error: { code: "internal-error", message: "Internal server error" } },
500,
)
})
const server = Bun.serve<SubmissionSocketData>({
port: config.port,
async fetch(request, bunServer) {
const url = new URL(request.url)
if (url.pathname === "/ws/submissions") {
const user = await getRequestSessionUser(request)
if (!user) return new Response("Unauthorized", { status: 401 })
if (
bunServer.upgrade(request, {
data: { userId: user.id, username: user.username },
})
) {
return undefined
}
return new Response("WebSocket upgrade failed", { status: 400 })
}
return app.fetch(request)
},
websocket: submissionWebSocketHandler(),
})
await bridgeSubmissionEvents(server)
console.log(`OJ2 API listening on http://localhost:${server.port}`)