# Gérer les FlowStreams avec l’API de Flow

> Connectez-vous, listez, créez, importez, exportez, mettez en pause, redémarrez et supprimez des FlowStreams avec l’API JSON sur /fapi/, lisez les statistiques et les variables et appelez un flux de l’extérieur par son adresse notify ou son propre chemin proxy.

Framework: flow
Product: Flow (flow@11.1)
Language: fr
Content-SHA256: 64dc69adf592436d76e390cfa94b005fe5be3cec374b644d3b4f7b9c43ee76ba
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: 
Review: not-recorded

Tout ce que fait l’éditeur passe par un seul point d’accès JSON : `POST /fapi/` avec le corps `{ "schema": "<name>", "data": { ... } }` (les routes API de Total.js, voir [routes API](/en/total5/api-routes/)). L’adresse `/fapi/` vient de la ligne `$api : /fapi/` du fichier `config`. Tous les appels sauf la connexion ont besoin du cookie de session ; sans lui la réponse est `401: Unauthorized`.

Ces appels ont aussi été essayés contre un Flow 11.1 local (Node.js 24 et `total5@0.0.19`) pendant la rédaction de cette page.

## Se connecter

`Auth|login` prend `login` et `password` et répond `{"success":true}` avec le cookie de session. Un mauvais couple répond `Invalid credentials`.

```bash
curl -c cookie.txt -X POST http://localhost:8000/fapi/ \
  -H 'content-type: application/json' \
  -d '{"schema":"Auth|login","data":{"login":"<your login>","password":"<your password>"}}'
```

Les appels suivants utilisent `-b cookie.txt`.

## Les appels

| `schema` | `data` | Ce qu’il fait |
|---|---|---|
| `Streams` | aucune | la liste des FlowStreams avec `id`, `name`, `group`, `author`, `version`, `proxypath`, `size` et les `stats` en direct de ceux qui tournent |
| `Streams\|save` | `name`, et éventuellement `author`, `version`, `icon`, `color`, `group`, `url`, `reference`, `readme`, `memory`, `cloning`, `proxypath`, `proxytimeout` | **crée** un flux quand `id` manque (la permission *create* est vérifiée), sinon met à jour le flux portant cet `id` et le redémarre |
| `Streams\|read` | `id` | les propriétés d’un flux |
| `Streams\|raw` | `id` | l’objet complet du flux, avec son design |
| `Streams\|export` | `id` | le flux sous forme de texte JSON dans `value`, sans les champs internes (`unixsocket`, `env`, `import`, `worker`, `asfiles`) |
| `Streams\|import` | `data` (le texte JSON) | crée un **nouveau** flux à partir d’un export (jusqu’à 10 Mo), avec un nouvel `id` ; un `proxypath` répété est remplacé par un chemin aléatoire ; répond `{"success":true,"value":"<id>"}` |
| `Streams\|pause` | `id`, `is` (`true` ou `false`) | met en pause ou reprend un flux en cours |
| `Streams\|restart` | `id` | redémarre le flux |
| `Streams\|remove` | `id` | supprime le flux et son dossier (la permission *remove* est vérifiée) |
| `Streams\|stats` | aucune | les totaux de l’installation : versions de Node.js, Total.js et Flow, messages, en attente, mémoire et connexions |
| `Variables\|read` / `Variables\|save` | `id` (facultatif), `data` | les variables d’un flux, ou les variables **globales** quand `id` est vide ; l’enregistrement les pousse vers les flux en cours |
| `Console\|read` / `Console\|clear` | aucune | la console de l’application |
| `CDN\|clear` | aucune | vide le cache des composants d’interface téléchargés |
| `Settings\|read` / `Settings\|save` | les réglages (voir [réglages et fichiers](/en/flow/settings-and-files/)) | uniquement pour le super-administrateur |

## Créer un flux et l’exécuter

Créez-le, puis importez un design construit dans l’éditeur (un fichier JSON exporté) pour le démarrer :

```bash
curl -b cookie.txt -X POST http://localhost:8000/fapi/ \
  -H 'content-type: application/json' \
  -d '{"schema":"Streams|save","data":{"name":"Demo","author":"Me"}}'
```

Un flux exporté depuis l’éditeur contient son `design` (les boîtes et leurs connexions), ses `components` (le source de chacun) et ses `variables`.

## Règles de `proxypath`

Un flux peut publier des routes HTTP sous un chemin qui lui est propre. Flow ajoute les barres obliques (`demo` devient `/demo/`), rejette les chemins qui appartiennent à Flow lui-même (`/`, `/cdn/`, `/fapi/`, `/private/`, `/flows/`, `/designer/`, `/parts/`, `/forms/`, `/css/`, `/js/`, `/fonts/`, `/panels/`) avec `Proxy endpoint contains reserved path`, et rejette un chemin déjà utilisé par un autre flux. `proxytimeout` est le temps en secondes à attendre pour la réponse du flux (par défaut `120`).

## Appels depuis l’extérieur

| Route | Usage |
|---|---|
| `GET` ou `POST /notify/{id}/` | envoie une notification au flux portant cet id (le corps du POST est limité à 1 Mo) ; les composants du flux décident quoi en faire. Répond `{"success":true}` |
| `+SOCKET /{id}/` | le WebSocket de l’éditeur pour ce flux (il faut la session) |
| `GET /private/?token=<token>` | liste les fichiers du dossier `private/` quand le jeton est égal au `token` des réglages ; dix mauvais jetons bloquent une adresse pendant 15 minutes |
| `+POST /update/` | met à jour l’application à partir d’un fichier `.bundle` ; uniquement pour la version empaquetée |

Gardez le `token` secret, envoyez ces appels en HTTPS et placez Flow derrière un proxy inverse quand il est accessible depuis Internet.
