diff --git a/apps/server/src/network/handlers/game/createGameEventPublisher.ts b/apps/server/src/network/handlers/game/createGameEventPublisher.ts new file mode 100644 index 0000000..de657b7 --- /dev/null +++ b/apps/server/src/network/handlers/game/createGameEventPublisher.ts @@ -0,0 +1,55 @@ +import { Server } from "socket.io"; +import { protocol } from "@repo/shared"; +import type { gridMapTypes, playerTypes } from "@repo/shared"; +import { createEmitToAll } from "@server/network/adapters/socketEmitters"; +import type { CommonHandlerContext } from "../CommonHandler"; + +export type GameEventPublisher = { + publishPong: (payload: { clientTime: number; serverTime: number }) => void; + publishUpdatePlayer: (roomId: string, playerData: playerTypes.PlayerData) => void; + publishMapCellUpdates: (roomId: string, cellUpdates: gridMapTypes.CellUpdate[]) => void; + publishGameEnd: (roomId: string) => void; + publishGameStartToRoom: (roomId: string, payload: { startTime: number }) => void; + publishCurrentPlayers: (players: playerTypes.PlayerData[]) => void; + publishGameStartToSocket: (payload: { startTime: number }) => void; +}; + +export type GameDisconnectPublisher = { + publishPlayerRemoved: (removedPlayerId: string) => void; +}; + +export const createGameEventPublisher = (common: CommonHandlerContext): GameEventPublisher => { + return { + publishPong: (payload: { clientTime: number; serverTime: number }) => { + common.emitToSocket(protocol.SocketEvents.PONG, payload); + }, + publishUpdatePlayer: (roomId: string, playerData: playerTypes.PlayerData) => { + common.emitToRoom(roomId, protocol.SocketEvents.UPDATE_PLAYER, playerData); + }, + publishMapCellUpdates: (roomId: string, cellUpdates: gridMapTypes.CellUpdate[]) => { + common.emitToRoom(roomId, protocol.SocketEvents.UPDATE_MAP_CELLS, cellUpdates); + }, + publishGameEnd: (roomId: string) => { + common.emitToRoom(roomId, protocol.SocketEvents.GAME_END); + }, + publishGameStartToRoom: (roomId: string, payload: { startTime: number }) => { + common.emitToRoom(roomId, protocol.SocketEvents.GAME_START, payload); + }, + publishCurrentPlayers: (players: playerTypes.PlayerData[]) => { + common.emitToSocket(protocol.SocketEvents.CURRENT_PLAYERS, players); + }, + publishGameStartToSocket: (payload: { startTime: number }) => { + common.emitToSocket(protocol.SocketEvents.GAME_START, payload); + }, + }; +}; + +export const createGameDisconnectPublisher = (io: Server): GameDisconnectPublisher => { + const emitToAll = createEmitToAll(io); + + return { + publishPlayerRemoved: (removedPlayerId: string) => { + emitToAll(protocol.SocketEvents.REMOVE_PLAYER, removedPlayerId); + }, + }; +}; diff --git a/apps/server/src/network/handlers/game/handleGameDisconnect.ts b/apps/server/src/network/handlers/game/handleGameDisconnect.ts index b57e17f..bb732f4 100644 --- a/apps/server/src/network/handlers/game/handleGameDisconnect.ts +++ b/apps/server/src/network/handlers/game/handleGameDisconnect.ts @@ -1,21 +1,18 @@ import { Server } from "socket.io"; import { GameManager } from "@server/domains/game/GameManager"; -import { protocol } from "@repo/shared"; import { disconnectUseCase } from "@server/domains/game/application/useCases/disconnectUseCase"; -import { createEmitToAll } from "@server/network/adapters/socketEmitters"; +import { createGameDisconnectPublisher } from "./createGameEventPublisher"; export const handleGameDisconnect = ( io: Server, gameManager: GameManager, playerId: string ) => { - const emitToAll = createEmitToAll(io); + const gameDisconnectPublisher = createGameDisconnectPublisher(io); disconnectUseCase({ gameManager, playerId, - publishPlayerRemoved: (removedPlayerId) => { - emitToAll(protocol.SocketEvents.REMOVE_PLAYER, removedPlayerId); - }, + publishPlayerRemoved: gameDisconnectPublisher.publishPlayerRemoved, }); }; diff --git a/apps/server/src/network/handlers/game/registerGameHandlers.ts b/apps/server/src/network/handlers/game/registerGameHandlers.ts index d60b385..ef038b3 100644 --- a/apps/server/src/network/handlers/game/registerGameHandlers.ts +++ b/apps/server/src/network/handlers/game/registerGameHandlers.ts @@ -8,6 +8,7 @@ import { readyForGameUseCase } from "@server/domains/game/application/useCases/readyForGameUseCase"; import { movePlayerUseCase } from "@server/domains/game/application/useCases/movePlayerUseCase"; import { createCommonHandlerContext } from "@server/network/handlers/CommonHandler"; +import { createGameEventPublisher } from "./createGameEventPublisher"; export const registerGameHandlers = ( io: Server, @@ -16,13 +17,12 @@ roomManager: RoomManager ) => { const common = createCommonHandlerContext(io, socket); + const gamePublisher = createGameEventPublisher(common); socket.on(protocol.SocketEvents.PING, (clientTime: number) => { pingUseCase({ clientTime, - publishPong: (payload) => { - common.emitToSocket(protocol.SocketEvents.PONG, payload); - }, + publishPong: gamePublisher.publishPong, }); }); @@ -31,18 +31,10 @@ ownerId: socket.id, gameManager, roomManager, - publishUpdatePlayer: (roomId, playerData) => { - common.emitToRoom(roomId, protocol.SocketEvents.UPDATE_PLAYER, playerData); - }, - publishMapCellUpdates: (roomId, cellUpdates) => { - common.emitToRoom(roomId, protocol.SocketEvents.UPDATE_MAP_CELLS, cellUpdates); - }, - publishGameEnd: (roomId) => { - common.emitToRoom(roomId, protocol.SocketEvents.GAME_END); - }, - publishGameStart: (roomId, payload) => { - common.emitToRoom(roomId, protocol.SocketEvents.GAME_START, payload); - }, + publishUpdatePlayer: gamePublisher.publishUpdatePlayer, + publishMapCellUpdates: gamePublisher.publishMapCellUpdates, + publishGameEnd: gamePublisher.publishGameEnd, + publishGameStart: gamePublisher.publishGameStartToRoom, }); }); @@ -53,12 +45,8 @@ socketId: socket.id, roomId, gameManager, - publishCurrentPlayers: (players) => { - common.emitToSocket(protocol.SocketEvents.CURRENT_PLAYERS, players); - }, - publishGameStart: (payload) => { - common.emitToSocket(protocol.SocketEvents.GAME_START, payload); - }, + publishCurrentPlayers: gamePublisher.publishCurrentPlayers, + publishGameStart: gamePublisher.publishGameStartToSocket, }); }); diff --git a/apps/server/src/network/handlers/room/createRoomEventPublisher.ts b/apps/server/src/network/handlers/room/createRoomEventPublisher.ts new file mode 100644 index 0000000..d7c7091 --- /dev/null +++ b/apps/server/src/network/handlers/room/createRoomEventPublisher.ts @@ -0,0 +1,29 @@ +import { Server } from "socket.io"; +import { protocol } from "@repo/shared"; +import { createEmitToRoom } from "@server/network/adapters/socketEmitters"; +import type { roomTypes } from "@repo/shared"; +import type { CommonHandlerContext } from "../CommonHandler"; + +export type RoomEventPublisher = { + publishRoomUpdate: (roomId: string, room: roomTypes.Room) => void; +}; + +export const createRoomEventPublisher = ( + common: CommonHandlerContext +): RoomEventPublisher => { + return { + publishRoomUpdate: (roomId: string, room: roomTypes.Room) => { + common.emitToRoom(roomId, protocol.SocketEvents.ROOM_UPDATE, room); + }, + }; +}; + +export const createRoomDisconnectPublisher = (io: Server): RoomEventPublisher => { + const emitToRoom = createEmitToRoom(io); + + return { + publishRoomUpdate: (roomId: string, room: roomTypes.Room) => { + emitToRoom(roomId, protocol.SocketEvents.ROOM_UPDATE, room); + }, + }; +}; diff --git a/apps/server/src/network/handlers/room/handleRoomDisconnect.ts b/apps/server/src/network/handlers/room/handleRoomDisconnect.ts index fce362d..66d9bb1 100644 --- a/apps/server/src/network/handlers/room/handleRoomDisconnect.ts +++ b/apps/server/src/network/handlers/room/handleRoomDisconnect.ts @@ -1,21 +1,18 @@ import { Server, Socket } from "socket.io"; import { RoomManager } from "@server/domains/room/RoomManager"; -import { protocol } from "@repo/shared"; import { roomDisconnectUseCase } from "@server/domains/room/application/useCases/roomDisconnectUseCase"; -import { createEmitToRoom } from "@server/network/adapters/socketEmitters"; +import { createRoomDisconnectPublisher } from "./createRoomEventPublisher"; export const handleRoomDisconnect = ( io: Server, socket: Socket, roomManager: RoomManager ) => { - const emitToRoom = createEmitToRoom(io); + const roomDisconnectPublisher = createRoomDisconnectPublisher(io); roomDisconnectUseCase({ roomManager, socketId: socket.id, - publishRoomUpdate: (roomId, room) => { - emitToRoom(roomId, protocol.SocketEvents.ROOM_UPDATE, room); - }, + publishRoomUpdate: roomDisconnectPublisher.publishRoomUpdate, }); }; diff --git a/apps/server/src/network/handlers/room/registerRoomHandlers.ts b/apps/server/src/network/handlers/room/registerRoomHandlers.ts index c4a236b..be531ca 100644 --- a/apps/server/src/network/handlers/room/registerRoomHandlers.ts +++ b/apps/server/src/network/handlers/room/registerRoomHandlers.ts @@ -4,6 +4,7 @@ import type { roomTypes } from "@repo/shared"; import { joinRoomUseCase } from "@server/domains/room/application/useCases/joinRoomUseCase"; import { createCommonHandlerContext } from "@server/network/handlers/CommonHandler"; +import { createRoomEventPublisher } from "./createRoomEventPublisher"; export const registerRoomHandlers = ( io: Server, @@ -11,6 +12,7 @@ roomManager: RoomManager ) => { const common = createCommonHandlerContext(io, socket); + const roomPublisher = createRoomEventPublisher(common); socket.on(protocol.SocketEvents.JOIN_ROOM, (data: roomTypes.JoinRoomPayload) => { const { roomId } = data; @@ -21,9 +23,7 @@ roomManager, socketId: socket.id, data, - publishRoomUpdate: (roomId, room) => { - common.emitToRoom(roomId, protocol.SocketEvents.ROOM_UPDATE, room); - }, + publishRoomUpdate: roomPublisher.publishRoomUpdate, }); }); };