![Passos para a conexão em tempo real: obter o token PubSub, conectar ao endpoint /cable, assinar o canal com o comando subscribe e atualizar a presença periodicamente.](/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBcndRIiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--539feb5b6fffb9dd6550676fe6e483c230348c23/1729185813-como-configurar-uma-conexao-web_socket.png)

O WebSocket estabelece uma conexão contínua entre o cliente e o servidor, permitindo comunicação bidirecional. O Chatwoot utiliza essa conexão para fornecer atualizações em tempo real sobre eventos da plataforma. Para se conectar ao WebSocket do Chatwoot, basta fornecer um token e seguir as instruções de configuração deste guia.

**Nota**: Este recurso é experimental e a documentação pode mudar a cada nova versão. Além disso, a compatibilidade com versões anteriores não é garantida, então é essencial garantir que você esteja usando a versão mais recente da implementação.

### Por que usar uma conexão WebSocket?

A conexão WebSocket permite atualizações de dados em tempo real, o que é ideal para clientes como os SDKs de Android ou iOS do Chatwoot. Isso atualiza o painel sem precisar recarregar a página, melhorando a experiência do usuário e a produtividade dos agentes.

### Como configurar uma conexão WebSocket com o Chatwoot?

Para configurar uma conexão WebSocket com o Chatwoot, você precisa iniciar uma conexão com o token de autenticação PubSub fornecido pelo Chatwoot. A URL para conexão é `wss://<sua-url-de-instalacao>/cable`, substituindo `<sua-url-de-instalacao>` pelo endereço da sua instância.

Um token PubSub é usado para autenticar o cliente ao se conectar ao serviço PubSub (publicação e assinatura). O cliente deve apresentar esse token para estabelecer a conexão e começar a publicar ou assinar mensagens.

Há dois tipos de token PubSub disponíveis no Chatwoot:

* **Token PubSub de Usuário**: tem os privilégios de um agente/administrador e recebe todos os eventos listados neste documento. Você pode obter o token chamando a API de Perfil.

* **Token PubSub de Contato**: o Chatwoot gera um token exclusivo para cada sessão de contato. Esse token é usado para conectar-se ao WebSocket e receber atualizações em tempo real daquela sessão. Quando um contato é criado por meio das APIs públicas, o `pubsub_token` é incluído na resposta. Esse token dá acesso apenas aos eventos da sessão atual, como `conversation.created` e `message.created`.

### Como conectar ao WebSocket do Chatwoot?

Para se conectar ao WebSocket do Chatwoot, use o comando `subscribe`. O identificador depende do tipo de token:

* Com um **token de contato**, envie somente `channel` e `pubsub_token`.
* Com um **token de usuário**, envie também `account_id` e `user_id`.

No exemplo abaixo, escolha exatamente um dos dois identificadores:

```js
const stringify = (payload = {}) => JSON.stringify(payload);

const contactIdentifier = {
  channel: "RoomChannel",
  pubsub_token: "<token-pubsub-de-contato>",
};

const userIdentifier = {
  channel: "RoomChannel",
  pubsub_token: "<token-pubsub-de-usuario>",
  account_id: "<seu-account-id>",
  user_id: "<seu-user-id>",
};

// Use contactIdentifier para um contato ou userIdentifier para um usuário.
const identifier = contactIdentifier;

const connection = new WebSocket("wss://<sua-url-de-instalacao>/cable");

connection.addEventListener("open", () => {
  connection.send(
    stringify({
      command: "subscribe",
      identifier: stringify(identifier),
    })
  );
});
```

### Como publicar a presença no servidor WebSocket?

Para manter o status dos usuários online no Chatwoot, envie um evento de atualização de presença periodicamente ao servidor.

* **Atualizar presença de agente/administrador**

  Envie o seguinte payload ao servidor:

```js
const userPayload = stringify({
  command: "message",
  identifier: stringify(userIdentifier),
  data: stringify({ action: "update_presence" }),
});

connection.send(userPayload);
```

* **Atualizar presença de contato**

  Envie o seguinte payload:

```js
const contactPayload = stringify({
  command: "message",
  identifier: stringify(contactIdentifier),
  data: stringify({ action: "update_presence" }),
});

connection.send(contactPayload);
```

### Payloads WebSocket

Os eventos no Chatwoot podem conter diversos objetos no payload, como `Conversation`, `Contact`, `User` e `Message`. Cada evento retorna dados específicos dependendo do tipo de objeto e do evento que ocorreu, como conversas criadas, mensagens enviadas ou atualizações de presença.

Agora você está pronto para configurar e utilizar o WebSocket no Chatwoot, oferecendo uma experiência em tempo real e aumentando a eficiência das suas operações de atendimento.