Skip to content

Record and log all communication over sockets

Notifications You must be signed in to change notification settings

kellym/hellodog

Repository files navigation

Hello, Dog!

There are libraries out there that record HTTP transactions. There's yakbak and sepia, to name a couple.

This library is different. This library records and logs all communication over sockets, not just sockets used for HTTP transactions.

What happens over sockets, you ask? Let's name a few:

  • HTTP transactions
  • HTTPS transactions
  • FTP transactions
  • WebSockets
  • stdin, stdout, and stderr (this means you can track console.log!)
  • and many more!

Build Status

Quick Start

Patching Socket

When using HelloDog, net.Socket needs to be patched before anything else extends or creates a Socket in order for that to be recorded. Patching can be done by either calling patch() or by assigning track:

// automatically patches when retrieving the track method:
const { track } = require('hellodog');

// or more explicitly:
require('hellodog').patch();

// net Socket can also be unpatched:
require('hellodog').unpatch();

Basic usage

const { track } = require('hellodog');

// basic recording of process.stdout
track((done) => {
  console.log('Hello, dog!');
  console.log('Goodbye, dog!');
  done();
}, (err, log) => {
  // returns an array of sockets and their messages
});

// or use it as a Promise
track((resolve, reject) => {
  console.log('I promise!');
  resolve();
}).then((log) => {

});

const log = await track(fnCall);

Response from console.log:

[
  {
    events: [
      { type: 'write', data: 'Hello, dog!\n', created_at: 1489460314753.3242 },
      { type: 'write', data: 'Goodbye, dog!\n', created_at: 1489460314753.4758 }
    ],
    source: 'stdout'
  }
]

More advanced responses

const { track } = require('hellodog');
const express = require('express');

// recording of an HTTP transaction
const app = express();
app.get('/', (req, res) => {
  res.header('Content-length', 13);
  res.write('Hello, world!');
  res.end();
});
const server = app.listen(8888, () => {
  track((done) => {
    http.get('http://localhost:8888', done);
  }, (err, log) => {
    // returns an array of sockets and their messages,
    // both request and response
    server.close();
  });
});

Response from HTTP transaction:

[
  {
    events: [
      {
        type: 'connect',
        created_at: 1489460545610.2593
      },
      {
        type: 'write',
        data: 'GET / HTTP/1.1\r\nHost: localhost:8888\r\nConnection: close\r\n\r\n',
        created_at: 1489460545620.1575
      },
      {
        type: 'read',
        data: 'HTTP/1.1 200 OK\r\nX-Powered-By: Express\r\nContent-length: 13\r\nDate: Tue, 14 Mar 2017 03:02:25 GMT\r\nConnection: close\r\n\r\nHello, world!',
        created_at: 1489460545628.0654
      }
    ],
    connection: {
      host: 'localhost',
      port: '8888'
    },
    source: 'tcp'
  }
]

Why Dog?

Dogs have both an excellent memory and excellent hearing. We need both.

About

Record and log all communication over sockets

Resources

Stars

Watchers

Forks

Packages

No packages published