Skip to content

変更履歴 ​

@uzuhq/code-sdk のリリース履歴。

Unreleased ​

破壊的変更 ​

  • 観測席を roster から外し、setup({ seats }) を setup({ players }) にリネーム。

    • players は配役を受け取る参加者だけ。観戦席・進行管理席は roster に載らないまま接続してくるので、シナリオは「roster に居ない = 観測者」で view を分ける。

      ts
      onState(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-memory GameRoom (本番と同一 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-devharness package は削除 (public 未公開だった)。
    • 既存 scenario の移行は main.ts 冒頭の if (import.meta.env.DEV) { mountHarness(...); } block と package.json の @uzupj/uzu-devharness devDep を削除するだけ。 詳細は はじめに を参照。
  • 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 を参照してください。