Giter Site home page Giter Site logo

naderio / rerpc Goto Github PK

View Code? Open in Web Editor NEW
1.0 1.0 0.0 40 KB

an opinionated take on RPC system intended for usage with or without dedicated client library, HTTP request or Socket.IO event.

License: The Unlicense

JavaScript 100.00%
rpc http nodejs expressjs socket-io

rerpc's Introduction

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.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.