# リリースノート

**CHANGE**
: 下位互換のない変更

**UPDATE**
: 下位互換がある変更

**ADD**
: 下位互換がある追加

**FIX**
: バグ修正

過去のリリースノートを確認したい場合は [古いリリースノート](old_release.html) をご確認ください。

## 2026.1.0

**リリース日**: 2026-06-18

### ESM 専用パッケージへの移行について

Sora JavaScript SDK 2026.1.0 から `package.json` の `exports["."]` から `require` 条件を削除し、ESM のみのサポートになりました。

`require("sora-js-sdk")` は 2025.2.0 以前でも `ERR_REQUIRE_ESM` で失敗していましたが、
2026.1.0 以降は `ERR_PACKAGE_PATH_NOT_EXPORTED` でエラーメッセージが変わります。

CommonJS から利用していた場合は `import` または `await import()` に置き換えてください。

### Node.js のサポートバージョンについて

Sora JavaScript SDK 2026.1.0 から Node.js の最低要件は `22.18.0` 以上になりました。

Node.js 20 は 2026-04-30 に End Of Life (EoL) を迎えたためサポートを終了しました。
Node.js 22 系を利用する場合は 22.17.x 以前ではビルドが通らない点に注意してください。


### 変更履歴

- [CHANGE] Node.js 20 のサポートを終了しました- Node.js 20 は 2026-04-30 に End Of Life (EoL) を迎えました-
- [CHANGE] Node.js の最低要件を 22.18.0 以上に引き上げました- 後続のビルドツール移行で導入される `tsdown` 0.22 系が Node.js `^22.18.0 || >=24.0.0` を要求するため
- [CHANGE] `package.json` の `exports["."]` から `require` 条件を削除し ESM のみをサポートするように変更しました- `require("sora-js-sdk")` は元から `ERR_REQUIRE_ESM` で失敗していましたが、削除後は `ERR_PACKAGE_PATH_NOT_EXPORTED` でエラーメッセージが変わります- CommonJS で利用していたコードは `import` または `await import()` に置き換える必要があります
- [CHANGE] `removeAudioTrack` / `removeVideoTrack` 実行中に `disconnect()` 等で `RTCPeerConnection` が破棄された場合に `ConnectError` (reason `"REMOVE_TRACK_DURING_DISCONNECT"`) で reject するように変更しました- 利用者は `.catch` で reject を受ける必要がある (fire-and-forget で呼んでいる場合は unhandled promise rejection が発生する)- 非推奨の `stopAudioTrack` / `stopVideoTrack`、および `replaceAudioTrack` / `replaceVideoTrack` 経由でも同じ reject が伝播する
- [CHANGE] `abendPeerConnectionState()` の発火順を他 3 系統と揃え timeline → callback の順に変更しました
- [UPDATE] pnpm 11 系に上げました
- [UPDATE] TypeScript 6.0 へ対応しました
- [FIX] `trace()` が JWT 等の機密を含む metadata を `console` / `callbacks.log` に raw 出力していたセキュリティ問題を redact で修正しました
- [FIX] `rpc` メソッドのサンプルコードで、実際に存在しない RPC メソッド名が使われていた問題を修正しました
- [FIX] `type: "redirect"` 受信時に旧 WebSocket の `onmessage` ハンドラが解除されていなかった問題を修正しました
- [FIX] `type: "switched"` (`ignore_disconnect_websocket`) 経路で旧 WebSocket の `onmessage` / `onerror` ハンドラが解除されていなかった問題を修正しました
- [FIX] `disconnect()` が並列実行されたとき `callbacks.disconnect()` が複数回発火しないように修正しました
- [FIX] `onDataChannel` で同名 label の DataChannel を上書きする際に旧 DataChannel のハンドラを解除し close するように修正しました
- [FIX] `disconnect()` で WebSocket が `OPEN` 以外の状態のときに `disconnect` callback が呼ばれない問題を修正しました
- [FIX] `iceConnectionState` が `disconnected` で 10 秒経過した際の検知が現行ブラウザで動作していなかった問題を修正しました
- [FIX] 切断系メソッド 5 経路で `pc.onicecandidate` を解放し Trickle ICE 由来の unhandled rejection を防ぐように修正しました
- [FIX] `sendAnswer()` の `ws.send()` が同期 throw したときに内部状態がクリーンアップされなかった問題を修正しました
- [FIX] `signaling()` の `ws.onmessage` 内で例外が発生したときに `connect()` が `connectionTimeout` まで固まっていた問題を修正しました
- [FIX] `generateCertificate` が失敗した環境 (FIPS モード等) でも接続できるようにフォールバックするように修正しました
- [FIX] `disconnect()` で DataChannel 切断エラー (`code: 4999`) 時に `abend` event が `normal` で上書きされないように修正しました
- [FIX] `createSignalingMessage()` で `{ audioBitRate: undefined }` のような呼び出しで `message.audio` / `message.video` が boolean true から空オブジェクト `{}` に置換されていた問題を修正しました- 関連して `spotlightNumber` / `audioOpusParams*` に `undefined` を渡しても `message` に `undefined` キーが積まれないように修正しました
- [FIX] `messaging()` が呼び出し側に渡された options を破壊しないように修正しました
- [FIX] `ConnectionBase` constructor で options を shallow copy に変更し `skipIceCandidateEvent` の内部代入が呼び出し側 options に漏れないようにしました- 上記 `messaging()` の修正とあわせて、同一 options を `sendrecv()` / `sendonly()` / `recvonly()` と `messaging()` に渡したときに先行 Connection の options まで書き換わる問題も解消しました
- [FIX] `abend()` の abend 分岐で `SoraCloseEvent` を 2 回生成して timeline と callback に別インスタンスを渡していたのを 1 つのインスタンスを共有するように修正しました
- [FIX] `sendSignalingMessage` / `sendStatsMessage` で送信前に readyState を確認し、 `OPEN` 以外の状態での送信を防ぐように修正しました

