出荷済みの機能は README の「ステータス」に、仕組みは ARCHITECTURE.ja.md にあります。このファイルには、残っている作業、重い作業を早まって始めないための着手条件、形を変えたときの移行メモを置きます。
- ステージフレームとピクチャーインピクチャーの実画面での確認. ヘッドレスのトレースで測れるのはメインスレッドの負荷だけです。実際のモニターでのステージフレームと PiP(ベータ)のフレームペーシングは確認できていません。
- YouTube がチャットを作り直したときの監視. YouTube が
#itemsを作り直した後の付け直しと、チャットを閉じている間の代役チャット iframe には自動テストがありません。どちらも実際の配信で手で確認しています。 - PWA の実機確認. デプロイ済みの PWA で下のチェックリストを実行します。
- PWA でのピン留めとドラッグ. PWA では YouTube の iframe がポインタ入力を持つので、先にキャプチャ用の層が必要です。拡張では動作します。
端末: iOS Safari(最新、低電力モードをオフ、次にオン)、Android Chrome(最新、中価格帯の端末)。フレーム p95 が基準に近ければ、古い Android 端末も。
- デプロイ済みの PWA を開く。
- URL 欄と Web Share Target の両方からライブ配信を始める。
- タップで再生、一時停止、独自の操作部が動く。
- ライブではシークバーが隠れ、リプレイでは使える。
- 対応環境では Media Session のメタ情報が出て、再生/一時停止が効く。
- Wake Lock が前面にいる間は画面を点け続け、停止で解放する。
?perf=1を開き、チャットの多い配信を 3 分以上見る。fps、frameP95、frameP99、longTasks、active、droppedを記録する。
基準を満たさない端末があれば、まず renderScalePct、spawnPerFrame、maxActive を下げます。iOS と Android で renderScalePct の既定値を分けるのは、両方の計測がそれを支持するときだけです。最終的な値と HUD の画面はリリースノートに残します。
根拠がそろうまでは始めません。
スコアラーはコンテンツスクリプト(チャット iframe)と PWA で動く素の JavaScript で、ボトルネックではありません。別の経路を足すのは次をすべて満たすときだけです。
- バッチ型または状態を持つスコアラーが、拡張のホットパスの外に先に存在する
- Chrome/V8 のベンチマークで、JS スコアラーに対してはっきりした改善が端から端まで出る
- 拡張が新しい形に依存する前に CONTRACT.ja.md を更新する
- マニフェストの CSP と web accessible resources を見直す
上のチェックリストで、実機が次のどれかを示さない限り Canvas2D のままにします。
active < maxActiveの状態でframeP95 > 33 msが 30 秒以上続く- 通常のチャットの盛り上がりで Long Task が繰り返し増える
- コメントが流れている間、タッチや動画の操作がはっきり遅れる
試作には、それらの端末での前後の HUD 画面を付け、絵文字、スーパーチャットの色、コメント一覧のスクロールを悪化させないこと。
中継はステートレスな HTTP ポーリングのままにします(エッジキャッシュ、処理中リクエストの集約、レート制限。ARCHITECTURE.ja.md の「中継の堅牢性とコスト」)。次に進むのは、中継の計測が次を示したときです。
- 同じ動画を多くの視聴者が見ているのに MISS 率が高い
- キャッシュを調整しても上流の 429/5xx がまとまって出る
- 再解決や continuation の入れ替わりが続き、視聴者に見える遅延が出る
候補: 動画 ID ごとに 1 つの Durable Object が上流へのポーリングを 1 本だけ持ち、WebSocket でクライアントに PollEnvelope をまとめて配る。リプレイではクライアントが再生位置を送る。WebSocket 側を計測し終えるまで HTTP の /api/livechat を予備として残す。受け入れ条件: 採点や描画を Worker に移さない。切断が続いても動画ごとのメモリが有界である。リプレイの位置はまとめるか間引き、1 人がシークを繰り返しても上流への呼び出しが増えない。上流への呼び出し数、遅延、エラーを 2 つの経路で比べる計測がある。
形(CONTRACT.ja.md):
- 中継は continuation トークンのパーセントエスケープをもう一段デコードしてから検証とキャッシュ検索を行います。エンベロープとクライアントのエンコードは変わりません。
paidColorはChatMessageと描画ペイロードの任意・表示専用のフィールドです。これがないメッセージも有効で、amountは引き続き null 可です。- リプレイのポーリングは
contとoffsetにreplay=1を付けます。replay=1のないcont+offsetは 400 になります。中継はリプレイのendedを常にfalseで返し、リプレイの終わりはプレイヤーが判断します。
保存済みの設定:
lineHeight(px)は読まなくなりました。保存済みの値はlineHeightScaleの既定値に正規化されます。エンジンには引き続き px(fontPx * scale)を渡します。- フィルターの保存データに
mode(drop/censor/replace)とreplacementが加わりました。古いレコードはdropと既定の置換文字に正規化されます。 - 真偽値の
scaleWithPlayerはfontScaleModeセレクト(fixed/up/relative)になりました。保存済みのtrueはup、falseはfixedとして読みます。relativeはfontPxを 720px のプレイヤーでのサイズとして扱い、小さいウィンドウでは縮小もします(下限 0.5 倍)。
却下されたら理由をここに書きます。
いくつかの設定と操作(種類別の表示と文字サイズ、投稿者名の表示モード、縁取り、流れる向き、密度、最大幅、折り返し、ユーザー CSS、ピン留め、タイムシフト)は ys-j/YoutubeLiveChatFlusher のアイデアに倣っています。実装は独自で、コードはコピーしていません。