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 Archipelago 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 WsPacket 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.
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 Archipelago tras una ronda previa de autenticación.
El primer mensaje que un cliente envía al unirse a una isla es WsIdentification, 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 ↗ fuente
address
string
La dirección pública de Ethereum del cliente
WsChallengeRequired ↗ fuente
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 ↗ fuente
WsWelcome ↗ fuente
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 ↗ fuente
address
string
La dirección Ethereum del nuevo par
WsPeerLeave ↗ fuente
alias
uint32
El ID generado por el servidor del par desconectado
WsKicked ↗ fuente
KickedMessage
string
La explicación del servidor de por qué la conexión será cerrada
Mensajes del cliente
Para enviar comms messages, 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 ↗ fuente
from_alias
uint32
El ID generado por el servidor del remitente
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