good morning!!!!

Skip to content
Snippets Groups Projects
codecs.go 1.09 KiB
Newer Older
a's avatar
a committed
package codecs

import (
a's avatar
a committed
	"fmt"

a's avatar
a committed
	"gfx.cafe/open/jrpc/contrib/codecs/http"
	"gfx.cafe/open/jrpc/contrib/codecs/websocket"
a's avatar
a committed
	"gfx.cafe/open/jrpc/pkg/server"

	gohttp "net/http"
a's avatar
a committed
	"net/url"
a's avatar
a committed
)

a's avatar
a committed
var WebsocketHandler = websocket.WebsocketHandler
var HttpHandler = http.HttpHandler
a's avatar
a committed

var HttpWebsocketHandler = func(srv *server.Server, origins []string) gohttp.Handler {
	cwss := WebsocketHandler(srv, origins)
	chttp := HttpHandler(srv)
	return gohttp.HandlerFunc(func(w gohttp.ResponseWriter, r *gohttp.Request) {
		if r.Header.Get("upgrade") != "" {
			cwss.ServeHTTP(w, r)
			return
		}
		chttp.ServeHTTP(w, r)
	})
}
a's avatar
a committed

a's avatar
a committed
// TODO: create ListenAndServeContext
//func ListenAndServe(ctx context.Context, u string, srv *server.Server, opts map[string]any) error {
//}

// ListenAndServe
a's avatar
a committed
func ListenAndServe(u string, srv *server.Server, opts map[string]any) error {
	pu, err := url.Parse(u)
	if err != nil {
		return err
	}
	if opts == nil {
		opts = map[string]any{}
	}
	handler := handlerFuncs[pu.Scheme]
	if handler == nil {
		return fmt.Errorf("%w: %s", ErrSchemeNotSupported, pu.Scheme)
	}
	return handler(pu, srv, opts)
}