node package manager


Fingi command protocol parser and serializer.


Install with

$ npm i fingi-cmd --save


The package exports the Command class, a parse method and a Stream which is a Duplex stream that works on Command instances.


Create by invoking the constructor with new and passing the desired command properties.

var Command = require('fingi-cmd').Command;
var cmd = new Command({ action: 'HELLO' });

Properties include:

  • nonce - (number) The nonce counter.
  • source - (string array) The command source (or origin.)
  • action - (string) The action to carry out.
  • args - (string array) Arguments

Check with the official Fingi protocol description for more information.

When you already have a Command instance, these 2 methods may be of interest:

Signs the entire command line using the HMAC-SHA1 algorithm and append the resulting signature digest as the last argument.

Returns correct protocol represenation of the command as a string ready to be sent onto the wire.


The exported Stream is an instance of node core's Duplex object-mode stream which automatically parses incoming data into Command instances and then allow send()-ing out commands to the wire.

var CmdStream = require('fingi-cmd').Stream;
var commands = new CmdStream();

To receive commands, pipe your raw incoming stream into the CmdStream and listen for the command event. The chunker module is also recommended to ensure that the stream always receives a full line.

commands.on('command', function(cmd) {
  console.log('receive:', cmd.action());

Or when using with chunker:

var chunker = new (require('chunker'))({ matcher: '\r\n' });
// commands.on('command')... as usual 

Send commands by using the send() method, passing in the Command instance to send.

// send PINGs every second. 
setInterval(function() {
  commands.send(new Command({ action: 'PING' }));
}, 1000);


Optionally, you may have a string representation that you would like to parse by yourself. You can do this by using the exported parse() function:

var parse = require('fingi-cmd').parse;
var input = '1000 server-name 9.9.99 | HELLO device\r\n';
var cmd = parse(input);
console.log(cmd.source[0]); // prints "server-name" 


MIT. See the LICENSE file for the full license text.