> ## 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.

# Migrer vers la v4

> Ce qui a changé dans @squarecloud/blob 4.0.0 : une politique de nouvelles tentatives plus sûre, moins de nouvelles tentatives par défaut, un SavedRule.active_from optionnel et une suppression par lot cohérente avec un seul identifiant.

La version 4.0.0 modifie **la manière dont le SDK réessaie**, afin qu'il ne répète que ce qui peut l'être sans risque. **Aucune méthode, option ni export n'a été renommé ou supprimé.**

## Prérequis

Inchangés : **Node.js 20** ou plus récent, ou un navigateur ; ESM et CommonJS.

## Résumé des changements incompatibles

| v3.x                                                              | v4.x                                                                             |
| ----------------------------------------------------------------- | -------------------------------------------------------------------------------- |
| `429` réessayé                                                    | **Jamais réessayé** (sauf `TOO_MANY_CONCURRENT_CHUNKS` sur une partie multipart) |
| Écritures réessayées en cas d'erreur réseau et de `5xx`           | Les écritures ont droit à **une seule tentative**                                |
| Réessayé uniquement sur `500` et `503`                            | Réessayé sur **tout `5xx`** (lectures et parties multipart)                      |
| `maxRetries` par défaut `5`                                       | Par défaut **`2`**                                                               |
| Backoff plafonné à 30 s                                           | Plafonné à **8 s** : `min(8 s, 500 ms · 2^n) · U(0.5, 1)`                        |
| `SavedRule.active_from: string`                                   | `active_from?: string` (**optionnel**)                                           |
| `delete([id])` avec un seul identifiant lève `PREFIX_NOT_ALLOWED` | Le signale dans `failed`                                                         |
| `RATE_LIMIT` dans `BlobErrorCode`                                 | **Déprécié** (toujours présent dans le type)                                     |

## `429` n'est plus réessayé

`RATE_LIMITED` couvre à la fois une fenêtre par route et un blocage du compte ou de l'IP qui peut durer environ 30 minutes : le SDK ne le réessaie donc plus. Cela inclut la limite des envois simples et `TOO_MANY_CONCURRENT_UPLOADS`. Gérez-le vous-même, et attendez avant de réessayer :

```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;
}
```

La seule exception est `TOO_MANY_CONCURRENT_CHUNKS` sur une partie multipart : le serveur refuse la partie avant de la lire, le SDK la renvoie donc dans la limite de `maxRetries`.

## Les écritures ont droit à une seule tentative

Les erreurs réseau et les `5xx` ne sont désormais réessayés que sur les appels `GET` et sur les parties d'un envoi multipart. Ces appels ont droit à **une seule tentative** :

* `put()` simple, ainsi que le démarrage, la finalisation et l'annulation d'un envoi multipart ;
* `update()`, `copy()`, `move()`, `delete()` ;
* `rules.set()`, `uploadTokens.create()`, `shares.create()`, `shares.revoke()`.

Ne réessayez vous-même une écriture que lorsque la répéter est sans risque pour vous, par exemple un `put()` vers le même nom avec `overwrite: true`. Voir [Réessayer vous-même les écritures](/fr/sdks/blob/errors#réessayer-vous-même-les-écritures).

## Moins de nouvelles tentatives, backoff plus court

`maxRetries` vaut désormais `2` par défaut (contre `5` auparavant), et le backoff est plafonné à 8 secondes (contre 30). Pour conserver l'ancien budget sur les lectures et les parties multipart :

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

Cela ne rétablit pas les nouvelles tentatives sur `429` ni sur les écritures.

## `SavedRule.active_from` est optionnel

L'API n'envoie `active_from` que pour les règles avec `delete_after_days`. En TypeScript, gérez `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}`);
    }
}
```

## `delete([id])` avec un seul identifiant

Un lot contenant un seul identifiant signale désormais `PREFIX_NOT_ALLOWED` dans `failed`, comme n'importe quel autre lot, au lieu de lever une erreur :

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

`delete(id)` avec une simple chaîne lève toujours une erreur.

## `RATE_LIMIT` est déprécié

Le service n'envoie plus `RATE_LIMIT` : le blocage du compte ou de l'IP est `RATE_LIMITED`. L'ancien code reste dans `BlobErrorCode` pour que les comparaisons existantes compilent toujours ; remplacez-les par `RATE_LIMITED`. `DUPLICATE_RULE_PREFIX` a été ajouté.

## Corrections

* Un corps de réponse tronqué en cours de lecture est désormais une **erreur réseau** : il est réessayé sur les appels `GET` et les parties multipart, et sinon l'erreur `fetch` d'origine est levée (auparavant, c'était `UNKNOWN_ERROR`).
* Un envoi multipart échoué **attend désormais les parties encore en cours** avant d'annuler, de sorte qu'aucune partie n'arrive après l'annulation et qu'aucune requête ne survit à `put()`.

## Liste de contrôle

<Steps>
  <Step title="Gérez vous-même les 429">
    Interceptez `RATE_LIMITED` et temporisez ; le SDK ne le réessaie plus.
  </Step>

  <Step title="Passez en revue les écritures">
    N'ajoutez vos propres nouvelles tentatives qu'aux écritures répétables sans risque.
  </Step>

  <Step title="Choisissez un budget de nouvelles tentatives">
    Passez `{ maxRetries: 5 }` si vous dépendiez de l'ancien nombre de tentatives sur les lectures et les parties multipart.
  </Step>

  <Step title="Mettez à jour les types">
    Gérez le cas où `active_from` vaut `undefined`, et remplacez `RATE_LIMIT` par `RATE_LIMITED`.
  </Step>
</Steps>
