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_storeをredisに変更し、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_players が 2 になります。
入力値のエラー確認
最小人数は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_id と host_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_idをtoとして指定します。
crystal-p2p-server
- 0
- 0
- 0
- 0
- 0
- about 2 hours ago
- September 14, 2026
Mon, 14 Sep 2026 02:05:56 GMT