Un module de serveur-évent (SSE) natif pour ADONISJS.
ADONISJS Transmit est un module SSE-Event (SSE) de serveur natif pour ADONISJS. Il fournit une API simple pour envoyer des événements au client. Il prend également en charge Redis en tant que couche de transport pour les événements de diffusion vers plusieurs serveurs ou instances.
Voici quelques éléments que vous devez savoir avant d'utiliser ce module.
Communication unidirectionnelle: la transmission de données ne se produit que du serveur à un client, et non dans l'inverse.
Données textuelles uniquement: SSE prend en charge uniquement la transmission des données textuelles, les données binaires ne peuvent pas être envoyées.
Protocole HTTP: Le protocole sous-jacent utilisé est le HTTP ordinaire, pas un protocole spécial ou propriétaire.
Installation
Usage
Canaux
Noms de canaux
Autorisation de canal
Synchronisation
Ping-ping
Événements
Installez le package à partir du registre NPM comme suit:
Node Ace Add @ Adonisjs / Transmit
Le module expose une instance transmit
, qui peut être utilisée pour envoyer des événements au client.
Importer la transmission à partir de '@ Adonisjs / Transmit / Services / Main' // n'importe où dans votre codetransmit.broadcast ('ChannelName', {nom d'utilisateur: 'lanz'})
Les canaux sont un moyen de regrouper les événements. Par exemple, vous pouvez avoir un canal pour users
et un autre pour posts
. Le client peut s'abonner à un ou plusieurs canaux pour recevoir des événements.
Les noms de canaux doivent être une chaîne et ne doivent contenir aucun caractères spéciaux sauf /
. Voici les noms de canaux valides.
transmit.broadcast ('utilisateurs', {nom d'utilisateur: 'lanz'}) transmit.broadcast ('utilisateurs / 1', {nom d'utilisateur: 'lanz'}) transmit.broadcast ('utilisateurs / 1 / poteaux', {username: ' lanz '})
Vous pouvez marquer un canal en tant que privé, puis autoriser le client à vous abonner. L'autorisation se fait à l'aide d'une fonction de rappel.
// start / transmit.tsimport type {httpcontext} de '@ adonisjs / core / http'transmit.authorize <{id: string}> (' utilisateurs /: id ', (ctx: httpcontext, {id}) => {{{ return ctx.auth.user? .id === + id})
Note
N'oubliez pas d'ajouter votre fichier start/transmit.ts
dans le tableau preloads
du fichier adonisrc.ts
.
Lorsqu'un client essaie de s'abonner à un canal privé, la fonction de rappel est invoquée avec les paramètres du canal et le contexte HTTP. La fonction de rappel doit renvoyer une valeur booléenne pour permettre ou interdire l'abonnement.
Transmission prend en charge la synchronisation des événements sur plusieurs serveurs ou instances à l'aide d'une couche de transport. Vous pouvez activer la synchronisation en modifiant la configuration et en faisant référence à votre pilote (seul Redis est disponible à partir de maintenant).
// config / transmit.tsimport env à partir de '# start / env'import {DefiConfig} de' @ adonisjs / transmit'import {redis} de '@ adonisjs / transmit / transport'export defailConfig ({{{ Transport: {Driver: redis ({hôte: env.get ('redis_host'), port: env.get ('redis_port'), mot de passe: env.get ('redis_password'),}) }})
Note
Assurez-vous d'installer ioredis
lors de l'utilisation du pilote redis
.
La transmission prend en charge le ping au client pour maintenir la connexion en vie. Vous pouvez activer le ping en modifiant la configuration.
// config / transmit.tsIMPORT {DefiConfig} de '@ Adonisjs / transmit'import {redis} de' @ adonisjs / transmit / transport'export defaulconfig ({{ Pinginterval: '1m',})
Transmit utilise Emittery pour émettre tous les événements de cycle de vie. Vous pouvez écouter les événements en utilisant la méthode on
.
transmit.on ('connect', ({uid}) => { console.log (`connecté: $ {uid}`)}) transmit.on ('déconnecter', ({uid}) => { console.log (`déconnecté: $ {uid}`)}) transmit.on ('diffuser', ({canal}) => { console.log (`diffusé sur canal $ {canal}`)}) transmit.on ('abonnez-vous', ({uid, canal}) => { console.log (`souscrit $ {uid} à $ {canal}`)}) transmit.on ('désubscribe', ({uid, canal}) => { console.log (`non publié $ {uid} de $ {canal}`)})