Categorygithub.com/superisaac/jsoff
modulepackage
5.0.3+incompatible
Repository: https://github.com/superisaac/jsoff.git
Documentation: pkg.go.dev

# README

jsoff

jsoff is a JSONRPC 2.0 library and a suite of client utilities in golang

features

  • Full spec support
  • JSON schema checking
  • Support multiple network transports, http1, http2, websocket, tcp and vsockets(for virtual machines and hypervisors)
  • Utility command line tools to call JSON RPC servers, see bin/jsonrpc-*

Install and build

% git checkout https://github.com/superisaac/jsoff
% cd jsoff
% make test # run unit test
...
% make build  # build cli tools
go build -gcflags=-G=3 -o bin/jsonrpc-call cli/call/jsonrpc_call.go
go build -gcflags=-G=3 -o bin/jsonrpc-notify cli/notify/jsonrpc_notify.go
go build -gcflags=-G=3 -o bin/jsonrpc-watch cli/watch/jsonrpc_watch.go
go build -gcflags=-G=3 -o bin/jsoff-example-fifo examples/fifo/main.go

Examples

Start a simple JSONRPC server

server side code

import (
    "github.com/superisaac/jsoff/net"
)
// create a HTTP/1 handler, currently http1, http2 and websocket handlers are supported
server := jsoffnet.NewHttp1Handler(nil)
// register an actor function
server.Actor.OnTyped("echo", func(req *jsoffnet.RPCRequest, text string) (string, error) {
    return "echo " + text, nil
})
// serve the JSONRPC at port 8000
jsoffnet.ListenAndServe(rootCtx, ":8000", server)

the server can be tested using client tools jsonrpc-call

% bin/jsonrpc-call -c http://127.0.0.1:8000 echo hi
{
   "jsonrpc": "2.0",
   "id": "1",
   "result": "echo hi"
}

Initialize a JSONRPC request

import (
    "context"
    "github.com/superisaac/jsoff"
    "github.com/superisaac/jsoff/net"
)

// create a jsonrpc client according to the server url
// the supported url schemes are: http, https, h2, h2c, ws and wss
client := jsoffnet.NewClient("http://127.0.0.1:8000")

// create a request message with a random id field
reqmsg := jsoff.NewRequestMessage(jsoff.NewUuid(), "echo", []interface{}{"hi5"})
fmt.Printf("request message: %s\n", jsoff.MessageString(reqmsg))

resmsg, err := client.Call(context.Background(), reqmsg)
fmt.Printf("result message: %s\n", jsoff.MessageString(resmsg))
assert.True(resmsg.IsResultOrError())  // resmsg is a Result type message or an Error type message
assert.Equal("echo hi5", resmsg.MustResult())

// a notify message, notify message doesn't have id field and doesn't expect result
ntfmsg := jsoff.NewNotifyMessage("echo", []interface{}{"hi6"})
err := client.Send(context.Background(), ntfmsg)

FIFO service

the FIFO service is an example to demonstrate how jsoff server and client works without writing and code. the server maintains an array in memory, you can push/pop/get items from it and list all items, you can even subscribe the item additions.

Start server which listen at port 6000

% bin/jsoff-example-fifo
INFO[0000] Example fifo service starts at 127.0.0.1:6000

Open another terminal and type a sequence of commands

# list the fifo and get an empty list
% bin/jsonrpc-call -c http://127.0.0.1:6000 fifo_list
{
  "jsonrpc": "2.0",
  "id": "a85bfe31c94f4a5bb0fcb6539bbd6d66",
  "result": []
}

# push an item "hello"
 % bin/jsonrpc-call -c http://127.0.0.1:6000 fifo_push hello
{
  "jsonrpc": "2.0",
  "id": "c460ebe3a9094249a043b6cddf3fa29f",
  "result": "ok"
}

# call list again, now that the item "hello" is pushed 
% bin/jsonrpc-call -c http://127.0.0.1:6000 fifo_list
{
  "jsonrpc": "2.0",
  "id": "b3262cc3166e45e2bb5e58939d5e73bb",
  "result": [
    "hello"
  ]
}

