package websocket import ( "net/http" "gfx.cafe/open/websocket" "gfx.cafe/open/jrpc/pkg/server" ) type Server struct { Server *server.Server } func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { if s.Server == nil { http.Error(w, "no server set", http.StatusInternalServerError) return } conn, err := websocket.Accept(w, r, nil) if err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return } c := newWebsocketCodec(r.Context(), conn, "", r) err = s.Server.ServeCodec(r.Context(), c) if err != nil { //slog.Error("codec err", "error", err) } } // WebsocketHandler returns a handler that serves JSON-RPC to WebSocket connections. // // allowedOrigins should be a comma-separated list of allowed origin URLs. // To allow connections with any origin, pass "*". func WebsocketHandler(s *server.Server, allowedOrigins []string) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { conn, err := websocket.Accept(w, r, &websocket.AcceptOptions{ OriginPatterns: allowedOrigins, CompressionMode: websocket.CompressionContextTakeover, CompressionThreshold: 4096, }) if err != nil { return } codec := newWebsocketCodec(r.Context(), conn, r.Host, r) err = s.ServeCodec(r.Context(), codec) if err != nil { // slog.Error("codec err", "error", err) } }) }