Node's Pocket Monsters

    weak-daemon
    TypeScript icon, indicating that this package has built-in type declarations

    1.0.3 • Public • Published

    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-daemon

    Examples

    • 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 this usage:
    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:

      • interval integer number - interval time of task call in milliseconds. Note this is not guarntee to call task every interval, it works exactly the same as setInterval(..).unref()
      • caller object | null - task's caller context (in case if task will use 'this' keyword)
      • task function - task that will be called every interval
      • [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
    • ##### interval getter for provided interval_time

    • ##### caller getter for provided caller

    • ##### task getter for provided task

    • ##### args getter for provided args ([] returned if not provided])

    function getInstance

    Provided for mocking purposes.

    • ###### Arguments: @see class WeakDaemon constructor
    • ###### Returns: instance of WeakDaemon.

    function getClass

    Provided for mocking purposes.

    • ###### Arguments: no
    • ###### Returns: WeakDaemon class.

    Keywords

    Install

    npm i weak-daemon

    DownloadsWeekly Downloads

    22,330

    Version

    1.0.3

    License

    MIT

    Unpacked Size

    13.9 kB

    Total Files

    7

    Last publish

    Collaborators

    • fider