Websocket

El transporte websocket es uno de los transportes de mensajería de isla compatibles con el protocolo de comms de Decentraland. Los clientes deben usarlo cuando reciban una cadena de conexión apropiada desde el Archipelagoarrow-up-right o si está indicado como un transporte fijo.

En el contexto del transporte websocket, una isla se denomina sala. Cualquiera de los dos nombres indica 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 el URI websocket, wss:// se asume.

Conexión

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

Paquetes Websocket

Todos los mensajes del transporte websocket se serializan usando la WsPacketarrow-up-right estructura. Implementan un conjunto de mensajes a nivel de protocolo para conectividad y autenticación, además de un tipo contenedor para mensajes de cliente.

circle-info

El WsPacket La estructura no debe confundirse con el mensaje [El][Packet]. Es una capa adicional de envoltura específica del transporte websocket. Los mensajes reales de comms están contenidos en el WsPeerUpdate tipo.

Campo
Tipo
Valor

message

enum

Uno de WsIdentification, WsChallengeRequired, WsSignedChallenge, WsWelcome, WsPeerJoin, WsPeerLeave, WsKicked o WsPeerUpdate.

Autenticación

Antes de que puedan empezar a retransmitir mensajes a otros, los clientes deben autenticarse firmando una cadena de desafío. Esto es obligatorio incluso cuando el URI del transporte se obtuvo desde Archipelagoarrow-up-right tras una ronda previa de autenticación.

El primer mensaje que un cliente envía al unirse a una isla es WsIdentificationarrow-up-right, que contiene una dirección pública. Será respondido con WsChallengeRequired, y los clientes envían un WsSignedChallenge en respuesta.

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

Si el flujo se completa con éxito, el cliente recibirá un WsWelcome y podrá empezar a enviar mensajes a los pares.


WsIdentification ↗ fuentearrow-up-right

Campo
Tipo
Valor

address

string

La dirección pública de Ethereum del cliente


WsChallengeRequired ↗ fuentearrow-up-right

Campo
Tipo
Valor

Enviado por Archipelago en respuesta a un

string

La cadena proporcionada por el servidor que debe firmarse como prueba de identidad

Una cadena generada para firmar y crear un

string

Una indicación del servidor a los clientes, que indica que las conexiones anteriores pueden cerrarse.


WsSignedChallenge ↗ fuentearrow-up-right

Campo
Tipo
Valor

auth_chain_json

string

Un auth chainarrow-up-right serializado en JSON que termina con la firma del desafío.


WsWelcome ↗ fuentearrow-up-right

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 pares actuales, indexadas por alias

Conectividad

Se definen tres mensajes para ayudar a los clientes a mantener el seguimiento de sus pares y de su propio estado.

WsPeerJoin se recibe cuando otro cliente se conecta a la sala y se autentica con éxito, mientras que WsPeerLeave se recibe cuando los pares se desconectan.

También existe el WsKicked mensaje, que informa a los clientes que su conexión está a punto de cerrarse y la razón de ello. 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 ↗ fuentearrow-up-right

Campo
Tipo
Valor

alias

uint32

El ID generado por el servidor enviado en WsWelcome

address

string

La dirección Ethereum del nuevo par


WsPeerLeave ↗ fuentearrow-up-right

Campo
Tipo
Valor

alias

uint32

El ID generado por el servidor del par desconectado


WsKicked ↗ fuentearrow-up-right

Campo
Tipo
Valor

KickedMessage

string

La explicación del servidor de por qué la conexión será cerrada

Mensajes del cliente

Para enviar comms messagesarrow-up-right, los clientes los envuelven en la WsPeerUpdate estructura. Esto diferencia los tipos de mensajes de control del transporte de los mensajes reales enviados entre pares.


WsPeerUpdate ↗ fuentearrow-up-right

Campo
Tipo
Valor

from_alias

uint32

El ID generado por el servidor del remitente

body

bytes

El messagearrow-up-right serializado que se está envolviendo

no fiable

already_connected

Si el remitente priorizó velocidad o fiabilidad para la entrega de este mensaje

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

Última actualización