Files
fn_registry/functions/infra/ws_handler.md
T

2.5 KiB

name, kind, lang, domain, version, purity, signature, description, tags, uses_functions, uses_types, returns, returns_optional, error_type, imports, params, output, tested, tests, test_file_path, file_path
name kind lang domain version purity signature description tags uses_functions uses_types returns returns_optional error_type imports params output tested tests test_file_path file_path
ws_handler function go infra 1.0.0 impure func WSHandler(hub *WSHub, origins []string) http.HandlerFunc Retorna un http.HandlerFunc que upgradea la conexion HTTP a WebSocket via WSUpgrader, crea un WSClient con ID hex aleatorio, lo registra en el hub y lanza readPump y writePump como goroutines. La readPump bloquea el handler para mantener la request viva. Al desconectar (error de I/O o canal cerrado) se desregistra el cliente y se cierra la conexion limpiamente.
websocket
handler
http
server
hub
infra
realtime
ws_upgrader_go_infra
WSHub_go_infra
WSClient_go_infra
false error_go_core
context
crypto/rand
encoding/hex
net/http
time
nhooyr.io/websocket
name desc
hub *WSHub donde se registran los clientes que se conecten via este handler. Debe estar corriendo (hub.Run() lanzado en goroutine).
name desc
origins lista de patrones de origen permitidos para el upgrade. Pasa directamente a WSUpgrader. Para dev: `["*"]`. Para prod: lista explicita.
http.HandlerFunc lista para montarse en una ruta GET. Cada conexion entrante crea un cliente nuevo en el hub. true
upgradea conexion y registra cliente en hub
broadcast del hub llega al cliente conectado
desregistra cliente al desconectar
multiples clientes reciben el broadcast
functions/infra/ws_test.go functions/infra/ws_handler.go

Ejemplo

hub := NewWSHub()
go hub.Run()
defer hub.Stop()

routes := []Route{
    {Method: "GET", Path: "/ws", Handler: WSHandler(hub, []string{"example.com"})},
}
mux := HTTPRouter(routes)
HTTPServe(":8080", mux, ctx)

Notas

El handler asigna un ID hex aleatorio de 16 caracteres a cada cliente (crypto/rand). Si se quiere usar IDs propios (UUID, username autenticado), envolver el handler para sobreescribir client.ID antes del Register.

readPump publica todos los mensajes recibidos al hub.Broadcast — modo chat-like por defecto. Para procesar mensajes con un callback (sin reenviar a todos), copiar el codigo y reemplazar el Broadcast por la logica deseada. Esta separacion es deliberada: el hub es un mecanismo de fan-out, no un router de mensajes.

writePump usa write deadline de 10s — si un Write tarda mas, asume cliente muerto y termina. Esto previene goroutines colgadas si el cliente cierra TCP sin enviar Close frame.