lib-http-rpc

define client/server http rpc

http rpc

rpc over http using streams

Build both the client and server from a common interface.

npm install --save lib-http-rpc

Specify a common API between the client and server.

var iface = {
  getUser: {
    method : 'GET',
    route  : '/user/:name',
  },
  setUser: {
    method : 'POST',
    route  : '/user/:name',
  },
  listUsers: {
    method : 'GET',
    route  : '/users',
    options: {
      limit: 10,
      order: 'desc'
    }
  }
};

Create an rpc from your interface.

var RPC = require('lib-http-rpc')();
var rpc = RPC.NewFromInterface(iface);

Define your server application without any http dependencies.

var solidify = require('lib-stream-solidify');
var liquify  = require('lib-stream-liquify');
 
function App() {
  this.users = {};
}
 
App.prototype.getUser = function (streamparams) {
  var name = params.name;
  var user = this.users[name];
 
  // this causes an HTTP 404 error 
  if (!user) throw new RPC.Error(404, 'user not found');
 
  stream.write(JSON.stringify(user));
};
 
App.prototype.setUser = function (streamparams) {
  var name  = params.name;
  var users = this.users;
 
  // parse incoming stream as json 
  solidify(stream).json(function (errobj) {
    if (err) throw err;
 
    users[name] = obj;
 
    // send response 
    stream.end();
  });
};
 
App.prototype.listUsers = function (streamparams) {
  var limit = params.limit;
  var order = params.order;
  var users = Object.keys(this.users);
 
  // sort and limit users 
  users = limitBy(limit, sortBy(order, users));
 
  // turn user object into a stream 
  liquify(users).pipe(stream);
};

Generate a router from your application.

var router = rpc.getRouter(new App());
require('http').createServer(router).listen(8080);

Generate a client based on the shared interface.

var client = rpc.getClient(8080, 'localhost');
var stream = client.getUser({name: 'bob'});
 
stream.end().pipe(process.stdout);