Newer
Older
PixelPaintWar / apps / server / src / domains / room / RoomHandler.ts
import { Server, Socket } from "socket.io";
import { RoomManager } from "./RoomManager";
import { protocol } from "@repo/shared";
import type { roomTypes } from "@repo/shared";
import { executeJoinRoomUseCase } from "./application/useCases/executeJoinRoomUseCase";
import { executeRoomDisconnectUseCase } from "./application/useCases/executeRoomDisconnectUseCase";

export const registerRoomHandlers = (io: Server, socket: Socket, roomManager: RoomManager) => {
  
  socket.on(protocol.SocketEvents.JOIN_ROOM, (data: roomTypes.JoinRoomPayload) => {
    const { roomId } = data;
    
    socket.join(roomId);

    executeJoinRoomUseCase({
      roomManager,
      socketId: socket.id,
      data,
      emitToRoom: (targetRoomId, event, payload) => {
        if (payload === undefined) {
          io.to(targetRoomId).emit(event);
          return;
        }

        io.to(targetRoomId).emit(event, payload);
      },
    });
  });

};

/**
 * 切断時のルームクリーンアップ処理
 */
export const handleRoomDisconnect = (io: Server, socket: Socket, roomManager: RoomManager) => {
  executeRoomDisconnectUseCase({
    roomManager,
    socketId: socket.id,
    emitToRoom: (roomId, event, payload) => {
      if (payload === undefined) {
        io.to(roomId).emit(event);
        return;
      }

      io.to(roomId).emit(event, payload);
    },
  });
};