テーマ
変更履歴
@uzuhq/code-sdk のリリース履歴。
Unreleased
破壊的変更
観測席を roster から外し、
setup({ seats })をsetup({ players })にリネーム。playersは配役を受け取る参加者だけ。観戦席・進行管理席は roster に載らないまま接続してくるので、シナリオは「roster に居ない = 観測者」で view を分ける。tsonState(state, myPlayerId) { const me = state.players.find((p) => p.playerId === myPlayerId); if (me) return playerView(me); return observerView(); }Seat.kindを削除。roster が player だけになり、roster エントリの席種別が定数になったため。SeatKind型は下記のmySeatKindで引き続き使う。名前を残して中身だけ絞ると、観測者が居る前提のシナリオが無言で壊れるのでリネームにした。
setup()に旧名seatsは渡らない。SetupArgsにも宣言が無いので、シナリオはplayersを使う。wire (
?players=) の各要素からもkindが消えた。載るのが player 席だけになり、値が定数になったため。onStateに第 3 引数mySeatKind: SeatKindを追加 (非破壊)。ホストが iframe URL の?seatKind=で伝える。観測者はstate.playersに居ないので「player か観測者か」は state から分かるが、spectatorとadminの区別は state から導けないため。seatId の命名規約 (admin_0等) に頼ると命名が変わった瞬間に静かに壊れる。seatKindは iframe URL 限定で WebSocket には出さない。play-server は roster に居ない接続を通すだけで、その席が admin か spectator かを知る必要が無い。渡るのは自分の席種別だけで、他プレイヤーの席種別はActionArgsにも渡らない (自己申告なので権限チェックには使えない)。観測者の種別 (観戦 / 進行管理) はサーバーへ届かない。表示の出し分けが要るようになったら URL パラメータの追加で後から非破壊に足せる。
@uzuhq/code-sdkを runtime only に純化。 SDK は import しても DOM を一切触らない。 親 frame でinit()/run()を呼んでも何もしない (= noop)。- 旧
runDevHarness/showDevButton/startDevHost/buildDevPlayersは削除。 - 動機: Svelte / React 等 framework 系 scenario が body に template mount しようとすると SDK の body 上書きと衝突する問題の根本解消。 Google Analytics / firebase 等の modern library と同じ「import しただけでは host page の DOM を奪わない」原則。
- 旧
dev harness (iframe grid / HUD / state inspector / virtual server) を
@uzuhq/code-cliのuzu devサブコマンドに統合。- scenario 側は import 文ゼロ、 mountHarness 呼び出しゼロ。
run<S>({ logic, events })を書くだけでuzu devが harness page + in-memoryGameRoom(本番と同一 WebSocket プロトコル) を立ち上げる。 - virtual server は BroadcastChannel から WebSocket に切り替わり、 本番 (Cloudflare Worker DO) と同じ通信 shape になる。 disconnect / reconnect / message ordering など dev でしか再現しなかった bug が early に見つかる。
- 子 iframe SDK は既存 online mode (
?server=ws://localhost:<port>) をそのまま使うので改造ほぼゼロ。 window.__uzu_devは harness page (親 frame) が dev-server の管理 channel と WebSocket で会話して expose する。setRawState/sendAction/pauseTick/stepTick/resetは引き続き Playwright / E2E から使える。- 旧
@uzupj/uzu-devharnesspackage は削除 (public 未公開だった)。 - 既存 scenario の移行は
main.ts冒頭のif (import.meta.env.DEV) { mountHarness(...); }block とpackage.jsonの@uzupj/uzu-devharnessdevDep を削除するだけ。 詳細は はじめに を参照。
- scenario 側は import 文ゼロ、 mountHarness 呼び出しゼロ。
firstFrameReady()/gameReady()ライフサイクル API を追加- YouTube Playables 互換の 2 段階ライフサイクル契約
- 黒画面 / 二重 splash 問題の構造的解消
- 詳細は API リファレンス を参照
追加
finishGame()を追加。ゲームを終えて、呼んだ端末のプレイ画面を閉じる。- ホストはイベントを終了扱いにし、呼んだプレイヤーを退出させる。全員を閉じたいときは、終了を表す state を全員へ配り、各端末で呼ぶ。
- 対応していない古いアプリや
uzu devでは何も起きない。詳細は API リファレンス を参照
その他
- URL の roster パラメータを
?seats=から?players=にリネーム。setup({ players })と名前が揃う。- シナリオ作者からは見えない層 (SDK が吸収する) なので、書くコードは変わらない。
- 旧名
?seats=は読まないし送らない。GameRoom へ繋ぐ WebSocket URL も同じ。
計画中
manifest.jsonの constraints フィールド追加npx uzu publish時の自動 lint (bundle size / DOM 使用 / 絶対パス 等)- iOS WKWebView CI 自動テスト
SDK API のメジャー変更履歴
@uzuhq/code-sdk のバージョンごとの API 変更は npm install 後の node_modules/@uzuhq/code-sdk/CHANGELOG.md を参照してください。