wsrpc.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. package wsrpc
  2. //go:generate folder2go client wsrpcAssets
  3. import (
  4. "log"
  5. "net/http"
  6. "dev.hexasoftware.com/stdio/wsrpc/wsrpcAssets" // embed assets
  7. "golang.org/x/net/websocket"
  8. )
  9. // Return a specific handler
  10. type ServerContext interface {
  11. Handle(string, http.Handler)
  12. HandleFunc(string, func(http.ResponseWriter, *http.Request))
  13. }
  14. type HandleFunc func(*ClientCtx)
  15. // Write wsrpc.js
  16. func wsrpcjsFunc(w http.ResponseWriter, r *http.Request) {
  17. w.Header().Set("Content-type", "application/javascript")
  18. w.WriteHeader(200)
  19. w.Write(wsrpcAssets.Data["/wsrpc.js"])
  20. }
  21. // Create a client websocket handler on connection
  22. func createCliHandler(handler HandleFunc) websocket.Handler {
  23. return func(ws *websocket.Conn) {
  24. ch := NewHandler("main", ws)
  25. go handler(ch)
  26. for {
  27. var data = map[string]interface{}{}
  28. err := websocket.JSON.Receive(ws, &data)
  29. if err != nil {
  30. log.Println("Error: ", err)
  31. return
  32. }
  33. ch.Process(data)
  34. }
  35. }
  36. }
  37. // RegisterTo register both js and websocket in the servermux
  38. func RegisterTo(server ServerContext, handler HandleFunc) {
  39. server.Handle("/wsrpc", websocket.Handler(createCliHandler(handler)))
  40. server.HandleFunc("/wsrpc/client.js", wsrpcjsFunc)
  41. }
  42. // Handler we can attatch this to http.Server
  43. func Handler(handler HandleFunc) http.Handler {
  44. mux := http.NewServeMux()
  45. RegisterTo(mux, handler)
  46. // When we receive a connection
  47. return mux
  48. }