Skip to content

Latest commit

 

History

History
17 lines (14 loc) · 2.41 KB

File metadata and controls

17 lines (14 loc) · 2.41 KB

プロダクト解釈メモ

  • 最優先は「実況を邪魔しないこと」。入力不能、送信不能、誤って内容を失う、の3つを特に避けたい
  • タイムスタンプは壁時計ではなく「視聴中の動画のどこか」を表す値。開始秒数、カウントダウン、微調整はすべてこの目的のためにある
  • タイマー未開始でも投稿できる以上、未開始時の投稿は表現上 00:00:00.00 起点として扱うのが自然。将来変えるなら仕様として明記したい
  • localStorage は作業継続のための保存、エクスポートは共有・バックアップのための保存。用途が違うので形式や含めるメタデータは分けて考えてよい
  • 投稿者名やサフィックスは、共有時の見え方に関わるメタデータ。投稿本文そのものとは分離して保持し、表示時・コピー時・エクスポート時に付与する設計とした
  • Enter 系ショートカットは日本語 IME と複数行入力を壊さないことが前提。今後ショートカットを増やす場合もこの制約を優先する
  • 削除・全削除・リセットは「実況を止める事故」になりやすい操作。確認か Undo のどちらかを基本方針にしたい
  • カウントダウン秒数、開始秒数、投稿者名、サフィックスは「セッション設定」とみなし、復元対象かどうかを整理しておくと実装がぶれにくい

セキュリティ方針

  • ユーザー入力は React のエスケープ機構を通じてのみ描画し、dangerouslySetInnerHTML や直接の DOM 操作で HTML として描画しない。将来 Markdown プレビューやリンク自動化を追加する場合もこの原則を維持するか、明示的なサニタイズライブラリ(DOMPurify 等)を導入する
  • localStorage に保存されるデータ(投稿、下書き、投稿者名、サフィックス)は平文。共有端末・配信画面での利用を想定し、「完全削除」導線で全データを消去できるようにする
  • JSON インポートにはファイルサイズ(5MB)、投稿件数(10,000件)、テキスト長(10,000文字)、メタデータ長(500文字)の上限を設けている
  • localStorage 読み込み時の JSON.parse 失敗は例外捕捉し、破損データを自動削除して空のセッションで起動する