Um módulo Native Server-Sent-Invent (SSE) para Adonisjs.
O ADONISJS transmit é um módulo de eventos de servidor nativo (SSE) para Adonisjs. Ele fornece uma API simples para enviar eventos ao cliente. Ele também suporta o Redis como uma camada de transporte para transmitir eventos para vários servidores ou instâncias.
Aqui estão algumas coisas que você deve saber antes de usar este módulo.
Comunicação unidirecional: a transmissão de dados ocorre apenas de servidor para cliente, e não o contrário.
Somente dados textuais: SSE suporta apenas a transmissão de dados textuais, os dados binários não podem ser enviados.
Protocolo HTTP: O protocolo subjacente utilizado é o HTTP regular, não qualquer protocolo especial ou proprietário.
Instalação
Uso
Canais
Nomes de canais
Autorização do canal
Sincronização
Ping
Eventos
Instale o pacote do registro da NPM da seguinte forma:
nó Ace Add @Adonisjs/Transmit
O módulo expõe uma instância transmit
, que pode ser usada para enviar eventos ao cliente.
Importar transmissão de '@adonisjs/transmit/service/main' // em qualquer lugar do seu codeTransmit.broadcast ('canalname', {nome de usuário: 'lanz'})
Os canais são uma maneira de agrupar eventos. Por exemplo, você pode ter um canal para users
e outro para posts
. O cliente pode se inscrever em um ou mais canais para receber eventos.
Os nomes dos canais devem ser uma string e não devem conter caracteres especiais, exceto /
. Os seguintes são nomes de canais válidos.
transmit.broadcast ('usuários', {nome de usuário: 'lanz'}) transmit.broadcast ('usuários/1', {userrame: 'lanz'}) transmit.broadcast ('users/1/posts', {nome de usuário: ' Lanz '})
Você pode marcar um canal como privado e, em seguida, autorizar o cliente a se inscrever nele. A autorização é feita usando uma função de retorno de chamada.
// start/transmit.tsimport tipo {httpContext} de '@adonisjs/core/http'transmit.authorize <{id: string}> (' users/: id ', (ctx: httpContext, {id}) => {{ retornar ctx.auth.user? .id === +id})
Observação
Não se esqueça de adicionar seu arquivo start/transmit.ts
dentro da matriz preloads
do arquivo adonisrc.ts
.
Quando um cliente tenta se inscrever em um canal privado, a função de retorno de chamada é invocada com os parâmetros do canal e o contexto HTTP. A função de retorno de chamada deve retornar um valor booleano para permitir ou proibir a assinatura.
A transmissão suporta a sincronização de eventos em vários servidores ou instâncias usando uma camada de transporte. Você pode ativar a sincronização alterando a configuração e referenciando seu driver (apenas o Redis está disponível a partir de agora).
// config/transmit.tsimport Env de '#start/Env'import {Defineconfig} de'@adonisjs/transmit'import {redis} de '@adonisjs/transmit/transports'export padrão definitivamentefig ({{{{{{{{ transporte: {driver: redis ({host: Env.get ('redis_host'), porta: Env.get ('redis_port'), senha: Env.get ('redis_password'),}) }})
Observação
Certifique -se de instalar ioredis
ao usar o driver redis
.
A transmissão suporta pinging ao cliente para manter a conexão viva. Você pode ativar o ping alterando a configuração.
// config/transmit.tsimport {DefinEConfig} de '@adonisjs/transmit'import {redis} de'@adonisjs/transmit/transports'export default defintEConfig ({{ pinginterval: '1m',})
A Transmit usa emittery para emitir quaisquer eventos do ciclo de vida. Você pode ouvir eventos usando o método on
.
transmit.on ('Connect', ({uid}) => { console.log (`conectado: $ {uid}`)}) transmit.on ('desconectado', ({uid}) => { console.log (`desconectado: $ {uid}`)}) transmite.on ('transmissão', ({canal}) => { console.log (`transmitido para o canal $ {canal}`)}) transmite.on ('assinando', ({uid, canal}) => { console.log (`subscrito $ {uid} para $ {canal}`)}) transmit.on ('caça -escrenda', ({uid, canal}) => { console.log (`não inscrito $ {uid} de $ {canal}`)})