Newer
Older
PixelPaintWar / apps / server / src / network / handlers / game / services / roomViewerSyncContext.ts
/**
 * roomViewerSyncContext
 * ルーム内の受信者走査で使う共通コンテキストを提供する
 * SyncService間で重複する受信者解決処理を集約する
 */
import type { domain } from "@repo/shared";
import {
  getConnectedSocketIdsInRoom,
  getRoomPlayers,
  type RuntimeResolverDeps,
} from "../runtime/gameRuntimeResolvers";

type RoomId = domain.room.Room["roomId"];

type ViewerId = string;

/** ルーム受信者走査の実行入力 */
export type ForEachRoomViewerParams = {
  runtimeDeps: RuntimeResolverDeps;
  roomId: RoomId;
  run: (params: {
    viewerId: ViewerId;
    viewer: domain.game.player.PlayerData;
    roomPlayers: domain.game.player.PlayerData[];
  }) => void;
};

/** ルーム内の接続済み受信者を列挙し,各受信者ごとに処理を実行する */
export const forEachRoomViewer = ({
  runtimeDeps,
  roomId,
  run,
}: ForEachRoomViewerParams): void => {
  const roomPlayers = getRoomPlayers(runtimeDeps, roomId);
  if (roomPlayers.length === 0) {
    return;
  }

  const roomPlayerById = new Map(roomPlayers.map((player) => [player.id, player]));
  const recipientSocketIds = getConnectedSocketIdsInRoom(runtimeDeps, roomId);

  recipientSocketIds.forEach((viewerId) => {
    const viewer = roomPlayerById.get(viewerId);
    if (!viewer) {
      return;
    }

    run({
      viewerId,
      viewer,
      roomPlayers,
    });
  });
};