1.0.3 • Published 8 years ago
weak-daemon v1.0.3
About
- Node.js object wrapper for unref'ed setInterval.
- weak means it will not prevent Node.js process to exit if event loop is empty.
- It will help you remember about routine context.
- No external dependencies.
Installation
Requires Node.js v4.8.7
$ npm install weak-daemonExamples
- Ordinary function:
const WeakDaemon = require('weak-daemon').WeakDaemon
var daemon = new WeakDaemon(
102,
null,
() => { console.log('tick', 'tock') }
);
daemon.start(); // Will print 'tick' 'tock' every ~102 ms
..
/* (!) Note that multiple 'start' call without previous 'stop' will throw error */
daemon.start(); // First call made after ~102ms
daemon.start(false);// First call made after ~102ms
daemon.start(true); // First call made immediately;
..
daemon.start();
daemon.isRunning(); // true
daemon.stop();
daemon.isRunning(); // false
daemon.start();- Equivalent of above example
var daemon = new WeakDaemon(
102,
null,
console.log,
['tick', 'tock']
);- Function that requires a caller context, because of
thisusage:
const worker = {
data: {},
updateData(source) {
this.data = source.data;
}
}
var daemon = new WeakDaemon(
102,
worker, /* So `this` will be handled properly on `updateData` call */
worker.updateData,
[data_source]
);
daemon.start();- Example error scenario:
const worker = {
data: {},
source: {...},
updateData() {
this.data = this.source.data()
}
}
var daemon = new WeakDaemon(
101,
null, /* `this.source` will be undefined while daemon will call `updateData` */
worker.updateData
);
/* Error - `this.source` is undefined */
daemon.start();Mocking for test purposes:
/* your-lib.js */
const {getInstance} = require('weak-daemon');
// :(
const non_mockable_daemon = new WeakDaemon(...args);
// :)
const mockable_daemon = getInstance(...args);/* test-your-lib.js */
const WD = require('weak-daemon');
WD.getInstance = () => { return your_mock; }Alternative way:
/* your-lib.js */
const {WeakDaemon, getClass} = require('weak-daemon');
const non_mockable_daemon = new WeakDaemon(...args)
const MockableWeakDaemon = getClass();
const mockable_daemon = new MockableWeakDaemon(...args);/* test-your-lib.js */
const WD = require('weak-daemon');
WD.getClass = () => { return YourMock; }Documentation
class WeakDaemon
constructor( interval_time, caller, task, task_args=[] )Arguments:
intervalinteger number - interval time of task call in milliseconds. Note this is not guarntee to call task every interval, it works exactly the same assetInterval(..).unref()callerobject | null -task'scaller context (in case if task will use 'this' keyword)taskfunction - task that will be called everyinterval[task_args]Array - list of arguments task will be called with.
start( immediate_call )Start daemon.
Arguments:
immediate_call- boolean, is task should be called immediately after start call. Default false.
stop()Stop daemon (can be resterted by calling
start).isRunning()Returns:
- boolean, is daemon running
intervalgetter for providedinterval_timecallergetter for providedcallertaskgetter for providedtaskargsgetter for providedargs([] returned if not provided])
function getInstance
Provided for mocking purposes.
Arguments: @see class
WeakDaemonconstructorReturns: instance of WeakDaemon.
function getClass
Provided for mocking purposes.
Arguments: no
Returns: WeakDaemon class.