Documentation
¶
Overview ¶
Package jrpc implements client and server for RPC-like communication over HTTP with json encoded messages. The protocol is somewhat simplified version of json-rpc with a single POST call sending Request json (method name and the list of parameters) and receiving back json Response with "result" json and error string
Index ¶
- Variables
- type Client
- type HandlersGroup
- type L
- type LoggerFunc
- type Option
- func Auth(user, password string) Option
- func WithLimits(limit float64) Option
- func WithLogger(logger L) Option
- func WithMiddlewares(middlewares ...func(http.Handler) http.Handler) Option
- func WithSignature(appName, author, version string) Option
- func WithThrottler(limit int) Option
- func WithTimeouts(timeouts Timeouts) Option
- type Request
- type Response
- type Server
- type ServerFn
- type Timeouts
Examples ¶
Constants ¶
This section is empty.
Variables ¶
var NoOpLogger = LoggerFunc(func(format string, args ...any) {}) //nolint
NoOpLogger logger does nothing
Functions ¶
This section is empty.
Types ¶
type Client ¶
type Client struct {
API string // URL to jrpc server with entrypoint, i.e. http://127.0.0.1:8080/command
Client http.Client // http client injected by user
AuthUser string // basic auth user name, should match Server.AuthUser, optional
AuthPasswd string // basic auth password, should match Server.AuthPasswd, optional
// contains filtered or unexported fields
}
Client implements remote engine and delegates all calls to remote http server if AuthUser and AuthPasswd defined will be used for basic auth in each call to server
func (*Client) Call ¶
Call remote server with given method and arguments. Empty args will be ignored, single arg will be marshaled as-us and multiple args marshaled as []interface{}. Returns Response and error. Note: Response has it's own Error field, but that onw controlled by server. Returned error represent client-level errors, like failed http call, failed marshaling and so on.
Example ¶
ExampleClient_Call shows how an application calls the remote method.
package main
import (
"encoding/json"
"log"
"github.com/go-pkgz/jrpc"
)
func main() {
rpcClient := jrpc.Client{
API: "http://127.0.0.1:8080/command",
AuthUser: "user",
AuthPasswd: "password",
}
resp, err := rpcClient.Call("mycommand")
if err != nil {
log.Fatalf("call failed: %v", err)
}
var message string
if err = json.Unmarshal(*resp.Result, &message); err != nil {
log.Fatalf("failed to decode result: %v", err)
}
log.Printf("got %q", message)
}
Output:
type LoggerFunc ¶
LoggerFunc type is an adapter to allow the use of ordinary functions as Logger.
type Option ¶ added in v0.3.0
type Option func(s *Server)
Option func type
func Auth ¶ added in v0.3.0
Auth sets basic auth credentials, optional. Auth enforced only if both user and password set to non-empty values, otherwise the server keeps serving every request unauthenticated. Setting just one of them doesn't enable auth.
func WithLimits ¶ added in v0.3.0
WithLimits sets value for client limit call/sec per client middleware
func WithLogger ¶ added in v0.3.0
WithLogger sets custom logger, optional
func WithMiddlewares ¶ added in v0.3.0
WithMiddlewares sets custom middlewares list, optional
func WithSignature ¶ added in v0.3.0
WithSignature sets signature data for server response headers
func WithThrottler ¶ added in v0.3.0
WithThrottler sets throttler middleware with specify limit value, optional
func WithTimeouts ¶ added in v0.3.0
WithTimeouts sets server timeout values such as ReadHeader, Write and Idle timeout, optional. If this option not defined server use default timeout values
type Request ¶
type Request struct {
Method string `json:"method"` // method (function) name
Params any `json:"params,omitempty"` // function arguments
ID uint64 `json:"id"` // unique call id
}
Request encloses method name and all params
type Response ¶
type Response struct {
Result *json.RawMessage `json:"result,omitempty"` // response json
Error string `json:"error,omitempty"` // optional remote (server side / plugin side) error
ID uint64 `json:"id"` // unique call id, echoed Request.ID to allow calls tracing
}
Response encloses result and error received from remote server
type Server ¶
type Server struct {
// contains filtered or unexported fields
}
Server is json-rpc server with an optional basic auth. Auth enforced only if both authUser and authPasswd set, see Auth option.
func NewServer ¶ added in v0.3.0
NewServer the main constructor of server instance which pass API url and another options values
Example ¶
ExampleNewServer shows the minimal server setup with a single method registered.
package main
import (
"encoding/json"
"github.com/go-pkgz/jrpc"
)
func main() {
plugin := jrpc.NewServer("/command")
plugin.Add("mycommand", func(id uint64, params json.RawMessage) jrpc.Response {
return jrpc.EncodeResponse(id, "hello, it works", nil)
})
// blocks until Shutdown called or the server failed
_ = plugin.Run(8080)
}
Output:
Example (Options) ¶
ExampleNewServer_options shows the server setup with all the available options.
package main
import (
"encoding/json"
"log"
"time"
"github.com/go-pkgz/rest"
"github.com/go-pkgz/jrpc"
)
func main() {
plugin := jrpc.NewServer("/command",
jrpc.Auth("user", "password"),
jrpc.WithTimeouts(jrpc.Timeouts{
ReadHeaderTimeout: 5 * time.Second,
WriteTimeout: 30 * time.Second,
IdleTimeout: 10 * time.Second,
CallTimeout: 25 * time.Second,
}),
jrpc.WithThrottler(120),
jrpc.WithLimits(100),
jrpc.WithSignature("the best plugin ever", "author", "1.0.0"),
jrpc.WithLogger(jrpc.LoggerFunc(log.Printf)),
jrpc.WithMiddlewares(rest.Trace),
)
plugin.Add("mycommand", func(id uint64, params json.RawMessage) jrpc.Response {
return jrpc.EncodeResponse(id, "hello, it works", nil)
})
_ = plugin.Run(8080)
}
Output:
func (*Server) Group ¶
func (s *Server) Group(prefix string, m HandlersGroup)
Group of handlers with common prefix, match on group.method
type ServerFn ¶
type ServerFn func(id uint64, params json.RawMessage) Response
ServerFn handler registered for each method with Add or Group. Implementations provided by consumer and defines response logic.
type Timeouts ¶ added in v0.3.0
type Timeouts struct {
ReadHeaderTimeout time.Duration // amount of time allowed to read request headers
WriteTimeout time.Duration // max duration before timing out writes of the response
IdleTimeout time.Duration // max amount of time to wait for the next request when keep-alive enabled
CallTimeout time.Duration // max time allowed to finish the call, optional
}
Timeouts includes values and timeouts for the server