Newer
Older
PixelPaintWar / apps / server / src / network / handlers / socketEventBridge.ts
/**
 * socketEventBridge
 * サーバー向けソケットイベント bridge を生成する
 * クライアント受信イベントを型安全に購読する入口を提供する
 */
import type { Socket } from "socket.io";
import {
  createSocketEventBridge,
  type ClientToServerEventPayloadMap,
  type SocketBridgeTarget,
  type ServerToClientEventPayloadMap,
} from "@repo/shared";

/** サーバー向けの型付きソケットイベント bridge を生成する */
export const createServerSocketOnBridge = (socket: Socket) => {
  const bridgeTarget: SocketBridgeTarget = {
    on: (event, callback) => {
      socket.on(event, callback);
    },
    once: (event, callback) => {
      socket.once(event, callback);
    },
    off: (event, callback) => {
      socket.off(event, callback);
    },
    emit: (event, payload) => {
      if (payload === undefined) {
        socket.emit(event);
        return;
      }

      socket.emit(event, payload);
    },
  };

  const { onEvent, onceEvent } = createSocketEventBridge<
    ClientToServerEventPayloadMap,
    ServerToClientEventPayloadMap
  >(bridgeTarget);

  return {
    onEvent,
    onceEvent,
  };
};