# push another item 5(integer)
% bin/jsonrpc-call -c http://127.0.0.1:6000 fifo_push 5
{
  "jsonrpc": "2.0",
  "id": "dc2bbac79e6841d78786e5ff5fc37c13",
  "result": "ok"
}

# now there are 2 items
% bin/jsonrpc-call -c http://127.0.0.1:6000 fifo_list
{
  "jsonrpc": "2.0",
  "id": "29ca7b80ac504e9c9dd3513f3d4b966d",
  "result": [
    "hello",
    5
  ]
}

# get fifo[1], which is the second item of fifo
% bin/jsonrpc-call -c http://127.0.0.1:6000 fifo_get 1
{
  "jsonrpc": "2.0",
  "id": "1c3fd5fe30034b72b115705263961c22",
  "result": 5
}

# pop an item out of the fifo
% bin/jsonrpc-call -c http://127.0.0.1:6000 fifo_pop
{
  "jsonrpc": "2.0",
  "id": "df4bbe13c79c4fdc914ed8961ced9cf3",
  "result": "ok"
}

# the item 5 was removed
% bin/jsonrpc-call -c http://127.0.0.1:6000 fifo_list
{
  "jsonrpc": "2.0",
  "id": "f767a5275f544b9db2ba091cdebd9f5f",
  "result": [
    "hello"
  ]
}

Open another terminal to subscribe item pushing

% bin/jsonrpc-watch -c h2c://127.0.0.1:6000 fifo_subscribe
{
  "jsonrpc": "2.0",
  "id": "abdc63d3873649a1a7a2b1bd49916e44",
  "result": "ok"
}

Note that the cli command is bin/jsonrpc-watch and the server url scheme is h2c:// which means the client can be in streaming mode, ws:// is also streaming schema but the http1 client doesn't support streaming.

now switch to the second terminal and push another item, the output turn out to be showed in the third terminal.

 % bin/jsonrpc-watch -c h2c://127.0.0.1:6000 fifo_subscribe
{
  "jsonrpc": "2.0",
  "id": "abdc63d3873649a1a7a2b1bd49916e44",
  "result": "ok"
}
{
  "jsonrpc": "2.0",
  "method": "fifo_subscription",
  "params": [
    "world"
  ]
}

# Packages

No description provided by the author
No description provided by the author
interacting jsonrpc in http family specs, currently jsoffnet provides 3 mechanisms: the classical http/1.1, websocket and http/2 wire protocol.
No description provided by the author

# Functions

No description provided by the author
No description provided by the author
/ Convert params to a struct field by field.
Message methods.
No description provided by the author
No description provided by the author
No description provided by the author
method names.
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
Create a new instance of ErrMessageType additional is the information to help identify error details.
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author

# Constants

message kinds.
message kinds.
message kinds.
message kinds.

# Variables

error defination https://www.jsonrpc.org/specification#error_object.
error defination https://www.jsonrpc.org/specification#error_object.
error defination https://www.jsonrpc.org/specification#error_object.
error defination https://www.jsonrpc.org/specification#error_object.
error defination https://www.jsonrpc.org/specification#error_object.
error defination https://www.jsonrpc.org/specification#error_object.
error defination https://www.jsonrpc.org/specification#error_object.
error defination https://www.jsonrpc.org/specification#error_object.
error defination https://www.jsonrpc.org/specification#error_object.
error defination https://www.jsonrpc.org/specification#error_object.
error defination https://www.jsonrpc.org/specification#error_object.
error defination https://www.jsonrpc.org/specification#error_object.
error defination https://www.jsonrpc.org/specification#error_object.

# Structs

The base class of JSONRPC types.
Error message kind.
Notify message kind.
Request message kind.
Result message kind.
RPC error object.

# Interfaces

The abstract interface of JSONRPC message.

# Type aliases

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