• Stars
    star
    208
  • Rank 189,015 (Top 4 %)
  • Language
    JavaScript
  • Created over 10 years ago
  • Updated almost 2 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Message queues which uses MongoDB.

mongodb-queue

Build Status NPM

A really light-weight way to create queues with a nice API if you're already using MongoDB.

Now compatible with the MongoDB v3 driver.

For MongoDB v2 driver use mongodb-queue@3.

NOTE: This package is considered feature complete and STABLE hence there is not a whole lot of development on it though it is being used extensively. Use it with all your might and let us know of any problems - it should be bullet-proof.

Synopsis

Create a connection to your MongoDB database, and use it to create a queue object:

var mongodb = require('mongodb')
var mongoDbQueue = require('mongodb-queue')

const url = 'mongodb://localhost:27017/'
const client = new mongodb.MongoClient(url, { useNewUrlParser: true })

client.connect(err => {
  const db = client.db('test')
  const queue = mongoDbQueue(db, 'my-queue')

  // ...

})

Add a message to a queue:

queue.add('Hello, World!', (err, id) => {
    // Message with payload 'Hello, World!' added.
    // 'id' is returned, useful for logging.
})

Get a message from the queue:

queue.get((err, msg) => {
    console.log('msg.id=' + msg.id)
    console.log('msg.ack=' + msg.ack)
    console.log('msg.payload=' + msg.payload) // 'Hello, World!'
    console.log('msg.tries=' + msg.tries)
})

Ping a message to keep it's visibility open for long-running tasks

queue.ping(msg.ack, (err, id) => {
    // Visibility window now increased for this message id.
    // 'id' is returned, useful for logging.
})

Ack a message (and remove it from the queue):

queue.ack(msg.ack, (err, id) => {
    // This msg removed from queue for this ack.
    // The 'id' of the message is returned, useful for logging.
})

By default, all old messages - even processed ones - are left in MongoDB. This is so that you can go and analyse them if you want. However, you can call the following function to remove processed messages:

queue.clean((err) => {
    // All processed (ie. acked) messages have been deleted
})

And if you haven't already, you should call this to make sure indexes have been added in MongoDB. Of course, if you've called this once (in some kind one-off script) you don't need to call it in your program. Of course, check the changelock to see if you need to update them with new releases:

queue.createIndexes((err, indexName) => {
    // The indexes needed have been added to MongoDB.
})

Creating a Queue

To create a queue, call the exported function with the MongoClient, the name and a set of opts. The MongoDB collection used is the same name as the name passed in:

var mongoDbQueue = require('mongodb-queue')

// an instance of a queue
var queue1 = mongoDbQueue(db, 'a-queue')
// another queue which uses the same collection as above
var queue2 = mongoDbQueue(db, 'a-queue')

Using queue1 and queue2 here won't interfere with each other and will play along nicely, but that's not a good idea code-wise - just use the same object. This example is for illustrative purposes only.

Note: Don't use the same queue name twice with different options, otherwise behaviour is undefined and again it's not something you should do.

To pass in options for the queue:

var resizeQueue = mongoDbQueue(db, 'resize-queue', { visibility : 30, delay : 15 })

This example shows a queue with a message visibility of 30s and a delay to each message of 15s.

Options

name

This is the name of the MongoDB Collection you wish to use to store the messages. Each queue you create will be it's own collection.

e.g.

var resizeImageQueue = mongoDbQueue(db, 'resize-image-queue')
var notifyOwnerQueue = mongoDbQueue(db, 'notify-owner-queue')

This will create two collections in MongoDB called resize-image-queue and notify-owner-queue.

visibility - Message Visibility Window

Default: 30

By default, if you don't ack a message within the first 30s after receiving it, it is placed back in the queue so it can be fetched again. This is called the visibility window.

You may set this visibility window on a per queue basis. For example, to set the visibility to 15 seconds:

var queue = mongoDbQueue(db, 'queue', { visibility : 15 })

All messages in this queue now have a visibility window of 15s, instead of the default 30s.

delay - Delay Messages on Queue

Default: 0

When a message is added to a queue, it is immediately available for retrieval. However, there are times when you might like to delay messages coming off a queue. ie. if you set delay to be 10, then every message will only be available for retrieval 10s after being added.

To delay all messages by 10 seconds, try this:

var queue = mongoDbQueue(db, 'queue', { delay : 10 })

