> ## Documentation Index
> Fetch the complete documentation index at: https://docs.squarecloud.app/llms.txt
> Use this file to discover all available pages before exploring further.

# v4 への移行

> @squarecloud/blob 4.0.0 の変更点: より安全なリトライポリシー、デフォルトのリトライ回数の削減、オプションになった SavedRule.active_from、一貫した ID 1 つでのバッチ削除。

バージョン 4.0.0 では **SDK のリトライ方法**が変わり、安全に繰り返せるものだけを繰り返すようになりました。**メソッド、オプション、エクスポートの名前変更や削除はありません。**

## 要件

変更なし: **Node.js 20** 以降、またはブラウザ。ESM と CommonJS。

## 破壊的変更のまとめ

| v3.x                                                 | v4.x                                                           |
| ---------------------------------------------------- | -------------------------------------------------------------- |
| `429` をリトライ                                          | **決してリトライしない** (マルチパートのパートでの `TOO_MANY_CONCURRENT_CHUNKS` を除く) |
| 書き込みをネットワークエラーと `5xx` でリトライ                          | 書き込みは **1 回のみ試行**                                              |
| `500` と `503` のみリトライ                                 | **すべての `5xx`** でリトライ (読み取りとマルチパートのパート)                         |
| `maxRetries` のデフォルトは `5`                             | デフォルトは **`2`**                                                 |
| バックオフの上限は 30 秒                                       | 上限は **8 秒**: `min(8 s, 500 ms · 2^n) · U(0.5, 1)`              |
| `SavedRule.active_from: string`                      | `active_from?: string` (**オプション**)                             |
| ID が 1 つの `delete([id])` は `PREFIX_NOT_ALLOWED` をスロー | `failed` で報告                                                   |
| `BlobErrorCode` の `RATE_LIMIT`                       | **非推奨** (型には残っています)                                            |

## `429` はリトライされなくなった

`RATE_LIMITED` は、ルートごとの時間枠と、約 30 分続くことがあるアカウントまたは IP のブロックの両方を表すため、SDK はリトライしなくなりました。これにはシンプルアップロードの制限と `TOO_MANY_CONCURRENT_UPLOADS` も含まれます。自分で処理し、しばらく待ってから再試行してください:

```typescript theme={"system"}
import { SquareCloudBlobError } from "@squarecloud/blob";

try {
    await blob.put(file, { name: "report" });
} catch (error) {
    if (error instanceof SquareCloudBlobError && error.code === "RATE_LIMITED") {
        // back off: queue the job for later instead of retrying right away
    }
    throw error;
}
```

唯一の例外は、マルチパートのパートでの `TOO_MANY_CONCURRENT_CHUNKS` です。サーバーはパートを読み取る前に拒否するため、SDK は `maxRetries` の範囲内で再送します。

## 書き込みは 1 回のみ試行

ネットワークエラーと `5xx` がリトライされるのは、`GET` の呼び出しとマルチパートアップロードのパートだけになりました。次の呼び出しは **1 回のみ**試行されます:

* シンプルな `put()`、およびマルチパートアップロードの開始・完了・中止
* `update()`、`copy()`、`move()`、`delete()`
* `rules.set()`、`uploadTokens.create()`、`shares.create()`、`shares.revoke()`

書き込みを自分でリトライするのは、繰り返しても安全な場合だけにしてください。たとえば、同じ名前に `overwrite: true` で行う `put()` です。[書き込みを自分でリトライする](/ja/sdks/blob/errors#書き込みを自分でリトライする)を参照してください。

## リトライ回数の削減とバックオフの短縮

`maxRetries` のデフォルトは `2` (以前は `5`) になり、バックオフの上限は 8 秒 (以前は 30 秒) になりました。読み取りとマルチパートのパートで以前の回数を維持するには:

```typescript theme={"system"}
const blob = new SquareCloudBlob(process.env.SQUARECLOUD_API_KEY, { maxRetries: 5 });
```

これで `429` や書き込みのリトライが復活するわけではありません。

## `SavedRule.active_from` はオプションに

API が `active_from` を送信するのは、`delete_after_days` を持つルールだけです。TypeScript では `undefined` を処理してください:

```typescript theme={"system"}
const rules = await blob.rules.get();

for (const rule of rules) {
    if (rule.active_from) {
        console.log(`${rule.prefix} starts deleting at ${rule.active_from}`);
    }
}
```

## ID が 1 つの `delete([id])`

ID が 1 つのバッチも、他のバッチと同様に、例外をスローする代わりに `failed` で `PREFIX_NOT_ALLOWED` を報告するようになりました:

```typescript theme={"system"}
// v3: threw SquareCloudBlobError (PREFIX_NOT_ALLOWED)
// v4:
const { failed } = await blob.delete([id]);
// failed: [{ id, code: "PREFIX_NOT_ALLOWED" }]
```

プレーンな文字列を渡す `delete(id)` は引き続きスローします。

## `RATE_LIMIT` は非推奨

サービスは `RATE_LIMIT` を送信しなくなりました。アカウントまたは IP のブロックは `RATE_LIMITED` です。既存の比較がコンパイルできるよう古いコードは `BlobErrorCode` に残っていますが、`RATE_LIMITED` に切り替えてください。`DUPLICATE_RULE_PREFIX` が追加されました。

## 修正

* 読み取り途中で途切れたレスポンスボディは**ネットワークエラー**として扱われるようになりました。`GET` の呼び出しとマルチパートのパートではリトライされ、それ以外では元の `fetch` のエラーがスローされます (以前は `UNKNOWN_ERROR` でした)。
* 失敗したマルチパートアップロードは、中止する前に**処理中のパートを待つ**ようになりました。これにより、中止後にパートが届くことも、`put()` より長く続くリクエストが残ることもありません。

## チェックリスト

<Steps>
  <Step title="429 を自分で処理する">
    `RATE_LIMITED` を捕捉してバックオフしてください。SDK はもうリトライしません。
  </Step>

  <Step title="書き込みを見直す">
    独自のリトライは、繰り返しても安全な書き込みにだけ追加してください。
  </Step>

  <Step title="リトライ回数を決める">
    読み取りとマルチパートのパートで以前の試行回数に依存していた場合は、`{ maxRetries: 5 }` を渡してください。
  </Step>

  <Step title="型を更新する">
    `active_from` が `undefined` の場合を処理し、`RATE_LIMIT` を `RATE_LIMITED` に置き換えてください。
  </Step>
</Steps>
