From 206b029824727d9143a02897fb2bf74c797ba03d Mon Sep 17 00:00:00 2001 From: aster <137767097+aster-void@users.noreply.github.com> Date: Thu, 20 Feb 2025 16:58:07 +0900 Subject: [PATCH 1/8] fix: websocket fails to initialize --- bun.lock | 5 +++++ package.json | 4 +++- server/src/index.ts | 4 +--- server/src/lib/socket/socket.ts | 9 ++++++--- 4 files changed, 15 insertions(+), 7 deletions(-) diff --git a/bun.lock b/bun.lock index ca198071..d0dbf2e2 100644 --- a/bun.lock +++ b/bun.lock @@ -3,6 +3,9 @@ "workspaces": { "": { "name": "course-mate", + "dependencies": { + "@hono/node-server": "^1.13.8", + }, "devDependencies": { "@biomejs/biome": "^1.9.1", "lefthook": "^1.10.10", @@ -278,6 +281,8 @@ "@grpc/proto-loader": ["@grpc/proto-loader@0.7.13", "", { "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", "protobufjs": "^7.2.5", "yargs": "^17.7.2" }, "bin": { "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" } }, "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw=="], + "@hono/node-server": ["@hono/node-server@1.13.8", "", { "peerDependencies": { "hono": "^4" } }, "sha512-fsn8ucecsAXUoVxrUil0m13kOEq4mkX4/4QozCqmY+HpGfKl74OYSn8JcMA8GnG0ClfdRI4/ZSeG7zhFaVg+wg=="], + "@hono/zod-validator": ["@hono/zod-validator@0.4.3", "", { "peerDependencies": { "hono": ">=3.9.0", "zod": "^3.19.1" } }, "sha512-xIgMYXDyJ4Hj6ekm9T9Y27s080Nl9NXHcJkOvkXPhubOLj8hZkOL8pDnnXfvCf5xEE8Q4oMFenQUZZREUY2gqQ=="], "@hookform/resolvers": ["@hookform/resolvers@3.10.0", "", { "peerDependencies": { "react-hook-form": "^7.0.0" } }, "sha512-79Dv+3mDF7i+2ajj7SkypSKHhl1cbln1OGavqrsF7p6mbUv11xpqpacPsGDCTRvCSjEEIez2ef1NveSVL3b0Ag=="], diff --git a/package.json b/package.json index cbab030d..3be609d5 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,8 @@ "lefthook": "^1.10.10", "lint-staged": "^15.2.10" }, - "dependencies": {}, + "dependencies": { + "@hono/node-server": "^1.13.8" + }, "trustedDependencies": ["@biomejs/biome", "lefthook"] } diff --git a/server/src/index.ts b/server/src/index.ts index 3592a82e..b7fd12c8 100644 --- a/server/src/index.ts +++ b/server/src/index.ts @@ -1,4 +1,3 @@ -import type { Server } from "node:http"; import { Hono } from "hono"; import { cors } from "hono/cors"; import { HTTPException } from "hono/http-exception"; @@ -58,7 +57,6 @@ export function main() { port: process.env.PORT ?? 3000, }); // ?? - initializeSocket(server as unknown as Server, corsOptions); - return server; + return initializeSocket(app, corsOptions); } export default app; diff --git a/server/src/lib/socket/socket.ts b/server/src/lib/socket/socket.ts index 1570a683..4f79689f 100644 --- a/server/src/lib/socket/socket.ts +++ b/server/src/lib/socket/socket.ts @@ -1,17 +1,18 @@ -import type { Server } from "node:http"; +import { serve } from "@hono/node-server"; import type { Message, UserID } from "common/types"; -import type { CorsOptions } from "cors"; +import type { Hono } from "hono"; import { type Socket, Server as SocketIOServer } from "socket.io"; import { getUserIdFromToken } from "../../firebase/auth/db"; const users = new Map(); export function initializeSocket( - server: Server, + app: Hono, corsOptions: { origin: string[]; }, ) { + const server = serve(app); const cors = { ...corsOptions, origin: corsOptions.origin[0], @@ -46,6 +47,8 @@ export function initializeSocket( } }); }); + + return server; } export function sendMessage(message: Message, friendId: UserID) { From 28369e4047bc790c78d124ec7efb9152316296f6 Mon Sep 17 00:00:00 2001 From: aster <137767097+aster-void@users.noreply.github.com> Date: Thu, 20 Feb 2025 20:25:49 +0900 Subject: [PATCH 2/8] feat: use SSE --- common/types.ts | 16 +++++++ server/package.json | 2 +- server/src/index.ts | 20 +++------ server/src/lib/socket/socket.ts | 79 --------------------------------- server/src/main.ts | 3 -- server/src/router/chat.ts | 27 ++++++++--- server/src/router/sse.ts | 55 +++++++++++++++++++++++ web/app/layout.tsx | 3 +- web/components/data/socket.ts | 43 ------------------ web/components/data/socket.tsx | 73 ++++++++++++++++++++++++++++++ 10 files changed, 174 insertions(+), 147 deletions(-) delete mode 100644 server/src/lib/socket/socket.ts delete mode 100644 server/src/main.ts create mode 100644 server/src/router/sse.ts delete mode 100644 web/components/data/socket.ts create mode 100644 web/components/data/socket.tsx diff --git a/common/types.ts b/common/types.ts index 51cb39e5..508daa7d 100644 --- a/common/types.ts +++ b/common/types.ts @@ -1,5 +1,7 @@ // common/type/types.ts +import type { Message, UserID } from "./zod/types.ts"; + export type { UserID, GUID, @@ -34,3 +36,17 @@ export type { InitSharedRoom, UpdateRoom, } from "./zod/types.ts"; + +export type SSEChatEvents = { + "Chat:Append": { + message: Message; + }; + "Chat:Update": { + id: number; + message: Message; + }; + "Chat:Delete": { + id: number; + }; + "Chat:Ping": ""; +}; diff --git a/server/package.json b/server/package.json index 3e4c2865..eb47d695 100644 --- a/server/package.json +++ b/server/package.json @@ -5,7 +5,7 @@ "main": "src/index.ts", "scripts": { "prepare": "bun --env-file=./.env.dev prisma generate --sql || (echo 'please set DATABASE_URL in server/.env.dev' && exit 1)", - "dev": "bun --watch src/main.ts", + "dev": "bun --watch src/index.ts", "build": "tsc", "serve": "bun target/main.js" }, diff --git a/server/src/index.ts b/server/src/index.ts index b7fd12c8..20771725 100644 --- a/server/src/index.ts +++ b/server/src/index.ts @@ -1,13 +1,13 @@ import { Hono } from "hono"; import { cors } from "hono/cors"; import { HTTPException } from "hono/http-exception"; -import { initializeSocket } from "./lib/socket/socket"; import { allUrlMustBeValid, env } from "./lib/utils"; import chatRoutes from "./router/chat"; import coursesRoutes from "./router/courses"; import matchesRoutes from "./router/matches"; import pictureRoutes from "./router/picture"; import requestsRoutes from "./router/requests"; +import sseRoutes from "./router/sse"; import subjectsRoutes from "./router/subjects"; import usersRoutes from "./router/users"; @@ -30,11 +30,10 @@ if (corsOptions.origin.length > 1) { const app = new Hono() .onError((err, c) => { if (err instanceof HTTPException) { - c.status(err.status); - return c.json({ error: err }); + throw err; } - c.status(500); - return c.json({ error: err }); + console.log(err); + return c.json({ error: err }, 500); }) .use(cors(corsOptions)) @@ -49,14 +48,7 @@ const app = new Hono() .route("/subjects", subjectsRoutes) .route("/requests", requestsRoutes) .route("/matches", matchesRoutes) - .route("/chat", chatRoutes); + .route("/chat", chatRoutes) + .route("/sse", sseRoutes); -export function main() { - const server = Bun.serve({ - fetch: app.fetch, - port: process.env.PORT ?? 3000, - }); - // ?? - return initializeSocket(app, corsOptions); -} export default app; diff --git a/server/src/lib/socket/socket.ts b/server/src/lib/socket/socket.ts deleted file mode 100644 index 4f79689f..00000000 --- a/server/src/lib/socket/socket.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { serve } from "@hono/node-server"; -import type { Message, UserID } from "common/types"; -import type { Hono } from "hono"; -import { type Socket, Server as SocketIOServer } from "socket.io"; -import { getUserIdFromToken } from "../../firebase/auth/db"; - -const users = new Map(); - -export function initializeSocket( - app: Hono, - corsOptions: { - origin: string[]; - }, -) { - const server = serve(app); - const cors = { - ...corsOptions, - origin: corsOptions.origin[0], - }; - const io = new SocketIOServer(server, { - cors, - connectionStateRecovery: {}, - }); - - io.on("connection", (socket) => { - console.log(`[log:ws] New connection created of id ${socket.id}`); - socket.on("register", async (token) => { - const userId = await getUserIdFromToken(token); - if (userId) { - users.set(userId, socket); - console.log( - `[log:ws] The user of id ${socket.id} turned out to have id ${userId}`, - ); - } else { - console.log("[log:ws] Invalid token or failed to retrieve user ID"); - } - }); - - socket.on("disconnect", () => { - console.log(`[log:ws] A user disconnected of id ${socket.id}`); - for (const [id, socket2] of users.entries()) { - if (socket2.id === socket.id) { - console.log(`[log:ws] ... whose userId is ${id}`); - users.delete(id); - break; - } - } - }); - }); - - return server; -} - -export function sendMessage(message: Message, friendId: UserID) { - console.log("[log:ws] got request for creating message."); - const socket = users.get(friendId); - if (socket) { - console.log("[log:ws] Sending message..."); - socket.emit("newMessage", message); - } -} - -export function updateMessage(message: Message, friendId: UserID) { - console.log("[log:ws] got request for updating message."); - const socket = users.get(friendId); - if (socket) { - console.log("[log:ws] Updating message..."); - socket.emit("updateMessage", message); - } -} - -export function deleteMessage(messageId: number, friendId: UserID) { - console.log("[log:ws] got request for deleting message."); - const socket = users.get(friendId); - if (socket) { - console.log("[log:ws] Deleting message..."); - socket.emit("deleteMessage", messageId); - } -} diff --git a/server/src/main.ts b/server/src/main.ts deleted file mode 100644 index efc922b6..00000000 --- a/server/src/main.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { main } from "./index"; - -main(); diff --git a/server/src/router/chat.ts b/server/src/router/chat.ts index edc844c0..d110d18c 100644 --- a/server/src/router/chat.ts +++ b/server/src/router/chat.ts @@ -11,10 +11,10 @@ import { z } from "zod"; import * as db from "../database/chat"; import { getUserId } from "../firebase/auth/db"; import * as core from "../functions/chat"; -import * as ws from "../lib/socket/socket"; import { json, param } from "../lib/validator"; +import * as sse from "../router/sse"; -const userid_param = param({ userid: z.number() }); +const userid_param = param({ userid: z.coerce.number() }); const router = new Hono() .get("/overview", async (c) => { const id = await getUserId(c); @@ -29,9 +29,13 @@ const router = new Hono() const send = c.req.valid("json"); const result = await core.sendDM(user, friend, send); if (result.ok) { - ws.sendMessage(result.body, friend); + sse.send(friend, { + event: "Chat:Append", + data: { message: result.body }, + }); } - return c.json(result.body); // status: result.code + c.status(result.code); + return c.json(result.body); }) // GET a DM Room with userId, CREATE one if not found. @@ -118,7 +122,13 @@ const router = new Hono() const result = await core.updateMessage(user, id, content); if (result.ok) { - ws.updateMessage(result.body, friend); + sse.send(friend, { + event: "Chat:Update", + data: { + id: result.body.id, + message: result.body, + }, + }); } c.status(result.code); return c.json(result.body); @@ -134,7 +144,12 @@ const router = new Hono() const id = c.req.valid("param").id; const friend = c.req.valid("json").friend; await db.deleteMessage(id as MessageID, user); - ws.deleteMessage(id, friend); + sse.send(friend, { + event: "Chat:Delete", + data: { + id, + }, + }); c.status(204); return c.json({}); }, diff --git a/server/src/router/sse.ts b/server/src/router/sse.ts new file mode 100644 index 00000000..c0b8cbce --- /dev/null +++ b/server/src/router/sse.ts @@ -0,0 +1,55 @@ +import type { SSEChatEvents, UserID } from "common/types"; +import { Hono } from "hono"; +import { HTTPException } from "hono/http-exception"; +import { streamSSE } from "hono/streaming"; +import { getUserIdFromToken } from "../firebase/auth/db"; + +export const sseChatPath = (id: UserID) => `sse:chat:${id}`; +type SSEChatEventEnum = "Chat:Append" | "Chat:Update" | "Chat:Delete"; +type SSEChatEvent = { + event: T; + data: SSEChatEvents[T]; +}; +export function send( + to: UserID, + event: SSEChatEvent, +) { + const bc = new BroadcastChannel(sseChatPath(to)); + bc.postMessage(event); + bc.close(); +} + +// https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API +// https://hono.dev/docs/helpers/streaming +const route = new Hono().get("/chat", async (c) => { + const token = c.req.query("token"); + if (!token) + throw new HTTPException(400, { + message: "token required in param", + }); + + const userId = await getUserIdFromToken(token); + return streamSSE(c, async (stream) => { + const bc = new BroadcastChannel(sseChatPath(userId)); + bc.onmessage = (e: MessageEvent) => { + const event = e.data as SSEChatEvent; + stream.writeSSE({ + event: event.event, + data: JSON.stringify(event.data), + }); + }; + + stream.onAbort(() => { + bc.close(); + }); + while (true) { + await Bun.sleep(2000); + stream.writeSSE({ + event: "Ping", + data: "", + }); + } + }); +}); + +export default route; diff --git a/web/app/layout.tsx b/web/app/layout.tsx index 254ffcf8..4ffe64a6 100644 --- a/web/app/layout.tsx +++ b/web/app/layout.tsx @@ -11,6 +11,7 @@ import "@fontsource/roboto/700.css"; import BanLandscape from "~/components/BanLandscape"; import { AlertProvider } from "~/components/common/alert/AlertProvider"; import { ModalProvider } from "~/components/common/modal/ModalProvider"; +import SSEProvider from "~/components/data/socket"; import AuthProvider from "~/firebase/auth/AuthProvider"; const theme = createTheme({ @@ -50,7 +51,7 @@ export default function RootLayout({ - {children} + {children} diff --git a/web/components/data/socket.ts b/web/components/data/socket.ts deleted file mode 100644 index 630b024c..00000000 --- a/web/components/data/socket.ts +++ /dev/null @@ -1,43 +0,0 @@ -import type { Message } from "common/types"; -import { enqueueSnackbar } from "notistack"; -import { io } from "socket.io-client"; -import { API_ENDPOINT } from "~/api/internal/endpoints"; -import * as user from "~/api/user"; -import { getIdToken } from "~/firebase/auth/lib"; - -export const socket = io(API_ENDPOINT, { - auth: { - serverOffset: 0, //TODO: ちゃんと実装する - }, -}); - -export const handlers: { - onCreate: undefined | ((data: Message) => boolean); // should return if it matched - onUpdate: undefined | ((id: number, data: Message) => void); - onDelete: undefined | ((id: number) => void); -} = { - onCreate: undefined, - onUpdate: undefined, - onDelete: undefined, -}; - -(async () => { - const idToken = await getIdToken(); - socket.emit("register", idToken); -})(); -socket.on("newMessage", async (msg: Message) => { - if (handlers.onCreate?.(msg)) return; // if it exists and caught the create sig - - const creator = await user.get(msg.creator); - if (!creator) return; - enqueueSnackbar(`${creator.name}さんからのメッセージ : ${msg.content}`, { - variant: "info", - }); -}); - -socket.on("updateMessage", async (msg: Message) => { - if (handlers.onUpdate) handlers.onUpdate(msg.id, msg); -}); -socket.on("deleteMessage", async (msgId: number) => { - if (handlers.onDelete) handlers.onDelete(msgId); -}); diff --git a/web/components/data/socket.tsx b/web/components/data/socket.tsx new file mode 100644 index 00000000..e17c5ef1 --- /dev/null +++ b/web/components/data/socket.tsx @@ -0,0 +1,73 @@ +import type { Message } from "common/types"; +import type { SSEChatEvents } from "common/types"; +import { enqueueSnackbar } from "notistack"; +import { useEffect } from "react"; +import { API_ENDPOINT } from "~/api/internal/endpoints"; +import * as user from "~/api/user"; +import { getIdToken } from "~/firebase/auth/lib"; + +export const handlers: { + onCreate: undefined | ((data: Message) => boolean); // should return if it matched + onUpdate: undefined | ((id: number, data: Message) => void); + onDelete: undefined | ((id: number) => void); +} = { + onCreate: undefined, + onUpdate: undefined, + onDelete: undefined, +}; + +async function main({ signal }: { signal: AbortSignal }) { + const sse = new EventSource( + `${API_ENDPOINT}/sse/chat?token=${await getIdToken()}`, + ); + signal.addEventListener("abort", () => sse.close()); + + sse.addEventListener( + "Chat:Append", + async (ev) => { + console.log(ev); + const data = JSON.parse(ev.data) as SSEChatEvents["Chat:Append"]; + const msg = data.message; + // if it exists and caught the create sig + if (handlers.onCreate?.(msg)) return; + const creator = await user.get(msg.creator); + if (!creator) return; + enqueueSnackbar(`${creator.name}さんからのメッセージ : ${msg.content}`, { + variant: "info", + }); + }, + { signal }, + ); + sse.addEventListener( + "Chat:Update", + (ev) => { + console.log(ev); + const data = JSON.parse(ev.data) as SSEChatEvents["Chat:Update"]; + const msg = data.message; + handlers.onUpdate?.(msg.id, msg); + }, + { signal }, + ); + sse.addEventListener( + "Chat:Delete", + (ev) => { + console.log(ev); + const data = JSON.parse(ev.data) as SSEChatEvents["Chat:Delete"]; + handlers.onDelete?.(data.id); + }, + { signal }, + ); + + return () => sse.close(); +} + +export default function SSEProvider({ + children, +}: { children: React.ReactNode }) { + useEffect(() => { + const ctl = new AbortController(); + main({ signal: ctl.signal }).catch(console.error); + return () => ctl.abort(); + }, []); + return children; +} From 1c22e3e657f360ccc713f497c79278e7c09438fa Mon Sep 17 00:00:00 2001 From: aster <137767097+aster-void@users.noreply.github.com> Date: Thu, 20 Feb 2025 20:36:10 +0900 Subject: [PATCH 3/8] fix types and some flaws --- common/types.ts | 6 ++++++ server/src/functions/chat.ts | 15 +++++++++------ server/src/router/chat.ts | 27 +++++++++++++++++++-------- server/src/router/sse.ts | 7 +------ web/components/data/socket.tsx | 6 ++---- 5 files changed, 37 insertions(+), 24 deletions(-) diff --git a/common/types.ts b/common/types.ts index 508daa7d..b25207bc 100644 --- a/common/types.ts +++ b/common/types.ts @@ -40,6 +40,7 @@ export type { export type SSEChatEvents = { "Chat:Append": { message: Message; + sender: string; // user name }; "Chat:Update": { id: number; @@ -50,3 +51,8 @@ export type SSEChatEvents = { }; "Chat:Ping": ""; }; +export type SSEChatEventEnum = "Chat:Append" | "Chat:Update" | "Chat:Delete"; +export type SSEChatEvent = { + event: T; + data: SSEChatEvents[T]; +}; diff --git a/server/src/functions/chat.ts b/server/src/functions/chat.ts index a86fe98f..3f6a3aad 100644 --- a/server/src/functions/chat.ts +++ b/server/src/functions/chat.ts @@ -8,6 +8,7 @@ import type { SendMessage, ShareRoomID, } from "common/types"; +import { HTTPException } from "hono/http-exception"; import * as db from "../database/chat"; import { areAllMatched, getRelation } from "../database/matches"; import { getUserByID } from "../database/users"; @@ -37,12 +38,13 @@ export async function sendDM( from: UserID, to: UserID, send: SendMessage, -): Promise> { +): Promise { const rel = await getRelation(from, to); if (rel.status === "REJECTED") - return http.forbidden( - "You cannot send a message because the friendship request was rejected.", - ); + throw new HTTPException(403, { + message: + "You cannot send a message because the friendship request was rejected.", + }); // they are now MATCHED const msg: Omit, "isPicture"> = { @@ -53,8 +55,9 @@ export async function sendDM( }; const result = await db.sendDM(rel.id, msg); - if (!result) return http.internalError("Failed to send DM"); - return http.created(result); + if (!result) + throw new HTTPException(500, { message: "Failed to send message" }); + return result; } export async function getDM( diff --git a/server/src/router/chat.ts b/server/src/router/chat.ts index d110d18c..6d0bb5ce 100644 --- a/server/src/router/chat.ts +++ b/server/src/router/chat.ts @@ -7,8 +7,10 @@ import { SharedRoomSchema, } from "common/zod/schemas"; import { Hono } from "hono"; +import { HTTPException } from "hono/http-exception"; import { z } from "zod"; import * as db from "../database/chat"; +import { prisma } from "../database/client"; import { getUserId } from "../firebase/auth/db"; import * as core from "../functions/chat"; import { json, param } from "../lib/validator"; @@ -28,14 +30,23 @@ const router = new Hono() const friend = c.req.valid("param").userid; const send = c.req.valid("json"); const result = await core.sendDM(user, friend, send); - if (result.ok) { - sse.send(friend, { - event: "Chat:Append", - data: { message: result.body }, - }); - } - c.status(result.code); - return c.json(result.body); + const senderName = await prisma.user.findUnique({ + where: { + id: user, + }, + select: { + name: true, + }, + }); + if (!senderName) + throw new HTTPException(500, { message: "sender not found???" }); + + sse.send(friend, { + event: "Chat:Append", + data: { message: result, sender: senderName?.name }, + }); + c.status(201); + return c.json(result); }) // GET a DM Room with userId, CREATE one if not found. diff --git a/server/src/router/sse.ts b/server/src/router/sse.ts index c0b8cbce..82d02c11 100644 --- a/server/src/router/sse.ts +++ b/server/src/router/sse.ts @@ -1,15 +1,10 @@ -import type { SSEChatEvents, UserID } from "common/types"; +import type { SSEChatEvent, SSEChatEventEnum, UserID } from "common/types"; import { Hono } from "hono"; import { HTTPException } from "hono/http-exception"; import { streamSSE } from "hono/streaming"; import { getUserIdFromToken } from "../firebase/auth/db"; export const sseChatPath = (id: UserID) => `sse:chat:${id}`; -type SSEChatEventEnum = "Chat:Append" | "Chat:Update" | "Chat:Delete"; -type SSEChatEvent = { - event: T; - data: SSEChatEvents[T]; -}; export function send( to: UserID, event: SSEChatEvent, diff --git a/web/components/data/socket.tsx b/web/components/data/socket.tsx index e17c5ef1..15887ff7 100644 --- a/web/components/data/socket.tsx +++ b/web/components/data/socket.tsx @@ -24,15 +24,13 @@ async function main({ signal }: { signal: AbortSignal }) { sse.addEventListener( "Chat:Append", - async (ev) => { + (ev) => { console.log(ev); const data = JSON.parse(ev.data) as SSEChatEvents["Chat:Append"]; const msg = data.message; // if it exists and caught the create sig if (handlers.onCreate?.(msg)) return; - const creator = await user.get(msg.creator); - if (!creator) return; - enqueueSnackbar(`${creator.name}さんからのメッセージ : ${msg.content}`, { + enqueueSnackbar(`${data.sender}さんからのメッセージ : ${msg.content}`, { variant: "info", }); }, From 04bbcce0552a027d16c2474748bc14027174668a Mon Sep 17 00:00:00 2001 From: aster <137767097+aster-void@users.noreply.github.com> Date: Thu, 20 Feb 2025 20:43:50 +0900 Subject: [PATCH 4/8] fix: build --- common/types.ts | 2 +- web/components/data/socket.tsx | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/common/types.ts b/common/types.ts index b25207bc..7bce202d 100644 --- a/common/types.ts +++ b/common/types.ts @@ -1,6 +1,6 @@ // common/type/types.ts -import type { Message, UserID } from "./zod/types.ts"; +import type { Message } from "./zod/types.ts"; export type { UserID, diff --git a/web/components/data/socket.tsx b/web/components/data/socket.tsx index 15887ff7..17523c3a 100644 --- a/web/components/data/socket.tsx +++ b/web/components/data/socket.tsx @@ -3,7 +3,6 @@ import type { SSEChatEvents } from "common/types"; import { enqueueSnackbar } from "notistack"; import { useEffect } from "react"; import { API_ENDPOINT } from "~/api/internal/endpoints"; -import * as user from "~/api/user"; import { getIdToken } from "~/firebase/auth/lib"; export const handlers: { From 136b229d76149f0526541511485eeee1e4a2a212 Mon Sep 17 00:00:00 2001 From: aster <137767097+aster-void@users.noreply.github.com> Date: Thu, 20 Feb 2025 20:45:19 +0900 Subject: [PATCH 5/8] style: delete console.logs --- web/components/data/socket.tsx | 3 --- 1 file changed, 3 deletions(-) diff --git a/web/components/data/socket.tsx b/web/components/data/socket.tsx index 17523c3a..515b453b 100644 --- a/web/components/data/socket.tsx +++ b/web/components/data/socket.tsx @@ -24,7 +24,6 @@ async function main({ signal }: { signal: AbortSignal }) { sse.addEventListener( "Chat:Append", (ev) => { - console.log(ev); const data = JSON.parse(ev.data) as SSEChatEvents["Chat:Append"]; const msg = data.message; // if it exists and caught the create sig @@ -38,7 +37,6 @@ async function main({ signal }: { signal: AbortSignal }) { sse.addEventListener( "Chat:Update", (ev) => { - console.log(ev); const data = JSON.parse(ev.data) as SSEChatEvents["Chat:Update"]; const msg = data.message; handlers.onUpdate?.(msg.id, msg); @@ -48,7 +46,6 @@ async function main({ signal }: { signal: AbortSignal }) { sse.addEventListener( "Chat:Delete", (ev) => { - console.log(ev); const data = JSON.parse(ev.data) as SSEChatEvents["Chat:Delete"]; handlers.onDelete?.(data.id); }, From 4aa80697f19e6f9c49f878ff77a4ebb403518f5e Mon Sep 17 00:00:00 2001 From: aster <137767097+aster-void@users.noreply.github.com> Date: Thu, 20 Feb 2025 20:47:37 +0900 Subject: [PATCH 6/8] uninstall socket.io --- bun.lock | 42 +------------------ server/package.json | 3 +- web/app/layout.tsx | 2 +- .../{data/socket.tsx => SSEProvider.tsx} | 0 web/components/chat/RoomWindow.tsx | 2 +- web/package.json | 3 +- 6 files changed, 5 insertions(+), 47 deletions(-) rename web/components/{data/socket.tsx => SSEProvider.tsx} (100%) diff --git a/bun.lock b/bun.lock index 72608b23..a18149da 100644 --- a/bun.lock +++ b/bun.lock @@ -34,10 +34,9 @@ "dotenv": "^16.4.5", "dotenv-cli": "^7.4.2", "firebase-admin": "^12.2.0", - "lru-cache": "^11.0.2", "hono": "^4.7.1", + "lru-cache": "^11.0.2", "sharp": "^0.33.5", - "socket.io": "^4.7.5", "sql-formatter": "^15.4.10", "zod": "^3.23.8", }, @@ -70,7 +69,6 @@ "react-easy-crop": "^5.0.8", "react-hook-form": "^7.53.2", "react-icons": "^5.3.0", - "socket.io-client": "^4.7.5", "zod": "^3.23.8", }, "devDependencies": { @@ -428,8 +426,6 @@ "@protobufjs/utf8": ["@protobufjs/utf8@1.1.0", "", {}, "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="], - "@socket.io/component-emitter": ["@socket.io/component-emitter@3.1.2", "", {}, "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA=="], - "@swc/counter": ["@swc/counter@0.1.3", "", {}, "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ=="], "@swc/helpers": ["@swc/helpers@0.5.5", "", { "dependencies": { "@swc/counter": "^0.1.3", "tslib": "^2.4.0" } }, "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A=="], @@ -496,8 +492,6 @@ "abort-controller": ["abort-controller@3.0.0", "", { "dependencies": { "event-target-shim": "^5.0.0" } }, "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg=="], - "accepts": ["accepts@1.3.8", "", { "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" } }, "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw=="], - "acorn": ["acorn@8.14.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA=="], "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], @@ -534,8 +528,6 @@ "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], - "base64id": ["base64id@2.0.0", "", {}, "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog=="], - "bignumber.js": ["bignumber.js@9.1.2", "", {}, "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug=="], "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], @@ -652,12 +644,6 @@ "end-of-stream": ["end-of-stream@1.4.4", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q=="], - "engine.io": ["engine.io@6.6.4", "", { "dependencies": { "@types/cors": "^2.8.12", "@types/node": ">=10.0.0", "accepts": "~1.3.4", "base64id": "2.0.0", "cookie": "~0.7.2", "cors": "~2.8.5", "debug": "~4.3.1", "engine.io-parser": "~5.2.1", "ws": "~8.17.1" } }, "sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g=="], - - "engine.io-client": ["engine.io-client@6.6.3", "", { "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1", "engine.io-parser": "~5.2.1", "ws": "~8.17.1", "xmlhttprequest-ssl": "~2.1.1" } }, "sha512-T0iLjnyNWahNyv/lcjS2y4oE358tVS/SYQNxYXGAJ9/GLgH4VCvOQ/mhTjqU88mLZCQgiG8RIegFHYCdVC+j5w=="], - - "engine.io-parser": ["engine.io-parser@5.2.3", "", {}, "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q=="], - "environment": ["environment@1.1.0", "", {}, "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q=="], "error-ex": ["error-ex@1.3.2", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g=="], @@ -950,8 +936,6 @@ "nearley": ["nearley@2.20.1", "", { "dependencies": { "commander": "^2.19.0", "moo": "^0.5.0", "railroad-diagrams": "^1.0.0", "randexp": "0.4.6" }, "bin": { "nearleyc": "bin/nearleyc.js", "nearley-test": "bin/nearley-test.js", "nearley-unparse": "bin/nearley-unparse.js", "nearley-railroad": "bin/nearley-railroad.js" } }, "sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ=="], - "negotiator": ["negotiator@0.6.3", "", {}, "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="], - "next": ["next@14.2.24", "", { "dependencies": { "@next/env": "14.2.24", "@swc/helpers": "0.5.5", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001579", "graceful-fs": "^4.2.11", "postcss": "8.4.31", "styled-jsx": "5.1.1" }, "optionalDependencies": { "@next/swc-darwin-arm64": "14.2.24", "@next/swc-darwin-x64": "14.2.24", "@next/swc-linux-arm64-gnu": "14.2.24", "@next/swc-linux-arm64-musl": "14.2.24", "@next/swc-linux-x64-gnu": "14.2.24", "@next/swc-linux-x64-musl": "14.2.24", "@next/swc-win32-arm64-msvc": "14.2.24", "@next/swc-win32-ia32-msvc": "14.2.24", "@next/swc-win32-x64-msvc": "14.2.24" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.41.2", "react": "^18.2.0", "react-dom": "^18.2.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-En8VEexSJ0Py2FfVnRRh8gtERwDRaJGNvsvad47ShkC2Yi8AXQPXEA2vKoDJlGFSj5WE5SyF21zNi4M5gyi+SQ=="], "node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], @@ -1102,14 +1086,6 @@ "slice-ansi": ["slice-ansi@5.0.0", "", { "dependencies": { "ansi-styles": "^6.0.0", "is-fullwidth-code-point": "^4.0.0" } }, "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ=="], - "socket.io": ["socket.io@4.8.1", "", { "dependencies": { "accepts": "~1.3.4", "base64id": "~2.0.0", "cors": "~2.8.5", "debug": "~4.3.2", "engine.io": "~6.6.0", "socket.io-adapter": "~2.5.2", "socket.io-parser": "~4.2.4" } }, "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg=="], - - "socket.io-adapter": ["socket.io-adapter@2.5.5", "", { "dependencies": { "debug": "~4.3.4", "ws": "~8.17.1" } }, "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg=="], - - "socket.io-client": ["socket.io-client@4.8.1", "", { "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.2", "engine.io-client": "~6.6.1", "socket.io-parser": "~4.2.4" } }, "sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ=="], - - "socket.io-parser": ["socket.io-parser@4.2.4", "", { "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1" } }, "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew=="], - "source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="], "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], @@ -1206,10 +1182,6 @@ "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], - "ws": ["ws@8.17.1", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ=="], - - "xmlhttprequest-ssl": ["xmlhttprequest-ssl@2.1.2", "", {}, "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ=="], - "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], "yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], @@ -1250,10 +1222,6 @@ "cosmiconfig/yaml": ["yaml@1.10.2", "", {}, "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="], - "engine.io/debug": ["debug@4.3.7", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ=="], - - "engine.io-client/debug": ["debug@4.3.7", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ=="], - "error-ex/is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], "eslint/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], @@ -1298,14 +1266,6 @@ "slice-ansi/ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="], - "socket.io/debug": ["debug@4.3.7", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ=="], - - "socket.io-adapter/debug": ["debug@4.3.7", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ=="], - - "socket.io-client/debug": ["debug@4.3.7", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ=="], - - "socket.io-parser/debug": ["debug@4.3.7", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ=="], - "string-width-cjs/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], "string-width-cjs/is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], diff --git a/server/package.json b/server/package.json index dc425005..9f8ce373 100644 --- a/server/package.json +++ b/server/package.json @@ -24,10 +24,9 @@ "dotenv": "^16.4.5", "dotenv-cli": "^7.4.2", "firebase-admin": "^12.2.0", - "lru-cache": "^11.0.2", "hono": "^4.7.1", + "lru-cache": "^11.0.2", "sharp": "^0.33.5", - "socket.io": "^4.7.5", "sql-formatter": "^15.4.10", "zod": "^3.23.8" }, diff --git a/web/app/layout.tsx b/web/app/layout.tsx index 4ffe64a6..1620151c 100644 --- a/web/app/layout.tsx +++ b/web/app/layout.tsx @@ -9,9 +9,9 @@ import "@fontsource/roboto/400.css"; import "@fontsource/roboto/500.css"; import "@fontsource/roboto/700.css"; import BanLandscape from "~/components/BanLandscape"; +import SSEProvider from "~/components/SSEProvider"; import { AlertProvider } from "~/components/common/alert/AlertProvider"; import { ModalProvider } from "~/components/common/modal/ModalProvider"; -import SSEProvider from "~/components/data/socket"; import AuthProvider from "~/firebase/auth/AuthProvider"; const theme = createTheme({ diff --git a/web/components/data/socket.tsx b/web/components/SSEProvider.tsx similarity index 100% rename from web/components/data/socket.tsx rename to web/components/SSEProvider.tsx diff --git a/web/components/chat/RoomWindow.tsx b/web/components/chat/RoomWindow.tsx index ecbfa406..1dc94f71 100644 --- a/web/components/chat/RoomWindow.tsx +++ b/web/components/chat/RoomWindow.tsx @@ -8,8 +8,8 @@ import { useMessages } from "~/api/chat/hooks"; import { API_ENDPOINT } from "~/api/internal/endpoints"; import request from "~/api/request"; import { useMyID } from "~/api/user"; +import { handlers } from "../SSEProvider"; import Dots from "../common/Dots"; -import { handlers } from "../data/socket"; import { MessageInput } from "./MessageInput"; import { RoomHeader } from "./RoomHeader"; diff --git a/web/package.json b/web/package.json index ceebb6de..e3fefad7 100644 --- a/web/package.json +++ b/web/package.json @@ -9,13 +9,13 @@ "preview": "next start" }, "dependencies": { - "common": "workspace:common", "@emotion/react": "^11.11.4", "@emotion/styled": "^11.11.5", "@fontsource/roboto": "^5.0.13", "@hookform/resolvers": "^3.9.1", "@mui/icons-material": "^5.16.7", "@mui/material": "^5.15.20", + "common": "workspace:common", "devalue": "^5.1.1", "firebase": "^10.12.2", "framer-motion": "^11.3.23", @@ -26,7 +26,6 @@ "react-easy-crop": "^5.0.8", "react-hook-form": "^7.53.2", "react-icons": "^5.3.0", - "socket.io-client": "^4.7.5", "zod": "^3.23.8" }, "devDependencies": { From 0ea44056a14daf3e8768992e65d6b3dc046d76c8 Mon Sep 17 00:00:00 2001 From: aster <137767097+aster-void@users.noreply.github.com> Date: Thu, 20 Feb 2025 20:51:42 +0900 Subject: [PATCH 7/8] bun: uninstall @hono/node-server --- bun.lock | 5 ----- package.json | 25 +++++++++++-------------- 2 files changed, 11 insertions(+), 19 deletions(-) diff --git a/bun.lock b/bun.lock index a18149da..ffe38b29 100644 --- a/bun.lock +++ b/bun.lock @@ -3,9 +3,6 @@ "workspaces": { "": { "name": "course-mate", - "dependencies": { - "@hono/node-server": "^1.13.8", - }, "devDependencies": { "@biomejs/biome": "^1.9.1", "lefthook": "^1.10.10", @@ -280,8 +277,6 @@ "@grpc/proto-loader": ["@grpc/proto-loader@0.7.13", "", { "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", "protobufjs": "^7.2.5", "yargs": "^17.7.2" }, "bin": { "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" } }, "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw=="], - "@hono/node-server": ["@hono/node-server@1.13.8", "", { "peerDependencies": { "hono": "^4" } }, "sha512-fsn8ucecsAXUoVxrUil0m13kOEq4mkX4/4QozCqmY+HpGfKl74OYSn8JcMA8GnG0ClfdRI4/ZSeG7zhFaVg+wg=="], - "@hono/zod-validator": ["@hono/zod-validator@0.4.3", "", { "peerDependencies": { "hono": ">=3.9.0", "zod": "^3.19.1" } }, "sha512-xIgMYXDyJ4Hj6ekm9T9Y27s080Nl9NXHcJkOvkXPhubOLj8hZkOL8pDnnXfvCf5xEE8Q4oMFenQUZZREUY2gqQ=="], "@hookform/resolvers": ["@hookform/resolvers@3.10.0", "", { "peerDependencies": { "react-hook-form": "^7.0.0" } }, "sha512-79Dv+3mDF7i+2ajj7SkypSKHhl1cbln1OGavqrsF7p6mbUv11xpqpacPsGDCTRvCSjEEIez2ef1NveSVL3b0Ag=="], diff --git a/package.json b/package.json index 303c603c..7e6a019b 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,16 @@ { "name": "course-mate", "version": "1.0.0", - "description": "", + "author": "", "main": "index.js", + "devDependencies": { + "@biomejs/biome": "^1.9.1", + "lefthook": "^1.10.10", + "lint-staged": "^15.2.10" + }, + "description": "", + "keywords": [], + "license": "ISC", "scripts": { "prepare": "lefthook install && (cd server; bun run prepare)", "check": "bun type && bun style:check", @@ -27,17 +35,6 @@ "test": "make test", "spell": "bunx cspell --quiet ." }, - "keywords": [], - "author": "", - "license": "ISC", - "workspaces": ["common", "web", "server"], - "devDependencies": { - "@biomejs/biome": "^1.9.1", - "lefthook": "^1.10.10", - "lint-staged": "^15.2.10" - }, - "dependencies": { - "@hono/node-server": "^1.13.8" - }, - "trustedDependencies": ["@biomejs/biome", "lefthook"] + "trustedDependencies": ["@biomejs/biome", "lefthook"], + "workspaces": ["common", "web", "server"] } From 56e1e0a115ccacecb06539f2f520d2d755ec721d Mon Sep 17 00:00:00 2001 From: aster <137767097+aster-void@users.noreply.github.com> Date: Thu, 20 Feb 2025 20:58:25 +0900 Subject: [PATCH 8/8] fix: CI --- server/src/firebase/auth/lib.ts | 2 +- server/src/index.ts | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/server/src/firebase/auth/lib.ts b/server/src/firebase/auth/lib.ts index fdf4b12b..a7055341 100644 --- a/server/src/firebase/auth/lib.ts +++ b/server/src/firebase/auth/lib.ts @@ -11,7 +11,7 @@ type DecodedIdToken = admin.DecodedIdToken; // THROWS: if idToken is not present in request cookie, or when the token is not valid. export async function getGUID(c: Context): Promise { const idToken = c.req.header("Authorization"); - if (typeof idToken !== "string") error("token not found in query", 401); + if (typeof idToken !== "string") error("token not found in header", 401); return await getGUIDFromToken(idToken); } diff --git a/server/src/index.ts b/server/src/index.ts index 20771725..7243dc3f 100644 --- a/server/src/index.ts +++ b/server/src/index.ts @@ -30,9 +30,10 @@ if (corsOptions.origin.length > 1) { const app = new Hono() .onError((err, c) => { if (err instanceof HTTPException) { - throw err; + console.log(err); + return c.json({ error: err.message }, err.status); } - console.log(err); + console.error(err); return c.json({ error: err }, 500); })