crystal-p2p-server

crystal-p2p-server

ゲーム固有の状態を解釈しない、WebRTCシグナリング用のCrystalサーバです。

前提

  • Crystal 1.21以降
  • Shards
  • curl

ルームストアはデフォルトでオンメモリです。Redisを使わない場合はRedisサーバを起動する必要はありません。

ビルド

リポジトリのルートから実行します。

cd crystal-p2p-server
shards install
shards build

ビルドが成功すると、bin/p2p-server が作成されます。

設定

設定ファイルを使う場合は、サンプルをコピーします。

cp config.example.yml config.yml

config.yml が存在しない場合も、組み込みのデフォルト値で起動できます。設定ファイルのパスは P2P_CONFIG で変更できます。

主な設定項目は次のとおりです。

host: 0.0.0.0
port: 8080
room_store: memory # memory または redis
default_room_capacity: 2
max_room_capacity: 8
room_ttl_seconds: 900

redis:
  url: redis://127.0.0.1:6379/0
  namespace: p2p

Redisを使う場合は、room_storeredisに変更し、Redisサーバを起動してください。

起動

bin/p2p-server

設定ファイルを指定する場合:

P2P_CONFIG=config.yml bin/p2p-server

デフォルトでは 0.0.0.0:8080 で待ち受けます。終了するには Ctrl-C を押します。

curlによる動作確認

サーバを起動した状態で、別のターミナルから実行します。

ヘルスチェック

curl -i http://127.0.0.1:8080/healthz

次のようなレスポンスが返れば成功です。

HTTP/1.1 200 OK
...

{"status":"ok"}

ルーム作成

max_playersはホストを含む最大参加人数です。次の例では、最大4人のルームを作成します。

curl -i \
  -X POST \
  -H 'Content-Type: application/json' \
  -d '{"max_players":4}' \
  http://127.0.0.1:8080/rooms

201 Createdと、次の項目を含むJSONが返れば成功です。

{
  "room_id": "...",
  "host_token": "...",
  "join_token": "...",
  "join_url": "http://localhost:8080/join?room=...&token=...",
  "max_players": 4,
  "expires_at": 0
}

デフォルト人数でルーム作成

max_playersを省略すると、default_room_capacityが使われます。

curl -i \
  -X POST \
  -H 'Content-Type: application/json' \
  -d '{}' \
  http://127.0.0.1:8080/rooms

デフォルト設定では max_players2 になります。

入力値のエラー確認

最小人数は2人です。次のリクエストは 422 Unprocessable Entity になります。

curl -i \
  -X POST \
  -H 'Content-Type: application/json' \
  -d '{"max_players":1}' \
  http://127.0.0.1:8080/rooms

max_room_capacityを超えた人数を指定した場合も、422 Unprocessable Entityになります。

WebSocket接続

ルーム作成レスポンスの room_idhost_token または join_tokenを使って、次のURLへ接続します。

ws://localhost:8080/ws?room=<room_id>&token=<host_token_or_join_token>

curlではHTTP APIの確認まで行えます。WebSocketのOffer/Answer/ICE候補の中継確認には、WebSocket対応クライアントを使用してください。

複数ゲストのルームでは、peer_joinedイベントのpeer_idを使い、シグナリングメッセージに対象のpeer_idtoとして指定します。

Repository

crystal-p2p-server

Owner
Statistic
  • 0
  • 0
  • 0
  • 0
  • 0
  • about 2 hours ago
  • September 14, 2026
License

Links
Synced at

Mon, 14 Sep 2026 02:05:56 GMT

Languages