## 2025.2.0

**リリース日**: 2025-12-10

### 変更履歴

- [ADD] 接続が確立した際に発火する `connected` コールバックを追加しました- `RTCPeerConnection` の `connectionState` が `connected` かつシグナリング通知で自身の `connection.created` が通知されたタイミングで発火します
  - `connected` コールバックは **一度のみ** 発火します
  - `connected` コールバックはシグナリング通知が無効な場合は発火しません
  - 詳細は [connected](callback.html#28c76d) をご確認ください
- [ADD] シグナリングが DataChannel 経由に切り替わった際に発火する `switched` コールバックを追加しました- DataChannel シグナリング機能を利用している場合にのみ発火します- 詳細は [switched](callback.html#5d9002) をご確認ください
- [ADD] サイマルキャスト機能で初期の `rid` を指定する `simulcast_request_rid` オプションを追加しました- デフォルトは未指定です- `simulcast` を `true` で指定する必要があります- `sendrecv` または `recvonly` でのみ有効です
- [ADD] RPC 機能を利用できる `rpc` メソッドを追加しました
- [ADD] 利用できる RPC 一覧が取得できる `rpcMethods` を追加しました

## 2025.1.0

**リリース日**: 2025-06-12

### レガシーストリーム機能の廃止について

Sora 2025.1.0 のレガシーストリーム機能の廃止に伴い、
Sora JavaScript SDK の 2025.1.0 でレガシーストリーム機能を廃止しました。


今後、レガシーストリーム機能を継続して利用したい場合は、
Sora JavaScript SDK の 2025.1.0 より以前のバージョンを利用してください。

### multistream オプションの廃止について

今回 Sora 2025.1.0 でレガシーストリーム機能の廃止に伴い `multistream` オプションを廃止しました。

もし `multistream` オプションを指定している場合は、
`options` から `multistream` 項目を削除して利用するようにしてください。

`multistream` オプションを指定しない場合は何もする必要がありません。

```typescript
sora = Sora.connection(signalingUrl, debug);
connection = sora.sendonly(channelId, undefined, {
   // 廃止された multistream オプションなので、この項目を削除してください
   multistream: true,
});
```

- 2017 年にリリースした Sora JavaScript SDK で `multistream` オプションを追加しました
- 2022 年にリリースした Sora JavaScript SDK で `multistream` オプションのデフォルト値を `true` を変更しました

### 変更履歴

- [CHANGE] Sora 2025.1.0 で廃止される、レガシーストリーム機能への対応を終了しました
- [CHANGE] レガシーストリーム対応の終了に伴い、オプションの `multistream` 項目を廃止しました
- [ADD] `onIceCandidate` を呼ばない `skipIceCandidateEvent` オプションを追加しました
- [FIX] シグナリング URL が一つの場合でも配列として扱うようになっていた問題を修正しました
- [FIX] シグナリング URL が空配列の場合エラーになるように修正しました
