Update pages/api/socketio.ts
Browse files- pages/api/socketio.ts +50 -2
pages/api/socketio.ts
CHANGED
|
@@ -11,7 +11,7 @@ import {
|
|
| 11 |
setRoom,
|
| 12 |
} from "../../lib/cache"
|
| 13 |
import { createNewRoom, createNewUser, updateLastSync } from "../../lib/room"
|
| 14 |
-
import { Playlist, RoomState, UserState } from "../../lib/types"
|
| 15 |
import { isUrl } from "../../lib/utils"
|
| 16 |
|
| 17 |
const ioHandler = (_: NextApiRequest, res: NextApiResponse) => {
|
|
@@ -77,6 +77,17 @@ const ioHandler = (_: NextApiRequest, res: NextApiResponse) => {
|
|
| 77 |
|
| 78 |
await createNewUser(roomId, socket.id)
|
| 79 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 80 |
socket.on("disconnect", async () => {
|
| 81 |
await decUsers()
|
| 82 |
log("disconnected")
|
|
@@ -309,6 +320,43 @@ const ioHandler = (_: NextApiRequest, res: NextApiResponse) => {
|
|
| 309 |
room.serverTime = new Date().getTime()
|
| 310 |
socket.emit("update", room)
|
| 311 |
})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 312 |
}
|
| 313 |
)
|
| 314 |
|
|
@@ -325,4 +373,4 @@ export const config = {
|
|
| 325 |
},
|
| 326 |
}
|
| 327 |
|
| 328 |
-
export default ioHandler
|
|
|
|
| 11 |
setRoom,
|
| 12 |
} from "../../lib/cache"
|
| 13 |
import { createNewRoom, createNewUser, updateLastSync } from "../../lib/room"
|
| 14 |
+
import { Playlist, RoomState, UserState, ChatMessage } from "../../lib/types"
|
| 15 |
import { isUrl } from "../../lib/utils"
|
| 16 |
|
| 17 |
const ioHandler = (_: NextApiRequest, res: NextApiResponse) => {
|
|
|
|
| 77 |
|
| 78 |
await createNewUser(roomId, socket.id)
|
| 79 |
|
| 80 |
+
// Send initial chat history to the newly joined socket
|
| 81 |
+
{
|
| 82 |
+
const r = await getRoom(roomId)
|
| 83 |
+
if (r) {
|
| 84 |
+
io.to(socket.id).emit("chatHistory", r.chatLog ?? [])
|
| 85 |
+
}
|
| 86 |
+
}
|
| 87 |
+
|
| 88 |
+
// Simple chat rate limiting per-socket
|
| 89 |
+
let lastChatAt = 0
|
| 90 |
+
|
| 91 |
socket.on("disconnect", async () => {
|
| 92 |
await decUsers()
|
| 93 |
log("disconnected")
|
|
|
|
| 320 |
room.serverTime = new Date().getTime()
|
| 321 |
socket.emit("update", room)
|
| 322 |
})
|
| 323 |
+
|
| 324 |
+
// ===== Chat events =====
|
| 325 |
+
socket.on("chatMessage", async (text: string) => {
|
| 326 |
+
try {
|
| 327 |
+
const now = Date.now()
|
| 328 |
+
// Basic rate limiting: 1 message every 750ms
|
| 329 |
+
if (now - lastChatAt < 750) return
|
| 330 |
+
lastChatAt = now
|
| 331 |
+
|
| 332 |
+
const msgText = (text || "").toString().trim()
|
| 333 |
+
if (!msgText) return
|
| 334 |
+
if (msgText.length > 500) return
|
| 335 |
+
|
| 336 |
+
const room = await getRoom(roomId)
|
| 337 |
+
if (room === null) return
|
| 338 |
+
|
| 339 |
+
// Find sender's display name
|
| 340 |
+
const sender = room.users.find((u) => u.socketIds[0] === socket.id)
|
| 341 |
+
const name = sender?.name ?? "Anonymous"
|
| 342 |
+
|
| 343 |
+
const msg: ChatMessage = {
|
| 344 |
+
id: `${now}-${socket.id}`,
|
| 345 |
+
userId: socket.id,
|
| 346 |
+
name,
|
| 347 |
+
text: msgText,
|
| 348 |
+
ts: now,
|
| 349 |
+
}
|
| 350 |
+
|
| 351 |
+
room.chatLog = [...(room.chatLog ?? []), msg].slice(-200)
|
| 352 |
+
await setRoom(roomId, room)
|
| 353 |
+
|
| 354 |
+
io.to(roomId).emit("chatNew", msg)
|
| 355 |
+
} catch (e) {
|
| 356 |
+
console.error("chatMessage failed:", e)
|
| 357 |
+
}
|
| 358 |
+
})
|
| 359 |
+
// =======================
|
| 360 |
}
|
| 361 |
)
|
| 362 |
|
|
|
|
| 373 |
},
|
| 374 |
}
|
| 375 |
|
| 376 |
+
export default ioHandler
|