Skip to content

Commit

Permalink
Initial token bucket implementation (#1314)
Browse files Browse the repository at this point in the history
  • Loading branch information
megawac committed Nov 9, 2016
1 parent 9cc01fd commit 247b892
Showing 1 changed file with 39 additions and 0 deletions.
39 changes: 39 additions & 0 deletions lib/internal/TokenBucket.js
@@ -0,0 +1,39 @@
import DLL from './DoublyLinkedList';

/**
* An internal implementation of [Token Bucket](https://en.wikipedia.org/wiki/Token_bucket)
* for rate-limiting/traffic shaping.
*
* @param {Number} bucketSize - the maximum number of items (inclusive) which can be queued in
* a interval of time.
* @param {Number} interval - the period in miliseconds to stop tracking a sent item
*/
export function TokenBucket(bucketSize, interval) {
this.bucketSize = bucketSize;
this.interval = interval;
this.queue = new DLL();
this.queued = 0; // Number of items sent + size of queue
}

/**
* Enqueue an operation to be executed
*/
TokenBucket.prototype.enqueue = function(operation) {
this.queued++;
if (this.queued <= this.bucketSize) {
operation();
} else {
this.queue.push(operation);
}

// after interval, decrement the queued count and call a queued operation (if bucket is full)
setTimeout(onIntervalComplete, this.interval, this);
}

function onIntervalComplete(bucket) {
bucket.queued--;
if (bucket.queue.length > 0) {
// call first queued operation
(bucket.queue.shift())();
}
}

3 comments on commit 247b892

@megawac
Copy link
Collaborator Author

@megawac megawac commented on 247b892 Nov 9, 2016

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@aearly thoughts on something like this for rate limiting?

/cc @hargasinski

@aearly
Copy link
Collaborator

@aearly aearly commented on 247b892 Jan 31, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry, I completely lost this notification in a slew of emails. LGTM. 👍

@megawac
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think this makes sense to implement in async proper any more.

Please sign in to comment.