Categorygithub.com/semrush/zenrpc/v2
modulepackage
2.1.1
Repository: https://github.com/semrush/zenrpc.git
Documentation: pkg.go.dev

# README

zenrpc: JSON-RPC 2.0 Server Implementation with SMD support

Go Report Card Build Status codecov GoDoc

zenrpc is a JSON-RPC 2.0 server library with Service Mapping Description support. It's built on top of go generate instead of reflection.

How to Use

Service is struct with RPC methods, service represents RPC namespace.

  1. Install zenrpc generator go get github.com/semrush/zenrpc/v2/zenrpc
  2. Import github.com/semrush/zenrpc/v2 into our code with rpc service.
  3. Add trailing comment //zenrpc to your service or embed zenrpc.Service into your service struct.
  4. Write your funcs almost as usual.
  5. Do not forget run go generate or zenrpc for magic

Accepted Method Signatures

func(Service) Method([args]) (<value>, <error>)
func(Service) Method([args]) <value>
func(Service) Method([args]) <error>
func(Service) Method([args])
  • Value could be a pointer
  • Error is error or *zenrpc.Error

Example

package main

import (
	"flag"
	"context"
	"errors"
	"math"
	"log"
	"net/http"
	"os"	
	
	"github.com/semrush/zenrpc/v2"
	"github.com/semrush/zenrpc/v2/testdata"
)

type ArithService struct{ zenrpc.Service }

// Sum sums two digits and returns error with error code as result and IP from context.
func (as ArithService) Sum(ctx context.Context, a, b int) (bool, *zenrpc.Error) {
	r, _ := zenrpc.RequestFromContext(ctx)

	return true, zenrpc.NewStringError(a+b, r.Host)
}

// Multiply multiples two digits and returns result.
func (as ArithService) Multiply(a, b int) int {
	return a * b
}

type Quotient struct {
	Quo, Rem int
}

func (as ArithService) Divide(a, b int) (quo *Quotient, err error) {
	if b == 0 {
		return nil, errors.New("divide by zero")
	} else if b == 1 {
		return nil, zenrpc.NewError(401, errors.New("we do not serve 1"))
	}

	return &Quotient{
		Quo: a / b,
		Rem: a % b,
	}, nil
}

// Pow returns x**y, the base-x exponential of y. If Exp is not set then default value is 2.
//zenrpc:exp=2
func (as ArithService) Pow(base float64, exp float64) float64 {
	return math.Pow(base, exp)
}

//go:generate zenrpc

func main() {
	addr := flag.String("addr", "localhost:9999", "listen address")
	flag.Parse()

	rpc := zenrpc.NewServer(zenrpc.Options{ExposeSMD: true})
	rpc.Register("arith", testdata.ArithService{})
	rpc.Register("", testdata.ArithService{}) // public
	rpc.Use(zenrpc.Logger(log.New(os.Stderr, "", log.LstdFlags)))

	http.Handle("/", rpc)

	log.Printf("starting arithsrv on %s", *addr)
	log.Fatal(http.ListenAndServe(*addr, nil))
}

Magic comments

All comments are optional.

Method comments
//zenrpc:<method parameter>[=<default value>][whitespaces<description>]
//zenrpc:<error code>[whitespaces<description>]
//zenrpc:return[whitespaces<description>]
 
Struct comments
type MyService struct {} //zenrpc

Need to browse your api and do some test api calls?

We recommend to use SMDBox. It is Swagger-like JSON RPC API browser, compatible with smd scheme, generated by zenrpc.

JSON-RPC 2.0 Supported Features

  • Requests
    • Single requests
    • Batch requests
    • Notifications
  • Parameters
    • Named
    • Position
    • Default values
  • SMD Schema
    • Input
    • Output
    • Codes
    • Scopes for OAuth

Server Library Features

  • go generate
  • Transports
    • HTTP
    • WebSocket
    • RabbitMQ
  • Server middleware
    • Basic support
    • Metrics
    • Logging

# Packages

No description provided by the author
No description provided by the author
No description provided by the author

# Functions

ConvertToObject converts json array into object using key by index from keys array.
ErrorMsg returns error as text for default JSON-RPC errors.
IDFromContext returns request ID from context.
IsArray checks json message if it array or object.
Logger is middleware for JSON-RPC 2.0 Server.
Metrics is a middleware for logging duration of RPC requests via Prometheus.
NamespaceFromContext returns method's namespace from context.
NewError makes a JSON-RPC error with given code and standard error.
NewResponseError returns new Response with Error object.
NewServer returns new JSON-RPC 2.0 Server.
NewStringError makes a JSON-RPC with given code and message.
RequestFromContext returns http.Request from context.
SMDBoxHandler is a handler for SMDBox web app.

# Constants

context key for ID.
InternalError is error code defined by JSON-RPC 2.0 spec.
InvalidParams is error code defined by JSON-RPC 2.0 spec.
InvalidRequest is error code defined by JSON-RPC 2.0 spec.
MethodNotFound is error code defined by JSON-RPC 2.0 spec.
ParseError is error code defined by JSON-RPC 2.0 spec.
ServerError is error code defined by JSON-RPC 2.0 spec.
Version is only supported JSON-RPC Version.

# Structs

Error object used in response if function call errored.
Options is options for JSON-RPC 2.0 Server.
Request is a json structure for json-rpc request to server.
Response is json structure for json-rpc response from server.
Server is JSON-RPC 2.0 Server.
Service is as struct for discovering JSON-RPC 2.0 services for zenrpc generator cmd.

# Interfaces

Invoker implements service handler.
No description provided by the author

# Type aliases

InvokeFunc is a function for processing single JSON-RPC 2.0 Request after validation and parsing.
MiddlewareFunc is a function for executing as middleware.