123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- 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":
- log.Println("Provide ws connection")
- h.wsHandler.ServeHTTP(w, r)
- case "cli.js": // Serve client JS file
- log.Println("Sending cli")
- 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
- }*/
|