proc handle(conn: hive.net.WsConnection): void {
// A conexão dura enquanto o handler durar, então ele faz um laço
// até o outro lado desligar.
mut open := true
for ; open; {
got := hive.net.wsReceive(conn)
if got is Result.Ok(msg) {
hive.net.wsSend(conn, "eco: {msg}")
} else {
open = false
}
}
}
proc main(): void {
hive.net.wsServe(8081, handle)
}WebSockets são RFC 6455 de ponta a ponta: o handshake, o enquadramento, a máscara, ping e pong e a fragmentação são assunto do runtime, e um programa só vê mensagens inteiras, como Str.
wsServe(port, handler) chama um proc(WsConnection): void uma vez por conexão, cada uma numa thread própria, e a conexão fecha quando o handler retorna — então um handler que pretende conversar mais de uma vez faz um laço.wsConnect(url) abre uma como cliente, respondendo com um Result.wsReceive(conn) espera a próxima mensagem; wsSend(conn, message) responde com os bytes que enviou; wsClose(conn) a encerra deste lado.wsRequest(conn) é o HttpRequest que abriu a conexão, como um valor simples.Um hive.net.WsError carrega um reason — "Handshake", "Protocol", "Closed", "Send" ou "Receive" — e uma message. O outro lado desligar é "Closed", que é como uma conversa termina e não uma falha que valha reportar.