Redis をデータ層に使う、Express + Socket.IO ベースのリアルタイムチャットサーバーです。HTTP API と WebSocket はどちらも認証付きで動作し、メッセージ履歴、ユーザー名、トークン、管理者セッション、レート制限状態を Redis に保存します。
- Socket.IO によるルーム単位のリアルタイム配信
- HTTP API と WebSocket のトークン認証
- Redis へのメッセージ履歴保存
- ルームごとのメッセージ上限管理
- ユーザー名変更のレート制限
- 管理者ログイン、ルームクリア、状態確認
- スパム判定と送信制限
- セキュリティヘッダーと CORS 制御
- 静的フロントエンドの配信
- Node.js 22 以上
- Redis に接続できること
npm install起動前に以下を設定します。
export REDIS_URL=redis://localhost:6379
export FRONTEND_URL=http://localhost:3000
export ADMIN_PASS=change-me
export PORT=3000
export TRUST_PROXY=falseREDIS_URL: Redis 接続 URLFRONTEND_URL: 許可するフロントエンドのオリジンADMIN_PASS: 管理者ログイン用パスワードPORT: HTTP サーバーの待受ポート。既定は3000TRUST_PROXY: プロキシ配下でreq.ipを信頼する場合はtrue
npm start- 認証トークンの有効期間は 24 時間です。
- 認証時にユーザー名を省略すると
guest-xxxxxx形式が割り当てられます。 - ユーザー名は 1〜20 文字です。
- メッセージは 1〜300 文字です。
- ルーム ID は 1〜32 文字で、英数字・
_・-のみ使用できます。 - メッセージ履歴は
generalルームで最大 300 件、それ以外のルームで最大 100 件です。 general以外のルームは、最終更新から 30 日を超えると定期クリーンアップの対象になります。- WebSocket 接続は 1 クライアント ID につき 1 接続に制限されます。
認証が必要な API は Authorization: Bearer <token> を要求します。token は POST /api/auth で発行します。
認証トークンを発行します。
リクエスト例:
{ "username": "taro" }username を省略すると、自動生成された guest 名が使われます。
レスポンス例:
{ "token": "…", "username": "taro" }指定ルームのメッセージ履歴を返します。
メッセージを保存して、そのルームに newMessage を配信します。
リクエスト例:
{ "message": "こんにちは" }現在のユーザー名を更新します。
同一クライアントには 30 秒の変更間隔制限があります。
リクエスト例:
{ "username": "new-name" }POST /api/admin/loginGET /api/admin/statusPOST /api/admin/logoutPOST /api/admin/clear/:roomId
/login は認証済みトークンと ADMIN_PASS を使って管理者セッションを作成します。
/status は現在のトークンが管理者セッションかどうかを返します。
/logout は管理者セッションを削除します。
/clear/:roomId は指定ルームのメッセージ履歴を削除し、clearMessages を配信します。
接続時に handshake.auth.token で認証トークンを渡します。
トークンがない、または無効な場合は接続できません。
joinRoom—{ roomId }を送るとルームに参加しますjoinedRoom— ルーム参加成功時に返りますnewMessage— 新規メッセージ配信clearMessages— ルーム履歴の削除通知roomUserCount— ルームの接続人数通知toast— ユーザーまたはルーム向け通知authRequired— 認証が必要な操作で返ります
- Redis はメッセージ履歴、トークン、ユーザー名、管理者セッション、レート制限、スパム判定に使われます。
@socket.io/redis-adapterを使って複数ノード間のイベントを同期できます。public/に静的 UI が含まれています。server.jsが起動処理、Redis 接続、クリーンアップスケジュール、シグナル終了処理を担当します。
server.js— エントリポイントapp.js— Express アプリの構築socket.js— Socket.IO サーバーauth.js— トークン生成と検証redis.js— Redis 接続routes/— HTTP APIservices/— スパム判定などのサービスlib/— Redis キー、メッセージ処理、バリデーションutils/— 補助ユーティリティpublic/— 静的ファイルlua/— Redis Lua スクリプト
MIT