# Flux : SSE et WebSocket

> Les flux sont relayés sans retenue : chaque évènement arrive quand l'amont l'émet. Côté produit : Passerelle d'API ; côté exploitation : Flux SSE et WebSocket.

Guide - Depuis la version 0.2.0 - Flexway v1.6.3 - https://flexway.io/docs/developer-streams/

> Les flux sont relayés **sans retenue** : chaque évènement arrive quand l'amont l'émet.
>
> Côté produit : [Passerelle d'API](https://flexway.io/docs/product-api-gateway/) ; côté exploitation : [Flux SSE et WebSocket](https://flexway.io/docs/operations-examples-rest/#flux-sse-et-websocket).

## Server-sent events

```bash
curl -N -H "Authorization: Bearer $TOKEN" -H 'Accept: text/event-stream' https://api.example.com/events
```

| Règle | Détail |
| --- | --- |
| Pas de délai total | Un flux ouvert n'est pas coupé par le budget de l'opération |
| Le silence le termine | Au-delà du délai de lecture de l'exploitant sans octet, le flux se ferme : faites émettre un battement (`: ping`) plus souvent |
| Débit | Compté à l'ouverture |

Le `EventSource` d'un navigateur ne sait pas poser `Authorization`. Lisez le flux avec `fetch` :

```javascript
const res = await fetch("https://api.example.com/events", {
  headers: { Authorization: `Bearer ${token}`, Accept: "text/event-stream" },
});
const reader = res.body.pipeThrough(new TextDecoderStream()).getReader();
for (;;) {
  const { value, done } = await reader.read();
  if (done) break;
  handle(value); // découpez sur la ligne vide qui termine un évènement
}
```

## WebSocket

La mise à niveau est une requête comme une autre : identité et débit sont vérifiés **à l'ouverture**,
puis la connexion survit au budget de l'opération.

```javascript
// Un navigateur ne pose pas d'en-tête sur un WebSocket : l'exploitant décide comment l'identité
// arrive (cookie déclaré au contrat, edge qui authentifie). Un client serveur pose Authorization :
const ws = new WebSocket("wss://api.example.com/ws", { headers: { Authorization: `Bearer ${token}` } }); // Node (ws)
```

Les canaux d'évènements d'un courtier (accusés, reprise) sont décrits à part :
[canaux asynchrones](https://flexway.io/docs/developer-async/).
