Skip to content
This repository was archived by the owner on May 24, 2023. It is now read-only.
This repository was 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

Description

@saul-data

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?

Activity

  1. clarkmcc commented on May 17, 2023

    @clarkmcc

    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 join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions