Documentação oficial

WebSockets

Referência técnica de WebSockets — Joss language and Joss Red ecosystem.

#WebSockets

Índice · Antes: HTTP, fechamentos · Depois: concurrency

Um WebSocket mantém uma conexão aberta para troca de mensagens em ambas as direções. Use-o para bate-papo ou atualizações contínuas; uma consulta específica pode ser resolvida com HTTP. Os exemplos são fragmentos para o servidor integrado.

As rotas aceitam parâmetros dinâmicos. O primeiro argumento do manipulador é a conexão e então os parâmetros são injetados em ordem.“`joss Router::ws(”/rooms/{room}/users/{id}“, “ChatController@connect”)

public class ChatController { public func connect(WebSocket \(ws, string \)room, string \(id) { \)ws->onMessage(func(string \(message) { \)ws->send($message) }) } }

Os retornos de chamada registrados com `onMessage` capturam o ambiente léxico do
manipulador. `$ws`, parâmetros de caminho e variáveis locais seguem
disponível após o manipulador terminar. O estado capturado é preservado
entre mensagens e suas invocações são serializadas:```joss
public func connect(WebSocket $ws) {
    $count = 0
    $ws->onMessage(func(string $message) {
        $count = $count + 1
        $ws->send("Mensaje " . $count . ": " . $message)
    })
}

Cada fechamento retém sua própria captura. Não presuma que onClose veja realocações locais feitas por outro encerramento onMessage.

Cada conexão é executada por conta própria Runtime.Fork(), então o O contexto capturado não é compartilhado com outras conexões.

A conexão expõe:

  • send($message): envia uma mensagem e retorna se a escrita foi bem sucedida.
  • onMessage($callback): registra o retorno de chamada da mensagem.
  • onClose($callback): registra a limpeza que sempre é executada quando finalizada.
  • subscribe($channel) / unsubscribe($channel): gerencia canais locais.
  • publish($channel, $message): publica para os demais membros do canal.
  • WebSocket::subscriberCount($channel): retorna o número de conexões assinantes ativos do canal.
  • close(): na verdade fecha o soquete.

WebSocket::publish($channel, $message) publica para todos os membros e pode ser invocado a partir de manipuladores HTTP. As assinaturas são excluídas automaticamente ao fechar a conexão. WebSocket::broadcast() preserva o hub global histórico.

Os canais são locais para o processo. Uma implantação com múltiplas réplicas requer sessões fixas e um backplane externo de pub/sub, ou você deve manter um único réplica para funções de sala.

O servidor aplica limites configuráveis ​​e de manutenção de atividade:


WS_MAX_MESSAGE_BYTES="8388608"
WS_IDLE_TIMEOUT_SECONDS="120"
WS_PING_INTERVAL_SECONDS="30"
A atualização ocorre antes do middleware HTTP normal. Para autenticação dentro do soquete, valide o JWT com Auth::validateToken($token); o tempo de execução preenche novamente a sessão usada por Auth::user().

Com TLS_CERT_FILE e TLS_KEY_FILE, o servidor integrado oferece wss. Um proxy reverso ainda é válido e deve encaminhar Upgrade e Connection.