rerpc

0.13.1 • Public • Published

reRPC

reRPC is a simplified and flexible RPC system with unified model for client-to-server and server-to-server communication on top of HTTP and/or Socket.IO.

It provides an unified approach to define both a HTTP path and a Socket.IO event handlers as a single async function that can be invoked with a dedicated library.

Status

Status npm node npm dependency Status devDependency Status devDependency Status Build Status npm

This library is production-ready.

Please refer to releases/changelog and roadmap for more information.

Description

reRPC enable you to do the following:

  • define an async Node.js function (lib.doSomething = async (payload) => { ... ; return result; };)
  • call the defined function from client by mean of:
    • client library (result = await lib.doSomething(payload);)
    • HTTP request (POST /rerpc/doSomething with payload as JSON in body)
    • Socket.IO event (socketio.emit('/rerpc', 'doSomething', payload, (result) => { ... });)

reRPC exposes defined functions by attaching itself to:

  • /rerpc route on an Express app or route instance
  • /rerpc event on a Socket.IO instance

Goals

  • enable writing a function once and call it with dedicated library, HTTP request and/or Socket.IO event
  • simplify function invocation interface by mean of async/await and ES2015 Proxy
  • stay simple:
    • do not create and manage transport connection, even in frontend
    • no middleware, authentication, ...
    • delegate customisation code to transport (Express and/or Socket.IO)
  • stay flexible:

Requirements

reRPC makes use of a number of ES2015+ features, most notably async/await and Proxy. Therefore:

  • Node v8+
  • Transpiler for browser code

Usage

Refer to doc folder for more documentation.

Server

const express = require('express');
const app = express();
app.use(express.json());
const http = require('http').Server(app);
app.io = require('socket.io')(http);
http.listen(5000);
 
// initiate
const rerpc = require('rerpc')({});
 
// define function
async function greet({ name }) {
  return `Hello ${name}!`;
}
 
// register function
rerpc.register({ greet });
 
// attach to Express app our route, creates '/rerpc' route
rerpc.attachToExpress(app);
 
// attach to Socket.IO instance, creates '/rerpc' event
app.io.on('connect', soc => rerpc.attachToSocketIO(soc));

Client

Using dedicated library

const rerpc = require('rerpc/client')({
  transport: 'http',
  transportHandler: 'http://localhost:5000',
});
 
// or
 
const socketio = require('socket.io-client')('http://localhost:5000/');
 
const rerpc = require('rerpc/client')({
  transport: 'socket.io',
  transportHandler: socketio,
});
 
// then
 
try {
  const result = await rerpc.fn.greet({ name: 'World' });
  console.log(result); // => "Hello World!"
} catch(error) {
  console.error(error);
}

Using CURL

curl -X POST 'http://localhost:5000/rerpc/greet' -H 'Content-Type: application/json' -d '{"name": "World"}'
# => { "$result": "Hello World!" } OR {" $error": { ... } } 

Using fetch

const response = await fetch('http://localhost:5000/rerpc/greet', {
  method: 'post',
  headers: new Headers({ 'Content-Type': 'application/json' }),
  body: JSON.stringify({ name: 'World' }),
});
 
const result = await response.json();
 
console.log(result); // => { "$result": "Hello World!" } OR { "$error:" { ... } }

Using Socket.IO

const socketio = require('socket.io-client')('http://localhost:5000/');
 
socketio.emit('/rerpc', 'greet', { name: 'World' }, (result => {
  console.log(result); // => { "$result": "Hello World!" } OR { "$error:" { ... } }
});

Code Samples

Refer to samples folder for more examples.

Versions

Current Tags

  • Version
    Downloads (Last 7 Days)
    • Tag
  • 0.13.1
    0
    • latest

Version History

Package Sidebar

Install

npm i rerpc

Weekly Downloads

0

Version

0.13.1

License

Unlicense

Last publish

Collaborators

  • naderio