Skip to content


Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
A very simple json-header-and-body protocol
tag: v1.1.0


latest commit 25a3c683aa
@isaacs authored
Failed to load latest commit information.
example examples
test a test with tcp
LICENSE bsd readme
incoming.js fix for new transform api
index.js codes
outgoing.js fix for new transform api
package.json v1.1.0


A very simple header-and-body protocol.

Originally written as an example in a Node API doc.


var sp = require('simple-protocol');
var Incoming = sp.Incoming;
var Outgoing = sp.Outgoing;

// throw some tcp in there, just for funsies
// Note that we have to use allowHalfOpen, because we're not
// explicitly managing the sockets, and we want to not close
// when we get a FIN from the client.
// In a real live environment, you'd probably want a client that can
// pool and reuse connections, do keepAlive, etc., and you'd then
// want to turn off allowHalfOpen, because the server is not
// interested in what the client has to say after it's finished
// sending the response.
require('net').createServer({ allowHalfOpen: true }, function(sock) {
  var req = new Incoming();
  var res = new Outgoing();

  req.on('header', function(h) {
    console.log('SERVER header', h);

  req.on('data', function(chunk) {
    console.log('SERVER message %j', chunk.toString());

  req.on('end', function() {
    console.log('SERVER end');
    res.header = { well: 'that was fun' };
    res.write('ok, ');
    res.end('goodbye, now');

}).listen(1337, function() {
  var sock = require('net').connect(1337);
  sock.allowHalfOpen = true;
  sock.on('connect', function() {
    var req = new Outgoing();
    var res = new Incoming();

    req.header = { hello: 'alice', this: 'is bob' };

    res.on('header', function(h) {
      console.log('CLIENT header', h);
    res.on('data', function(chunk) {
      console.log('CLIENT message %j', chunk.toString());
    res.on('end', function() {
      console.log('CLIENT end');

    req.write('this is body chunks');
    req.write('.  and it will stream and stream\n');
    req.end('because there is no I in example.\n');

And the output goes like:

SERVER header { hello: 'alice', this: 'is bob' }
SERVER message "this is body chunks.  and it will stream and stream\nbecause there is no I in example.\n"
CLIENT header { well: 'that was fun' }
CLIENT message "ok, goodbye, now"


If you want to use this with node v0.8 and before, you'll need to also install the readable-stream module. It's not added as a dependency, because the future is larger than the past.

Something went wrong with that request. Please try again.