├── .gitignore ├── .travis.yml ├── .zuul.yml ├── README.md ├── index.js ├── package.json └── test.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - '0.10' 4 | env: 5 | global: 6 | - secure: lFW2zDRNnmNIEUFT/zGvXWdGVkHIo7dkgfXWHfrGTpSozGrgrSAPnNKvFJfI/q51seq6ahex8x/LbYlt51mBae8ECbeBDHQUbrKiZTWlIg+UnjIzDGU1/qy7y4yaWy2nE7j+sXRZYNeHcPV4++Hx4Tb8Ny8l2cmDdtPcbn81o6M= 7 | - secure: kVaYpjuO6brLtWQ+kdkfGh/lpVcCG/E8D5ctOjFfLnEukOtEd+oX4eS/EkCJEd299Fuq057ImmkNCepu8PG7GBEMuCEVPNIj321TvIJQFcDgei6/rLqL8/xJdM39T9T2Vsay5Cu9jjR/JJNWR+EzLtlF/WuVDO3O1bRG331M9cI= 8 | -------------------------------------------------------------------------------- /.zuul.yml: -------------------------------------------------------------------------------- 1 | ui: mocha-qunit 2 | browsers: 3 | - name: chrome 4 | version: 27..latest 5 | - name: firefox 6 | version: 20..latest 7 | - name: safari 8 | version: 5..latest 9 | - name: ie 10 | version: 7..latest 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # away [![Build Status](https://travis-ci.org/defunctzombie/away.png?branch=master)](https://travis-ci.org/defunctzombie/away) 2 | 3 | detect idle users on webpages 4 | 5 | ```js 6 | var away = require('away'); 7 | 8 | // detect users who are idle for 10 seconds 9 | var timer = away(10000); 10 | timer.on('idle', function() { 11 | console.log('user is idle'); 12 | }); 13 | timer.on('active', function() { 14 | console.log('user is active'); 15 | }); 16 | ``` 17 | 18 | ## api 19 | 20 | ```away()``` returns a Timer object which exposes the following methods. 21 | 22 | ### .on('idle', fn) 23 | Call ```fn``` when user becomes idle. 24 | 25 | ### .on('active', fn) 26 | Call ```fn``` when user becomes active after having been idle. 27 | 28 | ### .stop() 29 | Stop the idle timer from detecting user activity 30 | 31 | ### .start() 32 | Start the idle timer. (By default the idle timer is started automatically) 33 | 34 | ## options 35 | 36 | ```idle()``` accepts a second argument with additional options. 37 | 38 | ### element 39 | The dom element to monitor for activity. (default ```document```) 40 | 41 | ### timeout 42 | Milliseconds before user is considered idle. (default ```30000```) 43 | 44 | ### events 45 | String of DOM events that will trigger activity. (see index.js for default) 46 | 47 | ### start 48 | Whether to start idle timer upon creation. (default ```true```) 49 | 50 | ## install 51 | 52 | ``` 53 | npm install away 54 | ``` 55 | 56 | ## credits 57 | 58 | Inspired by the [jquery-idletimer](https://github.com/mikesherov/jquery-idletimer) plugin. 59 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | var xtend = require('xtend'); 2 | 3 | module.exports = function(timeout) { 4 | return new Idle({ timeout: timeout }); 5 | }; 6 | 7 | // default settings 8 | var defaults = { 9 | //start as soon as timer is set up 10 | start: true, 11 | // timer is enabled 12 | enabled: true, 13 | // amount of time before timer fires 14 | timeout: 30000, 15 | // what element to attach to 16 | element: document, 17 | // activity is one of these events 18 | events: 'mousemove keydown DOMMouseScroll mousewheel mousedown touchstart touchmove' 19 | }; 20 | 21 | var Idle = function(opt) { 22 | var self = this; 23 | 24 | self.opt = xtend(defaults, opt); 25 | self.element = self.opt.element; 26 | 27 | self.state = { 28 | idle: self.opt.idle, 29 | timeout: self.opt.timeout, 30 | enabled: self.opt.enabled, 31 | idle_fn: [], 32 | active_fn: [] 33 | }; 34 | 35 | // wrapper to pass state to toggleState 36 | self.state.state_fn = function() { 37 | toggleState(self.state); 38 | }; 39 | 40 | if (self.opt.start) { 41 | self.start(); 42 | } 43 | }; 44 | 45 | var proto = Idle.prototype; 46 | 47 | proto.start = function() { 48 | var self = this; 49 | var state = self.state; 50 | var element = self.element; 51 | 52 | function handler(ev) { 53 | // clear any current timouet 54 | clearTimeout(state.timer_id); 55 | 56 | if (!state.enabled) { 57 | return; 58 | } 59 | 60 | if (state.idle) { 61 | toggleState(state); 62 | } 63 | 64 | state.timer_id = setTimeout(state.state_fn, state.timeout); 65 | } 66 | 67 | // to remove later 68 | state.handler = handler; 69 | 70 | var events = this.opt.events.split(' '); 71 | for (var i=0 ; i", 25 | "license": "MIT" 26 | } 27 | -------------------------------------------------------------------------------- /test.js: -------------------------------------------------------------------------------- 1 | var assert = require('assert'); 2 | var idle = require('./'); 3 | 4 | var synth = require('synthetic-dom-events'); 5 | 6 | var move = function(element) { 7 | var ev = synth('mousemove'); 8 | if (element.dispatchEvent) { 9 | element.dispatchEvent(ev); 10 | } 11 | else { 12 | element.fireEvent('onmousemove', ev); 13 | } 14 | }; 15 | 16 | test('create', function() { 17 | var timer = idle(1000); 18 | timer.stop(); 19 | }); 20 | 21 | test('idle', function(done) { 22 | var timer = idle(1000); 23 | var elapsed = false; 24 | 25 | setTimeout(function() { 26 | elapsed = true; 27 | }, 900); 28 | timer.on('idle', function() { 29 | timer.stop(); 30 | assert.ok(elapsed); 31 | done(); 32 | }); 33 | timer.on('active', function() { 34 | assert.ok(false); 35 | }); 36 | }); 37 | 38 | test('stop', function(done) { 39 | var timer = idle(1000); 40 | 41 | setTimeout(function() { 42 | timer.stop(); 43 | }, 500); 44 | 45 | setTimeout(function() { 46 | done(); 47 | }, 1500); 48 | 49 | timer.on('idle', function() { 50 | assert.ok(false); 51 | }); 52 | timer.on('active', function() { 53 | assert.ok(false); 54 | }); 55 | }); 56 | 57 | test('active', function(done) { 58 | var timer = idle(1000); 59 | timer.on('idle', function() { 60 | move(document); 61 | }); 62 | timer.on('active', function() { 63 | timer.stop(); 64 | done(); 65 | }); 66 | }); 67 | --------------------------------------------------------------------------------