Événements envoyés par le serveur
Server-Sent Events (SSE) est une technologie de push serveur permettant à un client de recevoir des mises à jour automatiques d'un serveur via une connexion HTTP. Chaque notification est envoyée sous la forme d'un bloc de texte terminé par une paire de nouvelles lignes (pour en savoir plus ici).
Utilisation#
Pour activer les événements envoyés par le serveur sur une route (route enregistrée dans une classe controller), annoter le gestionnaire de méthode avec le décorateur @Sse()
.
@Sse('sse')
sse(): Observable<MessageEvent> {
return interval(1000).pipe(map((_) => ({ data: { hello: 'world' } })));
}
Astuce Le décorateur@Sse()
et l'interfaceMessageEvent
sont importés du package@nestjs/common
, tandis queObservable
,interval
, etmap
sont importés du packagerxjs
.
Attention Les routes d'événements envoyés par le serveur doivent renvoyer un flux Observable
.
Dans l'exemple ci-dessus, nous avons défini une route nommée sse
qui nous permettra de propager des mises à jour en temps réel. Ces événements peuvent être écoutés à l'aide de l'API EventSource.
La méthode sse
retourne un Observable
qui émet plusieurs MessageEvent
(dans cet exemple, il émet un nouveau MessageEvent
toutes les secondes). L'objet MessageEvent
doit respecter l'interface suivante pour correspondre à la spécification :
export interface MessageEvent {
data: string | object;
id?: string;
type?: string;
retry?: number;
}
Avec ceci en place, nous pouvons maintenant créer une instance de la classe EventSource
dans notre application côté client, en passant la route /sse
(qui correspond au point de terminaison que nous avons passé dans le décorateur @Sse()
ci-dessus) comme argument du constructeur.
L'instance EventSource
ouvre une connexion persistante à un serveur HTTP, qui envoie des événements au format text/event-stream
. La connexion reste ouverte jusqu'à ce qu'elle soit fermée en appelant EventSource.close()
.
Une fois la connexion ouverte, les messages entrants du serveur sont transmis à votre code sous la forme d'événements. Si le message entrant contient un champ d'événement, l'événement déclenché est le même que la valeur du champ d'événement. Si aucun champ d'événement n'est présent, un événement générique message
est déclenché (source).
const eventSource = new EventSource('/sse');
eventSource.onmessage = ({ data }) => {
console.log('Nouveau message', JSON.parse(data));
};
Exemple#
Un exemple concret est disponible ici.