本文へ移動

モニターのルート ​

ngrokのモニター入口の背後で配信する経路です(モバイルモニターを含む)。入口・Hostの検査・session・トンネルの関係はモバイルモニターにあります。接続設定のAPIはローカルの経路で、Web APIにあります。

モニターの入口の経路 ​

ルート内容
GET/HEAD //monitor/ へ308で転送する。ngrokの警告ページで「Visit Site」を押すと、このアドレスに戻るため。
GET/HEAD /monitor/モニターのHTML。トークン・session・ボードのデータは含まない。/monitorは/monitor/へリダイレクトする。
GET /monitor/api/sessionCookieの有効なsessionを知らせ、csrfToken・expiresAt・expiresInSecondsを返す。有効なsessionがなければ401 session_requiredで、sessionは開始しない。クロスサイトのSec-Fetch-Siteは403。
POST /monitor/api/unlock合言葉をsessionと交換する。本文はJSONの{"code":"1234"}で256バイトまで。公開OriginとSec-Fetch-Site: same-originが必要で、CSRFトークンは要らない。正しければCookieagboard_ngrok_sessionを設定し、csrfToken・expiresAt・expiresInSecondsを返す。間違いは手がかりを示さない403 unlock_failed。連続5回間違えたあとは、正しい合言葉も含むすべての試行が、接続を開始し直すまで429 unlock_lockedになる。Originやフェッチサイトの不備は403 forbidden、JSONと宣言されていない本文は415、256バイトを超える本文は413、解釈できない本文は400(これらは推測として数えない)。
POST /monitor/api/disconnectsessionを終了し、そのCookieを消す(CSRFトークンと公開Originが必要)。{"disconnected": true}を返し、サインアウト先はない。そのあとも合言葉は使える。
GET/HEAD /monitor/assets/monitor/{name}モニターのmanifestにある、内容から名前を付けたスクリプトとスタイルシートだけ。immutableでキャッシュさせ、受け付ける場合はgzipで送る。ほかの名前はno-storeの404。
GET/HEAD /logo-white.pngヘッダーのロゴ。入口の検査は必要だが、sessionは要らない。
GET/HEAD /monitor/api/projects/{projectId}/summaryプロジェクトのSummary。タスク、進捗付きのエピック、problemsを持ち、本文は含みません。そのversionがETagになり、一致するIf-None-Matchには304を返します。存在しないプロジェクトは404 project_not_foundです。Web APIを参照してください。
GET/HEAD /monitor/api/projects/{projectId}/tasks/{id}/detailタスクの本文・受入条件・履歴を、NDJSONのストリームで返します。?sections=documentか?sections=historyで一部だけ読めます。
GET/HEAD /monitor/api/projects/{projectId}/epics/{epicId}/detailエピックの本文を、NDJSONのストリームで返します。
GET /monitor/api/events?project=<projectId>ready(モニターのビルドIDを含む)・changed・resync・heartbeat・preferences(保存した言語とテーマ。変更のあとに送る)の専用SSE。projectは必須で、欠落または形式の誤りは422 invalid_value、存在しないプロジェクトは404 project_not_foundです。そのプロジェクトの変更だけを送ります。
GET /monitor/api/preferences保存した言語とカラーテーマ。PCのGET /api/preferencesと同じJSON。
PUT /monitor/api/preferences言語とテーマだけを保存する。locale・theme・両方のいずれか。回答と同じく、公開Origin・Sec-Fetch-Site: same-origin・CSRFトークンが必要。未知の項目と不正な値は422 invalid_preferences。
POST /monitor/api/projects/{projectId}/tasks/{id}/answer現在の依頼への回答だけ。
GET /monitor/api/projects/{projectId}/tasks/{id}/attachments/{attachmentId}所有する画像だけ。
GET/HEAD /monitor/api/projects/{projectId}/epics/{epicId}/attachments/{attachmentId}所有するエピックの画像だけ。
  • /monitor/api/は読み取りのrouterと、回答と言語・テーマの保存だけの書き込みrouterに分け、PCのAPIには合流させません。PCのrouterへのfallback、prefixを外すリダイレクト、メソッドの上書き、モニターの経路からPCの資産への別名はありません。
  • HEADは許可したJSONと画像のGETと同じ範囲で、SSEには設けません。未知の経路はHTMLへのfallbackなしの404、許可した経路で許可しないメソッドは405です。モニターの経路では、health・notify・archive、ほかの書き込み、ファイルの一覧を配信しません。
  • PCのボードとそのAPIは、モニターの入口では配信しません。
  • モニターにはプロジェクトの一覧がありません。/monitor/api/projectsと、プロジェクト全体を返す/monitor/api/projects/{projectId}/boardは提供しません。モニターのアドレスは一つのプロジェクトを指し、どの読み取りも、パスまたは?project=からプロジェクトIDを受け取ります。IDは読む対象を選ぶもので、アクセス権ではありません。
  • すべての要求は、まずHostの検査を通ります(失敗は理由を示さない403)。sessionとunlockを除く/monitor/api/の経路は、そのうえで有効なsessionが必要で(なければ401 session_required)、変更にはさらに公開Origin・同一オリジンのメタデータ・CSRFトークンが必要です。このエントリで受け付ける書き込みは、回答・言語とテーマの保存・切断の三つだけです。一覧にないパスは404です。