pinary

1.4.4 • Public • Published

pinary


Node.js CI npm version MIT Licence Dependency Status

Introduction

Yet another RPC client and server, with minimalistic publish/subscribe implementation.

  • Server

    • TCP or TLS, as you want (TLS require certificates, see https://github.com/jfromaniello/selfsigned )
    • Persistant connection
    • Binary frames (fast)
    • Optional ZLIB compression
    • Minimalistic JSON Schema implementation (input integrity)
    • Handle Max Clients
    • Basic publish/subscribe support
  • Client

    • Automatic reconnect
    • Internal RPC calls queue
      • Allow lazy client connect
      • Store calls when not connected and play calls when reconnect

Install

npm install pinary

Server

Server: instantiation

const PinaryServer = require('pinary').server;
const server = new PinaryServer();

// with options (see below)
// const server = new PinaryServer({port:64000});

Option Default Notes
useTLS false Use clear TCP or TLS
useZLIB false Use ZLIB compression
maxClients (1) 10 Maximum number of simultaneous TCP connections
timeoutData 1000 Delay before socket close if no data sent, in milliseconds
host 0.0.0.0 Listening IP/host
port 65000 for TCP, 65001 for TLS Listening port
key null TLS: private key
cert null TLS: public key
ca null TLS: certificate authority (string of array of string)
secureProtocol TLSv1_2_method TLS: cipher
rejectUnauthorized false TLS: allow self signed certificates, or not

(1) under the hood, a "client" is in fact 2 sockets, one for writing, one for reading.

Client

Client: instantiation

const PinaryClient = require('pinary').client;
const client = new PinaryClient(); // auto connect

// with a TCP url
// const client = new PinaryClient('tcp://localhost:64000',[options]);

// with a TLS url
// const client = new PinaryClient('tls://localhost:64000',[options]);
Option Default Note
reconnectInterval 500 milliseconds
queueSize 100 store rpc calls limit when not connected/disconnected

Client: trigger a method

// using callback
client.rpc('myMethod', (err, result) => {
    if (err) throw err;
    console.log(result);
});

// using async/await
async function letsgo() {
    let result;
    try {
        result = await client.rpcPromise('myMethod');
    } catch(e) {
        // something wrong
    }
    console.log(result);
}

Note: if not yet connected or while the client is trying to reconnect, RPC calls are stored in a queue and played when client is connected.

Client: events

event name arguments Notes
connected retryCount if retryCount = 0, first connection, else reconnection
disconnected
error Error

Publish/Subscribe (PUBSUB)

Client to clients

const Server = require('pinary').server;
const Client = require('pinary').client;

const server = new Server();
const client1 = new Client();
const client2 = new Client();

const channel = '/myChannel';

server.start();

client1.subscribe('/bla', (data) => {
    console.log(data);
    process.exit();
});

client2.publish('/bla', { foo:'bar' });

Server to clients

const Server = require('pinary').server;
const Client = require('pinary').client;

const server = new Server();
const client = new Client();

const channel = '/myChannel';

server.start();

client.subscribe(channel, (data) => {
    console.log(data);
    process.exit();
});

server.publish(channel, { foo:'bar' });

The actual implementation is minimalistic:

  • a channel is considered as an ID, you cannot use wildcards like redis or faye

TODO

  • finish doc
    • events emitted (server)
    • server methods registration (see test/tests/102.methodExist.js, or examples/ for moment)

Package Sidebar

Install

npm i pinary

Weekly Downloads

1

Version

1.4.4

License

MIT

Unpacked Size

73.4 kB

Total Files

40

Last publish

Collaborators

  • eviltik