Skip to content

Instantly share code, notes, and snippets.

@brenofreire
Last active November 22, 2023 15:04
Show Gist options
  • Save brenofreire/212955fd7e1d267058f10a829b024e03 to your computer and use it in GitHub Desktop.
Save brenofreire/212955fd7e1d267058f10a829b024e03 to your computer and use it in GitHub Desktop.
[MEDIUM] Usando Socket.io + AdonisJS V5

Usando Socket.io + AdonisJS V5

Recentemente me propus um desafio novo, construir um boilerplate de uma API em NodeJS usando TypeScript como parte de uma demanda do meu setor.

Por ter uma boa experiência com Angular, alinhado com a necessidade de criar uma API que fosse de fácil acesso à desenvolvedores frontend que já mexiam com TypeScript. Conversando em um canal no Telegram um amigo me falou sobre o AdonisJS em sua versão 5.

Foi amor a primeira vista.

Vejamos o que diz a página deles sobre o framework

O AdonisJS é uma estrutura MVC completa para o Node.js. Ele cuida da maioria dos problemas de desenvolvimento da Web, oferecendo uma API limpa e estável para criar aplicativos da Web ou microsserviços.

Tão direto ao ponto quanto parece ser. E a partir dai eu enxerguei no framework a solução para todos os meus gargalos!  Ao ler esse artigo, assumo que já tenha noções básicas sobre o framework e já tenha uma aplicação criada. Até a publicação desese artigo, ainda não temos socket nativamente com o AdonisJS, e esses foi um dos fatores para escolhermos o socket.io como uma solução. Então vamos direto ao ponto!


1. Instalando dependências

Assumindo que você já tem uma instalação AdonisJS, vamos precisar de 3 pacotes

npm install socket.io @types/socket.io socketio-jwt

O primeiro é o próprio socket.io, o segundo é uma abstração da ferramenta para TypeScript e o terceiro é uma integração com a ferramenta de autenticação de token de acesso JWT.

2. Criando o arquivo que vai startar nosso socket

  1. Dentro da pasta start na raiz do nosso diretório criaremos um arquivo chamado socket.ts
  2. No arquivo .adonisrc.json na raiz do nosso projeto iremos adicionar na chave preloads o caminho desse arquivo ./start/socket

Isso fará com que a nossa API execute automaticamente o socket quando ela iniciar.

3. Configurando o servidor para receber pulsos do socket

const app = require('express')() // Importa o express lidar com a conexão 
const socketioJwt = require('socketio-jwt') // Importa o SocketioJWT para utilizarmos auth nos sockets
const server = require('http').Server(app) // Monta o servidor HTTP do Express
const io = require('socket.io')(server) // Atrela o servidor HTTP ao socketio
const dotenv = require('dotenv').config().parsed // Aqui é só um pacote pra importar infos do .env facilmente

// Cria um "middleware" com JWT para validar a autorização do socket
io.use(socketioJwt.authorize({
  secret: dotenv.JWT_SECRET,
  handshake: true,
}))

// Escuta o server na porta 4444
server.listen(4444)

io.on('connection', socket => {
  socket.on('mensagem-nova', (request, socketOrigem) => {
    // Aqui você pode executar o que quiser 
  })
  
  socket.on('nome-do-evento', (request, callback) => {
    // Aqui você pode executar o que quiser 
  })
})

4. Conclusão

Pronto isso é tudo que precisa pra conectar com socket no AdonisV5. Alguns detalhes que você deve prestar atenção

  • Não é obrigatório utilizar JWT
  • Se utilizar JWT fica atento ao seu secret, é ele que permite você decodificar um token
  • Para mais informações acesse A documentação oficial do Socket.io
@tomrlh
Copy link

tomrlh commented Jul 2, 2020

Se pudesse dava mais uma estrela, comecei a usar o Adonis 5 recentemente e com ainda está na preview, existe pouco material para integração com outras libs e outros serviços que o 4 tem.
Parabéns pela iniciativa

@EmersonGarrido
Copy link

Ja eu to apanhando pra conseguir fazer funcionar, nao sai de jeito nenhum

@joaovictormilhomem
Copy link

Muito bom! Mas é possível integrar isso com a autenticação do Adonis?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment