Skip to content
This repository has been archived by the owner on May 24, 2023. It is now read-only.

Example to implement json rpc 2 with net/rpc/jsonrpc #141

Open
saul-data opened this issue Dec 18, 2022 · 1 comment
Open

Example to implement json rpc 2 with net/rpc/jsonrpc #141

saul-data opened this issue Dec 18, 2022 · 1 comment

Comments

@saul-data
Copy link

I tried to adapt this example for go fiber v2 websockets
https://gist.github.com/mowings/dad4917b6fc21e6e5ffe2da3b16e7ef9

func main() {
	rpc.Register(new(Arith))

	http.Handle("/ws", websocket.Handler(serve))
	http.ListenAndServe("localhost:7000", nil)
}

func serve(ws *websocket.Conn) {
	log.Printf("Handler starting")
	jsonrpc.ServeConn(ws)
	log.Printf("Handler exiting")
}

I get this error:
cannot use c (variable of type *"github.com/gofiber/websocket/v2".Conn) as io.ReadWriteCloser value in argument to jsonrpc.NewClient: *"github.com/gofiber/websocket/v2".Conn does not implement io.ReadWriteCloser (missing method Read)

Is there a way to adapt golang.org/x/net/websocket to be used with go fiber websockets?

@clarkmcc
Copy link

I know this is late, but in case it's useful for others, something like this should do the trick. Disclaimer: untested.

jsonrpc.ServeConn(&WebSocketWrapper{conn})
type WebSocketWrapper struct {
	*websocket.Conn
}

func (w *WebSocketWrapper) Read(p []byte) (n int, err error) {
	_, msg, err := w.ReadMessage()
	if err != nil {
		return 0, err
	}
	if len(msg) > len(p) {
		return 0, io.ErrShortBuffer
	}
	copy(p, msg)
	return len(msg), err
}

func (w *WebSocketWrapper) Write(p []byte) (n int, err error) {
	return len(p), w.WriteMessage(websocket.BinaryMessage, p)
}

func (w *WebSocketWrapper) Close() error {
	return w.Conn.Close()
}

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants