Slide 57 de 74

WebSockets

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.