GelRpc for Node.js
GelRpc is a dead simple (~300 loc) rpc system that works over any
full-duplex text/byte/json stream. It has one dependency -
through. Matching libraries for
Python and .NET are planned.
Table of Contents
Usage
var gelrpc = require('gelrpc');
var server = gelrpc.stream({
hello: function(name, cb) {
cb(null, 'hello, ' + name);
}
});
var client = gelrpc.stream();
client.pipe(server).pipe(client);
client.rpc('hello', ['JIM'], function (err, message) {
if (err)
console.log('ERROR: ' + err);
else if (message === 'hello, JIM')
console.log('Got the message!');
});
var remote = client.wrap(['hello']);
remote.hello('JIM', function (err, mess) {
if (err)
console.log('ERROR: ' + err);
else if (message === 'hello, JIM')
console.log('Got the message!');
})
Over TCP
Server
net.createServer(function(con) {
var server = gelrpc.stream();
server.pipe(con).pipe(server);
}).listen(3000));
Client
var client = gelrpc.stream();
var con = net.connect(3000);
client.pipe(con).pipe(client);
var remote = client.wrap(['hola']);
remote.hola('steve', function(err, res) {
console.log(res);
});
API Reference
gelrpc.router
Documentation for gelrpc.router
will be coming shortly.
gelrpc.serializer
Documentation for gelrpc.serializer
will be coming shortly.
gelrpc.stream(route, opts)
Returns a Stream
that will call methods when written to.
Parameters
[route]
Object
- contains one key per callable function.[route]
Function
- accepts (path, args, callback)
where path
is a string, args
any type and callback
a standard Node.js error-first
callback function.[opts]
Object
- contains one or more of the following options.
[EOL]
String
- end of line marker to use. Default: '\n'
.[flattenError]
Function
- accepts (err)
and returns an object to
serialize.[prefix]
String
- a value to use as an include-filter for each
EOL
-separated line in the stream.[raw]
Boolean
- when true
, the default serializer which uses
JSON.stringify
is disabled and you just get a stream of objects. Use this
if you want to do your own parsing and serializing.
Class: Stream
A class that is derived from Stream
.
stream.wrap(methodNames)
Returns a wrapped object with the remote's methods.
The client needs to already know the names of the methods.
Accepts a string, and array of strings, or a object.
If it's an object, wrap
will use the keys as the method names.
Example
var fsrpc = gelrpc.stream(require('fs'));
Then, in another process...
var fsrpc = gelrpc.stream();
var remoteFs = fsrpc.wrap(require('fs'));
remoteFs.mkdir('/tmp/whatever', function (err, dir) {
})
Now, the second process can call the fs
module in the first process!
wrap
does not use the methods for anything. It just wants the names.
stream.rpc(name, args, cb)
Directly send a call to the remote side without any wrapper function.
Parameters
name
String
- name (or 'path/to/name'
) of a remote function.[args]
Any
- array of arguments to pass to the remote function.[cb]
Function
- a standard Node.js error-first callback that will
be called when the remote side responds.
Example
var client = gelrpc.stream();
client.rpc('hello', [name], callback);
client.wrap('hello').hello(name, callback);
stream.pipe(stream)
Read about piping streams
here.
Ports
(Coming Soon!)
...
Credits
This project contains a fork of
Dominic Tarr's
excellent
rpc-stream
and
stream-serializer
libraries, which form the core of this library. Thanks for your work!
WTF?
(Why the Fork?)
I needed a single, tightly-coupled library that I can easily maintain instead
of multiple loosely-coupled libraries that I don't control. This library will
also be used in a larger library that it must be compatible with.