modular-json-rpc

Modular JSON-RPC 2.0 library that allows easy addition of transports

Usage no npm install needed!

<script type="module">
  import modularJsonRpc from 'https://cdn.skypack.dev/modular-json-rpc';
</script>

README

Build Status Coverage Status

modular-json-rcp

modular-json-rpc is a JSON-RPC 2.0 library.

Features:

  • Simple transport interface allows easy addition of different transports (only ws transport is implemented at the moment)
  • Supports bidirectional calls (see RPCNode)
  • Supports async calls and async server methods
  • Written in typescript (has definitions)

Examples

Server-client RPC

Server code

const RPC = require('modular-json-rpc');
const WebSocket = require('ws');

const wss = new WebSocket.Server({ port: 8080 });

wss.on('connection', function connection(ws) {
    console.log("New websocket client");

    // Create transport interface via websocket
    var transport = new RPC.WSTransport(ws);

    // Create RPC server
    var server = new RPC.RPCServer(transport);

    // Bind methods
    server.bind("hello", (name) => {
        return `Hello, ${name}!`;
    });

    server.bind("add", (a, b) => {
        return a + b;
    });

    console.log("RPC Server ready!");
});

console.log("Server listening on port 8080");

Client code

const RPC = require('modular-json-rpc');
const WebSocket = require('ws');

const ws = new WebSocket('ws://localhost:8080');

ws.on('open', async () => {
    console.log("Websocket connected.");

    // Create transport interface via websocket
    var transport = new RPC.WSTransport(ws);

    // Create RPC client
    var client = new RPC.RPCClient(transport);

    console.log(`Calling method hello("world").`);
    var result1 = await client.call("hello", "World");
    console.log(`Response: ${result1}`);

    console.log(`Calling method add(16, 32).`)
    var result2 = await client.call("add", 16, 32);
    console.log(`Response: ${result2}`);

    process.exit();
});

Client console output

$ node client.js
Websocket connected.
Calling method hello("world").
Response: Hello, World!
Calling method add(16, 32).
Response: 48

Bidirectional RPC

Node (ws server) code

const RPC = require('modular-json-rpc');
const WebSocket = require('ws');

const wss = new WebSocket.Server({ port: 8080 });

wss.on('connection', function connection(ws) {
    console.log("New websocket client");

    // Create transport interface via websocket
    var transport = new RPC.WSTransport(ws);

    // Create RPC node
    var node = new RPC.RPCNode(transport);

    // Note that hello method does not have name argument
    // name is retrieved by calling back and asking for a name
    node.bind("hello", async () => {
        var name = await node.call('getname');

        return `Hello, ${name}!`;
    });
});

console.log("Server listening on port 8080");

Node (ws client) code

const RPC = require('modular-json-rpc');
const WebSocket = require('ws');

const ws = new WebSocket('ws://localhost:8080');

ws.on('open', async () => {
    console.log("Websocket connected.");

    // Create transport interface via websocket
    var transport = new RPC.WSTransport(ws);

    // Create RPC node
    var node = new RPC.RPCNode(transport);

    // Other node will call back and request a name
    node.bind('getname', () => {
        return "World";
    });

    // Call hello method without providing name
    var result = await node.call('hello');
    console.log(`Response: ${result}`);

    process.exit();
});

Client console output

$ node node_client.js
Websocket connected.
Response: Hello, World!