Skip to content

Commit

Permalink
first commit
Browse files Browse the repository at this point in the history
  • Loading branch information
timisbusy committed Oct 9, 2012
0 parents commit 3480e39
Show file tree
Hide file tree
Showing 4 changed files with 117 additions and 0 deletions.
1 change: 1 addition & 0 deletions index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module.exports = require('./tweek');
15 changes: 15 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"author": "Tim Atkinson <timisbusy@gmail.com> (timisbusy.com)",
"name": "tweek",
"description": "Adds inactivity events to node stream objects.",
"version": "0.0.0",
"repository": {
"url": ""
},
"main": "index.js",
"engines": {
"node": "~0.6.9"
},
"dependencies": {},
"devDependencies": {}
}
46 changes: 46 additions & 0 deletions test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
var Stream = require('stream').Stream,
Tweek = require('./index');

var stream1 = new Stream();

stream1.writable = true;
stream1.readable = true;

stream1.write = function (data) {
this.emit('data', data);
return true;
}

stream1.destroy = function () {
clearInterval(this.interval);
this.emit('end');
}

var tweek = new Tweek(stream1, { patience: 4000, checkInterval: 2000 });

stream1.interval = setInterval(function () {
var write = Math.random() > .8;
if (write) {
stream1.write('jam', 'utf8');
}
}, 1000);

stream1.on('data', function (data) {
console.log(data);
});

stream1.on('error', function (error) {
console.log(error);
});

stream1.on('end', function () {
console.log('ended');
});

stream1.on('tweek', function (tdata) {
console.log('tweek!');
console.log(tdata);
if (tdata.n === 5) {
stream1.destroy();
}
});
55 changes: 55 additions & 0 deletions tweek.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
var events = require('events'),
util = require('util');

function Tweek (stream, options) {
var self = this;
var defaults = {
maxTweeks: 5,
checkInterval: 1000,
patience: 3000,
eventName: 'tweek'
}
this.options = options || {};

this.options.maxTweeks = this.options.maxTweeks || defaults.maxTweeks;
this.options.checkInterval = this.options.checkInterval || defaults.checkInterval;
this.options.patience = this.options.patience || defaults.patience;
this.options.eventName = this.options.eventName || defaults.eventName;

events.EventEmitter.call(this);

this.stream = stream;
this.tweeks = 0;
this.lastActive = new Date();

this.interval = setInterval(function () { self.runCheck() }, self.options.checkInterval);
this.stream.on('data', function () {
self.activity()
});
this.stream.on('end', function () {
clearInterval(self.interval);
});
}

util.inherits(Tweek, events.EventEmitter);

Tweek.prototype.runCheck = function runCheck () {
var now = new Date();
if (now.valueOf() - this.lastActive.valueOf() > this.options.patience) {
this.tweek();
}
}

Tweek.prototype.activity = function activity () {
this.lastActive = new Date();
this.tweeks = 0;
}

Tweek.prototype.tweek = function tweek () {
this.tweeks++;
if (this.tweeks <= this.options.maxTweeks) {
this.stream.emit(this.options.eventName, { n: this.tweeks, lastActive: this.lastActive });
}
}

module.exports = Tweek;

0 comments on commit 3480e39

Please sign in to comment.