This is now the default for every message added to the queue.

deadQueue - Dead Message Queue

Default: none

Messages that have been retried over maxRetries will be pushed to this queue so you can automatically see problem messages.

Pass in a queue (that you created) onto which these messages will be pushed:

var deadQueue = mongoDbQueue(db, 'dead-queue')
var queue = mongoDbQueue(db, 'queue', { deadQueue : deadQueue })

If you pop a message off the queue over maxRetries times and still have not acked it, it will be pushed onto the deadQueue for you. This happens when you .get() (not when you miss acking a message in it's visibility window). By doing it when you call .get(), the unprocessed message will be received, pushed to the deadQueue, acked off the normal queue and .get() will check for new messages prior to returning you one (or none).

maxRetries - Maximum Retries per Message

Default: 5

This option only comes into effect if you pass in a deadQueue as shown above. What this means is that if an item is popped off the queue maxRetries times (e.g. 5) and not acked, it will be moved to this deadQueue the next time it is tried to pop off. You can poll your deadQueue for dead messages much like you can poll your regular queues.

The payload of the messages in the dead queue are the entire messages returned when .get()ing them from the original queue.

e.g.

Given this message:

msg = {
  id: '533b1eb64ee78a57664cc76c',
  ack: 'c8a3cc585cbaaacf549d746d7db72f69',
  payload: 'Hello, World!',
  tries: 1
}

If it is not acked within the maxRetries times, then when you receive this same message from the deadQueue, it may look like this:

msg = {
  id: '533b1ecf3ca3a76b667671ef',
  ack: '73872b204e3f7be84050a1ce82c5c9c0',
  payload: {
    id: '533b1eb64ee78a57664cc76c',
    ack: 'c8a3cc585cbaaacf549d746d7db72f69',
    payload: 'Hello, World!',
    tries: 5
  },
  tries: 1
}

Notice that the payload from the deadQueue is exactly the same as the original message when it was on the original queue (except with the number of tries set to 5).

Operations

.add()

You can add a string to the queue:

queue.add('Hello, World!', (err, id) => {
    // Message with payload 'Hello, World!' added.
    // 'id' is returned, useful for logging.
})

Or add an object of your choosing:

queue.add({ err: 'E_BORKED', msg: 'Broken' }, (err, id) => {
    // Message with payload { err: 'E_BORKED', msg: 'Broken' } added.
    // 'id' is returned, useful for logging.
})

Or add multiple messages:

queue.add(['msg1', 'msg2', 'msg3'], (err, ids) => {
    // Messages with payloads 'msg1', 'msg2' & 'msg3' added.
    // All 'id's are returned as an array, useful for logging.
})

You can delay individual messages from being visible by passing the delay option:

queue.add('Later', { delay: 120 }, (err, id) => {
    // Message with payload 'Later' added.
    // 'id' is returned, useful for logging.
    // This message won't be available for getting for 2 mins.
})

.get()

Retrieve a message from the queue:

queue.get((err, msg) => {
    // You can now process the message
    // IMPORTANT: The callback will not wait for an message if the queue is empty.  The message will be undefined if the queue is empty.
})

You can choose the visibility of an individual retrieved message by passing the visibility option:

queue.get({ visibility: 10 }, (err, msg) => {
    // You can now process the message for 10s before it goes back into the queue if not ack'd instead of the duration that is set on the queue in general
})

Message will have the following structure:

{
  id: '533b1eb64ee78a57664cc76c', // ID of the message
  ack: 'c8a3cc585cbaaacf549d746d7db72f69', // ID for ack and ping operations
  payload: 'Hello, World!', // Payload passed when the message was addded
  tries: 1 // Number of times this message has been retrieved from queue without being ack'd
}

.ack()

After you have received an item from a queue and processed it, you can delete it by calling .ack() with the unique ackId returned:

queue.get((err, msg) => {
    queue.ack(msg.ack, (err, id) => {
        // this message has now been removed from the queue
    })
})

.ping()

After you have received an item from a queue and you are taking a while to process it, you can .ping() the message to tell the queue that you are still alive and continuing to process the message:

queue.get((err, msg) => {
    queue.ping(msg.ack, (err, id) => {
        // this message has had it's visibility window extended
    })
})

You can also choose the visibility time that gets added by the ping operation by passing the visibility option:

queue.get((err, msg) => {
    queue.ping(msg.ack, { visibility: 10 }, (err, id) => {
        // this message has had it's visibility window extended by 10s instead of the visibilty set on the queue in general
    })
})

.total()

Returns the total number of messages that has ever been in the queue, including all current messages:

queue.total((err, count) => {
    console.log('This queue has seen %d messages', count)
})

.size()

Returns the total number of messages that are waiting in the queue.

queue.size((err, count) => {
    console.log('This queue has %d current messages', count)
})

.inFlight()

Returns the total number of messages that are currently in flight. ie. that have been received but not yet acked:

queue.inFlight((err, count) => {
    console.log('A total of %d messages are currently being processed', count)
})

.done()

Returns the total number of messages that have been processed correctly in the queue:

queue.done((err, count) => {
    console.log('This queue has processed %d messages', count)
})

.clean()

Deletes all processed mesages from the queue. Of course, you can leave these hanging around if you wish, but delete them if you no longer need them. Perhaps do this using setInterval for a regular cleaning:

queue.clean((err) => {
    console.log('The processed messages have been deleted from the queue')
})

Notes about Numbers

If you add up .size() + .inFlight() + .done() then you should get .total() but this will only be approximate since these are different operations hitting the database at slightly different times. Hence, a message or two might be counted twice or not at all depending on message turnover at any one time. You should not rely on these numbers for anything but are included as approximations at any point in time.

Use of MongoDB

Whilst using MongoDB recently and having a need for lightweight queues, I realised that the atomic operations that MongoDB provides are ideal for this kind of job.

Since everything it atomic, it is impossible to lose messages in or around your application. I guess MongoDB could lose them but it's a safer bet it won't compared to your own application.

As an example of the atomic nature being used, messages stay in the same collection and are never moved around or deleted, just a couple of fields are set, incremented or deleted. We always use MongoDB's excellent collection.findAndModify() so that each message is updated atomically inside MongoDB and we never have to fetch something, change it and store it back.

Roadmap

We may add the ability for each function to return a promise in the future so it can be used as such, or with async/await.

Releases

4.0.0 (2019-02-20)

  • [NEW] Updated entire codebase to be compatible with the mongodb driver v3

2.1.0 (2016-04-21)

2.0.0 (2014-11-12)

1.0.1 (2015-05-25)

  • [NEW] Test changes only

1.0.0 (2014-10-30)

0.9.1 (2014-08-28)

  • [NEW] Added .clean() method to remove old (processed) messages
  • [NEW] Add 'delay' option to queue.add() so individual messages can be delayed separately
  • [TEST] Test individual 'delay' option for each message

0.7.0 (2014-03-24)

  • [FIX] Fix .ping() so only visible/non-deleted messages can be pinged
  • [FIX] Fix .ack() so only visible/non-deleted messages can be pinged
  • [TEST] Add test to make sure messages can't be acked twice
  • [TEST] Add test to make sure an acked message can't be pinged
  • [INTERNAL] Slight function name changes, nicer date routines

0.6.0 (2014-03-22)

  • [NEW] The msg.id is now returned on successful Queue.ping() and Queue.ack() calls
  • [NEW] Call quueue.ensureIndexes(callback) to create them
  • [CHANGE] When a message is acked, 'deleted' is now set to the current time (not true)
  • [CHANGE] The queue is now created synchronously

0.5.0 (2014-03-21)

  • [NEW] Now adds two indexes onto the MongoDB collection used for the message
  • [CHANGE] The queue is now created by calling the async exported function
  • [DOC] Update to show how the queues are now created

0.4.0 (2014-03-20)

  • [NEW] Ability to ping retrieved messages a. la. 'still alive' and 'extend visibility'
  • [CHANGE] Removed ability to have different queues in the same collection
  • [CHANGE] All queues are now stored in their own collection
  • [CHANGE] When acking a message, only need ack (no longer need id)
  • [TEST] Added test for pinged messages
  • [DOC] Update to specify each queue will create it's own MongoDB collection
  • [DOC] Added docs for option delay
  • [DOC] Added synopsis for Queue.ping()
  • [DOC] Removed use of msg.id when calling Queue.ack()

0.3.1 (2014-03-19)

  • [DOC] Added documentation for the delay option

0.3.0 (2014-03-19)

  • [NEW] Return the message id when added to a queue
  • [NEW] Ability to set a default delay on all messages in a queue
  • [FIX] Make sure old messages (outside of visibility window) aren't deleted when acked
  • [FIX] Internal: Fix queueName
  • [TEST] Added test for multiple messages
  • [TEST] Added test for delayed messages

0.2.1 (2014-03-19)

  • [FIX] Fix when getting messages off an empty queue
  • [NEW] More Tests

0.2.0 (2014-03-18)

  • [NEW] messages now return number of tries (times they have been fetched)

0.1.0 (2014-03-18)

  • [NEW] add messages to queues
  • [NEW] fetch messages from queues
  • [NEW] ack messages on queues
  • [NEW] set up multiple queues
  • [NEW] set your own MongoDB Collection name
  • [NEW] set a visibility timeout on a queue

Author

$ npx chilts

   ╒════════════════════════════════════════════════════╕
   β”‚                                                    β”‚
   β”‚   Andrew Chilton (Personal)                        β”‚
   β”‚   -------------------------                        β”‚
   β”‚                                                    β”‚
   β”‚          Email : [email protected]             β”‚
   β”‚            Web : https://chilts.org                β”‚
   β”‚        Twitter : https://twitter.com/andychilton   β”‚
   β”‚         GitHub : https://github.com/chilts         β”‚
   β”‚         GitLab : https://gitlab.org/chilts         β”‚
   β”‚                                                    β”‚
   β”‚   Apps Attic Ltd (My Company)                      β”‚
   β”‚   ---------------------------                      β”‚
   β”‚                                                    β”‚
   β”‚          Email : [email protected]              β”‚
   β”‚            Web : https://appsattic.com             β”‚
   β”‚        Twitter : https://twitter.com/AppsAttic     β”‚
   β”‚         GitLab : https://gitlab.com/appsattic      β”‚
   β”‚                                                    β”‚
   β”‚   Node.js / npm                                    β”‚
   β”‚   -------------                                    β”‚
   β”‚                                                    β”‚
   β”‚        Profile : https://www.npmjs.com/~chilts     β”‚
   β”‚           Card : $ npx chilts                      β”‚
   β”‚                                                    β”‚
   β•˜β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•›

License

MIT - http://chilts.mit-license.org/2014/

(Ends)

More Repositories

1

awssum

(deprecated: use aws-sdk) Node.js modules for talking to lots of Web Service APIs.
JavaScript
461
star
2

node-coupon-code

Implementation of Perl's Algorithm::CouponCode for NodeJS
JavaScript
131
star
3

cil

DVCS backed issue tracking system
Perl
71
star
4

oibackoff

incremental backoff flow-control for any : fn(function(err, data) { ... });
JavaScript
66
star
5

node-ofx

Parse OFX files into a usable data structure for Node.js.
JavaScript
60
star
6

data2xml

A data to XML converter with a nice interface (for NodeJS).
JavaScript
60
star
7

connect-stream-s3

Streaming connect middleware for uploading files to Amazon S3.
JavaScript
57
star
8

node-date-recur

Create a recurring date and query it to see if it lands on a particular date.
JavaScript
46
star
9

nginx-generator

Generate simple Nginx 'vhosts' with a simple library/cli tool.
JavaScript
42
star
10

nice-route53

A nicer API to Amazon's Route53.
JavaScript
37
star
11

12factor-config

Config which only reads the environment ... as described in http://12factor.net/config
JavaScript
36
star
12

sid

Generate Sortable Identifiers
Go
32
star
13

koa-pg

Koa middleware to get you a Postgres client.
JavaScript
29
star
14

fmt

Command line output formatting.
JavaScript
25
star
15

awssum-amazon-s3

(deprecated: use aws-sdk) NodeJS module to for talking to Amazon S3.
JavaScript
24
star
16

flake

Generate practically unique (approximately sortable) IDs in a distributed environment.
JavaScript
23
star
17

go-readme

An example ReadMe file for Go libraries.
22
star
18

feed2json

Convert RSS/Atom feeds to JSONFeed.
JavaScript
18
star
19

node-awssum-scripts

Examples of non-trivial scripts for node-awssum which can be used standalone
JavaScript
15
star
20

boltdb-dump

Command to dump a human-readable BoltDB to stdout.
Go
13
star
21

lol

Just lol, rofl, wtf, etc !!11!!1!
JavaScript
10
star
22

connect-uuid

Connect middleware to assign a UUID to every request.
JavaScript
8
star
23

connect-pgclient

Connect middleware to manage Postgres connections.
JavaScript
7
star
24

dep-tree

Create and solve a dependency tree.
JavaScript
7
star
25

awssum-amazon-ec2

(deprecated: use aws-sdk) NodeJS module to for talking to Amazon EC2.
JavaScript
6
star
26

mongodb-lock

Locks which uses MongoDB's atomic operations.
JavaScript
6
star
27

libawssum-perl

Perl Interface to many Web APIs (including AWS, RackSpace, Flickr, PayPal, Google Storage etc)
Perl
6
star
28

modb-dyno-leveldb

An implementation of dyno-abstract for a LevelDB store.
JavaScript
6
star
29

winston-simpledb

A SimpleDB transport for winston.
JavaScript
6
star
30

connect-blog

Blog middleware you can add to your Connect/Express app.
JavaScript
6
star
31

proxie

Proximity is a pluggable and configurable HTTP server.
JavaScript
5
star
32

node-awssum

Placeholder repo - now at http://github.com/awssum/awssum/
5
star
33

awssum-amazon-cloudsearch

(deprecated: use aws-sdk) NodeJS module to talk to Amazon CloudSearch.
JavaScript
5
star
34

sound

Make sure your data is sound! A validation library for Node.js.
JavaScript
5
star
35

awssum-amazon-route53

(deprecated: use aws-sdk) NodeJS module to talk to Amazon Route53.
JavaScript
5
star
36

pushid

Lexicographically ordered string IDs.
JavaScript
5
star
37

zaapt

A CMS written in Perl and using Postgres
Perl
4
star
38

awssum-amazon-dynamodb

(deprecated: use aws-sdk) NodeJS module to talk to Amazon DynamoDB.
JavaScript
4
star
39

awssum-amazon

NodeJS module to aid talking to Amazon Web Services. Requires awssum-amazon-* plugins.
JavaScript
4
star
40

awssum-amazon-sqs

(deprecated: use aws-sdk) NodeJS module to talk to Amazon Simple Queue Service (SQS).
JavaScript
4
star
41

s3tools

Tools for managing your S3 buckets and objects.
JavaScript
4
star
42

awssum-amazon-fps

(deprecated: use aws-sdk) NodeJS module to talk to Amazon Flexible Payments Service (FPS).
JavaScript
4
star
43

jquery.persona-assistant.js

jQuery plugin to help with performing common Persona tasks.
JavaScript
4
star
44

awssum-amazon-redshift

AwsSum plugin for Amazon Redshift.
JavaScript
4
star
45

blogz

Read a directory of files, get a blog data structure.
JavaScript
4
star
46

awssum-amazon-cloudformation

(deprecated: use aws-sdk) NodeJS module to talk to Amazon CloudFormation.
JavaScript
4
star
47

pg-patcher

A Postgres patch helper for node-postgres.
JavaScript
3
star
48

chilts.github.com

chilts.org - Node.js, Web APIs, Perl and other geeky type stuff. :)
HTML
3
star
49

