# FlowStreams mit der Flow-API verwalten

> Melden Sie sich an, listen, erstellen, importieren, exportieren, pausieren, starten neu und entfernen Sie FlowStreams mit der JSON-API unter /fapi/, lesen Sie Statistiken und Variablen und rufen Sie einen Stream von außen über seine notify-Adresse oder seinen eigenen Proxy-Pfad auf.

Framework: flow
Product: Flow (flow@11.1)
Language: de
Content-SHA256: 646a260301bcda4016430262df7a05a86406f0d6698e0d07491ec8ea1c229cd4
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: 
Review: not-recorded

Alles, was der Editor tut, läuft über einen JSON-Endpunkt: `POST /fapi/` mit dem Body `{ "schema": "<name>", "data": { ... } }` (die API-Routen von Total.js, siehe [API-Routen](/en/total5/api-routes/)). Die Adresse `/fapi/` stammt aus der Zeile `$api : /fapi/` der Datei `config`. Jeder Aufruf außer der Anmeldung braucht das Sitzungs-Cookie; ohne es lautet die Antwort `401: Unauthorized`.

Diese Aufrufe wurden beim Schreiben dieser Seite auch gegen ein lokales Flow 11.1 (Node.js 24 und `total5@0.0.19`) ausprobiert.

## Anmelden

`Auth|login` nimmt `login` und `password` entgegen und antwortet `{"success":true}` mit dem Sitzungs-Cookie. Ein falsches Paar antwortet `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>"}}'
```

Die nächsten Aufrufe verwenden `-b cookie.txt`.

## Die Aufrufe

| `schema` | `data` | Was er tut |
|---|---|---|
| `Streams` | keine | die Liste der FlowStreams mit `id`, `name`, `group`, `author`, `version`, `proxypath`, `size` und den Live-`stats` der laufenden |
| `Streams\|save` | `name`, und optional `author`, `version`, `icon`, `color`, `group`, `url`, `reference`, `readme`, `memory`, `cloning`, `proxypath`, `proxytimeout` | **erstellt** einen Stream, wenn `id` fehlt (die Berechtigung *create* wird geprüft), andernfalls aktualisiert er den Stream mit dieser `id` und startet ihn neu |
| `Streams\|read` | `id` | die Eigenschaften eines Streams |
| `Streams\|raw` | `id` | das ganze Stream-Objekt mit seinem Design |
| `Streams\|export` | `id` | der Stream als JSON-Text in `value`, ohne die internen Felder (`unixsocket`, `env`, `import`, `worker`, `asfiles`) |
| `Streams\|import` | `data` (der JSON-Text) | erstellt aus einem Export einen **neuen** Stream (bis 10 MB) mit neuer `id`; ein doppelter `proxypath` wird durch einen zufälligen ersetzt; antwortet `{"success":true,"value":"<id>"}` |
| `Streams\|pause` | `id`, `is` (`true` oder `false`) | pausiert oder setzt einen laufenden Stream fort |
| `Streams\|restart` | `id` | startet den Stream neu |
| `Streams\|remove` | `id` | entfernt den Stream und seinen Ordner (die Berechtigung *remove* wird geprüft) |
| `Streams\|stats` | keine | die Summen der Installation: Versionen von Node.js, Total.js und Flow, Nachrichten, ausstehend, Speicher und Verbindungen |
| `Variables\|read` / `Variables\|save` | `id` (optional), `data` | die Variablen eines Streams oder die **globalen** Variablen, wenn `id` leer ist; Speichern schickt sie an die laufenden Streams |
| `Console\|read` / `Console\|clear` | keine | die Konsole der Anwendung |
| `CDN\|clear` | keine | leert den Cache der heruntergeladenen Oberflächenkomponenten |
| `Settings\|read` / `Settings\|save` | die Einstellungen (siehe [Einstellungen und Dateien](/en/flow/settings-and-files/)) | nur für den Super-Administrator |

## Einen Stream erstellen und starten

Erstellen Sie ihn und importieren Sie dann ein im Editor gebautes Design (eine exportierte JSON-Datei), um ihn zu starten:

```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"}}'
```

Ein aus dem Editor exportierter Stream enthält sein `design` (die Boxen und ihre Verbindungen), seine `components` (den Quelltext jeder einzelnen) und seine `variables`.

## Regeln für `proxypath`

Ein Stream kann HTTP-Routen unter einem eigenen Pfad veröffentlichen. Flow ergänzt die Schrägstriche (`demo` wird zu `/demo/`), weist die Pfade ab, die Flow selbst gehören (`/`, `/cdn/`, `/fapi/`, `/private/`, `/flows/`, `/designer/`, `/parts/`, `/forms/`, `/css/`, `/js/`, `/fonts/`, `/panels/`), mit `Proxy endpoint contains reserved path` und weist einen Pfad ab, den schon ein anderer Stream nutzt. `proxytimeout` ist die Zeit in Sekunden, die auf die Antwort des Streams gewartet wird (Standard `120`).

## Aufrufe von außen

| Route | Verwendung |
|---|---|
| `GET` oder `POST /notify/{id}/` | sendet eine Benachrichtigung an den Stream mit dieser id (der POST-Body ist auf 1 MB begrenzt); die Komponenten des Streams entscheiden, was damit geschieht. Antwortet `{"success":true}` |
| `+SOCKET /{id}/` | der WebSocket des Editors für diesen Stream (benötigt die Sitzung) |
| `GET /private/?token=<token>` | listet die Dateien des Ordners `private/`, wenn das Token dem `token` der Einstellungen entspricht; zehn falsche Tokens sperren eine Adresse für 15 Minuten |
| `+POST /update/` | aktualisiert die Anwendung aus einer `.bundle`-Datei; nur für die gebündelte Version |

Halten Sie das `token` geheim, senden Sie diese Aufrufe über HTTPS und stellen Sie Flow hinter einen Reverse-Proxy, wenn es aus dem Internet erreichbar ist.
