package wsrpc //go:generate folder2go client wsrpcAssets import ( "log" "net/http" "dev.hexasoftware.com/stdio/wsrpc/wsrpcAssets" // embed assets "golang.org/x/net/websocket" ) // Return a specific handler type ServerContext interface { Handle(string, http.Handler) HandleFunc(string, func(http.ResponseWriter, *http.Request)) } type HandleFunc func(*ClientCtx) // Write wsrpc.js func wsrpcjsFunc(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-type", "application/javascript") w.WriteHeader(200) w.Write(wsrpcAssets.Data["/wsrpc.js"]) } // Create a client websocket handler on connection func createCliHandler(handler HandleFunc) websocket.Handler { return func(ws *websocket.Conn) { ch := NewHandler("main", ws) go handler(ch) for { var data = map[string]interface{}{} 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 }