# Zarządzanie FlowStreamami przez API Flow

> Zaloguj się, wyświetlaj, twórz, importuj, eksportuj, wstrzymuj, restartuj i usuwaj FlowStreamy przez API JSON pod /fapi/, odczytuj statystyki i zmienne oraz wywołuj przepływ z zewnątrz jego adresem notify lub własną ścieżką proxy.

Framework: flow
Product: Flow (flow@11.1)
Language: pl
Content-SHA256: 3d539888c4ebfda8c2f87afad86bb87ea67cfcee0fcd0bcc45b0858d820e1f8c
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: 
Review: not-recorded

Wszystko, co robi edytor, przechodzi przez jeden endpoint JSON: `POST /fapi/` z treścią `{ "schema": "<name>", "data": { ... } }` (trasy API Total.js, zobacz [trasy API](/en/total5/api-routes/)). Adres `/fapi/` pochodzi z wiersza `$api : /fapi/` pliku `config`. Każde wywołanie poza logowaniem wymaga ciasteczka sesji; bez niego odpowiedzią jest `401: Unauthorized`.

Te wywołania wypróbowano także na lokalnym Flow 11.1 (Node.js 24 i `total5@0.0.19`) podczas pisania tej strony.

## Logowanie

`Auth|login` przyjmuje `login` i `password` i odpowiada `{"success":true}` wraz z ciasteczkiem sesji. Błędna para odpowiada `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>"}}'
```

Kolejne wywołania używają `-b cookie.txt`.

## Wywołania

| `schema` | `data` | Co robi |
|---|---|---|
| `Streams` | brak | lista FlowStreamów z `id`, `name`, `group`, `author`, `version`, `proxypath`, `size` i bieżącymi `stats` uruchomionych |
| `Streams\|save` | `name`, i opcjonalnie `author`, `version`, `icon`, `color`, `group`, `url`, `reference`, `readme`, `memory`, `cloning`, `proxypath`, `proxytimeout` | **tworzy** przepływ, gdy brakuje `id` (sprawdzane jest uprawnienie *create*), w przeciwnym razie aktualizuje przepływ o tym `id` i restartuje go |
| `Streams\|read` | `id` | właściwości jednego przepływu |
| `Streams\|raw` | `id` | cały obiekt przepływu wraz z projektem |
| `Streams\|export` | `id` | przepływ jako tekst JSON w `value`, bez pól wewnętrznych (`unixsocket`, `env`, `import`, `worker`, `asfiles`) |
| `Streams\|import` | `data` (tekst JSON) | tworzy **nowy** przepływ z eksportu (do 10 MB) z nowym `id`; powtórzony `proxypath` jest zastępowany losowym; odpowiada `{"success":true,"value":"<id>"}` |
| `Streams\|pause` | `id`, `is` (`true` lub `false`) | wstrzymuje lub wznawia działający przepływ |
| `Streams\|restart` | `id` | restartuje przepływ |
| `Streams\|remove` | `id` | usuwa przepływ i jego folder (sprawdzane jest uprawnienie *remove*) |
| `Streams\|stats` | brak | sumy instalacji: wersje Node.js, Total.js i Flow, wiadomości, oczekujące, pamięć i połączenia |
| `Variables\|read` / `Variables\|save` | `id` (opcjonalne), `data` | zmienne jednego przepływu albo zmienne **globalne**, gdy `id` jest puste; zapis wysyła je do działających przepływów |
| `Console\|read` / `Console\|clear` | brak | konsola aplikacji |
| `CDN\|clear` | brak | czyści pamięć podręczną pobranych komponentów interfejsu |
| `Settings\|read` / `Settings\|save` | ustawienia (zobacz [ustawienia i pliki](/en/flow/settings-and-files/)) | tylko dla superadministratora |

## Utworzenie przepływu i jego uruchomienie

Utwórz go, a potem zaimportuj projekt zbudowany w edytorze (wyeksportowany plik JSON), aby go uruchomić:

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

Przepływ wyeksportowany z edytora niesie swój `design` (pola i ich połączenia), swoje `components` (źródło każdego z nich) i swoje `variables`.

## Zasady `proxypath`

Przepływ może publikować trasy HTTP pod własną ścieżką. Flow dodaje ukośniki (`demo` staje się `/demo/`), odrzuca ścieżki należące do samego Flow (`/`, `/cdn/`, `/fapi/`, `/private/`, `/flows/`, `/designer/`, `/parts/`, `/forms/`, `/css/`, `/js/`, `/fonts/`, `/panels/`) komunikatem `Proxy endpoint contains reserved path` i odrzuca ścieżkę, której używa już inny przepływ. `proxytimeout` to czas w sekundach oczekiwania na odpowiedź przepływu (domyślnie `120`).

## Wywołania z zewnątrz

| Trasa | Zastosowanie |
|---|---|
| `GET` lub `POST /notify/{id}/` | wysyła powiadomienie do przepływu o tym id (treść POST ograniczona do 1 MB); komponenty przepływu decydują, co z nim zrobić. Odpowiada `{"success":true}` |
| `+SOCKET /{id}/` | WebSocket edytora dla tego przepływu (wymaga sesji) |
| `GET /private/?token=<token>` | wyświetla pliki folderu `private/`, gdy token jest równy `token` z ustawień; dziesięć błędnych tokenów blokuje adres na 15 minut |
| `+POST /update/` | aktualizuje aplikację z pliku `.bundle`; tylko dla wersji spakowanej |

Zachowaj `token` w tajemnicy, wysyłaj te wywołania przez HTTPS i umieść Flow za odwrotnym proxy, gdy jest dostępny z Internetu.
