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
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) => { ... });
)
- client library (
reRPC
exposes defined functions by attaching itself to:
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 ES2015Proxy
- 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:
- enable function to access transport layer
- enable function context augmentation
- enable payload processing customisation
- enable error handling customisation
- enable prefix customisation
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 = ;const app = ;app;const http = ;appio = http;http; // initiateconst rerpc = {}; // define function { return `Hello !`;} // register functionrerpc; // attach to Express app our route, creates '/rerpc' routererpc; // attach to Socket.IO instance, creates '/rerpc' eventappio;
Client
Using dedicated library
const rerpc = transport: 'http' transportHandler: 'http://localhost:5000'; // or const socketio = 'http://localhost:5000/'; const rerpc = transport: 'socket.io' transportHandler: socketio; // then try const result = await rerpcfn; console; // => "Hello World!" catcherror console;
CURL
Using curl -X POST 'http://localhost:5000/rerpc/greet' -H 'Content-Type: application/json' -d '{"name": "World"}'# => { "$result": "Hello World!" } OR {" $error": { ... } }
fetch
Using const response = await ; const result = await response; console; // => { "$result": "Hello World!" } OR { "$error:" { ... } }
Using Socket.IO
const socketio = 'http://localhost:5000/'; socketio
Code Samples
Refer to samples
folder for more examples.