JSONRPCV
JSON-RPC 2.0
Install
VPM
v install Te4nick.jsonrpcv
vpkg
vpkg get jsonrpcv
Limitaions
- Request/Response use only string id
- JSON-RPC 1.0 incompatible
Features
- Request/Response single/batch json encoding/decoding
- Server to work with any io.ReaderWriter
- Server automatically manages batch Requests and builds batch Response
- Client to work with any io.ReaderWriter
- Interceptors for custom events, raw Request, Request, Response, raw Response
Usage
Request/Response operations
For both Request/Response constructors are provided and must be used for initialization.
import Te4nick.jsonrpcv as jsonrpc
// jsonrpc.new_request(method, params, id)
mut req := jsonrpc.new_request("kv.create", {"key": "key", "value": "value"}, "kv.create.1")
println(req.encode())
// '{"jsonrpc":"2.0","method":"kv.create","params":{"key":"key","value":"value"},"id":"kv.create.1"}'
// jsonrpc.new_response(result, error, id)
mut resp := jsonrpc.new_response({"key": "key", "value": "value"}, jsonrpc.ResponseError{}, "kv.create.1")
println(resp.encode())
// '{"jsonrpc":"2.0","result":{"key":"key","value":"value"},"id":"kv.create.1"}'
To create a Notification, pass empty string as
Request.id
jsonrpc.Empty{}.str()
jsonrpc.empty.str()
jsonrpc.new_reponse('method', 'params', jsonrpc.empty.str())
jsonrpc.Empty{}
jsonrpc.empty
jsonrpc.new_reponse('method', jsonrpc.empty, 'id')
jsonrpc.ResponseError{}
jsonrpc.new_response("result", jsonrpc.ResponseError{}, "id")
Result.id
jsonrpc.null
Client
For full usage check client in example
import net
import Te4nick.jsonrpcv as jsonrpc
addr := '127.0.0.1:42228'
mut stream := net.dial_tcp(addr)!
mut c := jsonrpc.new_client(jsonrpc.ClientConfig{
stream: stream
})
c.notify("kv.create", {
"key": "bazz"
"value": "barr"
})!
Client can work with any
io.ReaderWriter
Server
For ready key/value im-memory storage realized with server check this example
import net
import Te4nick.jsonrpcv as jsonrpc
fn handle_test(req &jsonrpc.Request, mut wr jsonrpc.ResponseWriter) {
p := req.decode_params[string]() or {
wr.write_error(jsonrpc.invalid_params)
return
}
wr.write(p)
}
fn handle_conn(mut conn net.TcpConn, h jsonrpc.Handler) {
defer { conn.close() or {} }
mut srv := jsonrpc.new_server(jsonrpc.ServerConfig{
stream: conn
handler: handle_test
})
srv.start()
}
addr := '127.0.0.1:42228'
mut l := net.listen_tcp(.ip, addr)!
println('TCP JSON-RPC server on ${addr} (Content-Length framing)')
for {
mut c := l.accept()!
println("Accepted")
go handle_conn(mut c)
}
Server can work with any
io.ReaderWriter
jsonrpc.Handler = fn(req &jsonrpc.Request, mut wr jsonrpc.ResponseWriter)
jsonrpc.Request
jsonrpc.Response
jsonrpc.ResponseWriter
jsonrpc.Handler
jsonrpc.Response
Handler
jsonrpc.Handler = fn(req &jsonrpc.Request, mut wr jsonrpc.ResponseWriter)
jsonrpc.Request
jsonrpc.Response
jsonrpc.ResponseWriter
wr.write()
wr.write_error()
jsonrpc.Response
wr.write()
wr.write_error()
Router
The simple
jsonrpc.Router
jsonrpc.Handler
jsonrpc.Request.method
jsonrpc.Router.handle_jsonrpc
jsonrpc.Server.handler
jsonrpc.Request.method
jsonrpc.Handler
jsonrpc.method_not_found
Interceptors
Both
jsonrpc.Client
jsonrpc.Server
jsonrpc.Interceptors
jsonrpc.LoggingInterceptor