awssum-test

Test repo to try which also acts as examples.
JavaScript
3
star
50

level-timeseries

A pluggable timeseries DB built on top of LevelDB.
JavaScript
3
star
51

connect-error-amazon-ses

Middleware to send errors as email through Amazon SES.
JavaScript
3
star
52

awssum-amazon-ses

(deprecated: use aws-sdk) NodeJS module to talk to Amazon Simple Email Service (SES).
JavaScript
3
star
53

redlock

Distributed locks using Redis. Nice API. Has keep-alive functionality.
JavaScript
3
star
54

awssum-amazon-sns

(deprecated: use aws-sdk) NodeJS module to talk to Amazon Simple Notification Service (SNS).
JavaScript
3
star
55

yid

Simple ID generator. A timestamp plus random digits.
JavaScript
3
star
56

connect-error-irc

Connect middleware to send errors to an IRC server.
3
star
57

awssum-io

The AwsSum docs site.
JavaScript
2
star
58

12factor-log

Logger which outputs to only stdout, as described in http://12factor.net/logs
JavaScript
2
star
59

phliky

A small lightweight and consistent text->html markup language
Perl
2
star
60

sandpeople

GoLang middleware to check the relevant `X-Sandstorm-*` headers.
Go
2
star
61

npxcard

Create a nice display for your 'npx your-name-here' package
JavaScript
2
star
62

