Skip to content

WebSocket 서버를 구축할 때 각 연결된 클라이언트와 관련된 일부 식별 정보 또는 컨텍스트를 저장하는 것이 일반적으로 필요합니다.

Bun.serve() 를 사용하면 이 "컨텍스트 데이터" 는 server.upgrade() 호출에서 data 매개변수를 전달하여 연결이 처음 업그레이드될 때 설정됩니다.

ts
Bun.serve({
  fetch(req, server) {
    const success = server.upgrade(req, {
      data: {
        socketId: Math.random(),
      },
    });
    if (success) return undefined;

    // HTTP 요청을 정상적으로 처리
    // ...
  },
  websocket: {
    // TypeScript: ws.data 의 타입을 이렇게 지정합니다
    data: {} as { socketId: number },

    // WebSocket 핸들러 정의
    async message(ws, message) {
      // 컨텍스트 데이터는 WebSocket 인스턴스의 `data` 속성에서 사용할 수 있습니다
      console.log(`${ws.data.socketId} 에서 ${message} 받음`);
    },
  },
});

연결된 클라이언트를 식별하기 위해 들어오는 요청에서 쿠키/헤더를 읽는 것이 일반적입니다.

ts
type WebSocketData = {
  createdAt: number;
  token: string;
  userId: string;
};

Bun.serve({
  async fetch(req, server) {
    // 라이브러리를 사용하여 쿠키 파싱
    const cookies = parseCookies(req.headers.get("Cookie"));
    const token = cookies["X-Token"];
    const user = await getUserFromToken(token);

    const upgraded = server.upgrade(req, {
      data: {
        createdAt: Date.now(),
        token: cookies["X-Token"],
        userId: user.id,
      },
    });

    if (upgraded) return undefined;
  },
  websocket: {
    // TypeScript: ws.data 의 타입을 이렇게 지정합니다
    data: {} as WebSocketData,

    async message(ws, message) {
      // 메시지를 데이터베이스에 저장
      await saveMessageToDatabase({
        message: String(message),
        userId: ws.data.userId,
      });
    },
  },
});

Bun by www.bunjs.com.cn 편집