libmill

0.4.0 • Public • Published

node.js function access to libmill

Build Status

go style concurrency for node.

an experiment

#install libmill and libsodium dependencies 
$ git clone https://github.com/sustrik/libmill.git
cd libmill && ./autogen.sh && ./configure && make -j 8 && sudo make install
$ sudo /sbin/ldconfig # linux only 
 
$ git clone https://github.com/jedisct1/libsodium.git
cd libsodium && ./autogen.sh && ./configure && make -j 8 && sudo make install
$ sudo /sbin/ldconfig # linux only 
 
$ npm i && npm t

tcp library

for msgs over tcp/ip, a server can use tcplisten(). once a client connects, the server can use tcpaccept() to establish bidirectional tcp streams.

tcplisten() and tcpaccept()

var lib = require('libmill');
 
/* create an ipaddr */
var ipaddr = lib.iplocal(5555);
 
/* listen on the ipaddr */
var ls = lib.tcplisten(ipaddr);
console.log('listening on port %s', lib.tcpport(ls));
 
while(1){
  /* accept and establish tcp connection */
  var as = lib.tcpaccept(ls);
  console.log('\nnew connection\nmsg recvd: ' + lib.tcprecvuntil(as));
 
  /* close tcp connection */
  lib.tcpclose(as);
}

tcpconnect()

var lib = require('libmill');
 
/* create an ipaddr */
var ipaddr = lib.iplocal(5555);
 
/* connect over the ipaddr */
var cs = lib.tcpconnect(ipaddr);
var str = 'go style concurrency for node', num = 1;
 
/* send a few msg before tcpflush */
/* delimiter is set to '\r', tells tcprecvuntil when to finish */
send('msg # ', str);
send('msg # ', str);
send('msg #', str+'\r');
function send(n, msg){
  n+= num+++msg+'\n';
  lib.tcpsend(cs, new Buffer(n));
}
 
/* tcpsend() stores data in user space and tcpflush() pushes it to kernel */
lib.tcpflush(cs);

udp library

udplisten() and udprecv()

var lib = require('libmill');
 
/* create an ipaddr */
var ipaddr = lib.iplocal(4444);
 
/* listen on ipaddr */
var ls = lib.udplisten(ipaddr);
process.stdout.write('udp socket listening on port: ' + lib.udpport(ls) + '\n');
 
/* next, to get udp msgs, use udprecv
   if you pass a cb function as the 3rd param, the call will use libuv async
   the callback's param will contain your msg
 
   otherwise w/out a cb, it will block and udprecv's return value is your msg */
 
 
/* the non-blocking way (a for async) */
lib.udprecv(ls, 255, function (msg) {
  var buf = String(msg.buf) /* msg.buf is a node buffer of the packet body */
  var addr = msg.addr  /* string address of packet origin */
});
 
/* the blocking way  */
while (1) {
  var sz = 13;
  var deadline = 10;
 
  var msg = lib.udprecv(ls, sz, deadline); /* deadline is optional param */
  process.stdout.write(msg.buf + '\n');
}

udpsend()

var s = lib.udplisten(ipaddr);
var buf = new Buffer('Hello, world!');
 
lib.udpsend(s, ipaddr, buf);

test

see test directory

license

MIT

tested on circleci linux and osx.

Package Sidebar

Install

npm i libmill

Homepage

req.link

Weekly Downloads

18

Version

0.4.0

License

MIT

Last publish

Collaborators

  • reqshark