feed2summary

An rss/atom to stdout processor.
JavaScript
2
star
63

blort

Perl command line Twitter client which uses OAuth
2
star
64

dropmail

DropMail is designed to make your life easier when sending emails from your web server or backend cron jobs.
Perl
2
star
65

pluralise

Plurals for the masses. (node.js)
JavaScript
2
star
66

patchy

Easy patching of your Postgres database.
Go
2
star
67

String-Random-NiceURL

Perl Library to create Random ID strings suitable for URLs.
Perl
2
star
68

nodejs-geek-nz

Node.js in New Zealand promotional site.
JavaScript
2
star
69

pollpod

A command line tool which helps you download podcasts
2
star
70

uchi

UCHI - Unified Cache Handling Interface
JavaScript
2
star
71

awssum-amazon-autoscaling

(deprecated: use aws-sdk) NodeJS module to talk to Amazon AutoScaling.
JavaScript
2
star
72

connect-content

Content middleware you can add to your Connect/Express app.
JavaScript
1
star
73

awssum-amazon-elasticache

(deprecated: use aws-sdk) NodeJS module to talk to Amazon ElasiCache.
JavaScript
1
star
74

awssum-amazon-elb

(deprecated: use aws-sdk) NodeJS module to talk to Amazon Elastic Load Balancing (ELB).
JavaScript
1
star
75

