npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

actorify

v1.0.0

Published

Turn any duplex stream into an actor

Readme

actorify

Turn any duplex stream into an actor. Built on the the AMP protocol for opaque binary and javascript argument support.

Actors are similar to traditional RPC however they are isolated units of communication, an actor receives and sends zero or more messages to and from its peer with bi-directional messaging. Typical RPC is done at the process-level, meaning in order to work with data coupled with an identifier such as a user id that the id must be passed each request, whereas an actor may retain this state.

Features

  • fast
  • clean api
  • json support
  • request timeouts
  • opaque binary support
  • simple flexible protocol
  • bi-directional messaging
  • request/response support

Installation

$ npm install actorify

Guide

Example

Simple hello world PING/PONG example:

var net = require('net');
var actorify = require('actorify');

// server

net.createServer(function(sock){
  var actor = actorify(sock);

  actor.on('ping', function(){
    console.log('PING');
    actor.send('pong');
  });
}).listen(3000);

// client

var sock = net.connect(3000);
var actor = actorify(sock);

setInterval(function(){
  actor.send('ping');
  actor.once('pong', function(){
    console.log('PONG');
  });
}, 300);

Sending a single request with multiple async responses, also illustrates how arguments may be primitives, json objects, or opaque binary such as sending an image over the wire for resizing, receiving multiple thumbnail blobs and their respective size:

var net = require('net');
var actorify = require('actorify');

// client

net.createServer(function(sock){
  var actor = actorify(sock);

  var img = new Buffer('faux data');

  actor.on('image thumbnails', function(img, sizes){
    console.log('%s byte image -> %s', img.length, sizes.join(', '));
    sizes.forEach(function(size){
      actor.send('thumb', size, new Buffer('thumb data'));
    });
  });
}).listen(3000);

// client

setInterval(function(){
  var sock = net.connect(3000);
  var actor = actorify(sock);

  console.log('send image for thumbs');
  var img = new Buffer('faux image');
  actor.send('image thumbnails', img, ['150x150', '300x300']);

  actor.on('thumb', function(size, img){
    console.log('thumb: %s', size);
  });
}, 500);

You may also associate callbacks with an actor message, effectively turning it into a traditional RPC call:

actor.send('get user', 'tobi', function(err, user){
  
});

actor.on('get user', function(name, reply){
  getUser(name, function(err, user){
    reply(err, user);
  });
});

Timeouts

When performing a request you may optionally timeout the response, after which an Error will be passed to the callback and any subsequent response will be ignored.

The argument may be numeric milliseconds or represented as a string such as "5s", "10m", "1 minute", "30 seconds", etc. By default there is no timeout.

actor.send('hello', function(err, res){
  
}).timeout('5s');

Error Handling

Stream errors are not handled, you must add an "error" listener to the stream passed to actorify().

Benchmarks

Benchmarks on my first generation MBP Retina with node 0.11.x. Real results are likely higher since having the producer on the same machine as the consumer makes results misleading.

With 64b messages:

      min: 56,818 ops/s
     mean: 159,207 ops/s
   median: 138,888 ops/s
    total: 1,376,188 ops in 8.644s
  through: 1.52 mb/s

With 1kb messages:

      min: 56,179 ops/s
     mean: 153,919 ops/s
   median: 142,857 ops/s
    total: 909,974 ops in 5.912s
  through: 150.31 mb/s

With 10kb messages:

      min: 11,389 ops/s
     mean: 64,167 ops/s
   median: 64,102 ops/s
    total: 352,025 ops in 5.486s
  through: 626.64 mb/s

With 32kb messages:

      min: 7,032 ops/s
     mean: 14,269 ops/s
   median: 23,584 ops/s
    total: 86,329 ops in 6.05s
  through: 445.91 mb/s

License

MIT