WebSocket
O transporte websocket é um dos transportes de mensagens da ilha suportados pelo protocolo de comms do Decentraland. Os clientes devem usá-lo quando receberem uma connection string apropriada do realm de seu Archipelago service, ou se estiver indicado como um transporte fixo.
No contexto do transporte websocket, uma ilha é chamada de sala. Ambos os nomes indicam a mesma coisa: um grupo de jogadores próximos que trocam atualizações e chat.
As connection strings começam com o ws-room: prefixo, seguido por uma wss:// URI para a sala específica. Elas se parecem com isto:
ws-room:wss://comms.example.com/rooms/<room-id>Na ausência de um protocolo explícito para a URI websocket, wss:// é assumido.
Conectando
O transporte usa o protocolo websocket regular sobre HTTPS. Os clientes podem abrir uma conexão usando qualquer implementação padrão à sua disposição.
Pacotes Websocket
Todas as mensagens do transporte websocket são serializadas usando a WsPacket estrutura. Elas implementam um conjunto de mensagens de conectividade e autenticação em nível de protocolo, além de um tipo contêiner para mensagens de cliente.
message
enum
Um de WsIdentification, WsChallengeRequired, WsSignedChallenge,
WsWelcome, WsPeerJoin, WsPeerLeave, WsKicked ou WsPeerUpdate.
Autenticação
Antes de começarem a retransmitir mensagens para outros, os clientes devem se autenticar assinando uma string de desafio. Isso é necessário mesmo quando a URI do transporte foi obtida de Archipelago após uma rodada anterior de autenticação.
A primeira mensagem que um cliente envia ao entrar em uma ilha é WsIdentification, que contém um endereço público. Ele receberá como resposta WsChallengeRequired, e os clientes enviam um WsSignedChallenge em resposta.
.----------. .--------.
| Servidor | | Cliente |
'----+-----' '---+----'
⋮ |
⋮ Conectar |
o - - - - - - - - - - - - -|
| |
| |
| WsIdentification |
|<-------------------------+
+------------------------->|
| WsChallengeRequired |
| |
| |
| WsSignedChallenge |
|<-------------------------+
+------------------------->|
| WsWelcome |
| |
Se o fluxo for concluído com sucesso, o cliente receberá um WsWelcome e poderá começar a enviar mensagens para os peers.
WsIdentification ↗ fonte
address
string
O endereço público de Ethereum do cliente
WsChallengeRequired ↗ fonte
challenge_to_sign
string
A string fornecida pelo servidor para ser assinada como prova de identidade
already_connected
string
Uma dica do servidor para os clientes, indicando que conexões anteriores podem ser encerradas.
WsSignedChallenge ↗ fonte
auth_chain_json
string
Serializado serializada em JSON serializada em JSON, terminando com a assinatura do desafio.
WsWelcome ↗ fonte
alias
uint32
Um ID gerado pelo servidor para a sessão do cliente
peer_identities
map<uint32, string>
Os endereços de todos os peers atuais, indexados por alias
Conectividade
Três mensagens são definidas para ajudar os clientes a acompanhar seus peers e seu próprio status.
WsPeerJoin é recebida quando outro cliente se conecta à sala e se autentica com sucesso, enquanto WsPeerLeave é recebida quando os peers se desconectam.
Há também a WsKicked mensagem, que informa os clientes de que sua conexão está prestes a ser encerrada e o motivo disso. Na prática atual, o principal motivo pelo qual um servidor pode expulsar um cliente de uma sala é porque ele se conectou simultaneamente a outra sala, quando isso é proibido pela política do servidor.
WsPeerJoin ↗ fonte
address
string
O endereço Ethereum do novo peer
WsPeerLeave ↗ fonte
alias
uint32
O ID gerado pelo servidor do peer desconectado
WsKicked ↗ fonte
reason
string
A explicação do servidor sobre por que a conexão será encerrada
Mensagens do client
Para enviar comms mensagens, os clientes os envolvem na WsPeerUpdate estrutura. Isso diferencia os tipos de mensagens de controle do transporte das mensagens reais enviadas entre peers.
WsPeerUpdate ↗ fonte
from_alias
uint32
O ID gerado pelo servidor do remetente
não confiável
bool
Se o remetente priorizou velocidade ou confiabilidade ao entregar esta mensagem
Os clientes devem definir o from_alias campo para 0 ao enviar, e o servidor o preencherá com o identificador correto antes de entregá-lo aos peers.
Atualizado