> For the complete documentation index, see [llms.txt](https://docs.decentraland.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.decentraland.org/contributor/contributor-es/comunicaciones/tipos-de-transporte/websocket.md).

# WebSocket

El transporte websocket es uno de los transportes de mensajería de la isla compatibles con el protocolo de comunicaciones de Decentraland. Los clientes deben usarlo cuando reciban una cadena de conexión apropiada de su realm [Archipelago](https://github.com/decentraland/docs/tree/main/contributor/archipelago/README.md) o si está indicado como un transporte fijo.

En el contexto del transporte websocket, una isla se denomina una *sala*. Ambos nombres indican lo mismo: un grupo de jugadores cercanos que intercambian actualizaciones y chat.

Las cadenas de conexión comienzan con el `ws-room:` prefijo, seguido de un `wss://` URI para la sala específica. Se ven así:

```
ws-room:wss://comms.example.com/rooms/<room-id>
```

En ausencia de un protocolo explícito para la URI de websocket, `wss://` se asume.

### Conectando

El transporte usa el protocolo websocket estándar sobre HTTPS. Los clientes pueden abrir una conexión usando cualquier implementación estándar a su disposición.

### Paquetes de websocket

Todos los mensajes del transporte websocket se serializan usando la [`WsPacket`](https://github.com/decentraland/protocol/blob/c48ea0aa00d8173084571552463a6a05a7f49636/proto/decentraland/kernel/comms/rfc5/ws_comms.proto#L78) estructura. Implementan un conjunto de mensajes de conectividad y autenticación a nivel de protocolo, además de un tipo contenedor para mensajes del cliente.

{% hint style="info" %}
El [`WsPacket`](#WsPacket) estructura no debe confundirse con el mensaje \[`Packet`]\[Packet]. Es una capa adicional de encapsulado específica del transporte websocket. Los mensajes reales de comms están contenidos en el [`WsPeerUpdate`](#WsPeerUpdate) tipo.
{% endhint %}

| Campo     | Tipo   | Valor                                                                                                                                                                                                                                           |
| --------- | ------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `message` | `enum` | <p>Uno de <code>WsIdentification</code>, <code>WsChallengeRequired</code>, <code>WsSignedChallenge</code>,<br><code>WsWelcome</code>, <code>WsPeerJoin</code>, <code>WsPeerLeave</code>, <code>WsKicked</code> o <code>WsPeerUpdate</code>.</p> |

### Autenticación

Antes de poder empezar a retransmitir mensajes a otros, los clientes deben autenticarse firmando una cadena de desafío. Esto se requiere incluso cuando la URI del transporte se obtuvo de [Archipelago](https://github.com/decentraland/docs/tree/main/contributor/archipelago/README.md) después de una ronda previa de autenticación.

El primer mensaje que un cliente envía al unirse a una isla es [`WsIdentification`](https://github.com/decentraland/protocol/blob/c48ea0aa00d8173084571552463a6a05a7f49636/proto/decentraland/kernel/comms/rfc5/ws_comms.proto#L64), que contiene una dirección pública. Se responderá con [`WsChallengeRequired`](#WsChallengeRequired), y los clientes envían un [`WsSignedChallenge`](#WsSignedChallenge) en respuesta.

```
  .----------.                .--------.
  |  Servidor  |                | Cliente |
  '----+-----'                '---+----'
       ⋮                          |
       ⋮                  Conectar |
       o - - - - - - - - - - - - -|
       |                          |
       |                          |
       |         WsIdentification |
       |<-------------------------+
       +------------------------->|
       | WsChallengeRequired      |
       |                          |
       |                          |
       |        WsSignedChallenge |
       |<-------------------------+
       +------------------------->|
       | WsWelcome                |
       |                          |

```

Si el flujo se completa correctamente, el cliente recibirá un [`WsWelcome`](#WsWelcome) y podrá empezar a enviar mensajes a otros pares.

***

**`WsIdentification`** [**↗ fuente**](https://github.com/decentraland/protocol/blob/c48ea0aa00d8173084571552463a6a05a7f49636/proto/decentraland/kernel/comms/rfc5/ws_comms.proto#L64)

| Campo     | Tipo     | Valor                                        |
| --------- | -------- | -------------------------------------------- |
| `address` | `string` | La dirección pública de Ethereum del cliente |

***

**`WsChallengeRequired`** [**↗ fuente**](https://github.com/decentraland/protocol/blob/c48ea0aa00d8173084571552463a6a05a7f49636/proto/decentraland/kernel/comms/rfc5/ws_comms.proto#L48)

| Campo               | Tipo     | Valor                                                                                               |
| ------------------- | -------- | --------------------------------------------------------------------------------------------------- |
| `challenge_to_sign` | `string` | La cadena proporcionada por el servidor que se firmará como prueba de identidad                     |
| `already_connected` | `string` | Una pista del servidor para los clientes, que indica que las conexiones anteriores pueden cerrarse. |

***

**`WsSignedChallenge`** [**↗ fuente**](https://github.com/decentraland/protocol/blob/c48ea0aa00d8173084571552463a6a05a7f49636/proto/decentraland/kernel/comms/rfc5/ws_comms.proto#L56)

| Campo             | Tipo     | Valor                                                                                                                                       |
| ----------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
| `auth_chain_json` | `string` | Un [cadena de autenticación](https://github.com/decentraland/docs/tree/main/auth/authchain/README.md) que termina con la firma del desafío. |

***

**`WsWelcome`** [**↗ fuente**](https://github.com/decentraland/protocol/blob/c48ea0aa00d8173084571552463a6a05a7f49636/proto/decentraland/kernel/comms/rfc5/ws_comms.proto#L11)

| Campo             | Tipo                  | Valor                                                            |
| ----------------- | --------------------- | ---------------------------------------------------------------- |
| `alias`           | `uint32`              | Un ID generado por el servidor para la sesión del cliente        |
| `peer_identities` | `map<uint32, string>` | Las direcciones de todos los peers actuales, indexadas por alias |

### Conectividad

Se definen tres mensajes para ayudar a los clientes a hacer seguimiento de sus peers y de su propio estado.

[`WsPeerJoin`](#WsPeerJoin) se recibe cuando otro cliente se conecta a la sala y se autentica correctamente, mientras que [`WsPeerLeave`](#WsPeerLeave) se recibe cuando los peers se desconectan.

También existe el [`WsKicked`](#WsKicked) mensaje, que informa a los clientes que su conexión está a punto de cerrarse y el motivo. En la práctica actual, la principal razón por la que un servidor puede expulsar a un cliente de una sala es porque se han conectado simultáneamente a otra sala, cuando eso está prohibido por la política del servidor.

***

**`WsPeerJoin`** [**↗ fuente**](https://github.com/decentraland/protocol/blob/c48ea0aa00d8173084571552463a6a05a7f49636/proto/decentraland/kernel/comms/rfc5/ws_comms.proto#L19)

| Campo     | Tipo     | Valor                                                               |
| --------- | -------- | ------------------------------------------------------------------- |
| `alias`   | `uint32` | El ID generado por el servidor enviado en [`WsWelcome`](#WsWelcome) |
| `address` | `string` | La dirección de Ethereum del nuevo peer                             |

***

**`WsPeerLeave`** [**↗ fuente**](https://github.com/decentraland/protocol/blob/c48ea0aa00d8173084571552463a6a05a7f49636/proto/decentraland/kernel/comms/rfc5/ws_comms.proto#L27)

| Campo   | Tipo     | Valor                                                |
| ------- | -------- | ---------------------------------------------------- |
| `alias` | `uint32` | El ID generado por el servidor del peer desconectado |

***

**`WsKicked`** [**↗ fuente**](https://github.com/decentraland/protocol/blob/c48ea0aa00d8173084571552463a6a05a7f49636/proto/decentraland/kernel/comms/rfc5/ws_comms.proto#L74)

| Campo    | Tipo     | Valor                                                         |
| -------- | -------- | ------------------------------------------------------------- |
| `reason` | `string` | La explicación del servidor de por qué se cerrará la conexión |

### Mensajes del cliente

Para enviar comms [mensajes](https://github.com/decentraland/docs/tree/main/contributor/messages/README.md), los clientes los envuelven en la [`WsPeerUpdate`](#WsPeerUpdate) estructura. Esto diferencia los tipos de mensajes de control del transporte de los mensajes reales enviados entre peers.

```
.-------------------.
| WsPacket          |
|  .--------------. |
|  | WsPeerUpdate | |
|  | .----------. | |
|  | |  Packet  | | |
|  | '----------' | |
|  '--------------' |
'-------------------'

```

***

**`WsPeerUpdate`** [**↗ fuente**](https://github.com/decentraland/protocol/blob/c48ea0aa00d8173084571552463a6a05a7f49636/proto/decentraland/kernel/comms/rfc5/ws_comms.proto#L34)

| Campo        | Tipo     | Valor                                                                                                                   |
| ------------ | -------- | ----------------------------------------------------------------------------------------------------------------------- |
| `from_alias` | `uint32` | El ID generado por el servidor del remitente                                                                            |
| `body`       | `bytes`  | Serializado [message](https://github.com/decentraland/docs/tree/main/contributor/messages/README.md) siendo encapsulado |
| `no fiable`  | `bool`   | Si el remitente priorizó la velocidad o la fiabilidad al entregar este mensaje                                          |

Los clientes deben establecer el `from_alias` campo a `0` al enviar, y el servidor lo completará con el identificador correcto antes de entregarlo a los peers.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.decentraland.org/contributor/contributor-es/comunicaciones/tipos-de-transporte/websocket.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
