WebSocket クローズコードと Pusher エラーコード
各コードの意味と対処法:標準の WebSocket クローズコード(1000–1015)と、Pusher プロトコルのエラーコード(4000–4399)。Hibira やほかの Pusher 互換サービスも同じコードを送ります。
Pusher プロトコルのコード
Pusher サーバーは、コードと理由を含む pusher:error メッセージを送ってから、同じコードで接続を閉じます。コードの範囲で、クライアントが次に何をするかが決まります。
4000 SSL only
このアプリは暗号化された接続しか受け付けません。
対処: wss:// で接続してください(pusher-js では forceTLS: true)。
同じ設定では再接続しない4001 Application does not exist
このホストに、このキーのアプリはありません。
対処: アプリキーとホスト(またはクラスター)を確認してください。あるサービスやリージョンのキーは、ほかでは使えません。
同じ設定では再接続しない4003 Application disabled
アプリはありますが、無効になっています。
対処: ダッシュボードでアプリを有効に戻すか、アカウントの支払い状況を確認してください。
同じ設定では再接続しない4004 Over connection quota
アプリの接続数がプランの上限に達しています。
対処: ほかの接続が閉じるのを待つ、不要なタブを閉じる、または接続数の多いプランに変えてください。
同じ設定では再接続しない4005 Path not found
URL のパスが /app/APP_KEY になっていません。
対処: WebSocket のパスを確認してください。プロキシや wsPath の設定ミスがよくある原因です。
同じ設定では再接続しない4006 Invalid version string format
クライアントが送ったバージョンをサーバーが読めません。
対処: 公式のクライアントライブラリを使うか、URL に protocol=7 を付けてください。
同じ設定では再接続しない4007 Unsupported protocol version
クライアントが求めたプロトコルバージョンに、サーバーが対応していません。
対処: クライアントライブラリを更新してください。現在のプロトコルは 7 です。
同じ設定では再接続しない4008 No protocol version supplied
URL に protocol パラメーターがありません。
対処: URL に ?protocol=7 を付けるか、公式のクライアントライブラリを使ってください。
同じ設定では再接続しない4009 Connection is unauthorized
サーバーがこの接続を拒否しました。Hibira では、ページのオリジンが許可されていないことがいちばん多い原因です。
対処: サイトのオリジン(スキーム、ホスト、ポート)をアプリの許可オリジンに追加してください。切断の前に届く pusher:error メッセージに、どのチェックで失敗したかが書かれています。
同じ設定では再接続しない4100 Over capacity
サーバーが混み合っているか、同じアドレスから一度に接続が多すぎます。
対処: ほとんどの場合は何もしなくて大丈夫です。クライアントがバックオフして再試行します。何度も起きる場合は、全クライアントが同時に再接続しないようにタイミングをずらしてください。
バックオフしてから再接続する4200 Generic reconnect immediately
サーバーがクライアントに再接続を求めました。たとえばサーバーの再起動中です。
対処: 何もしなくて大丈夫です。クライアントがすぐに再接続します。
すぐに再接続する4201 Pong reply not received
サーバーが ping を送りましたが、時間内に pong が返ってきませんでした。
対処: 多くはタブのスリープか、モバイル回線の不調です。自作のクライアントなら、pusher:ping に pusher:pong で応えてください。
すぐに再接続する4202 Closed after inactivity
接続が長い間アイドル状態でした。
対処: 何もしなくて大丈夫です。クライアントが再接続します。クライアントの activity timeout はサーバーより短くしてください。
すぐに再接続する4301 Client event rejected due to rate limit
この接続がクライアントイベントを短時間に送りすぎたため、1 件が破棄されました(Hibira では 1 日のメッセージ上限に達した場合も)。接続は開いたままです。
対処: 1 秒あたりのクライアントイベントを減らしてください。たとえば入力中やカーソルのイベントを間引きます。
接続は開いたまま
標準の WebSocket コード
WebSocket の標準(RFC 6455)で決められたコードで、どの WebSocket サーバーにも当てはまります。
1000 Normal Closure
接続は意図して閉じられ、処理は完了しています。
対処: 対処は不要です。
1001 Going Away
ページが閉じられたか再読み込みされた、またはサーバーが停止中です。
対処: 対処は不要です。ページやサーバーが戻ったら再接続してください。
1002 Protocol Error
どちらかが WebSocket プロトコルに反するフレームを送りました。
対処: 通信を書き換えるプロキシがないか、クライアントとサーバーのライブラリが食い違っていないか確認してください。
1003 Unsupported Data
相手が受け付けない種類のメッセージです。たとえばテキストしか受け付けないサーバーへのバイナリ。
対処: サーバーが求める種類で送ってください(Pusher サーバーは JSON テキストを受け付けます)。
1005 No Status Received
クローズフレームにコードがありませんでした。ブラウザーが報告する値で、実際に送られることはありません。
対処: このコードだけでは原因はわかりません。サーバーが接続を閉じたときのログを確認してください。
1006 Abnormal Closure
クローズフレームなしで接続が切れました。ネットワーク、TLS、プロキシ、またはサーバーが接続を終わらせています。ブラウザーが報告する値で、実際に送られることはありません。
対処: ホストとポート、wss:// と ws:// の使い分け、証明書、プロキシやロードバランサーのアイドルタイムアウトを確認してください(ハートビートは、アイドル接続が切られるより短い間隔で送ります)。ブラウザーでは、多くの場合コンソールに原因が表示されます。
1007 Invalid Frame Payload Data
テキストメッセージが正しい UTF-8 ではありません。
対処: テキストを UTF-8 でエンコードするか、バイナリで送ってください。
1008 Policy Violation
サーバーが独自のルール(認証やオリジンのチェックなど)でメッセージや接続を拒否しました。
対処: サーバーのルールと、クローズの理由を確認してください。
1009 Message Too Big
メッセージが相手の受け付けるサイズを超えています。
対処: メッセージを小さくするか、大きなものは分割してください。
1010 Mandatory Extension
クライアントが必要とした拡張に、サーバーが同意しませんでした。
対処: クライアントでその拡張を無効にするか、サーバーで有効にしてください。
1011 Internal Error
サーバーで予期しないエラーが起きました。
対処: サーバーのログを確認し、バックオフして再接続してください。
1012 Service Restart
サーバーが再起動しています。
対処: 短いランダムな待ち時間のあとで再接続してください。
1013 Try Again Later
サーバーが一時的に過負荷です。
対処: バックオフして再接続してください。
1014 Bad Gateway
ゲートウェイやプロキシが、背後のサーバーから不正な応答を受け取りました。
対処: プロキシの背後にあるサーバーを確認してください。
1015 TLS Handshake
TLS ハンドシェイクに失敗しました。たとえばクライアントが信頼しない証明書です。ブラウザーが報告する値で、実際に送られることはありません。
対処: 証明書チェーン、ホスト名、有効期限を確認してください。
コードの範囲
- 1000–2999:WebSocket 標準のための予約枠です。このコードはまだ割り当てられていません。
- 3000–3999:ライブラリやフレームワーク向けの登録枠です。使っているものを確認してください。
- 4000–4099:このあとクライアントが同じ設定では再接続しない Pusher エラー。
- 4100–4199:このあとクライアントがバックオフして再接続する Pusher エラー。
- 4200–4299:このあとクライアントがすぐに再接続する Pusher エラー。
- 4300–4399:接続を開いたままにする Pusher エラー。
- 4000–4999:プライベート用途。意味は送ったアプリやサービスが決めます。
購読エラー
プライベートチャンネルやプレゼンスチャンネルの購読に失敗しても接続は閉じず、クライアントには pusher:subscription_error が届きます。そこでの AuthError は、ほとんどの場合、認証エンドポイントが返した署名が合っていません。シークレット、ソケット ID、チャンネル名、channel_data のどれかが署名したときと違います。