12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- 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
- }
|