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 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 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.
message
enum
Uno de WsIdentification, WsChallengeRequired, WsSignedChallenge,
WsWelcome, WsPeerJoin, WsPeerLeave, WsKicked o WsPeerUpdate.
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 después de 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. Se responderá con WsChallengeRequired, y los clientes envían un WsSignedChallenge en respuesta.
.----------. .--------.
| Servidor | | Cliente |
'----+-----' '---+----'
⋮ |
⋮ Conectar |
o - - - - - - - - - - - - -|
| |
| |
| WsIdentification |
|<-------------------------+
+------------------------->|
| WsChallengeRequired |
| |
| |
| WsSignedChallenge |
|<-------------------------+
+------------------------->|
| WsWelcome |
| |
Si el flujo se completa correctamente, el cliente recibirá un WsWelcome y podrá empezar a enviar mensajes a otros pares.
WsIdentification ↗ fuente
address
string
La dirección pública de Ethereum del cliente
WsChallengeRequired ↗ fuente
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
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 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 se recibe cuando otro cliente se conecta a la sala y se autentica correctamente, mientras que WsPeerLeave se recibe cuando los peers se desconectan.
También existe el 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
address
string
La dirección de Ethereum del nuevo peer
WsPeerLeave ↗ fuente
alias
uint32
El ID generado por el servidor del peer desconectado
WsKicked ↗ fuente
reason
string
La explicación del servidor de por qué se cerrará la conexión
Mensajes del cliente
Para enviar comms mensajes, los clientes los envuelven en la WsPeerUpdate estructura. Esto diferencia los tipos de mensajes de control del transporte de los mensajes reales enviados entre peers.
WsPeerUpdate ↗ fuente
from_alias
uint32
El ID generado por el servidor del remitente
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.
Última actualización