diff --git a/apps/client/src/network/handlers/socketEventBridge.ts b/apps/client/src/network/handlers/socketEventBridge.ts index 655f720..7c7f602 100644 --- a/apps/client/src/network/handlers/socketEventBridge.ts +++ b/apps/client/src/network/handlers/socketEventBridge.ts @@ -19,16 +19,16 @@ /** クライアント向けの型付きソケットイベント bridge を生成する */ export const createClientSocketEventBridge = (socket: Socket) => { const bridgeTarget: SocketBridgeTarget = { - on: (event, callback) => { - socket.on(event, callback); + on: (event: string, callback: (payload: TPayload) => void) => { + socket.on(event, callback as (payload: unknown) => void); }, - once: (event, callback) => { - socket.once(event, callback); + once: (event: string, callback: (payload: TPayload) => void) => { + socket.once(event, callback as (payload: unknown) => void); }, - off: (event, callback) => { - socket.off(event, callback); + off: (event: string, callback: (payload: TPayload) => void) => { + socket.off(event, callback as (payload: unknown) => void); }, - emit: (event, payload?: unknown) => { + emit: (event: string, payload?: unknown) => { if (payload === undefined) { socket.emit(event); return; diff --git a/apps/client/src/scenes/game/entities/map/GameMapController.ts b/apps/client/src/scenes/game/entities/map/GameMapController.ts index 6213174..da2d52c 100644 --- a/apps/client/src/scenes/game/entities/map/GameMapController.ts +++ b/apps/client/src/scenes/game/entities/map/GameMapController.ts @@ -3,7 +3,7 @@ * 外部からのマップ更新入力をModelとViewへ仲介するコントローラー * 全体更新と差分更新を統一的に扱い,描画同期を提供する */ -import type { gridMapTypes } from '@repo/shared'; +import type { domain } from '@repo/shared'; import type { Container } from 'pixi.js'; import { AppearanceResolver } from '@client/scenes/game/application/AppearanceResolver'; import { GameMapModel } from './GameMapModel'; @@ -29,13 +29,13 @@ } /** 全体マップ状態を反映する */ - public updateMapState(state: gridMapTypes.MapState): void { + public updateMapState(state: domain.gridMap.MapState): void { this.model.applyMapState(state); this.view.renderAll(this.resolveAllCellColors(this.model.getAllTeamIds())); } /** 差分セル更新を反映する */ - public updateCells(updates: gridMapTypes.CellUpdate[]): void { + public updateCells(updates: domain.gridMap.CellUpdate[]): void { this.model.applyUpdates(updates); updates.forEach(({ index }) => { diff --git a/apps/client/src/scenes/game/entities/map/GameMapModel.ts b/apps/client/src/scenes/game/entities/map/GameMapModel.ts index 75b490e..886bdbb 100644 --- a/apps/client/src/scenes/game/entities/map/GameMapModel.ts +++ b/apps/client/src/scenes/game/entities/map/GameMapModel.ts @@ -4,7 +4,7 @@ * 全体更新と差分更新を適用して描画入力用の状態を保持する */ import { config } from '@client/config'; -import type { gridMapTypes } from '@repo/shared'; +import type { domain } from '@repo/shared'; /** マップセル状態の計算責務を担うモデル */ export class GameMapModel { @@ -17,7 +17,7 @@ } /** 全体マップ状態を適用する */ - public applyMapState(state: gridMapTypes.MapState): void { + public applyMapState(state: domain.gridMap.MapState): void { const maxLength = Math.min(this.cellTeamIds.length, state.gridColors.length); for (let index = 0; index < maxLength; index++) { this.cellTeamIds[index] = state.gridColors[index]; @@ -25,7 +25,7 @@ } /** 差分セル更新を適用する */ - public applyUpdates(updates: gridMapTypes.CellUpdate[]): void { + public applyUpdates(updates: domain.gridMap.CellUpdate[]): void { updates.forEach(({ index, teamId }) => { if (!this.isValidIndex(index)) return; this.cellTeamIds[index] = teamId; diff --git a/apps/client/src/scenes/game/entities/player/PlayerController.ts b/apps/client/src/scenes/game/entities/player/PlayerController.ts index 3543d25..46367a8 100644 --- a/apps/client/src/scenes/game/entities/player/PlayerController.ts +++ b/apps/client/src/scenes/game/entities/player/PlayerController.ts @@ -3,7 +3,7 @@ * 外部入出力とModel/Viewの橋渡しを担うコントローラー群 * ローカル入力適用,リモート更新適用,描画同期を分離して扱う */ -import type { playerTypes } from "@repo/shared"; +import type { domain } from "@repo/shared"; import { config } from "@client/config"; import { AppearanceResolver } from "@client/scenes/game/application/AppearanceResolver"; import { BombHitBlinkRenderer } from "@client/scenes/game/entities/bomb/BombHitBlinkRenderer"; @@ -18,7 +18,7 @@ }; /** リモート移動更新を表す型 */ -export type RemoteUpdate = Partial; +export type RemoteUpdate = Partial; /** * ローカル用コントローラーとリモート用コントローラーの共通基底 @@ -30,7 +30,7 @@ /** 共通初期化としてModelとViewを生成する */ protected constructor( - data: playerTypes.PlayerData, + data: domain.player.PlayerData, isLocal: boolean, appearanceResolver: AppearanceResolver, ) { @@ -57,12 +57,12 @@ } /** 現在座標を取得する */ - public getPosition(): playerTypes.MovePayload { + public getPosition(): domain.player.MovePayload { return this.model.getPosition(); } /** 外部送信用スナップショットを取得する */ - public getSnapshot(): playerTypes.PlayerData { + public getSnapshot(): domain.player.PlayerData { return this.model.getSnapshot(); } @@ -82,7 +82,7 @@ export class LocalPlayerController extends BasePlayerController { /** ローカルプレイヤー用コントローラーを初期化する */ constructor( - data: playerTypes.PlayerData, + data: domain.player.PlayerData, appearanceResolver: AppearanceResolver, ) { super(data, true, appearanceResolver); @@ -104,7 +104,7 @@ export class RemotePlayerController extends BasePlayerController { /** リモートプレイヤー用コントローラーを初期化する */ constructor( - data: playerTypes.PlayerData, + data: domain.player.PlayerData, appearanceResolver: AppearanceResolver, ) { super(data, false, appearanceResolver); diff --git a/apps/client/src/scenes/game/entities/player/PlayerModel.ts b/apps/client/src/scenes/game/entities/player/PlayerModel.ts index 1e2882f..7a17553 100644 --- a/apps/client/src/scenes/game/entities/player/PlayerModel.ts +++ b/apps/client/src/scenes/game/entities/player/PlayerModel.ts @@ -4,7 +4,7 @@ * ローカル移動,リモート目標座標,送信スナップショットを管理する */ import { config } from "@client/config"; -import type { playerTypes } from "@repo/shared"; +import type { domain } from "@repo/shared"; /** プレイヤーの座標計算と補間計算を管理するモデル */ export class PlayerModel { @@ -18,7 +18,7 @@ private targetGridY: number; /** 共有プレイヤー情報から初期状態を構築する */ - constructor(data: playerTypes.PlayerData) { + constructor(data: domain.player.PlayerData) { this.id = data.id; this.name = data.name; this.teamId = data.teamId; @@ -29,12 +29,12 @@ } /** 現在座標を取得する */ - public getPosition(): playerTypes.MovePayload { + public getPosition(): domain.player.MovePayload { return { x: this.gridX, y: this.gridY }; } /** 送信用スナップショットを取得する */ - public getSnapshot(): playerTypes.PlayerData { + public getSnapshot(): domain.player.PlayerData { return { id: this.id, name: this.name, @@ -64,7 +64,7 @@ } /** リモート更新の目標座標を設定する */ - public setRemoteTarget(update: Partial): void { + public setRemoteTarget(update: Partial): void { if (update.x !== undefined && this.isFiniteNumber(update.x)) this.targetGridX = update.x; if (update.y !== undefined && this.isFiniteNumber(update.y)) diff --git a/apps/client/src/scenes/lobby/LobbyScene.tsx b/apps/client/src/scenes/lobby/LobbyScene.tsx index 12ae64a..9683229 100644 --- a/apps/client/src/scenes/lobby/LobbyScene.tsx +++ b/apps/client/src/scenes/lobby/LobbyScene.tsx @@ -1,8 +1,8 @@ import { useEffect, useMemo, useState } from "react"; -import type { roomTypes } from "@repo/shared"; +import type { domain } from "@repo/shared"; type Props = { - room: roomTypes.Room | null; + room: domain.room.Room | null; myId: string | null; onStart: (targetPlayerCount: number) => void; onBackToTitle: () => void; @@ -278,7 +278,7 @@ paddingRight: "10px", }} > - {room.players.map((p: roomTypes.RoomMember) => ( + {room.players.map((p: domain.room.RoomMember) => (
  • void; + onJoin: (payload: domain.room.JoinRoomPayload) => void; // 入室失敗時の表示メッセージ joinErrorMessage: string | null; // 入室リクエスト送信中フラグ diff --git a/apps/server/src/domains/game/GameManager.ts b/apps/server/src/domains/game/GameManager.ts index fa7b906..ce01adc 100644 --- a/apps/server/src/domains/game/GameManager.ts +++ b/apps/server/src/domains/game/GameManager.ts @@ -3,7 +3,7 @@ * ゲームセッション集合の生成,更新,参照管理を統括する */ import type { - gameTypes, + domain, GameResultPayload, PlaceBombPayload, } from "@repo/shared"; @@ -61,7 +61,7 @@ startRoomSession( playerIds: string[], playerNamesById: Record, - onTick: (data: gameTypes.TickData) => void, + onTick: (data: domain.game.TickData) => void, onGameEnd: (payload: GameResultPayload) => void, onBotPlaceBomb?: (ownerId: string, payload: PlaceBombPayload) => void, ) { diff --git a/apps/server/src/domains/game/application/ports/gameUseCasePorts.ts b/apps/server/src/domains/game/application/ports/gameUseCasePorts.ts index a6a84fa..73819f0 100644 --- a/apps/server/src/domains/game/application/ports/gameUseCasePorts.ts +++ b/apps/server/src/domains/game/application/ports/gameUseCasePorts.ts @@ -7,10 +7,8 @@ BombPlacedAckPayload, BombPlacedPayload, PlayerDeadPayload, - gameTypes, - playerTypes, + domain, PlaceBombPayload, - roomTypes, CurrentPlayersPayload, GameResultPayload, GameStartPayload, @@ -25,7 +23,7 @@ startRoomSession( playerIds: string[], playerNamesById: Record, - onTick: (data: gameTypes.TickData) => void, + onTick: (data: domain.game.TickData) => void, onGameEnd: (payload: GameResultPayload) => void, onBotPlaceBomb?: (ownerId: string, payload: PlaceBombPayload) => void, ): void; @@ -34,7 +32,7 @@ /** 準備完了ユースケースが利用するゲーム状態参照入力ポート */ export interface ReadyForGamePort { - getRoomPlayers(): playerTypes.PlayerData[]; + getRoomPlayers(): domain.player.PlayerData[]; getRoomStartTime(): number | undefined; } @@ -56,22 +54,22 @@ players: UpdatePlayersPayload, ): void; publishMapCellUpdatesToRoom( - roomId: roomTypes.Room["roomId"], + roomId: domain.room.Room["roomId"], cellUpdates: UpdateMapCellsPayload, ): void; - publishGameEndToRoom(roomId: roomTypes.Room["roomId"]): void; + publishGameEndToRoom(roomId: domain.room.Room["roomId"]): void; publishGameResultToRoom( - roomId: roomTypes.Room["roomId"], + roomId: domain.room.Room["roomId"], payload: GameResultPayload, ): void; publishGameStartToRoom( - roomId: roomTypes.Room["roomId"], + roomId: domain.room.Room["roomId"], payload: GameStartPayload, ): void; publishCurrentPlayersToSocket(players: CurrentPlayersPayload): void; publishGameStartToSocket(payload: GameStartPayload): void; publishPlayerRemovedToRoom( - roomId: roomTypes.Room["roomId"], + roomId: domain.room.Room["roomId"], removedPlayerId: RemovePlayerPayload, ): void; } @@ -79,7 +77,7 @@ /** 爆弾ユースケースが利用する送信出力ポート */ export interface BombOutputPort { publishBombPlacedToOthersInRoom( - roomId: roomTypes.Room["roomId"], + roomId: domain.room.Room["roomId"], ownerSocketId: string, payload: BombPlacedPayload, ): void; @@ -88,7 +86,7 @@ payload: BombPlacedAckPayload, ): void; publishPlayerDeadToOthersInRoom( - roomId: roomTypes.Room["roomId"], + roomId: domain.room.Room["roomId"], deadPlayerId: string, payload: PlayerDeadPayload, ): void; diff --git a/apps/server/src/domains/game/application/services/GameRoomSession.ts b/apps/server/src/domains/game/application/services/GameRoomSession.ts index c932481..abbd935 100644 --- a/apps/server/src/domains/game/application/services/GameRoomSession.ts +++ b/apps/server/src/domains/game/application/services/GameRoomSession.ts @@ -8,7 +8,7 @@ logResults, logScopes, } from "@server/logging/index"; -import type { gameTypes, GameResultPayload } from "@repo/shared"; +import type { domain, GameResultPayload } from "@repo/shared"; import { config } from "@server/config"; import { GameLoop } from "../../loop/GameLoop"; import { Player } from "../../entities/player/Player.js"; @@ -57,7 +57,7 @@ public start( tickRate: number, - onTick: (data: gameTypes.TickData) => void, + onTick: (data: domain.game.TickData) => void, onGameEnd: (payload: GameResultPayload) => void, onBotPlaceBomb?: (ownerId: string, payload: PlaceBombPayload) => void, ): void { diff --git a/apps/server/src/domains/game/application/services/GameSessionLifecycleService.ts b/apps/server/src/domains/game/application/services/GameSessionLifecycleService.ts index a8e0da7..e5d05ec 100644 --- a/apps/server/src/domains/game/application/services/GameSessionLifecycleService.ts +++ b/apps/server/src/domains/game/application/services/GameSessionLifecycleService.ts @@ -4,7 +4,7 @@ */ import { config } from "@server/config"; import type { - gameTypes, + domain, GameResultPayload, PlaceBombPayload, } from "@repo/shared"; @@ -64,7 +64,7 @@ public startRoomSession( playerIds: string[], playerNamesById: Record, - onTick: (data: gameTypes.TickData) => void, + onTick: (data: domain.game.TickData) => void, onGameEnd: (payload: GameResultPayload) => void, onBotPlaceBomb?: (ownerId: string, payload: PlaceBombPayload) => void, ) { diff --git a/apps/server/src/domains/game/application/useCases/movePlayerUseCase.ts b/apps/server/src/domains/game/application/useCases/movePlayerUseCase.ts index 400b1ae..0243dca 100644 --- a/apps/server/src/domains/game/application/useCases/movePlayerUseCase.ts +++ b/apps/server/src/domains/game/application/useCases/movePlayerUseCase.ts @@ -2,13 +2,13 @@ * movePlayerUseCase * プレイヤー移動入力を受け取り,ゲーム管理へ反映する */ -import type { playerTypes } from "@repo/shared"; +import type { domain } from "@repo/shared"; import type { MovePlayerPort } from "../ports/gameUseCasePorts"; type MovePlayerUseCaseParams = { gameManager: MovePlayerPort; playerId: string; - move: playerTypes.MovePayload; + move: domain.player.MovePayload; }; /** プレイヤー移動入力をゲーム管理へ委譲する */ diff --git a/apps/server/src/domains/game/entities/map/MapStore.ts b/apps/server/src/domains/game/entities/map/MapStore.ts index f116f44..5e019ee 100644 --- a/apps/server/src/domains/game/entities/map/MapStore.ts +++ b/apps/server/src/domains/game/entities/map/MapStore.ts @@ -2,7 +2,7 @@ * MapStore * 塗り状態グリッドと差分更新キューを保持して提供する */ -import type { gridMapTypes } from "@repo/shared"; +import type { domain } from "@repo/shared"; import { createInitialGridColors } from "./mapGrid.js"; import { paintCellIfChanged } from "./mapPainting.js"; import { drainPendingUpdates } from "./mapUpdates.js"; @@ -12,7 +12,7 @@ // 全マスの現在の色(teamId)を保持 private gridColors: number[]; // 次回の送信ループで送る差分リスト - private pendingUpdates: gridMapTypes.CellUpdate[]; + private pendingUpdates: domain.gridMap.CellUpdate[]; constructor() { // 初期状態は -1 (無色) などで初期化 @@ -35,7 +35,7 @@ /** * 溜まっている差分を取得し,キューをクリアする(ループ送信時に使用) */ - public getAndClearUpdates(): gridMapTypes.CellUpdate[] { + public getAndClearUpdates(): domain.gridMap.CellUpdate[] { return drainPendingUpdates(this.pendingUpdates); } diff --git a/apps/server/src/domains/game/entities/map/mapPainting.ts b/apps/server/src/domains/game/entities/map/mapPainting.ts index 8ffe9fb..d1916d7 100644 --- a/apps/server/src/domains/game/entities/map/mapPainting.ts +++ b/apps/server/src/domains/game/entities/map/mapPainting.ts @@ -2,11 +2,11 @@ * mapPainting * マップセルの塗り更新と差分追加処理を提供する */ -import type { gridMapTypes } from "@repo/shared"; +import type { domain } from "@repo/shared"; type PaintCellParams = { gridColors: number[]; - pendingUpdates: gridMapTypes.CellUpdate[]; + pendingUpdates: domain.gridMap.CellUpdate[]; index: number; teamId: number; }; diff --git a/apps/server/src/domains/game/entities/map/mapUpdates.ts b/apps/server/src/domains/game/entities/map/mapUpdates.ts index 9c51618..79eed8e 100644 --- a/apps/server/src/domains/game/entities/map/mapUpdates.ts +++ b/apps/server/src/domains/game/entities/map/mapUpdates.ts @@ -2,12 +2,12 @@ * mapUpdates * マップ差分キューの取り出しとクリア処理を提供する */ -import type { gridMapTypes } from "@repo/shared"; +import type { domain } from "@repo/shared"; /** 差分キューを配列として返却し,キューを空にする */ export const drainPendingUpdates = ( - pendingUpdates: gridMapTypes.CellUpdate[] -): gridMapTypes.CellUpdate[] => { + pendingUpdates: domain.gridMap.CellUpdate[] +): domain.gridMap.CellUpdate[] => { const updates = [...pendingUpdates]; pendingUpdates.length = 0; return updates; diff --git a/apps/server/src/domains/game/entities/player/Player.ts b/apps/server/src/domains/game/entities/player/Player.ts index fc4daa5..89b3278 100644 --- a/apps/server/src/domains/game/entities/player/Player.ts +++ b/apps/server/src/domains/game/entities/player/Player.ts @@ -2,10 +2,9 @@ * Player * サーバー側で保持するプレイヤー状態モデルを定義する */ -import type { playerTypes } from "@repo/shared"; -// configのimportは不要になります +import type { domain } from "@repo/shared"; -export class Player implements playerTypes.PlayerData { +export class Player implements domain.player.PlayerData { public id: string; public name: string; public x: number = 0; diff --git a/apps/server/src/domains/game/entities/player/playerPosition.ts b/apps/server/src/domains/game/entities/player/playerPosition.ts index 0a2112c..700b0da 100644 --- a/apps/server/src/domains/game/entities/player/playerPosition.ts +++ b/apps/server/src/domains/game/entities/player/playerPosition.ts @@ -2,10 +2,10 @@ * playerPosition * プレイヤー座標からマップ上のセル位置を解決する */ -import { gridMapLogic } from "@repo/shared"; +import { domain } from "@repo/shared"; import { Player } from "./Player.js"; /** プレイヤー座標に対応するグリッドインデックスを返す */ export const getPlayerGridIndex = (player: Player): number | null => { - return gridMapLogic.getGridIndexFromPosition(player.x, player.y); + return domain.gridMap.getGridIndexFromPosition(player.x, player.y); }; diff --git a/apps/server/src/domains/game/loop/GameLoop.ts b/apps/server/src/domains/game/loop/GameLoop.ts index 339c05d..7497a75 100644 --- a/apps/server/src/domains/game/loop/GameLoop.ts +++ b/apps/server/src/domains/game/loop/GameLoop.ts @@ -6,7 +6,7 @@ import { MapStore } from "../entities/map/MapStore"; import { getPlayerGridIndex } from "../entities/player/playerPosition.js"; import { config } from "@server/config"; -import type { gameTypes, PlaceBombPayload } from "@repo/shared"; +import type { domain, PlaceBombPayload } from "@repo/shared"; import { logEvent } from "@server/logging/logger"; import { gameDomainLogEvents, @@ -25,7 +25,7 @@ private endMonotonicTimeMs: number = 0; private nextTickAtMs: number = 0; private readonly maxCatchUpTicks: number = 3; - private lastSentPlayers: Map = + private lastSentPlayers: Map = new Map(); private botAiService: BotAiService = new BotAiService(); @@ -34,7 +34,7 @@ private tickRate: number, private players: Map, private mapStore: MapStore, - private onTick: (data: gameTypes.TickData) => void, + private onTick: (data: domain.game.TickData) => void, private onGameEnd: () => void, private onBotPlaceBomb?: ( ownerId: string, @@ -143,7 +143,7 @@ }); } - private buildTickData(): gameTypes.TickData { + private buildTickData(): domain.game.TickData { const activePlayerIds = new Set(); const playerUpdates = this.collectChangedPlayerUpdates(activePlayerIds); this.cleanupInactivePlayerSnapshots(activePlayerIds); @@ -156,8 +156,8 @@ private collectChangedPlayerUpdates( activePlayerIds: Set, - ): gameTypes.TickData["playerUpdates"] { - const changedPlayers: gameTypes.TickData["playerUpdates"] = []; + ): domain.game.TickData["playerUpdates"] { + const changedPlayers: domain.game.TickData["playerUpdates"] = []; this.players.forEach((player) => { activePlayerIds.add(player.id); @@ -167,7 +167,7 @@ } // 送信用のプレイヤーデータを構築 - const playerData: gameTypes.PlayerPositionUpdate = { + const playerData: domain.game.PlayerPositionUpdate = { id: player.id, x: player.x, y: player.y, diff --git a/apps/server/src/domains/room/RoomManager.ts b/apps/server/src/domains/room/RoomManager.ts index fc446c6..72f88b1 100644 --- a/apps/server/src/domains/room/RoomManager.ts +++ b/apps/server/src/domains/room/RoomManager.ts @@ -2,7 +2,7 @@ * RoomManager * ルーム状態の保持とルーム操作サービスへの委譲を担うマネージャ */ -import type { roomTypes } from "@repo/shared"; +import type { domain } from "@repo/shared"; import { RoomJoinService } from "./application/services/RoomJoinService"; import { RoomExitService } from "./application/services/RoomExitService"; import { RoomPhaseService } from "./application/services/RoomPhaseService"; @@ -15,7 +15,7 @@ /** ルーム操作の公開インターフェースを提供するマネージャ */ export class RoomManager { - private rooms: Map = new Map(); + private rooms: Map = new Map(); private roomJoinService: RoomJoinService; private roomExitService: RoomExitService; private roomPhaseService: RoomPhaseService; @@ -39,17 +39,17 @@ } // オーナーIDからルームを取得する - public getRoomByOwnerId(ownerId: string): roomTypes.Room | undefined { + public getRoomByOwnerId(ownerId: string): domain.room.Room | undefined { return this.roomQueryService.getRoomByOwnerId(ownerId); } // ルームIDからルームを取得する - public getRoomById(roomId: string): roomTypes.Room | undefined { + public getRoomById(roomId: string): domain.room.Room | undefined { return this.roomQueryService.getRoomById(roomId); } // プレイヤーIDから所属ルームを取得する - public getRoomByPlayerId(playerId: string): roomTypes.Room | undefined { + public getRoomByPlayerId(playerId: string): domain.room.Room | undefined { return this.roomQueryService.getRoomByPlayerId(playerId); } diff --git a/apps/server/src/domains/room/application/ports/roomUseCasePorts.ts b/apps/server/src/domains/room/application/ports/roomUseCasePorts.ts index d72a13c..afd0961 100644 --- a/apps/server/src/domains/room/application/ports/roomUseCasePorts.ts +++ b/apps/server/src/domains/room/application/ports/roomUseCasePorts.ts @@ -2,7 +2,7 @@ * roomUseCasePorts * ルームユースケースが依存する操作ポートを定義する */ -import type { roomTypes } from "@repo/shared"; +import type { domain } from "@repo/shared"; import type { BombHitReportValidationPort, BombPlacementPort, @@ -23,14 +23,14 @@ /** ルーム参加処理の実行結果 */ export type JoinRoomResult = { - room: roomTypes.Room; + room: domain.room.Room; status: "joined" | "duplicate" | "full"; }; /** ルームユースケースが利用する出力ポート */ export interface RoomOutputPort { - publishRoomUpdateToRoom(roomId: roomTypes.Room["roomId"], room: roomTypes.Room): void; - publishJoinRejectedToSocket(payload: roomTypes.JoinRoomRejectedPayload): void; + publishRoomUpdateToRoom(roomId: domain.room.Room["roomId"], room: domain.room.Room): void; + publishJoinRejectedToSocket(payload: domain.room.JoinRoomRejectedPayload): void; } /** ルーム参加ユースケースが利用する参加操作ポート */ @@ -45,18 +45,18 @@ /** 退出処理で更新対象となったルーム情報 */ export type RoomDisconnectResult = { - updatedRooms: roomTypes.Room[]; + updatedRooms: domain.room.Room[]; deletedRoomIds: string[]; }; /** 切断調停で利用するプレイヤー所属ルーム参照ポート */ export interface FindRoomByPlayerPort { - getRoomByPlayerId(playerId: string): roomTypes.Room | undefined; + getRoomByPlayerId(playerId: string): domain.room.Room | undefined; } /** ゲーム開始調停で利用するオーナー所属ルーム参照ポート */ export interface FindRoomByOwnerPort { - getRoomByOwnerId(ownerId: string): roomTypes.Room | undefined; + getRoomByOwnerId(ownerId: string): domain.room.Room | undefined; } /** ゲーム開始調停で利用するルーム状態遷移ポート */ @@ -68,12 +68,12 @@ /** ルーム状態遷移の実行結果 */ export type RoomPhaseTransitionResult = { status: "updated" | "not_found" | "invalid_transition"; - room?: roomTypes.Room; + room?: domain.room.Room; }; /** ルームIDでの存在確認に利用する参照ポート */ export interface FindRoomByIdPort { - getRoomById(roomId: string): roomTypes.Room | undefined; + getRoomById(roomId: string): domain.room.Room | undefined; } /** ルーム参加後にゲームランタイムを確保する操作ポート */ diff --git a/apps/server/src/domains/room/application/services/RoomExitService.ts b/apps/server/src/domains/room/application/services/RoomExitService.ts index 1c54f38..434cfeb 100644 --- a/apps/server/src/domains/room/application/services/RoomExitService.ts +++ b/apps/server/src/domains/room/application/services/RoomExitService.ts @@ -2,17 +2,17 @@ * RoomExitService * ルーム退出処理とオーナー移譲処理を担うサービス */ -import type { roomTypes } from "@repo/shared"; +import type { domain } from "@repo/shared"; import type { RoomDisconnectResult } from "../ports/roomUseCasePorts"; import { logEvent } from "@server/logging/logger"; import { logResults, logScopes, roomDomainLogEvents } from "@server/logging/index"; /** 退出要求に応じてプレイヤー削除とルーム整理を行うサービス */ export class RoomExitService { - constructor(private rooms: Map) {} + constructor(private rooms: Map) {} public removePlayer(socketId: string): RoomDisconnectResult { - const updatedRooms: roomTypes.Room[] = []; + const updatedRooms: domain.room.Room[] = []; const deletedRoomIds: string[] = []; for (const [roomId, room] of this.rooms.entries()) { diff --git a/apps/server/src/domains/room/application/services/RoomQueryService.ts b/apps/server/src/domains/room/application/services/RoomQueryService.ts index 6881df8..3e65a6f 100644 --- a/apps/server/src/domains/room/application/services/RoomQueryService.ts +++ b/apps/server/src/domains/room/application/services/RoomQueryService.ts @@ -2,17 +2,17 @@ * RoomQueryService * ルーム状態の参照系クエリを提供するサービス */ -import type { roomTypes } from "@repo/shared"; +import type { domain } from "@repo/shared"; /** ルームの参照クエリを提供するサービス */ export class RoomQueryService { - constructor(private rooms: Map) {} + constructor(private rooms: Map) {} - public getRoomById(roomId: string): roomTypes.Room | undefined { + public getRoomById(roomId: string): domain.room.Room | undefined { return this.rooms.get(roomId); } - public getRoomByPlayerId(playerId: string): roomTypes.Room | undefined { + public getRoomByPlayerId(playerId: string): domain.room.Room | undefined { for (const room of this.rooms.values()) { if (room.players.some((player) => player.id === playerId)) { return room; @@ -22,7 +22,7 @@ return undefined; } - public getRoomByOwnerId(ownerId: string): roomTypes.Room | undefined { + public getRoomByOwnerId(ownerId: string): domain.room.Room | undefined { for (const room of this.rooms.values()) { if (room.ownerId === ownerId) { return room; diff --git a/apps/server/src/domains/room/application/useCases/joinRoomUseCase.ts b/apps/server/src/domains/room/application/useCases/joinRoomUseCase.ts index f83aa9b..b1f216d 100644 --- a/apps/server/src/domains/room/application/useCases/joinRoomUseCase.ts +++ b/apps/server/src/domains/room/application/useCases/joinRoomUseCase.ts @@ -2,7 +2,7 @@ * joinRoomUseCase * ルーム参加要求を処理し,状態更新を配信するユースケース */ -import type { roomTypes } from "@repo/shared"; +import type { domain } from "@repo/shared"; import type { EnsureGameRuntimePort, JoinRoomPort, @@ -16,7 +16,7 @@ roomManager: JoinRoomPort; runtimeRegistry: EnsureGameRuntimePort; socketId: string; - data: roomTypes.JoinRoomPayload; + data: domain.room.JoinRoomPayload; output: Pick; }; diff --git a/apps/server/src/network/handlers/game/createGameOutputAdapter.ts b/apps/server/src/network/handlers/game/createGameOutputAdapter.ts index f8cac06..6e3945c 100644 --- a/apps/server/src/network/handlers/game/createGameOutputAdapter.ts +++ b/apps/server/src/network/handlers/game/createGameOutputAdapter.ts @@ -7,11 +7,11 @@ import type { BombPlacedAckPayload, BombPlacedPayload, + domain, GameStartPayload, GameResultPayload, PlayerDeadPayload, PongPayload, - roomTypes, CurrentPlayersPayload, RemovePlayerPayload, UpdateMapCellsPayload, @@ -25,7 +25,7 @@ import { createEmitToRoom } from "@server/network/adapters/socketEmitters"; import type { CommonHandlerContext } from "../CommonHandler"; -type RoomId = roomTypes.Room["roomId"]; +type RoomId = domain.room.Room["roomId"]; /** ゲーム出力アダプターのインターフェース */ export type GameOutputAdapter = Omit & BombOutputPort; diff --git a/apps/server/src/network/handlers/game/gameEventOrchestrators.ts b/apps/server/src/network/handlers/game/gameEventOrchestrators.ts index ac74bf6..2f5c26a 100644 --- a/apps/server/src/network/handlers/game/gameEventOrchestrators.ts +++ b/apps/server/src/network/handlers/game/gameEventOrchestrators.ts @@ -4,7 +4,7 @@ * 受信ハンドラからユースケース実行責務を分離する * ランタイム未解決時はNetworkスコープでignored_missing_roomを記録する */ -import { contracts as protocol, type BombHitReportPayload, type PingPayload, type PlaceBombPayload, type playerTypes } from "@repo/shared"; +import { contracts as protocol, type BombHitReportPayload, type PingPayload, type PlaceBombPayload, type domain } from "@repo/shared"; import { readyForGameCoordinator } from "@server/application/coordinators/readyForGameCoordinator"; import { startGameCoordinator } from "@server/application/coordinators/startGameCoordinator"; import { movePlayerUseCase } from "@server/domains/game/application/useCases/movePlayerUseCase"; @@ -84,7 +84,7 @@ /** MOVEイベントを調停して移動ユースケースを実行する */ export const handleMoveEvent = ( deps: GameEventOrchestratorDeps, - move: playerTypes.MovePayload, + move: domain.player.MovePayload, ): void => { const resolved = runWithRuntimeByPlayerId( deps.roomManager, diff --git a/apps/server/src/network/handlers/room/createRoomOutputAdapter.ts b/apps/server/src/network/handlers/room/createRoomOutputAdapter.ts index 00610cd..eebc6f1 100644 --- a/apps/server/src/network/handlers/room/createRoomOutputAdapter.ts +++ b/apps/server/src/network/handlers/room/createRoomOutputAdapter.ts @@ -4,13 +4,13 @@ */ import { Server } from "socket.io"; import { contracts as protocol } from "@repo/shared"; -import type { roomTypes } from "@repo/shared"; +import type { domain } from "@repo/shared"; import type { RoomOutputPort } from "@server/domains/room/application/ports/roomUseCasePorts"; import { createEmitToRoom } from "@server/network/adapters/socketEmitters"; import type { CommonHandlerContext } from "../CommonHandler"; -type RoomId = roomTypes.Room["roomId"]; -type RoomUpdatePayload = roomTypes.Room; +type RoomId = domain.room.Room["roomId"]; +type RoomUpdatePayload = domain.room.Room; /** ルーム出力アダプターのインターフェース */ export type RoomOutputAdapter = RoomOutputPort; @@ -23,7 +23,7 @@ publishRoomUpdateToRoom: (roomId: RoomId, room: RoomUpdatePayload) => { common.emitToRoom(roomId, protocol.SocketEvents.ROOM_UPDATE, room); }, - publishJoinRejectedToSocket: (payload: roomTypes.JoinRoomRejectedPayload) => { + publishJoinRejectedToSocket: (payload: domain.room.JoinRoomRejectedPayload) => { common.emitToSocket(protocol.SocketEvents.ROOM_JOIN_REJECTED, payload); }, }; diff --git a/apps/server/src/network/handlers/room/roomEventOrchestrators.ts b/apps/server/src/network/handlers/room/roomEventOrchestrators.ts index 3de3c7a..16aa634 100644 --- a/apps/server/src/network/handlers/room/roomEventOrchestrators.ts +++ b/apps/server/src/network/handlers/room/roomEventOrchestrators.ts @@ -4,7 +4,7 @@ * 受信ハンドラからユースケース実行責務を分離する * 本ファイルではランタイム未解決ログ対象イベントを扱わない */ -import type { roomTypes } from "@repo/shared"; +import type { domain } from "@repo/shared"; import { joinRoomUseCase } from "@server/domains/room/application/useCases/joinRoomUseCase"; import { logEvent } from "@server/logging/logger"; import { logResults, logScopes, roomUseCaseLogEvents } from "@server/logging/index"; @@ -29,7 +29,7 @@ /** JOIN_ROOMイベントを調停して参加ユースケースを実行する */ export const handleJoinRoomEvent = async ( deps: JoinRoomOrchestratorDeps, - payload: roomTypes.JoinRoomPayload, + payload: domain.room.JoinRoomPayload, ): Promise => { const joinResult = joinRoomUseCase({ roomManager: deps.roomManager, diff --git a/apps/server/src/network/validation/socketPayloadValidators.ts b/apps/server/src/network/validation/socketPayloadValidators.ts index 7f05d71..39941ea 100644 --- a/apps/server/src/network/validation/socketPayloadValidators.ts +++ b/apps/server/src/network/validation/socketPayloadValidators.ts @@ -3,8 +3,7 @@ * ソケット受信ペイロードの型ガードを提供する */ import type { - playerTypes, - roomTypes, + domain, PlaceBombPayload, BombHitReportPayload, } from "@repo/shared"; @@ -27,7 +26,7 @@ /** MOVEイベントのペイロードが移動座標であるか判定する */ export const isMovePayload = ( value: unknown, -): value is playerTypes.MovePayload => { +): value is domain.player.MovePayload => { if (typeof value !== "object" || value === null) { return false; } @@ -79,7 +78,7 @@ /** JOIN_ROOMイベントのペイロードが参加情報であるか判定する */ export const isJoinRoomPayload = ( value: unknown, -): value is roomTypes.JoinRoomPayload => { +): value is domain.room.JoinRoomPayload => { if (typeof value !== "object" || value === null) { return false; }