package wsrpc //go:generate folder2go client wsrpcAssets import ( "log" "net/http" "strings" "dev.hexasoftware.com/stdio/wsrpc/wsrpcAssets" // embed assets "golang.org/x/net/websocket" ) // Handler wsrpc.Handler type Handler struct { wsHandler http.Handler prefix string } func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Get relative path if h.prefix == "" { server := r.Context().Value(http.ServerContextKey).(*http.Server) mux, ok := server.Handler.(*http.ServeMux) if ok { _, h.prefix = mux.Handler(r) } } urlPath := strings.TrimPrefix(r.URL.String(), h.prefix) switch urlPath { case "ws", "wsrpc": h.wsHandler.ServeHTTP(w, r) case "cli.js": // Serve client JS file w.Header().Set("Content-type", "application/javascript") w.WriteHeader(200) w.Write(wsrpcAssets.Data["wsrpc.js"]) default: w.WriteHeader(http.StatusNotFound) w.Write([]byte(http.StatusText(http.StatusNotFound))) } } // New create a new WSRpc handler func New(WSRPC Func) *Handler { return &Handler{ wsHandler: websocket.Handler(createCliHandler(WSRPC)), } } // Func for wsrpc type Func func(*ClientCtx) // Create a client websocket handler on connection func createCliHandler(handler Func) websocket.Handler { return func(ws *websocket.Conn) { ch := NewHandler("main", ws) go handler(ch) for { var data = CallObj{} err := websocket.JSON.Receive(ws, &data) if err != nil { log.Println("Error: ", err) return } ch.Process(data) } } } // RegisterTo register both js and websocket in the servermux /*func RegisterTo(server ServerContext, handler HandleFunc) { server.Handle("/wsrpc", websocket.Handler(createCliHandler(handler))) server.HandleFunc("/wsrpc/client.js", wsrpcjsFunc) } // Handler we can attatch this to http.Server func Handler(handler HandleFunc) http.Handler { mux := http.NewServeMux() RegisterTo(mux, handler) // When we receive a connection return mux }*/