awssum-amazon-glacier

(deprecated: use aws-sdk) NodeJS module to talk to Amazon Glacier.
JavaScript
1
star
76

awssum-amazon-iam

(deprecated: use aws-sdk) NodeJS module to talk to Amazon Identity and Access Management (IAM).
JavaScript
1
star
77

awssum-amazon-sts

(deprecated: use aws-sdk) NodeJS module to talk to Amazon Simple Token Service (STS).
JavaScript
1
star
78

pwkeepr

Helps you store and edit your passwords securely. :)
1
star
79

awssum-amazon-imd

(deprecated: use aws-sdk) NodeJS module to talk to Amazon Instance MetaData (IMD).
JavaScript
1
star
80

namez

A name generator, for projects, confirmation codes, or funsies!
JavaScript
1
star
81

trademe

Client for the TradeMe (trademe.co.nz) API
JavaScript
1
star
82

date-slice

Figure out which time slice a date lands in.
JavaScript
1
star
83

awssum-amazon-simpledb

(deprecated: use aws-sdk) NodeJS module to talk to Amazon SimpleDB.
JavaScript
1
star
84

persona-assistant-site

Example site using jquery.persona-assistant.js.
JavaScript
1
star
85

awssum-amazon-cloudfront

(deprecated: use aws-sdk) NodeJS module to talk to Amazon CloudFront.
JavaScript
1
star
86

