## jrpc ```go get gfx.cafe/open/jrpc``` this is a bottom up implementation of jsonrpc2, primarily made for hosting eth-like jsonrpc requests. we extend the eth-rpc reflect based handler with go-http style request/response. we also make things like subscriptions additional extensions, so they are no longer baked into the rpc package. most users should mostly access the `jrpc` packages, along with a variety of things in `contrib` see examples in `examples` folder for usage it is currently being used in the oku.trade api in proxy, client, and server applications. ## features - full jsonrpc2 protocol - batch requests + notifications - http.Request/http.ResponseWriter style semantics - simple but powerful middleware framework - subscription framework used by go-ethereum/rpc is implemented as middleware. - http (with rest-like access via RPC verb), websocket, io.Reader/io.Writer (tcp, any net.Conn, etc), inproc codecs. - using faster json packages (goccy/go-json and jx) - extensions, which allow setting arbitrary fields on the parent object, like in sourcegraph jsonrpc2 - jmux, which allows for http-like routing, implemented like `go-chi/v5`, except for jsonrpc2 paths - argreflect, which allows mounting methods on structs to the rpc engine, like go-ethereum/rpc - openrpc schema parser and code generator ## maybe outdated but somewhat useful contribution info basic structure ``` exports.go - export things in subpackages to jrpc namespace, cleaning up the public use package. pkg/ - packages for implementing jrpc clientutil/ - common utilities for client implementations to use idreply.go - generalizes making a request with an incrementing id, then waiting on it helper.go - helpers for decoding messages, etc codec/ - codec related things. to implement new codecs, use this package errors.go - jsonrpc2 error codes and marshaling json.go - jsonrpc2 json rules, encoding, decoding peer.go - peerinfo transport.go - define ReaderWriter interface wire.go - jsonrpc2 wire protocol marshaling, like ID and Version jrpc.go - define the Handler, HandlerFunc, and ResponseWriter reqresp.go - define Request, Response, along with json marshaling for the request server/ - server implementation server.go - a simple server implementation that uses a codec.ReaderWriter jrpctest/ - utilities for testing client and server. suite.go - implementors of client and server should pass this contrib/ - packages that add to jrpc codecs/ - client and server transport implementations codecs.go - dialers for all finished codecs http/ - http based codec codec_test.go - general tests that all must pass client.go - codec.Conn implementation codec.go - codec.ReaderWriter implementaiton const.go - constants handler.go - http handler http_test.go - http specific tests websocket/ - websocket basec codec codec_test.go - general tests that all must pass client.go - codec.Conn implementation codec.go - codec.ReadWriter implementation const.go - constants dial.go - websocket dialer handler.go - http handler websocket_test.go - websocket specific tests rdwr/ - rdwr based codec. can be used to implement other codecs inproc/ - inproc based codec openrpc/ - openapi specification implementation jmux/ - a chi based router which satisfies the jrpc.Handler interface handlers/ - special jrpc handlers argreflect/ - go-ethereum style struct reflection middleware/ - pre implemented middleware extension/ - extensions to the protocol subscription/ - WIP: subscription engine for go-ethereum style subs ```