操作
機能 #407
完了
機能 #407:
アバター連携フィード基盤(ObsHttpServer 拡張: pet 状態 + イベントSSE)
説明
背景¶
#406 決定記録(docs/poc/vrm-avatar-loading.md)に基づく three-vrm アバター対応の基盤。beatoraja から VRM アバターへ「状態」と「イベント」を配信する共通フィードを実装する。
作業内容¶
- 既存
bms.player.beatoraja.stream.obs.ObsHttpServer(loopback /obs/静的配信 //state.json)を拡張、または同等のローカル HTTP を追加。 - エンドポイント:
-
GET /pet/state.json… ペット状態スナップショット(no-store) -
GET /pet/events… momentary イベントの SSE(Server-Sent Events)配信
-
- JSON スキーマ定義:
- state:
name/level/exp/nextLevelExp/friendship/mood/personality - event: 単曲結果(クリア種別・スコア差・BP)/
pet_comment/level-up/ セッション要約 / 練習推薦
- state:
- 入力源は #397(ペット状態永続化)。未実装項目はスタブ可。
完了条件¶
- ブラウザ/curl で state.json とイベント SSE が取得できる。
- スキーマのユニットテスト(JSON 生成)。
依存¶
#397(ペット状態)。three-vrm 側(別子チケット)と本フィードの契約が一致すること。
エージェント ちゃん さんが12日前に更新
- ステータス を 未着手 から 実装中 に変更
- 進捗率 を 0 から 10 に変更
実装に着手しました。
- ブランチ:
feature/407 - 対応方針: 既存
ObsHttpServerを拡張し、ペット状態スナップショットGET /pet/state.json(no-store)と momentary イベントのGET /pet/events(SSE)を追加。状態は #397 のPetData(PetGrowthCalculatorで level/exp/nextLevelExp を導出、personality は #405 待ちで null スタブ)を入力源とし、イベントはresult/pet_comment/level_up/session_summary/practice_recommendのスキーマと配信基盤(ブローカ)を定義。本チケットでは state 反映と単曲resultイベントを実配線し、残りはスキーマ+publish API のみ(後続子チケットで配線)。JSON 生成のユニットテストを追加。
エージェント ちゃん さんが12日前に更新
- ステータス を 実装中 から 完了 に変更
- 進捗率 を 10 から 100 に変更
対応が完了しました。
概要¶
three-vrm Web アバターへ「状態」と「イベント」を配信する共通フィードを、既存 loopback ObsHttpServer を拡張して実装(#406 決定記録準拠)。入力源は #397 のペット状態。
変更点¶
-
GET /pet/state.json(no-store スナップショット)追加。スキーマname/level/exp/nextLevelExp/friendship/mood/personality。level/exp/nextLevelExp はPetData.totalExpからPetGrowthCalculatorで導出(exp=現レベル内累積、nextLevelExp=現レベルのスパン、max level で 0)。personality は #405 待ちでnullスタブ。 -
GET /pet/events(Server-Sent Events)追加。接続時にretry+現在状態event: stateを送信し、状態更新ごとにstateをブロードキャスト、無イベント時は約15秒間隔の keepalive コメント。 -
PetEventスキーマ(snake_case)定義:result/pet_comment/level_up/session_summary/practice_recommend。本チケットでの実配線は単曲result(MusicResult、PLAY かつ非コースのみ)だけ。残りはスキーマ+publish API(後続子チケットで配線)。 - ペットエンドポイントに CORS
Access-Control-Allow-Origin: *を付与(Tauri/OBS ブラウザソースの別オリジン想定)。 - 新規
PetFeedはスレッド安全な SSE ハブ(concurrent 購読者集合・有界キュー・close センチネル)。JSON は新規 package-localJsonWriterで生成し、既存ObsStateの builder は不変。 - 変更ファイル: 新規
stream/obs/JsonWriter.java/PetFeedState.java/PetEvent.java/PetFeed.java、変更stream/obs/ObsHttpServer.java/ObsController.java/MainController.java/result/MusicResult.java、テストstream/obs/PetFeedStateTest.java/PetEventTest.java/PetFeedTest.java(計 11 ファイル)。
テスト¶
-
.\gradlew.bat test: 成功(フルスイート BUILD SUCCESSFUL)。新規ユニットテスト 3 本(state JSON 導出/エスケープ、各 event の type/payload、ブローカ挙動)。 - 手動スモーク:
ObsHttpServer実起動で/pet/state.json(200/no-store/CORS/スキーマ一致)と/pet/events(200/event-stream、retry→state→publish した result をエスケープ込みで受信)を確認。
関連 MR¶
- !84 (feature/407 → develop)
操作