kebab

Half queue half pubsub. Super small (< 30 loc) and simple queue that supports subscribers.

kebab

Half queue half pubsub. Super small (< 30 loc) and simple queue that supports subscribers.

var kebab = require('kebab')
  , kb = kebab()
  , items = 10 
  , consumers = 4;
                      
function produce () {
  var id = --items;
 
  if (id) {
    setTimeout(function () {
      console.log('Producer enqueueing item %d', id);
      kb.enqueue({ now: new Date() }, id);
      produce();
    }, 50);
  }
}
 
function consume (num) {
  kb.once(function (infoid) { 
    console.log( 'Consumer %s handling item %d produced at (%ds:%dms).'
      , num, id, info.now.getSeconds(), info.now.getMilliseconds()); 
    
    // younger consumers are lazy and therefore only consume once 
    if (num > 1) setTimeout(function () { consume(num); }, 180);
  });
}
 
for (var i = 0; i < consumers; i++) consume(i);
 
produce();

Outputs:

Producer enqueueing item 9
Consumer 0 handling item 9 at (3s:879ms).
Producer enqueueing item 8
Consumer 1 handling item 8 at (3s:942ms).
Producer enqueueing item 7
Consumer 2 handling item 7 at (3s:995ms).
Producer enqueueing item 6
Consumer 3 handling item 6 at (4s:48ms).
Producer enqueueing item 5
Producer enqueueing item 4
Consumer 2 handling item 5 at (4s:99ms).
Producer enqueueing item 3
Consumer 3 handling item 4 at (4s:150ms).
Producer enqueueing item 2
Producer enqueueing item 1
Consumer 2 handling item 3 at (4s:202ms).
Consumer 3 handling item 2 at (4s:252ms).
Consumer 2 handling item 1 at (4s:303ms).

npm install kebab

npm test

npm run-script example

open example.html

  • works server side
  • works in the browser
  • supports async module loaders like requirejs
var kebab = require('kebab')
  , kb = kebab();

kebab.enqueue(arg1 [, arg2, .., argn])

arg1 .. argn are the arguments you want to pass when a subscriber callback is called.

Example:

kb.enqueue(1, 'hello world');

kebab.once(callback)

Subscribe to be called back with queued arguments.

If queue is currently holding arguments, callback will be invoked with them immediately.

Otherwise the callback will be invoked one time when arguments are enqueued in the future.

Example:

kb.once(function (nums) { console.log('working on num: %s - %s', num, s); });