PLAY COKO NETWORK SDK · 0.2.0

Invite friends into your game.

Browser networking for WebRTC negotiation, data channels, reconnection, spectators, and platform invites.

Standard web games do not need the SDK.

친구 초대와 대전을 연동할 때 사용하세요. v0.2은 리프트 아레나 기준의 초기 규격입니다. SDP·ICE 교환, 데이터 채널과 전송 연결 복구는 SDK가 처리합니다. 경기 규칙, 상태 동기화, 일시정지와 입력 확인은 게임에서 구현합니다.

1. HTML에서 불러오기

index.html에서 게임 코드보다 먼저 불러옵니다. 아래 두 예약 경로는 업로드 후 플랫폼이 제공합니다. 공개 URL과 게임 ID만 포함되며 비밀키를 넣지 않습니다.

<script src="./platform-config.js"></script>
<script src="./platform-network.js"></script>
<script src="./game.js"></script>

game.json에 "network": "play-v1"을 지정하세요. 로컬 게임 폴더만 열어서는 예약 경로를 사용할 수 없으므로 업로드 미리보기에서 확인하세요.

2. 모임 만들기와 초대

아래는 모임 생성 부분의 예시입니다. 네트워크 오류는 게임 UI에 표시하고, 반환된 토큰은 URL이나 채팅에 노출하지 마세요.

try {
  const member = await PlatformNetwork.request(
    "lobbies", "POST", { nickname: "푸른기사" }
  );
  const inviteUrl = PlatformNetwork.invite(member.lobbyId);
  // inviteUrl을 게임의 초대 UI에 표시합니다.
  // member.token은 본인 요청에만 사용합니다.
} catch (error) {
  // error.message를 오류 UI에 표시합니다.
}

입장은 lobbies/모임ID/join에 POST, 모임 상태는 lobbies/모임ID/poll에 GET으로 요청합니다. 상태 조회에는 네 번째 인자로 회원 토큰을 전달합니다. 연결 루프와 경기 상태 교환의 전체 예시는 ZIP의 lobby.js와 multiplayer.js를 참고하세요. 토큰은 메모리에만 보관하세요.

3. 배정된 경기 연결하기

모임 poll 응답의 assignment로 연결합니다. 동일 matchId에는 한 번만 만들고, 경기가 바뀌거나 나갈 때 close()를 호출하세요.

const rtcConfig = await PlatformNetwork.request("config");
const connection = PlatformNetwork.createConnection({
  room: assignment.id,
  token: assignment.token,
  role: assignment.role, // host 또는 guest
  rtcConfig,
  onopen: () => showConnected(),
  onmessage: data => applyGameMessage(data),
  ondisconnect: () => pauseGame(),
  onerror: error => showError(error.message),
});
connection.start();
connection.send({ type: "input", unit: 0, x: 300, y: 450 });
// 종료 시: connection.close();

send()는 전송 가능 여부를 반환합니다. 입력 확인·재전송과 스냅샷 순서는 게임이 관리합니다. SDK는 끊어진 전송을 최대 30초 재시도하며, 양방향 응답을 확인한 뒤 게임을 재개하세요.

관전은 signal 콜백으로 모임 signal API를 연결하고 receiveSignal()에 수신 신호를 전달합니다. channelOptions로 비순차·재전송 없는 관전 채널을 선택할 수 있습니다. 예제 ZIP에 전체 구현이 포함되어 있습니다.

4. 제공 API

API하는 일
request(path, method?, data?, token?)게임별 연결 서비스에 요청합니다. 기본 메서드는 GET이며 Promise로 결과를 반환합니다. 타임아웃은 12초입니다.
createConnection(options)대전 연결을 만들고 start()로 시그널링을 시작합니다. send(data), restart(), close()를 제공합니다. 모임 가입 후 request("config")로 인증된 ICE 서버 설정을 받습니다.
invite(lobbyId)플랫폼 플레이 페이지의 초대 URL을 반환하고 부모 페이지에 초대 이벤트를 보냅니다.
version현재 SDK 버전 문자열: 0.2.0

연동 전 확인할 점

  • 운영 환경의 멀티플레이는 게시 승인 후 사용할 수 있습니다. 승인 전에는 싱글·AI 흐름을 확인하세요.
  • 게임 파일은 상대 경로를 사용하세요. 외부 스크립트·임의 API·서비스 워커는 현재 실행 정책으로 제한됩니다.
  • Supabase 서비스 키와 TURN 공유 비밀키를 게임 파일에 넣지 마세요. TURN 임시 인증정보는 모임 인증 후 서버에서 발급합니다.
  • 결제, 공식 랭킹, 호스트 이전, 페이지 새로고침 후 경기 복원은 현재 SDK에 포함되지 않습니다.
전체 업로드 규격 보기 →

Account profiles and personal records

Published games are added to the signed-in player’s library when their entry page is ready. The SDK can also load and save a game nickname and settings without receiving login tokens.

const state = await PlatformStorage.init();
if (state.mode === 'account') {
  const saved = await PlatformStorage.saveProfile({
    nickname: 'Knight',
    settings: { sound: false },
    revision: state.profile.revision,
  });
  state.profile = saved.profile;
}

Guest settings stay local; preview does not write account data. A SAVE_CONFLICT means another device changed the profile: reload it with load() before resolving the conflict. General progress-save slots and ranked results are not provided yet.