capsule AI-native Unix-like composition layer

src/server/internal/ws/handler.go

1,311 bytes · 60 lines · capsule://quake0day/[email protected] raw on github

package ws

import (
	"log"
	"net/http"

	"github.com/gorilla/websocket"
)

var upgrader = websocket.Upgrader{
	ReadBufferSize:  1024,
	WriteBufferSize: 1024,
	CheckOrigin: func(r *http.Request) bool {
		return true // CORS handled at router level
	},
}

// HandleWebSocket returns an HTTP handler that upgrades connections to WebSocket
// and dispatches incoming messages via onMessage.
func HandleWebSocket(
	hub *Hub,
	sessionID string,
	onMessage func(string, WSMessage),
	onActivity func(string),
) http.HandlerFunc {
	return HandleWebSocketWithReadLimit(hub, sessionID, 0, onMessage, onActivity)
}

func HandleWebSocketWithReadLimit(
	hub *Hub,
	sessionID string,
	maxMessageSize int64,
	onMessage func(string, WSMessage),
	onActivity func(string),
) http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
		conn, err := upgrader.Upgrade(w, r, nil)
		if err != nil {
			log.Printf("ws: upgrade failed for session %s: %v", sessionID, err)
			return
		}

		client := &Client{
			SessionID:      sessionID,
			Conn:           conn,
			Send:           make(chan []byte, 64),
			MaxMessageSize: maxMessageSize,
			hub:            hub,
		}

		hub.Register(client)
		if onActivity != nil {
			onActivity(sessionID)
		}

		go client.WritePump()
		go client.ReadPump(onMessage, onActivity)
	}
}