awssum-amazon-emr

(deprecated: use aws-sdk) NodeJS module to talk to Amazon Elastic MapReduce (EMR).
JavaScript
1
star
87

kiwiwriters

The main website for kiwiwriters.org (no longer exists).
Perl
1
star
88

zproxy

An easily configurable web proxy, redirect, not found and static site server, written in Go.
Go
1
star
89

awssum-amazon-swf

(deprecated: use aws-sdk) NodeJS module to talk to Amazon Simple WorkFlow (SWF).
JavaScript
1
star
90

blat

Static site generation tool.
Perl
1
star
91

dyno

The networked cornerstone of an eventually consistent key/value store.
JavaScript
1
star
92

awssum-amazon-storagegateway

(deprecated: use aws-sdk) NodeJS module to talk to Amazon StorageGateway.
JavaScript
1
star
93

onebyone

Flow control so that only one function executes at any one time.
JavaScript
1
star
94

gocigar

A GoLang program to read stats from your system.
Go
1
star
95

webhook-inspector

App to receive, display, and query GitHub WebHooks.
HTML
1
star
96

nodejs-nz

A site for promoting Node in New Zealand.
JavaScript
1
star
97

conhash

A fast consistent hashing (hashring) implementation.
JavaScript
1
star
98

sensi

A set of tools for Infrastructure as a Service: Queues, Notifications etc
JavaScript
1
star
99

promises101-org

A tutorial site for Promises/A+ in JavaScript.
JavaScript
1
star
100

awssum-amazon-cloudwatch

(deprecated: use aws-sdk) NodeJS module to talk to Amazon CloudWatch.
JavaScript
1
star